From c61128a3698ec5214908dc7caeed06d8238f32eb Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Fri, 3 Jan 2025 22:19:23 +0000 Subject: [PATCH 01/27] feat: Initial conduit bundle block rewrite pass. Still need to address many TODOs and GUI --- .../common/blockentity/EnderBlockEntity.java | 9 +- .../com/enderio/conduits/api/Conduit.java | 10 +- .../com/enderio/conduits/api/ConduitApi.java | 2 + .../com/enderio/conduits/api/ConduitData.java | 1 - .../api/bundle/ConduitBundleAccessor.java | 72 + .../api/bundle/ConduitBundleReader.java | 115 ++ .../conduits/api/bundle/ConduitInventory.java | 17 + .../api/connection/ConduitConnection.java | 83 ++ .../api/connection/ConduitConnectionMode.java | 56 + .../api/connection/ConduitConnectionType.java | 70 + .../conduits/api/connection/package-info.java | 4 + .../conduits/client/ConduitClientSetup.java | 3 +- .../conduits/client/gui/ConduitScreen.java | 2 +- .../client/model/ConduitBlockModel.java | 2 +- .../conduit/bundle/ConduitBundleGeometry.java | 35 + .../bundle/ConduitBundleRenderState.java | 115 ++ .../conduit/bundle/NewConduitBundleModel.java | 358 +++++ .../common/conduit/ConduitApiImpl.java | 5 + .../common/conduit/ConduitBundle.java | 6 +- .../common/conduit/ConduitSavedData.java | 10 +- .../conduits/common/conduit/OffsetHelper.java | 18 + .../conduit/block/ConduitBundleBlock.java | 6 +- .../block/ConduitBundleBlockEntity.java | 22 +- .../conduit/bundle/NewConduitBundleBlock.java | 454 +++++++ .../bundle/NewConduitBundleBlockEntity.java | 1170 +++++++++++++++++ .../bundle/NewConduitBundleInventory.java | 206 +++ .../conduit/bundle/NewConduitShape.java | 187 +++ .../common/conduit/bundle/package-info.java | 4 + .../conduit/connection/ConnectionState.java | 1 + .../connection/DynamicConnectionState.java | 7 +- .../connection/StaticConnectionStates.java | 1 + .../{ => graph}/ConduitDataContainer.java | 2 +- .../{ => graph}/ConduitGraphContext.java | 2 +- .../{ => graph}/ConduitGraphObject.java | 36 +- .../{ => graph}/ConduitGraphUtility.java | 2 +- .../{ => graph}/WrappedConduitNetwork.java | 2 +- .../conduit/type/energy/EnergyConduit.java | 22 +- .../common/init/ConduitBlockEntities.java | 12 +- .../conduits/common/init/ConduitBlocks.java | 6 +- .../network/C2SSetConduitExtendedData.java | 3 +- .../common/init/MachineTravelTargets.java | 1 + 41 files changed, 3087 insertions(+), 52 deletions(-) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitInventory.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/package-info.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/package-info.java rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{ => graph}/ConduitDataContainer.java (98%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{ => graph}/ConduitGraphContext.java (98%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{ => graph}/ConduitGraphObject.java (78%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{ => graph}/ConduitGraphUtility.java (96%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{ => graph}/WrappedConduitNetwork.java (95%) diff --git a/endercore/src/main/java/com/enderio/core/common/blockentity/EnderBlockEntity.java b/endercore/src/main/java/com/enderio/core/common/blockentity/EnderBlockEntity.java index 878beececb..1d28fe47d2 100644 --- a/endercore/src/main/java/com/enderio/core/common/blockentity/EnderBlockEntity.java +++ b/endercore/src/main/java/com/enderio/core/common/blockentity/EnderBlockEntity.java @@ -93,10 +93,11 @@ public void endTick() { } } - @Override - public void setChanged() { - this.isChangedDeferred = true; - } + // TODO: I think we might be able to kill this optimisation now? +// @Override +// public void setChanged() { +// this.isChangedDeferred = true; +// } // endregion diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index b7b52e135e..df6d56b6eb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -2,6 +2,8 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.connection.ConduitConnection; +import com.enderio.conduits.api.connection.ConduitConnectionMode; import com.enderio.conduits.api.ticker.ConduitTicker; import com.enderio.conduits.api.upgrade.ConduitUpgrade; import com.mojang.serialization.Codec; @@ -17,6 +19,7 @@ import net.minecraft.resources.RegistryFixedCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.component.TooltipProvider; @@ -141,11 +144,8 @@ default TCapability proxyCapability(BlockCapability> conduit) { ItemStack getStackForType(Holder> conduit, int count); Ingredient getIngredientForType(Holder> conduit); + + int getConduitSortIndex(Holder> conduit); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitData.java index 069f2ee3a2..fa1eaf8541 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitData.java @@ -1,6 +1,5 @@ package com.enderio.conduits.api; -import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.mojang.serialization.Codec; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java new file mode 100644 index 0000000000..0abf528d21 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java @@ -0,0 +1,72 @@ +package com.enderio.conduits.api.bundle; + +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.common.conduit.RightClickAction; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +/** + * + */ +@ApiStatus.Experimental +public interface ConduitBundleAccessor extends ConduitBundleReader { + + // TODO: RightClickAction should have a better name. Maybe AddConduitResult + + boolean canAddConduit(Holder> conduit); + + /** + * + * @return + */ + RightClickAction addConduit(Holder> conduit, @Nullable Player player); + + /** + * Remove a conduit from the bundle. + * @throws IllegalArgumentException if this conduit is not present (in dev only). + */ + void removeConduit(Holder> conduit, @Nullable Player player); + + // region Connections + + // TODO: Should connections be accessible by API? + // Answer: probably not lol. + + /** + * Attempt to connect this conduit something in the given direction. + * @param side the direction to be connected to. + * @param conduit the conduit type that is being connected. + * @param isForcedConnection whether this is a forced connection or automated connection. (Wrench) + * @return whether a new connection was made. + */ + boolean tryConnectTo(Direction side, Holder> conduit, boolean isForcedConnection); + +// void connectTo(Direction side, Holder> conduit); + +// void disconnect(Direction side, Holder> conduit); + +// void disableConnection(Direction side, Holder> conduit); + + // endregion + + // region Facades + + /** + * Set the facade provider for this bundle. + * @apiNote The item must have an exposed {@link com.enderio.conduits.api.facade.ConduitFacadeProvider} capability. + * @param providerStack the stack providing the facade. + */ + void setFacadeProvider(ItemStack providerStack); + + /** + * Remove the facade from the bundle. + */ + void clearFacade(); + + // endregion + +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java new file mode 100644 index 0000000000..2c8f4a7829 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -0,0 +1,115 @@ +package com.enderio.conduits.api.bundle; + +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.connection.ConduitConnection; +import com.enderio.conduits.api.facade.FacadeType; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; +import com.enderio.conduits.api.connection.ConduitConnectionType; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import org.jetbrains.annotations.ApiStatus; + +import java.util.List; + +/** + * Immutable access to a conduit bundle. + */ +@ApiStatus.Experimental +public interface ConduitBundleReader { + + /** + * @implNote Must be sorted according to {@link com.enderio.conduits.api.ConduitApi#getConduitSortIndex(Holder)} + * @return a list of all conduits in the bundle. + */ + List>> getConduits(); + + // TEMP + + ConduitGraphObject getConduitNode(Holder> conduit); + + /** + * @implNote compare conduits using {@link Conduit#canConnectTo(Holder)} + * @param conduit the conduit to check for + * @return whether the bundle has this conduit, or another which is compatible. + */ + boolean hasConduitByType(Holder> conduit); + + /** + * @param conduit the conduit to check for + * @return whether the bundle has this specific conduit. + */ + boolean hasConduitStrict(Holder> conduit); + + /** + * @return whether the bundle has no conduits and no facade. + */ + boolean isEmpty(); + + /** + * @return whether the bundle has the maximum number of conduits. + */ + boolean isFull(); + + // region Connections + + /** + * @implNote Must be sorted according to {@link com.enderio.conduits.api.ConduitApi#getConduitSortIndex(Holder)} + * @param side the side to check for. + * @return a list of all conduits connected on this side. + */ + List>> getConnectedConduits(Direction side); + + /** + * + * @param side + * @param conduit + * @return + */ + ConduitConnectionType getConnectionType(Direction side, Holder> conduit); + + /** + * @throws IllegalStateException if {@link #getConnectionType} is not {@link ConduitConnectionType#CONNECTED_BLOCK}. + * @param side + * @param conduit + * @return + */ + ConduitConnection getConnection(Direction side, Holder> conduit); + + /** + * An endpoint is a side which has a "connection plate" to another block, rather than to continued line of bundles. + * @param side the side being checked. + * @return whether this side is an endpoint. + */ + boolean isEndpoint(Direction side); + + // endregion + + // region Facades + + /** + * @return whether the bundle has a facade. + */ + boolean hasFacade(); + + /** + * @throws IllegalStateException if {@link #hasFacade} is false. + * @return the block this bundle is mimicing. + */ + Block getFacadeBlock(); + + /** + * @throws IllegalStateException if {@link #hasFacade} is false. + * @return the type of facade this bundle has. + */ + FacadeType getFacadeType(); + + /** + * @return the item providing this bundle's facade. + */ + ItemStack getFacadeProvider(); + + // endregion + +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitInventory.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitInventory.java new file mode 100644 index 0000000000..90c02cbbd6 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitInventory.java @@ -0,0 +1,17 @@ +package com.enderio.conduits.api.bundle; + +import com.enderio.conduits.api.SlotType; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.ApiStatus; + +/** + * Represents the inventory of a single conduit in a bundle. + * The inventory is divided into sides for each possible connection. + */ +@ApiStatus.Experimental +public interface ConduitInventory { + ItemStack getStackInSlot(Direction side, SlotType slotType); + + void setStackInSlot(Direction side, SlotType slotType, ItemStack stack); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java new file mode 100644 index 0000000000..2141a55d97 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java @@ -0,0 +1,83 @@ +package com.enderio.conduits.api.connection; + +import com.enderio.base.api.misc.RedstoneControl; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.DyeColor; + +// If a conduit does not support redstone control, dye control etc. then set them to a sensible value and ignore it. +// TODO: In EnderIO 8 I would like this to be merged into ConduitData somehow. +// we could do this in EIO 7, but it would be a much more significant API/save break. +public record ConduitConnection( + ConduitConnectionMode mode, + DyeColor inputChannel, + DyeColor outputChannel, + RedstoneControl redstoneControl, + DyeColor redstoneChannel +) { + + public static Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + ConduitConnectionMode.CODEC.fieldOf("mode").forGetter(ConduitConnection::mode), + DyeColor.CODEC.fieldOf("input_channel").forGetter(ConduitConnection::inputChannel), + DyeColor.CODEC.fieldOf("output_channel").forGetter(ConduitConnection::outputChannel), + RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(ConduitConnection::redstoneControl), + DyeColor.CODEC.fieldOf("redstone_channel").forGetter(ConduitConnection::redstoneChannel) + ).apply(instance, ConduitConnection::new) + ); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ConduitConnectionMode.STREAM_CODEC, + ConduitConnection::mode, + DyeColor.STREAM_CODEC, + ConduitConnection::inputChannel, + DyeColor.STREAM_CODEC, + ConduitConnection::outputChannel, + RedstoneControl.STREAM_CODEC, + ConduitConnection::redstoneControl, + DyeColor.STREAM_CODEC, + ConduitConnection::redstoneChannel, + ConduitConnection::new + ); + + // No-channel constructor + public ConduitConnection(ConduitConnectionMode mode) { + this(mode, DyeColor.GREEN, DyeColor.GREEN); + } + + // No-redstone constructor + public ConduitConnection(ConduitConnectionMode mode, DyeColor inputChannel, DyeColor outputChannel) { + this(mode, inputChannel, outputChannel, RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); + } + + public boolean canInput() { + return mode.canInput(); + } + + public boolean canOutput() { + return mode.canOutput(); + } + + public ConduitConnection withMode(ConduitConnectionMode mode) { + return new ConduitConnection(mode, inputChannel, outputChannel, redstoneControl, redstoneChannel); + } + + public ConduitConnection withInsertChannel(DyeColor insertChannel) { + return new ConduitConnection(mode, insertChannel, outputChannel, redstoneControl, redstoneChannel); + } + + public ConduitConnection withExtractChannel(DyeColor extractChannel) { + return new ConduitConnection(mode, inputChannel, extractChannel, redstoneControl, redstoneChannel); + } + + public ConduitConnection withRedstoneControl(RedstoneControl redstoneControl) { + return new ConduitConnection(mode, inputChannel, outputChannel, redstoneControl, redstoneChannel); + } + + public ConduitConnection withRedstoneChannel(DyeColor redstoneChannel) { + return new ConduitConnection(mode, inputChannel, outputChannel, redstoneControl, redstoneChannel); + } + +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java new file mode 100644 index 0000000000..068557d012 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java @@ -0,0 +1,56 @@ +package com.enderio.conduits.api.connection; + +import com.mojang.serialization.Codec; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.util.ByIdMap; +import net.minecraft.util.StringRepresentable; + +import java.util.function.IntFunction; + +public enum ConduitConnectionMode implements StringRepresentable { + /** + * In mode - for conduits which deposit resources or signals into the attached block. + */ + IN("in", true, false), + + /** + * Out mode - for conduits which extract resources or signals from the attached block. + */ + + OUT("out", false, true), + + /** + * Both mode - for conduits which can both insert and extract resources or signals from the attached block. + */ + BOTH("both", true, true); + + public static final Codec CODEC = StringRepresentable.fromEnum(ConduitConnectionMode::values); + public static final IntFunction BY_ID = ByIdMap.continuous(Enum::ordinal, values(), + ByIdMap.OutOfBoundsStrategy.ZERO); + public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, Enum::ordinal); + + private final String name; + private final boolean canInput; + private final boolean canOutput; + + ConduitConnectionMode(String name, boolean canInput, boolean canOutput) { + this.name = name; + this.canInput = canInput; + this.canOutput = canOutput; + } + + @Override + public String getSerializedName() { + return name; + } + + public boolean canInput() { + return canInput; + } + + public boolean canOutput() { + return canOutput; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java new file mode 100644 index 0000000000..d5e4fabc53 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java @@ -0,0 +1,70 @@ +package com.enderio.conduits.api.connection; + +import com.mojang.serialization.Codec; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.util.ByIdMap; +import net.minecraft.util.StringRepresentable; + +import java.util.function.IntFunction; + +public enum ConduitConnectionType implements StringRepresentable { + /** + * This conduit is not connected to anything. + */ + NONE("none"), + + /** + * This conduit is connected to a block for extract. + * A {@link ConduitConnectionMode} will describe the properties of the connection. + */ + CONNECTED_BLOCK("connected_block"), + + /** + * This conduit is connected to another conduit. + */ + CONNECTED_CONDUIT("connected_conduit"), + + /** + * Intentionally disabled by the player, should not automatically reconnect without Yeta Wrench. + */ + DISABLED("disabled"); + + public static final Codec CODEC = StringRepresentable.fromEnum(ConduitConnectionType::values); + public static final IntFunction BY_ID = ByIdMap.continuous(Enum::ordinal, values(), + ByIdMap.OutOfBoundsStrategy.ZERO); + public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, Enum::ordinal); + + private final String name; + + ConduitConnectionType(String name) { + this.name = name; + } + + /** + * @return Whether a new connection can be made from this face. + */ + public boolean canConnect() { + return this == NONE; + } + + /** + * @return Whether this face is connected. + */ + public boolean isConnected() { + return this != NONE && this != DISABLED; + } + + /** + * @return Whether this face is connected to a block. + */ + public boolean isEndpoint() { + return this == CONNECTED_BLOCK; + } + + @Override + public String getSerializedName() { + return name; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/package-info.java new file mode 100644 index 0000000000..270831a1cf --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/package-info.java @@ -0,0 +1,4 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault + +package com.enderio.conduits.api.connection; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java index 31110a3df1..87c3ab74c4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java @@ -12,6 +12,7 @@ import com.enderio.conduits.client.model.FacadeItemGeometry; import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; import com.enderio.conduits.client.model.conduit.modifier.FluidConduitCoreModelModifier; +import com.enderio.conduits.client.model.rewrite.conduit.bundle.ConduitBundleGeometry; import com.enderio.conduits.common.init.ConduitTypes; import java.util.ArrayList; import java.util.HashMap; @@ -63,7 +64,7 @@ public static void registerConduitScreenExtensions(RegisterConduitScreenExtensio @SubscribeEvent public static void modelLoader(ModelEvent.RegisterGeometryLoaders event) { - event.register(EnderIO.loc("conduit"), new ConduitGeometry.Loader()); + event.register(EnderIO.loc("conduit"), new ConduitBundleGeometry.Loader()); event.register(EnderIO.loc("conduit_item"), new ConduitItemModelLoader()); event.register(EnderIO.loc("facades_item"), new FacadeItemGeometry.Loader()); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java index 200f1bf6b3..03804358a3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java @@ -16,7 +16,7 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.ConduitGraphObject; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.menu.ConduitMenu; import com.enderio.conduits.common.network.C2SSetConduitConnectionState; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java index 795b9a5fb2..6d6ebda602 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java @@ -21,7 +21,7 @@ import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; import com.enderio.conduits.common.Area; import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.ConduitGraphObject; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.OffsetHelper; import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import com.enderio.conduits.common.conduit.connection.ConnectionState; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java new file mode 100644 index 0000000000..d1bace5d01 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java @@ -0,0 +1,35 @@ +package com.enderio.conduits.client.model.rewrite.conduit.bundle; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.Material; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelState; +import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext; +import net.neoforged.neoforge.client.model.geometry.IGeometryLoader; +import net.neoforged.neoforge.client.model.geometry.IUnbakedGeometry; + +import java.util.function.Function; + +public class ConduitBundleGeometry implements IUnbakedGeometry { + + public ConduitBundleGeometry() { + } + + @Override + public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, + ItemOverrides overrides) { + return new NewConduitBundleModel(); + } + + public static class Loader implements IGeometryLoader { + @Override + public ConduitBundleGeometry read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) throws JsonParseException { + return new ConduitBundleGeometry(); + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java new file mode 100644 index 0000000000..552e1bba81 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java @@ -0,0 +1,115 @@ +package com.enderio.conduits.client.model.rewrite.conduit.bundle; + +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.common.conduit.OffsetHelper; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; +import com.enderio.conduits.api.bundle.ConduitBundleReader; +import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.ConduitConnection; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.client.model.data.ModelProperty; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ConduitBundleRenderState { + public static final ModelProperty PROPERTY = new ModelProperty<>(); + + private Direction.Axis mainAxis; + + private List>> conduits; + + // TODO: Due to the API design, we need to capture the nodes at the moment. + // it could be changed to accept ConduitDataAccessor instead, then we can clone the data storage. + private Map>, ConduitGraphObject> conduitNodes; + + private Map>>> conduitsByDirection; + + private Map>, ConduitConnection>> conduitConnections; + + private boolean hasFacade; + private BlockState facadeBlockstate; + private boolean doesFacadeHideConduits; + + public static ConduitBundleRenderState of(ConduitBundleReader bundle) { + var renderState = new ConduitBundleRenderState(); + + renderState.mainAxis = OffsetHelper.findMainAxis(bundle); + renderState.conduits = List.copyOf(bundle.getConduits()); + renderState.conduitNodes = bundle.getConduits().stream().collect(HashMap::new, (m, c) -> m.put(c, bundle.getConduitNode(c).deepCopy()), Map::putAll); + renderState.conduitsByDirection = new HashMap<>(); + for (var side : Direction.values()) { + renderState.conduitsByDirection.put(side, bundle.getConnectedConduits(side)); + } + + renderState.conduitConnections = new HashMap<>(); + for (var side : Direction.values()) { + HashMap>, ConduitConnection> conduits = new HashMap<>(); + for (var conduit : renderState.conduits) { + if (bundle.getConnectionType(side, conduit) == ConduitConnectionType.CONNECTED_BLOCK) { + conduits.put(conduit, bundle.getConnection(side, conduit)); + } + } + + renderState.conduitConnections.put(side, conduits); + } + + renderState.hasFacade = bundle.hasFacade(); + if (renderState.hasFacade) { + renderState.facadeBlockstate = bundle.getFacadeBlock().defaultBlockState(); + renderState.doesFacadeHideConduits = bundle.getFacadeType().doesHideConduits(); + } else { + renderState.facadeBlockstate = Blocks.AIR.defaultBlockState(); + renderState.doesFacadeHideConduits = false; + } + + return renderState; + } + + public List>> conduits() { + return conduits; + } + + public ConduitGraphObject getNode(Holder> conduit) { + return conduitNodes.get(conduit); + } + + public List>> getConnectedConduits(Direction side) { + return conduitsByDirection.getOrDefault(side, List.of()); + } + + public boolean isConnectionEndpoint(Direction side) { + return !conduitConnections.get(side).isEmpty(); + } + + public ConduitConnection getConnectionState(Direction side, Holder> conduit) { + return conduitConnections.get(side).get(conduit); + } + + public Direction.Axis mainAxis() { + return mainAxis; + } + + public ResourceLocation getTexture(Holder> conduit) { + var node = getNode(conduit); + return conduit.value().getTexture(node); + } + + public boolean hasFacade() { + return hasFacade; + } + + public BlockState facade() { + return facadeBlockstate; + } + + public boolean doesFacadeHideConduits() { + return doesFacadeHideConduits; + } + +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java new file mode 100644 index 0000000000..f64b7e471e --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java @@ -0,0 +1,358 @@ +package com.enderio.conduits.client.model.rewrite.conduit.bundle; + +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.model.ConduitCoreModelModifier; +import com.enderio.conduits.client.ConduitFacadeColor; +import com.enderio.conduits.client.model.BoxTextureQuadTransformer; +import com.enderio.conduits.client.model.ColorQuadTransformer; +import com.enderio.conduits.client.model.ConduitTextureEmissiveQuadTransformer; +import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; +import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; +import com.enderio.conduits.common.Area; +import com.enderio.conduits.common.conduit.ConduitBundle; +import com.enderio.conduits.common.conduit.OffsetHelper; +import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; +import com.enderio.core.data.model.ModelHelper; +import com.mojang.math.Axis; +import com.mojang.math.Transformation; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SingleThreadedRandomSource; +import net.neoforged.neoforge.client.ChunkRenderTypeSet; +import net.neoforged.neoforge.client.model.IDynamicBakedModel; +import net.neoforged.neoforge.client.model.IQuadTransformer; +import net.neoforged.neoforge.client.model.QuadTransformers; +import net.neoforged.neoforge.client.model.data.ModelData; +import net.neoforged.neoforge.client.model.data.ModelProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import java.util.*; + +import static com.enderio.conduits.client.ConduitClientSetup.*; + +public class NewConduitBundleModel implements IDynamicBakedModel { + + public static final ModelProperty FACADE_MODEL_DATA = new ModelProperty<>(); + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, + ModelData extraData, @Nullable RenderType renderType) { + + List quads = new ArrayList<>(); + ModelData data = extraData.get(FACADE_MODEL_DATA); + + ConduitBundleRenderState bundleState = extraData.get(ConduitBundleRenderState.PROPERTY); + + if (bundleState != null) { + if (FacadeHelper.areFacadesVisible()) { + IQuadTransformer transformer = quad -> quad.tintIndex = ConduitFacadeColor + .moveTintIndex(quad.getTintIndex()); + + if (bundleState.hasFacade()) { + BlockState facade = bundleState.facade(); + var model = Minecraft.getInstance().getBlockRenderer().getBlockModel(facade); + var facadeQuads = model.getQuads(facade, side, rand, data, renderType); + + if (renderType != null && model.getRenderTypes(facade, rand, data).contains(renderType)) { + quads.addAll(transformer.process(facadeQuads)); + } + } + + // If the facade should hide the conduits, escape early. + if (bundleState.hasFacade()) { + if (bundleState.doesFacadeHideConduits()) { + return quads; + } + } + } + + Direction.Axis axis = bundleState.mainAxis(); + Map>, List> offsets = new HashMap<>(); + + for (Direction direction : Direction.values()) { + boolean isEnd = bundleState.isConnectionEndpoint(direction); + Direction preRotation = rotateDirection(direction, side); + IQuadTransformer rotation = QuadTransformers.applying(rotateTransformation(direction)); + + if (isEnd) { + quads.addAll(rotation.process( + modelOf(CONDUIT_CONNECTOR).getQuads(state, preRotation, rand, extraData, renderType))); + } + + var connectedTypes = bundleState.getConnectedConduits(direction); + for (int i = 0; i < connectedTypes.size(); i++) { + Holder> conduit = connectedTypes.get(i); + ConduitGraphObject node = bundleState.getNode(conduit); + + Vec3i offset = OffsetHelper.translationFor(direction.getAxis(), + OffsetHelper.offsetConduit(i, connectedTypes.size())); + offsets.computeIfAbsent(conduit, ignored -> new ArrayList<>()).add(offset); + IQuadTransformer rotationTranslation = rotation + .andThen(QuadTransformers.applying(translateTransformation(offset))); + quads.addAll(new ConduitTextureEmissiveQuadTransformer(sprite(bundleState.getTexture(conduit)), 0) + .andThen(rotationTranslation) + .process(modelOf(CONDUIT_CONNECTION).getQuads(state, preRotation, rand, extraData, + renderType))); + + ConduitCoreModelModifier conduitCoreModifier = ConduitCoreModelModifiers + .getModifier(conduit.value().type()); + if (conduitCoreModifier != null) { + quads.addAll(rotationTranslation.process(conduitCoreModifier.createConnectionQuads(conduit, + node, side, direction, rand, renderType))); + } + + if (isEnd) { + quads.addAll(rotationTranslation.process(modelOf(CONDUIT_CONNECTION_BOX).getQuads(state, + preRotation, rand, extraData, renderType))); + + var connectionState = bundleState.getConnectionState(direction, conduit); + if (connectionState != null) { + IQuadTransformer color = rotationTranslation + .andThen(new ColorQuadTransformer(connectionState.inputChannel(), connectionState.outputChannel())); + + BakedModel model = switch (connectionState.mode()) { + case IN -> modelOf(CONDUIT_IO_IN); + case OUT -> modelOf(CONDUIT_IO_OUT); + case BOTH -> modelOf(CONDUIT_IO_IN_OUT); + }; + + if (model != null) { + quads.addAll( + color.process(model.getQuads(state, preRotation, rand, extraData, renderType))); + } + + if (connectionState.redstoneControl() == RedstoneControl.ACTIVE_WITH_SIGNAL + || connectionState.redstoneControl() == RedstoneControl.ACTIVE_WITHOUT_SIGNAL) { + quads.addAll(rotationTranslation + .andThen(new ColorQuadTransformer(null, connectionState.redstoneChannel())) + .process(modelOf(CONDUIT_IO_REDSTONE).getQuads(state, preRotation, rand, + extraData, renderType))); + } + } + } + } + } + + var allTypes = bundleState.conduits(); + @Nullable + Area box = null; + Map>, Integer> notRendered = new HashMap<>(); + List>> rendered = new ArrayList<>(); + for (int i = 0; i < allTypes.size(); i++) { + var type = allTypes.get(i); + @Nullable + List offsetsForType = offsets.get(type); + if (offsetsForType != null) { + // all are pointing to the same xyz reference meaning that we can draw the core + if (offsetsForType.stream().distinct().count() == 1) { + rendered.add(type); + } else { + if (box == null) { + box = new Area(offsetsForType.toArray(new Vec3i[0])); + } else { + offsetsForType.forEach(box::makeContain); + } + } + } else { + notRendered.put(type, i); + } + } + + Set duplicateFinder = new HashSet<>(); + // rendered have only one distinct pos, so I can safely assume get(0) is valid + List duplicatePositions = rendered.stream() + .map(offsets::get) + .map(List::getFirst) + .filter(n -> !duplicateFinder.add(n)) + .toList(); + for (Vec3i duplicatePosition : duplicatePositions) { + if (box == null) { + box = new Area(duplicatePosition); + } else { + box.makeContain(duplicatePosition); + } + } + for (Holder> toRender : rendered) { + List offsetsForType = offsets.get(toRender); + if (box == null || !box.contains(offsetsForType.getFirst())) { + quads.addAll(new ConduitTextureEmissiveQuadTransformer(sprite(bundleState.getTexture(toRender)), 0) + .andThen(QuadTransformers.applying(translateTransformation(offsetsForType.getFirst()))) + .process(modelOf(CONDUIT_CORE).getQuads(state, side, rand, extraData, renderType))); + } + } + + if (box != null) { + for (Map.Entry>, Integer> notRenderedEntry : notRendered.entrySet()) { + Vec3i offset = OffsetHelper.translationFor(axis, + OffsetHelper.offsetConduit(notRenderedEntry.getValue(), allTypes.size())); + if (!box.contains(offset)) { + quads.addAll(new ConduitTextureEmissiveQuadTransformer( + sprite(bundleState.getTexture(notRenderedEntry.getKey())), 0) + .andThen(QuadTransformers.applying(translateTransformation(offset))) + .process(modelOf(CONDUIT_CORE).getQuads(state, side, rand, extraData, + renderType))); + } + } + + quads.addAll(new BoxTextureQuadTransformer(box.size()) + .andThen(QuadTransformers.applying(translateTransformation(box.getMin()))) + .process(modelOf(BOX).getQuads(state, side, rand, extraData, renderType))); + } else { + for (Map.Entry>, Integer> notRenderedEntry : notRendered.entrySet()) { + quads.addAll(new ConduitTextureEmissiveQuadTransformer( + sprite(bundleState.getTexture(notRenderedEntry.getKey())), 0).andThen( + QuadTransformers.applying(translateTransformation(OffsetHelper.translationFor(axis, + OffsetHelper.offsetConduit(notRenderedEntry.getValue(), allTypes.size()))))) + .process(modelOf(CONDUIT_CORE).getQuads(state, side, rand, extraData, renderType))); + } + } + } + + return quads; + } + + /** + * @param toDirection the Direction you want to transform to from the Bottom as base + * @param toTransform the Direction to follow the same Transformation as bottom -> toDirection + * @return the Direction toTransform was transformed to + */ + @Nullable + public static Direction rotateDirection(Direction toDirection, @Nullable Direction toTransform) { + if (toTransform == null) { + return null; + } + + return switch (toDirection) { + case DOWN -> toTransform; + case UP -> toTransform.getClockWise(Direction.Axis.Z).getClockWise(Direction.Axis.Z); + case NORTH -> toTransform.getCounterClockWise(Direction.Axis.X); + case SOUTH -> toTransform.getClockWise(Direction.Axis.X); + case WEST -> toTransform.getCounterClockWise(Direction.Axis.Z); + case EAST -> toTransform.getClockWise(Direction.Axis.Z); + }; + } + + public static Transformation rotateTransformation(Direction toDirection) { + Quaternionf quaternion = new Quaternionf(); + switch (toDirection) { + case UP -> quaternion.mul(Axis.ZP.rotationDegrees(180)); + case NORTH -> quaternion.mul(Axis.XP.rotationDegrees(90)); + case SOUTH -> quaternion.mul(Axis.XN.rotationDegrees(90)); + case WEST -> quaternion.mul(Axis.ZN.rotationDegrees(90)); + case EAST -> quaternion.mul(Axis.ZP.rotationDegrees(90)); + default -> { + } + } + Transformation transformation = new Transformation(null, quaternion, null, null); + return transformation.applyOrigin(new Vector3f(.5f, .5f, .5f)); + } + + private static Transformation translateTransformation(Vec3i offset) { + return new Transformation(scale(offset, 3 / 16f), null, null, null); + } + + private static Vector3f scale(Vec3i vector, float scaler) { + return new Vector3f(vector.getX() * scaler, vector.getY() * scaler, vector.getZ() * scaler); + } + + @Override + public boolean useAmbientOcclusion() { + return true; + } + + @Override + public boolean isGui3d() { + return false; + } + + @Override + public boolean usesBlockLight() { + return false; + } + + @Override + public boolean isCustomRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleIcon() { + return ModelHelper.getMissingTexture(); + } + + @Override + public TextureAtlasSprite getParticleIcon(ModelData data) { + // TODO temp particle fix + ConduitBundleRenderState bundleState = data.get(ConduitBundleRenderState.PROPERTY); + + if (bundleState == null || bundleState.conduits().isEmpty()) { + return ModelHelper.getMissingTexture(); + } + + if (bundleState.hasFacade()) { + return Minecraft.getInstance() + .getBlockRenderer() + .getBlockModel(bundleState.facade()) + .getParticleIcon(data.get(ConduitBundleBlockEntity.FACADE_MODEL_DATA)); + } + return sprite(bundleState.getTexture(bundleState.conduits().getFirst())); + } + + @Override + public ItemOverrides getOverrides() { + return ItemOverrides.EMPTY; + } + + @Override + public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, + @NotNull ModelData data) { + ChunkRenderTypeSet facadeRenderTypes = data.get(ConduitBundleBlockEntity.FACADE_RENDERTYPE); + ChunkRenderTypeSet renderTypes = ChunkRenderTypeSet.of(RenderType.cutout()); + if (facadeRenderTypes != null) { + renderTypes = ChunkRenderTypeSet.union(renderTypes, facadeRenderTypes); + } + return renderTypes; + } + + @Override + public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState state, ModelData modelData) { + ModelData data = IDynamicBakedModel.super.getModelData(level, pos, state, modelData); + ModelData.Builder builder = data.derive(); + ConduitBundle conduitBundle = data.get(ConduitBundleBlockEntity.BUNDLE_MODEL_PROPERTY); + if (conduitBundle != null && conduitBundle.hasFacade()) { + BlockState blockState = conduitBundle.facade().get().defaultBlockState(); + BakedModel blockModel = Minecraft.getInstance().getBlockRenderer().getBlockModel(blockState); + ModelData facadeData = blockModel.getModelData(level, pos, blockState, ModelData.EMPTY); + builder.with(ConduitBundleBlockEntity.FACADE_MODEL_DATA, facadeData); + builder.with(ConduitBundleBlockEntity.FACADE_RENDERTYPE, blockModel.getRenderTypes(blockState, + new SingleThreadedRandomSource(state.getSeed(pos)), facadeData)); + } + return builder.build(); + } + + private static TextureAtlasSprite sprite(ResourceLocation location) { + return Minecraft.getInstance().getModelManager().getAtlas(InventoryMenu.BLOCK_ATLAS).getSprite(location); + } + + private static boolean isMissingModel(BakedModel model) { + return model == Minecraft.getInstance().getModelManager().getMissingModel(); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitApiImpl.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitApiImpl.java index 795d75ac10..84a2f499a9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitApiImpl.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitApiImpl.java @@ -18,4 +18,9 @@ public ItemStack getStackForType(Holder> conduit, int count) { public Ingredient getIngredientForType(Holder> conduit) { return ConduitIngredient.of(conduit); } + + @Override + public int getConduitSortIndex(Holder> conduit) { + return ConduitSorter.getSortIndex(conduit); + } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java index 4314525c32..244dec18f8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java @@ -7,6 +7,7 @@ import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.core.common.network.NetworkDataSlot; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -82,6 +83,7 @@ public ConduitBundle(Runnable onChanged, BlockPos pos) { this.pos = pos; } + // TODO: If we enable conversion from new to old, this will become public. private ConduitBundle(BlockPos pos, List>> conduits, Map connections, ItemStack facadeItem, Map>, ConduitGraphObject> conduitNodes) { @@ -428,7 +430,7 @@ public ConduitBundle deepCopy() { } // TODO: Clean this up - private static final class ConduitConnection { + public static final class ConduitConnection { public static Codec CODEC = ConnectionState.CODEC.listOf(0, MAX_CONDUITS) .xmap(ConduitConnection::new, i -> Arrays.stream(i.connectionStates).toList()); @@ -443,7 +445,7 @@ private static final class ConduitConnection { return states; }); - ConduitConnection() { + public ConduitConnection() { } private ConduitConnection(List connectionStates) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java index 4e8e07bd9f..0b73fb4d3b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java @@ -5,6 +5,10 @@ import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.ticker.ConduitTicker; import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; +import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; +import com.enderio.conduits.common.conduit.graph.WrappedConduitNetwork; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.init.Conduits; @@ -33,18 +37,20 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.saveddata.SavedData; +import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.LogicalSide; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.tick.LevelTickEvent; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; -@EventBusSubscriber(modid = EnderIOConduits.MODULE_MOD_ID) +@EventBusSubscriber(modid = EnderIOConduits.MODULE_MOD_ID, value = Dist.DEDICATED_SERVER) public class ConduitSavedData extends SavedData { private final Map>, List>> networks = new HashMap<>(); - // Used to find the NodeIdentifier(s) of a conduit when it is loaded + // Used to find the ConduitGraphObject(s) of a conduit when it is loaded private final Map>, Map>> deserializedNodes = new HashMap<>(); private static final Logger LOGGER = LogUtils.getLogger(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/OffsetHelper.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/OffsetHelper.java index 08349f53de..0707176056 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/OffsetHelper.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/OffsetHelper.java @@ -1,6 +1,7 @@ package com.enderio.conduits.common.conduit; import com.enderio.base.common.util.ThrowableUtil; +import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.mojang.logging.LogUtils; import java.util.ArrayList; import java.util.HashMap; @@ -112,6 +113,7 @@ public static Vec3i translationFor(Direction.Axis axis, Vector2i offset) { }; } + @Deprecated public static Direction.Axis findMainAxis(ConduitBundle bundle) { List connectedDirs = new ArrayList<>(); for (Direction dir : Direction.values()) { @@ -127,4 +129,20 @@ public static Direction.Axis findMainAxis(ConduitBundle bundle) { // get Last as MainAxis, because those are the horizontal ones return connectedDirs.get(connectedDirs.size() - 1).getAxis(); } + + public static Direction.Axis findMainAxis(ConduitBundleReader bundle) { + List connectedDirs = new ArrayList<>(); + for (Direction dir : Direction.values()) { + if (!bundle.getConnectedConduits(dir).isEmpty()) { + connectedDirs.add(dir); + } + } + + if (connectedDirs.isEmpty()) { + return Direction.Axis.Z; + } + + // get Last as MainAxis, because those are the horizontal ones + return connectedDirs.get(connectedDirs.size() - 1).getAxis(); + } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java index 0fce50c121..885b7950dc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java @@ -8,7 +8,7 @@ import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.ConduitGraphObject; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.ConduitSavedData; import com.enderio.conduits.common.conduit.RightClickAction; import com.enderio.conduits.common.conduit.connection.ConnectionState; @@ -493,6 +493,10 @@ public ItemStack getCloneItemStack(BlockState state, HitResult target, LevelRead Holder> conduit = blockEntity.getShape().getConduit(pos, target); if (conduit == null) { + if (blockEntity.getBundle().getConduits().isEmpty()) { + return ItemStack.EMPTY; + } + conduit = blockEntity.getBundle().getConduits().getFirst(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java index 9966529db4..38e0d7c266 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java @@ -13,10 +13,10 @@ import com.enderio.conduits.client.particle.ConduitBreakParticle; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.ConduitDataContainer; -import com.enderio.conduits.common.conduit.ConduitGraphContext; -import com.enderio.conduits.common.conduit.ConduitGraphObject; -import com.enderio.conduits.common.conduit.ConduitGraphUtility; +import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; +import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; +import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; import com.enderio.conduits.common.conduit.ConduitSavedData; import com.enderio.conduits.common.conduit.ConduitShape; import com.enderio.conduits.common.conduit.RightClickAction; @@ -236,12 +236,18 @@ public void setRemoved() { } public void everyTick() { - if (level != null && !level.isClientSide) { + if (level == null) { + return; + } + + if (!level.isClientSide) { serverTick(); checkConnection = checkConnection.next(); if (checkConnection.isInitialized()) { updateConnections(level, worldPosition, null, false); } + } else { + clientTick(); } } @@ -564,9 +570,9 @@ private void loadConduitFromSavedData(ConduitSavedData savedData, Holder BlockEntityTicker getTicker(Level level, BlockState state, + BlockEntityType blockEntityType) { + //return createTickerHelper(blockEntityType, typeSupplier.get(), EIOBlockEntity::tick); + return (level1, pos, state1, blockEntity) -> { + if (blockEntity instanceof NewConduitBundleBlockEntity conduitBundleBlockEntity) { + if (level.isClientSide) { + conduitBundleBlockEntity.clientTick(); + } else { + conduitBundleBlockEntity.serverTick(); + } + conduitBundleBlockEntity.endTick(); + } + }; + } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return getBundleShape(level, pos, true); + } + + @Override + protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return getBundleShape(level, pos, false); + } + + private VoxelShape getBundleShape(BlockGetter level, BlockPos pos, boolean canHideFacade) { + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { + if (conduit.hasFacade() && (!canHideFacade || FacadeHelper.areFacadesVisible())) { + return Shapes.block(); + } + + // Ensure if a bundle is bugged with 0 conduits that it can be broken. + if (!conduit.getConduits().isEmpty()) { + return conduit.getShape().getTotalShape(); + } + } + + // If there's no block entity, no shape - this will stop a bounding box flash when the bundle is first placed + return Shapes.empty(); + } + + @Override + public @Nullable PushReaction getPistonPushReaction(BlockState state) { + return PushReaction.BLOCK; + } + + @Override + protected boolean canBeReplaced(BlockState state, BlockPlaceContext useContext) { + return false; + } + + @Override + protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { + conduit.updateConnections(level, pos, neighborPos, true); + } + + super.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston); + } + + // region Water-logging + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue(WATERLOGGED, + context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(WATERLOGGED); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, + BlockPos currentPos, BlockPos neighborPos) { + if (state.getValue(WATERLOGGED)) { + level.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(level)); + } + + if (level.getBlockEntity(currentPos) instanceof NewConduitBundleBlockEntity conduit) { + // TODO.. + //conduit.updateShape(); + } + + return super.updateShape(state, direction, neighborState, level, currentPos, neighborPos); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + // endregion + + // region Place & Destroy Logic + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { + if (!(placer instanceof Player player)) { + return; + } + + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + Holder> conduit = stack.get(ConduitComponents.CONDUIT); + if (conduit != null) { + conduitBundle.addConduit(conduit, player); + } else { + // We might be placed using a facade item. If we are, apply the facade to the new bundle now. + var facadeProvider = stack.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); + if (facadeProvider != null && facadeProvider.isValid()) { + conduitBundle.setFacadeProvider(stack); + } + } + } + } + + @Override + public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, FluidState fluid) { + // TODO: Destroying the last conduit in the block has a laggy disconnect for the neighbours... + + HitResult hit = player.pick(player.blockInteractionRange() + 5, 1, false); + + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + // Client side does nothing special to the bundle. + /*if (level.isClientSide) { + // Only do it on the server - otherwise we get a strange flicker as the connections are removed. + // TODO: is this the right strategy, or should we do bundle remove logic on the client too... + return false; + }*/ + + if (conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()) { + SoundType soundtype = state.getSoundType(level, pos, player); + level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + + if (!player.getAbilities().instabuild) { + conduitBundle.dropFacadeItem(); + } + + int lightLevelBefore = level.getLightEmission(pos); + + conduitBundle.clearFacade(); + + // Handle light update + if (lightLevelBefore != level.getLightEmission(pos)) { + level.getLightEngine().checkBlock(pos); + } + + if (conduitBundle.isEmpty()) { + return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); + } else { + level.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(player, state)); + return false; + } + } else { + Holder> conduit = conduitBundle.getShape() + .getConduit(((BlockHitResult) hit).getBlockPos(), hit); + if (conduit == null) { + if (!conduitBundle.getConduits().isEmpty()) { + level.playSound(player, pos, SoundEvents.GENERIC_SMALL_FALL, SoundSource.BLOCKS, 1F, 1F); + return false; + } + + return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); + } + + SoundType soundtype = state.getSoundType(level, pos, player); + level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + + conduitBundle.removeConduit(conduit, player); + + if (conduitBundle.isEmpty()) { + return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); + } else { + level.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(player, state)); + + if (level.isClientSide) { + ConduitBreakParticle.addDestroyEffects(pos, conduit.value()); + } + return false; + } + } + + } + + return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); + } + + // endregion + + // region Item Interactions + + @Override + protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hitResult) { + + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + var result = addConduit(stack, level, pos, player, conduitBundle); + if (result != ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION) { + return result; + } + + // TODO: Yeta wrench handling + + result = addFacade(stack, level, pos, player, conduitBundle); + if (result != ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION) { + return result; + } + } + + return super.useItemOn(stack, state, level, pos, player, hand, hitResult); + } + + private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos pos, Player player, NewConduitBundleBlockEntity conduitBundle) { + // Get the conduit from the item + Holder> conduit = stack.get(ConduitComponents.CONDUIT); + if (conduit == null) { + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } + + if (!conduitBundle.canAddConduit(conduit)) { + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } + + // Do not consult the bundle on the client. + if (!level.isClientSide()) { + // Attempt to add to the bundle + RightClickAction addResult = conduitBundle.addConduit(conduit, player); + + if (addResult instanceof RightClickAction.Upgrade upgradeResult) { + if (!player.getAbilities().instabuild) { + stack.shrink(1); + player.getInventory() + .placeItemBackInInventory(ConduitBlockItem.getStackFor(upgradeResult.replacedConduit(), 1)); + } + } else if (addResult instanceof RightClickAction.Insert addedResult) { + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } + } else { + if (!FMLLoader.isProduction()) { + throw new IllegalStateException("ConduitBundleAccessor#canAddConduit returned true, but addConduit returned BLOCKED"); + } + + return ItemInteractionResult.FAIL; + } + + BlockState blockState = level.getBlockState(pos); + SoundType soundtype = blockState.getSoundType(level, pos, player); + level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); + } + + return ItemInteractionResult.sidedSuccess(level.isClientSide()); + } + + private ItemInteractionResult addFacade(ItemStack stack, Level level, BlockPos pos, Player player, NewConduitBundleBlockEntity conduitBundle) { + var facadeProvider = stack.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); + if (facadeProvider == null || !facadeProvider.isValid()) { + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } + + if (conduitBundle.hasFacade()) { + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } + + if (!level.isClientSide()) { + int lightLevelBefore = level.getLightEmission(pos); + + conduitBundle.setFacadeProvider(stack); + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } + + // Handle light change + if (lightLevelBefore != level.getLightEmission(pos)) { + level.getLightEngine().checkBlock(pos); + } + + // Block place effects + BlockState blockState = level.getBlockState(pos); + SoundType soundtype = blockState.getSoundType(level, pos, player); + level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); + } + + return ItemInteractionResult.sidedSuccess(level.isClientSide()); + } + + // endregion + + // region Hardcoded Redstone Logic + + @Override + public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos pos, @Nullable Direction direction) { + if (direction == null) { + return false; + } + + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + // TODO + } + + return super.canConnectRedstone(state, level, pos, direction); + } + + @Override + protected int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return super.getSignal(state, level, pos, direction); + } + + @Override + protected int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return super.getDirectSignal(state, level, pos, direction); + } + + // endregion + + // region Facade Behaviours + + private Optional getFacadeBlock(BlockGetter level, BlockPos pos) { + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + if (conduitBundle.hasFacade()) { + return Optional.of(conduitBundle.getFacadeBlock()); + } + } + + return Optional.empty(); + } + + @Override + public BlockState getAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, + @Nullable BlockState queryState, @Nullable BlockPos queryPos) { + + Optional facade = getFacadeBlock(level, pos); + if (facade.isPresent()) { + return facade.get().defaultBlockState(); + } + + return super.getAppearance(state, level, pos, side, queryState, queryPos); + } + + @Override + public int getLightEmission(BlockState state, BlockGetter level, BlockPos pos) { + Optional facade = getFacadeBlock(level, pos); + if (facade.isPresent()) { + return facade.get().getLightEmission(facade.get().defaultBlockState(), level, pos); + } + + return super.getLightEmission(state, level, pos); + } + + @Override + public float getFriction(BlockState state, LevelReader level, BlockPos pos, @Nullable Entity entity) { + Optional facade = getFacadeBlock(level, pos); + if (facade.isPresent()) { + return facade.get().getFriction(facade.get().defaultBlockState(), level, pos, entity); + } + + return super.getFriction(state, level, pos, entity); + } + + @Override + public SoundType getSoundType(BlockState state, LevelReader level, BlockPos pos, @Nullable Entity entity) { + Optional facade = getFacadeBlock(level, pos); + if (facade.isPresent()) { + return facade.get().getSoundType(facade.get().defaultBlockState(), level, pos, entity); + } + + return super.getSoundType(state, level, pos, entity); + } + + @Override + public boolean supportsExternalFaceHiding(BlockState state) { + return true; + } + + // endregion + + @Override + protected void spawnDestroyParticles(Level level, Player player, BlockPos pos, BlockState state) { + // Disabled for custom handling. + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java new file mode 100644 index 0000000000..b3be4c5e0f --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java @@ -0,0 +1,1170 @@ +package com.enderio.conduits.common.conduit.bundle; + +import com.enderio.base.api.UseOnly; +import com.enderio.conduits.ConduitNBTKeys; +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.ConduitCapabilities; +import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.ConduitBundleAccessor; +import com.enderio.conduits.api.facade.FacadeType; +import com.enderio.conduits.client.model.rewrite.conduit.bundle.ConduitBundleRenderState; +import com.enderio.conduits.common.conduit.ConduitBlockItem; +import com.enderio.conduits.common.conduit.ConduitSavedData; +import com.enderio.conduits.common.conduit.ConduitSorter; +import com.enderio.conduits.common.conduit.RightClickAction; +import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.connection.ConnectionState; +import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; +import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; +import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; +import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; +import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; +import com.enderio.conduits.api.connection.ConduitConnectionMode; +import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.ConduitConnection; +import com.enderio.conduits.common.init.ConduitBlockEntities; +import com.enderio.core.common.blockentity.EnderBlockEntity; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import dev.gigaherz.graph3.Graph; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.fml.LogicalSide; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.neoforge.capabilities.BlockCapability; +import net.neoforged.neoforge.capabilities.ICapabilityProvider; +import net.neoforged.neoforge.client.model.data.ModelData; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +public final class NewConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor { + + // TODO: onConnectionsUpdated needs to be fired. + // TODO: need to drop items when connections are removed etc. + // TODO: model is not making junction boxes correctly... + + public static final int MAX_CONDUITS = 9; + + // TODO: The new save format is actually not finished yet. + private static final boolean USE_LEGACY_SAVE_FORMAT = true; + + private ItemStack facadeProvider = ItemStack.EMPTY; + + private List>> conduits = new ArrayList<>(); + + private Map>, ConnectionContainer> conduitConnections = new HashMap<>(); + + private final NewConduitBundleInventory inventory; + + // Map of all conduit nodes for this bundle. + private Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); + + // Used to recover missing nodes when loading the bundle. + private final Map>, ConduitGraphObject> lazyNodes = new HashMap<>(); + private ListTag lazyNodeNBT = new ListTag(); + + private final NewConduitShape shape = new NewConduitShape(); + + // Deferred connection check + private ConduitBundleBlockEntity.UpdateState checkConnection = ConduitBundleBlockEntity.UpdateState.NONE; + + public NewConduitBundleBlockEntity(BlockPos worldPosition, BlockState blockState) { + super(ConduitBlockEntities.CONDUIT.get(), worldPosition, blockState); + + inventory = new NewConduitBundleInventory(this) { + @Override + protected void onChanged() { + setChanged(); + // TODO: Do we need to do anything else here? + } + }; + } + + @Override + public void serverTick() { + super.serverTick(); + + if (level != null) { + checkConnection = checkConnection.next(); + if (checkConnection.isInitialized()) { + updateConnections(level, getBlockPos(), null, false); + } + } + } + + @Override + public void onLoad() { + super.onLoad(); + + updateShape(); + + if (level instanceof ServerLevel serverLevel) { + // Fire on-created events + for (var conduit : conduits) { + conduit.value().onCreated(conduitNodes.get(conduit), level, getBlockPos(), null); + } + + // Attempt to make connections for recovered nodes. + for (var entry : lazyNodes.entrySet()) { + Holder> conduit = entry.getKey(); + ConduitGraphObject node = entry.getValue(); + + Graph graph = Objects.requireNonNull(node.getGraph()); + + for (Direction dir : Direction.values()) { + tryConnectTo(dir, conduit, false); + } + + ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel); + } + } + + // Update lighting engine now that the bundle is loaded + if (level != null && hasFacade()) { + level.getLightEngine().checkBlock(getBlockPos()); + } + } + + /** + * Fire all relevant updates when the conduits or connections change. + */ + private void bundleChanged() { + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); + level.updateNeighborsAt(getBlockPos(), getBlockState().getBlock()); + level.invalidateCapabilities(getBlockPos()); + setChanged(); + updateShape(); + + if (level.isClientSide()) { + updateModel(); + } + } + + // region Shape and Model + + public NewConduitShape getShape() { + return shape; + } + + public void updateShape() { + shape.updateConduit(this); + } + + @UseOnly(LogicalSide.CLIENT) + public void updateModel() { + requestModelDataUpdate(); + if (level != null) { + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), Block.UPDATE_ALL); + } + } + + @Override + public ModelData getModelData() { + return ModelData.builder().with(ConduitBundleRenderState.PROPERTY, ConduitBundleRenderState.of(this)).build(); + } + + // endregion + + // region Menu + + // TODO + + // endregion + + // region Capability Proxies + + public static ICapabilityProvider createCapabilityProvider( + BlockCapability cap) { + return (be, context) -> { + for (Holder> conduit : be.getConduits()) { + var proxiedCap = getProxiedCapability(cap, be, conduit, context); + if (proxiedCap != null) { + return proxiedCap; + } + } + + return null; + }; + } + + @Nullable + private static TCap getProxiedCapability(BlockCapability capability, + NewConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { + + if (blockEntity.level == null) { + return null; + } + + ConduitGraphObject node = blockEntity.conduitNodes.get(conduit); + return conduit.value().proxyCapability(capability, node, blockEntity.level, blockEntity.getBlockPos(), context); + } + + // endregion + + // region Conduits + + public List>> getConduits() { + return conduits; + } + + @Override + public boolean hasConduitByType(Holder> conduit) { + return conduits.stream().anyMatch(c -> c.value().canConnectTo(conduit)); + } + + @Override + public boolean hasConduitStrict(Holder> conduit) { + return conduits.contains(conduit); + } + + @Override + public boolean isEmpty() { + return conduits.isEmpty() && !hasFacade(); + } + + @Override + public boolean isFull() { + return conduits.size() == MAX_CONDUITS; + } + + /** + * Finds a conduit which is replaceable by the given conduit. + * @param possibleReplacement the conduit that may replace another. + * @return the conduit that can be replaced, or empty if none can be replaced. + */ + private Optional>> findReplacementCandidate(Holder> possibleReplacement) { + return conduits.stream() + .filter(existingConduit -> existingConduit.value().canBeReplacedBy(possibleReplacement)) + .findFirst(); + } + + /** + * @param conduit the conduit to check for. + * @return whether the provided conduit is compatible with the other conduits in the bundle. + */ + private boolean isConduitCompatibleWithExisting(Holder> conduit) { + return conduits.stream().allMatch(existingConduit -> existingConduit.value().canBeInSameBundle(conduit)); + } + + @Override + public boolean canAddConduit(Holder> conduit) { + if (level == null) { + return false; + } + + if (isFull()) { + return false; + } + + if (hasConduitStrict(conduit)) { + return false; + } + + if (findReplacementCandidate(conduit).isPresent()) { + return true; + } + + return isConduitCompatibleWithExisting(conduit); + } + + @Override + public RightClickAction addConduit(Holder> conduit, @Nullable Player player) { + if (level == null || !(level instanceof ServerLevel serverLevel)) { + return new RightClickAction.Blocked(); + } + + if (isFull()) { + return new RightClickAction.Blocked(); + } + + if (hasConduitStrict(conduit)) { + return new RightClickAction.Blocked(); + } + + // Attempt to upgrade an existing conduit. + RightClickAction result; + var replacementCandidate = findReplacementCandidate(conduit); + if (replacementCandidate.isPresent()) { + int replacementIndex = conduits.indexOf(replacementCandidate.get()); + conduits.set(replacementIndex, conduit); + + ConduitGraphObject oldNode = conduitNodes.remove(replacementCandidate.get()); + + ConduitGraphObject newNode; + if (oldNode != null) { + // Copy data into the node + newNode = new ConduitGraphObject(getBlockPos(), oldNode.conduitDataContainer()); + conduit.value().onRemoved(oldNode, level, getBlockPos()); + oldNode.getGraph().remove(oldNode); + } else { + newNode = new ConduitGraphObject(getBlockPos()); + } + + setNode(conduit, newNode); + conduit.value().onCreated(newNode, level, getBlockPos(), player); + + result = new RightClickAction.Upgrade(replacementCandidate.get()); + } else { + // Ensure there are no incompatible conduits. + if (!isConduitCompatibleWithExisting(conduit)) { + return new RightClickAction.Blocked(); + } + + // Create the new node + ConduitGraphObject node = new ConduitGraphObject(getBlockPos()); + + // Ensure the conduits list is sorted correctly. + int id = ConduitSorter.getSortIndex(conduit); + var addBefore = conduits.stream().filter(c -> ConduitSorter.getSortIndex(c) > id).findFirst(); + if (addBefore.isPresent()) { + conduits.add(conduits.indexOf(addBefore.get()), conduit); + } else { + conduits.add(conduit); + } + + // Add the node + setNode(conduit, node); + + // Add connections entry + conduitConnections.put(conduit, new ConnectionContainer(conduit)); + + // NeoForge contains a patch that calls onLoad after the conduit has been placed + // if it's the first one, so onCreated would be called twice. it's easier to + // detect here + if (conduits.size() != 1) { + conduit.value().onCreated(node, level, getBlockPos(), player); + } + + result = new RightClickAction.Insert(); + } + + // Attach the new node to its own graph + ConduitGraphUtility.integrate(conduit, getConduitNode(conduit), List.of()); + + // Now attempt to make connections. + for (Direction side : Direction.values()) { + tryConnectTo(side, conduit, false); + } + + ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(getConduitNode(conduit).getGraph()), serverLevel); + + if (result instanceof RightClickAction.Upgrade upgrade && + !upgrade.replacedConduit().value().canConnectTo(conduit)) { + removeNeighborConnections(conduit); + } + + bundleChanged(); + return result; + } + + @Override + public void removeConduit(Holder> conduit, @Nullable Player player) { + if (level == null) { + return; + } + + if (!hasConduitStrict(conduit)) { + if (!FMLLoader.isProduction()) { + throw new IllegalArgumentException( + "Conduit: " + conduit.getRegisteredName() + " is not present in conduit bundle " + + Arrays.toString(conduits.stream().map(Holder::getRegisteredName).toArray())); + } + + return; + } + + // Drop the conduit and it's inventory items. + if (!level.isClientSide()) { + if (player != null && !player.getAbilities().instabuild) { + dropItem(ConduitBlockItem.getStackFor(conduit, 1)); + for (Direction side : Direction.values()) { + dropConnectionItems(side, conduit); + } + } + } + + // Remove neighbour connections + removeNeighborConnections(conduit); + + // Remove from the inventory's storage. + inventory.removeConduit(conduit); + + // Node remove event + var node = conduitNodes.remove(conduit); + conduit.value().onRemoved(node, level, getBlockPos()); + + // Remove from the graph. + if (node.getGraph() != null) { + node.getGraph().remove(node); + } + + // Remove from the bundle + conduits.remove(conduit); + conduitConnections.remove(conduit); + + bundleChanged(); + } + + /** + * Removes connections to neigbouring bundles to the given conduit. + * @param conduit The conduit in this conduit that should be disconnected from other conduits. + */ + public void removeNeighborConnections(Holder> conduit) { + for (Direction dir : Direction.values()) { + if (level.getBlockEntity( + getBlockPos().relative(dir)) instanceof NewConduitBundleBlockEntity neighborBlockEntity) { + neighborBlockEntity.disconnect(dir.getOpposite(), conduit); + } + } + + if (level instanceof ServerLevel serverLevel) { + for (Direction dir : Direction.values()) { + BlockEntity blockEntity = level.getBlockEntity(getBlockPos().relative(dir)); + if (blockEntity instanceof NewConduitBundleBlockEntity neighborBlockEntity + && neighborBlockEntity.hasConduitByType(conduit)) { + Optional.of(neighborBlockEntity.getConduitNode(conduit)) + .map(ConduitGraphObject::getGraph) + .filter(Objects::nonNull) + .ifPresent(graph -> ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel)); + } + } + } + } + + private void dropItem(ItemStack stack) { + if (level != null) { + level.addFreshEntity( + new ItemEntity(level, getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), stack)); + } + } + + @Override + public ConduitGraphObject getConduitNode(Holder> conduit) { + return conduitNodes.get(conduit); + } + + private void setNode(Holder> conduit, ConduitGraphObject loadedNode) { + conduitNodes.put(conduit, loadedNode); + + // Give the node a reference to its inventory. + loadedNode.setInventory(inventory.getInventoryFor(conduit)); + + // Push the current connections through to the node. + var connections = conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new); + for (Direction side : Direction.values()) { + if (connections.getType(side) == ConduitConnectionType.CONNECTED_BLOCK) { + loadedNode.setConnection(side, connections.getConnection(side)); + } else { + loadedNode.setConnection(side, null); + } + } + } + + // endregion + + // region Connections + + @Override + public List>> getConnectedConduits(Direction side) { + return conduitConnections.entrySet().stream() + .filter(e -> e.getValue().getType(side).isConnected()) + .map(Map.Entry::getKey) + .sorted(Comparator.comparingInt(ConduitSorter::getSortIndex)) + .toList(); + } + + @Override + public ConduitConnectionType getConnectionType(Direction side, Holder> conduit) { + return conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new).getType(side); + } + + @Override + public ConduitConnection getConnection(Direction side, Holder> conduit) { + var connections = conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new); + if (connections.getType(side) != ConduitConnectionType.CONNECTED_BLOCK) { + throw new IllegalStateException("Conduit is not connected to a block on this side."); + } + + return conduitConnections.get(conduit).getConnection(side); + } + + @Override + public boolean isEndpoint(Direction side) { + return conduitConnections.values().stream().anyMatch(c -> c.hasEndpoint(side)); + } + + // TODO: This needs a better name or to handle blocks as well as conduits before it can be exposed via the interface. + public boolean canConnectTo(Direction side, Holder> conduit, ConduitGraphObject otherNode, boolean isForcedConnection) { + if (level == null) { + return false; + } + + if (!doTypesMatch(conduit)) { + return false; + } + + if (!conduit.value().canConnectTo(conduitNodes.get(conduit), otherNode)) { + return false; + } + + return isForcedConnection || conduitConnections.get(conduit).getType(side) != ConduitConnectionType.DISABLED; + } + + private boolean doTypesMatch(Holder> conduitToMatch) { + for (Holder> conduit : conduits) { + if (conduit.value().canConnectTo(conduitToMatch)) { + return true; + } + } + + return false; + } + + public boolean tryConnectTo(Direction side, Holder> conduit, boolean isForcedConnection) { + if (level == null) { + return false; + } + + if (!hasConduitStrict(conduit)) { + throw new IllegalArgumentException("Conduit is not present in this bundle."); + } + + // Don't attempt a connection if we already have one, or we're disabled (and not forcing a connection) + ConduitConnectionType currentConnectionType = conduitConnections.get(conduit).getType(side); + if (currentConnectionType.isConnected() || (!isForcedConnection && currentConnectionType == ConduitConnectionType.DISABLED)) { + return false; + } + + var node = conduitNodes.get(conduit); + + if (level.getBlockEntity(getBlockPos().relative(side)) instanceof NewConduitBundleBlockEntity neighbourConduitBundle) { + // Connect to another bundle which has a compatible conduit. + if (neighbourConduitBundle.canConnectTo(side.getOpposite(), conduit, node, isForcedConnection)) { + // Make connections to both sides + connectConduit(side, conduit); + neighbourConduitBundle.connectConduit(side.getOpposite(), conduit); + + // Fire node connection events + var neighbourNode = neighbourConduitBundle.getConduitNode(conduit); + conduit.value().onConnectTo(node, neighbourNode); + conduit.value().onConnectTo(neighbourNode, node); + + // Connect the graphs together + ConduitGraphUtility.connect(conduit, node, neighbourNode); + return true; + } + + return false; + } else if (conduit.value().canConnectTo(level, getBlockPos(), side) + || (isForcedConnection && conduit.value().canForceConnectTo(level, getBlockPos(), side))) { + connectBlock(side, conduit); + return true; + } + + return false; + } + + public void onConnectionsUpdated(Holder> conduit) { + if (level != null && !level.isClientSide) { + var node = getConduitNode(conduit); + + Set connectedSides = Arrays.stream(Direction.values()) + .filter(direction -> getConnectionType(direction, conduit).isConnected()) + .collect(Collectors.toSet()); + + conduit.value().onConnectionsUpdated(node, level, getBlockPos(), connectedSides); + } + } + + private void connectConduit(Direction side, Holder> conduit) { + conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new).connectConduit(side); + onConnectionsUpdated(conduit); + setChanged(); + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); + updateShape(); + } + + private void connectBlock(Direction side, Holder> conduit) { + conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new).connectBlock(side); + onConnectionsUpdated(conduit); + setChanged(); + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); + updateShape(); + } + + // TODO: poorly named, we're disconnecting from another conduit on the given side. + private void disconnect(Direction side, Holder> conduit) { + // TODO: Old disconnect does a lot more work than this... idk why it cycles through all conduits with canConnectTo + + boolean hasChanged = false; + for (var c : conduits) { + if (c.value().canConnectTo(conduit)) { + conduitConnections.computeIfAbsent(c, ConnectionContainer::new).disconnect(side); + onConnectionsUpdated(c); + hasChanged = true; + } + } + + if (hasChanged) { + setChanged(); + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); + updateShape(); + } + } + + private void dropConnectionItems(Direction side, Holder> conduit) { + for (SlotType slotType : SlotType.values()) { + ItemStack stack = inventory.getStackInSlot(conduit, side, slotType); + if (!stack.isEmpty()) { + dropItem(stack); + inventory.setStackInSlot(conduit, side, slotType, ItemStack.EMPTY); + } + } + } + + // TODO: I've not properly reviewed this method. + public void updateConnections(Level level, BlockPos pos, @Nullable BlockPos fromPos, boolean shouldActivate) { + if (fromPos != null && level.getBlockEntity(fromPos) instanceof NewConduitBundleBlockEntity) { + return; + } + + for (Direction side : Direction.values()) { + for (var conduit : conduits) { + if (shouldActivate && conduit.value().hasConnectionDelay()) { + checkConnection = checkConnection.activate(); + continue; + } + + var currentConnectionType = getConnectionType(side, conduit); + + if (currentConnectionType == ConduitConnectionType.NONE) { + tryConnectTo(side, conduit, false); + } else if (currentConnectionType == ConduitConnectionType.CONNECTED_BLOCK) { + if (!conduit.value().canForceConnectTo(level, getBlockPos(), side)) { + dropConnectionItems(side, conduit); + disconnect(side, conduit); + onConnectionsUpdated(conduit); + } + } + } + } + } + + // endregion + + // region Facades + + @Override + public boolean hasFacade() { + return !facadeProvider.isEmpty() && facadeProvider.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER) != null; + } + + @Override + public Block getFacadeBlock() { + if (facadeProvider.isEmpty()) { + throw new IllegalStateException("This bundle has no facade provider."); + } + + var provider = facadeProvider.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); + if (provider == null) { + // TODO: How to handle this error gracefully? + // For now default to a bedrock facade. + return Blocks.BEDROCK; + } + + return provider.block(); + } + + @Override + public FacadeType getFacadeType() { + if (facadeProvider.isEmpty()) { + throw new IllegalStateException("This bundle has no facade provider."); + } + + var provider = facadeProvider.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); + if (provider == null) { + return FacadeType.BASIC; + } + + return provider.type(); + } + + @Override + public ItemStack getFacadeProvider() { + return facadeProvider; + } + + @Override + public void setFacadeProvider(ItemStack facadeProvider) { + this.facadeProvider = facadeProvider; + bundleChanged(); + } + + @Override + public void clearFacade() { + this.facadeProvider = ItemStack.EMPTY; + bundleChanged(); + } + + public void dropFacadeItem() { + dropItem(facadeProvider); + } + + // endregion + + // region Network Sync + + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { + super.onDataPacket(net, pkt, lookupProvider); + + // Update shape and model after receiving an update from the server. + updateShape(); + updateModel(); + } + + @Override + public void handleUpdateTag(CompoundTag syncData, HolderLookup.Provider lookupProvider) { + super.handleUpdateTag(syncData, lookupProvider); + + // Update shape and model after receiving an update from the server. + updateShape(); + updateModel(); + } + + // endregion + + // region Serialization + + @Override + public void setLevel(Level level) { + super.setLevel(level); + + if (!level.isClientSide()) { + loadFromSavedData(); + } + } + + @UseOnly(LogicalSide.SERVER) + private void loadFromSavedData() { + if (!(level instanceof ServerLevel serverLevel)) { + return; + } + + ConduitSavedData savedData = ConduitSavedData.get(serverLevel); + for (int i = 0; i < conduits.size(); i++) { + Holder> type = conduits.get(i); + loadConduitFromSavedData(savedData, type, i); + } + + lazyNodeNBT.clear(); + } + + @UseOnly(LogicalSide.SERVER) + private void loadConduitFromSavedData(ConduitSavedData savedData, Holder> conduit, int typeIndex) { + if (level == null) { + return; + } + + ConduitGraphObject node = savedData.takeUnloadedNodeIdentifier(conduit, this.worldPosition); + if (node == null && conduitNodes.get(conduit) == null) { + ConduitDataContainer dataContainer = null; + if (typeIndex < lazyNodeNBT.size()) { + dataContainer = ConduitDataContainer.parse(level.registryAccess(), lazyNodeNBT.getCompound(typeIndex)); + } + + node = new ConduitGraphObject(worldPosition, dataContainer); + ConduitGraphUtility.integrate(conduit, node, List.of()); + setNode(conduit, node); + lazyNodes.put(conduit, node); + } else if (node != null) { + setNode(conduit, node); + } + } + + @Override + public void onChunkUnloaded() { + super.onChunkUnloaded(); + + if (level instanceof ServerLevel serverLevel) { + var savedData = ConduitSavedData.get(serverLevel); + + for (var conduit : conduits) { + var node = conduitNodes.get(conduit); + conduit.value().onRemoved(node, level, getBlockPos()); + savedData.putUnloadedNodeIdentifier(conduit, this.worldPosition, node); + } + } + } + + @Override + public void setRemoved() { + super.setRemoved(); + + // TODO: Remove from facade map. + } + + private static final String FACADE_PROVIDER_KEY = "FacadeProvider"; + private static final String CONDUITS_KEY = "Conduits"; + private static final String CONNECTIONS_KEY = "Connections"; + private static final String NODES_KEY = "Nodes"; + public static final String CONDUIT_INV_KEY = "ConduitInv"; + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + tag.put(CONDUIT_INV_KEY, inventory.serializeNBT(registries)); + + if (!USE_LEGACY_SAVE_FORMAT) { + // Save conduit nodes as another recovery option + // TODO: If we save the node, why do we need the additional CONDUIT_EXTRA_DATA tags... + // ... the same nodes contain the data being saved. + // Done in conduit list order. + ListTag listTag = new ListTag(); + for (Holder> conduit : conduits) { + var data = conduitNodes.get(conduit); + listTag.add(data.save(registries)); + } + tag.put(NODES_KEY, listTag); + } + + // Save node data in case of need for recovery + // Done in conduit list order. + ListTag listTag = new ListTag(); + for (Holder> conduit : conduits) { + var data = conduitNodes.get(conduit).conduitDataContainer(); + listTag.add(data.save(registries)); + } + + tag.put(ConduitNBTKeys.CONDUIT_EXTRA_DATA, listTag); + } + + @Override + protected void saveAdditionalSynced(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditionalSynced(tag, registries); + + // TODO: Only save here if we're using the new save format, if we're using old, add the new format in getUpdateTag? + // it'll mean much less data is sent. + if (USE_LEGACY_SAVE_FORMAT) { + var bundle = createLegacyBundle(); + tag.put(ConduitNBTKeys.CONDUIT_BUNDLE, bundle.save(registries)); + } else { + if (!conduits.isEmpty()) { + ListTag conduitList = new ListTag(); + for (var conduit : conduits) { + conduitList.add(Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit).getOrThrow()); + } + tag.put(CONDUITS_KEY, conduitList); + } + + // TODO: Save connections + + if (!facadeProvider.isEmpty()) { + tag.put(FACADE_PROVIDER_KEY, facadeProvider.save(registries)); + } + } + } + + @Override + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + + if (tag.contains(ConduitNBTKeys.CONDUIT_BUNDLE)) { + var bundle = LegacyConduitBundle.parse(registries, tag.getCompound(ConduitNBTKeys.CONDUIT_BUNDLE)); + loadFromLegacyBundle(bundle); + } else { + // New save format + if (tag.contains(CONDUITS_KEY)) { + ListTag conduitList = tag.getList(CONDUITS_KEY, 10); + for (var conduitTag : conduitList) { + conduits.add(Conduit.CODEC.parse(registries.createSerializationContext(NbtOps.INSTANCE), conduitTag).getOrThrow()); + } + } + + // TODO: Load connections + + if (tag.contains(FACADE_PROVIDER_KEY)) { + facadeProvider = ItemStack.parseOptional(registries, tag.getCompound(FACADE_PROVIDER_KEY)); + } + + if (tag.contains(NODES_KEY)) { + ListTag listTag = tag.getList(NODES_KEY, Tag.TAG_COMPOUND); + for (int i = 0; i < listTag.size(); i++) { + var data = ConduitGraphObject.parse(registries, listTag.getCompound(i)); + setNode(conduits.get(i), data); + } + } + } + + // Load inventory + if (tag.contains(CONDUIT_INV_KEY)) { + inventory.deserializeNBT(registries, tag.getCompound(CONDUIT_INV_KEY)); + } + + // Load node data used for recovery + if (tag.contains(ConduitNBTKeys.CONDUIT_EXTRA_DATA)) { + lazyNodeNBT = tag.getList(ConduitNBTKeys.CONDUIT_EXTRA_DATA, Tag.TAG_COMPOUND); + } + } + + @SuppressWarnings("removal") + private void loadFromLegacyBundle(LegacyConduitBundle bundle) { + // Copy the conduit list + conduits = new ArrayList<>(); + conduits.addAll(bundle.conduits); + + // Copy conduit nodes across + conduitNodes = new HashMap<>(); + for (var entry : bundle.conduitNodes.entrySet()) { + setNode(entry.getKey(), entry.getValue()); + } + + // Copy legacy connections into the new bundle + conduitConnections = new HashMap<>(); + for (var conduit : conduits) { + int conduitIndex = conduits.indexOf(conduit); + var connections = conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new); + + for (Direction side : Direction.values()) { + var legacySide = bundle.connections.get(side); + + var state = legacySide.getConnectionState(conduitIndex); + + if (state == StaticConnectionStates.CONNECTED || state == StaticConnectionStates.CONNECTED_ACTIVE) { + connections.internalSetType(side, ConduitConnectionType.CONNECTED_CONDUIT); + } else if (state == StaticConnectionStates.DISCONNECTED) { + connections.internalSetType(side, ConduitConnectionType.NONE); + } else if (state == StaticConnectionStates.DISABLED) { + connections.internalSetType(side, ConduitConnectionType.DISABLED); + } else if (state instanceof DynamicConnectionState dynamicState) { + connections.internalSetType(side, ConduitConnectionType.CONNECTED_BLOCK); + + ConduitConnectionMode mode; + if (dynamicState.isInsert() && dynamicState.isExtract()) { + mode = ConduitConnectionMode.BOTH; + } else if (dynamicState.isInsert()) { + mode = ConduitConnectionMode.IN; + } else { + mode = ConduitConnectionMode.OUT; + } + + connections.setConnection(side, new ConduitConnection( + mode, + dynamicState.insertChannel(), + dynamicState.extractChannel(), + dynamicState.control(), + dynamicState.redstoneChannel() + )); + + inventory.setStackInSlot(conduit, side, SlotType.FILTER_INSERT, dynamicState.filterInsert()); + inventory.setStackInSlot(conduit, side, SlotType.FILTER_EXTRACT, dynamicState.filterExtract()); + inventory.setStackInSlot(conduit, side, SlotType.UPGRADE_EXTRACT, dynamicState.upgradeExtract()); + } + } + } + } + + @SuppressWarnings("removal") + private LegacyConduitBundle createLegacyBundle() { + Map legacyConnectionsMap = new EnumMap<>(Direction.class); + for (var conduit : conduits) { + int conduitIndex = conduits.indexOf(conduit); + var connections = conduitConnections.get(conduit); + + for (Direction side : Direction.values()) { + var legacySide = legacyConnectionsMap.computeIfAbsent(side, ignored -> new LegacyConduitBundle.ConduitConnection()); + + var type = connections.getType(side); + if (type == ConduitConnectionType.DISABLED) { + legacySide.setConnectionState(conduitIndex, StaticConnectionStates.DISABLED); + } else if (type == ConduitConnectionType.NONE) { + legacySide.setConnectionState(conduitIndex, StaticConnectionStates.DISCONNECTED); + } else if (type == ConduitConnectionType.CONNECTED_CONDUIT) { + legacySide.setConnectionState(conduitIndex, StaticConnectionStates.CONNECTED); + } else if (type == ConduitConnectionType.CONNECTED_BLOCK) { + var connection = connections.getConnection(side); + + var legacyConnection = new DynamicConnectionState( + connection.canInput(), + connection.inputChannel(), + connection.canOutput(), + connection.outputChannel(), + connection.redstoneControl(), + connection.redstoneChannel(), + inventory.getStackInSlot(conduit, side, SlotType.FILTER_INSERT), + inventory.getStackInSlot(conduit, side, SlotType.FILTER_EXTRACT), + inventory.getStackInSlot(conduit, side, SlotType.UPGRADE_EXTRACT) + ); + + legacySide.setConnectionState(conduitIndex, legacyConnection); + } + } + } + + return new LegacyConduitBundle( + getBlockPos(), + conduits, + legacyConnectionsMap, + facadeProvider, + conduitNodes + ); + } + + // endregion + + private class ConnectionContainer { + private final Holder> conduit; + private final Map connectionTypes = new EnumMap<>(Direction.class); + private final Map connectionData = new EnumMap<>(Direction.class); + + public ConnectionContainer(Holder> conduit) { + this.conduit = conduit; + for (Direction dir : Direction.values()) { + connectionTypes.put(dir, ConduitConnectionType.NONE); + } + } + + public ConduitConnectionType getType(Direction side) { + return connectionTypes.getOrDefault(side, ConduitConnectionType.NONE); + } + + /** + * @deprecated Used for legacy data loading only. + */ + @Deprecated + public void internalSetType(Direction side, ConduitConnectionType type) { + connectionTypes.put(side, type); + } + + private void connectConduit(Direction side) { + connectionTypes.put(side, ConduitConnectionType.CONNECTED_CONDUIT); + connectionData.remove(side); + conduitNodes.get(conduit).setConnection(side, null); + } + + private void connectBlock(Direction side) { + connectionTypes.put(side, ConduitConnectionType.CONNECTED_BLOCK); + var defaultConnection = conduit.value().getDefaultConnection(level, getBlockPos(), side); + setConnection(side, defaultConnection); + } + + private void disconnect(Direction side) { + connectionTypes.put(side, ConduitConnectionType.NONE); + connectionData.remove(side); + conduitNodes.get(conduit).setConnection(side, null); + } + + public ConduitConnection getConnection(Direction side) { + return connectionData.get(side); + } + + public void setConnection(Direction side, ConduitConnection connection) { + connectionData.put(side, connection); + conduitNodes.get(conduit).setConnection(side, connection); + } + + public boolean hasEndpoint(Direction side) { + return getType(side) == ConduitConnectionType.CONNECTED_BLOCK; + } + } + + // Matches the same data format as the original conduit bundle. + // Enables us to convert between the new and old formats easily. + @SuppressWarnings("removal") + private record LegacyConduitBundle( + BlockPos pos, + List>> conduits, + Map connections, + ItemStack facadeItem, + Map>, ConduitGraphObject> conduitNodes + ) { + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(i -> i.pos), + Conduit.CODEC.listOf().fieldOf("conduits").forGetter(i -> i.conduits), + Codec.unboundedMap(Direction.CODEC, ConduitConnection.CODEC) + .fieldOf("connections") + .forGetter(i -> i.connections), + ItemStack.OPTIONAL_CODEC.optionalFieldOf("facade", ItemStack.EMPTY).forGetter(i -> i.facadeItem), + Codec.unboundedMap(Conduit.CODEC, ConduitGraphObject.CODEC).fieldOf("nodes").forGetter(i -> i.conduitNodes)) + .apply(instance, LegacyConduitBundle::new)); + + public Tag save(HolderLookup.Provider lookupProvider) { + return CODEC.encodeStart(lookupProvider.createSerializationContext(NbtOps.INSTANCE), this).getOrThrow(); + } + + public static LegacyConduitBundle parse(HolderLookup.Provider lookupProvider, Tag tag) { + return CODEC.decode(lookupProvider.createSerializationContext(NbtOps.INSTANCE), tag).getOrThrow().getFirst(); + } + + public static final class ConduitConnection { + + public static Codec CODEC = ConnectionState.CODEC.listOf(0, MAX_CONDUITS) + .xmap(ConduitConnection::new, i -> Arrays.stream(i.connectionStates).toList()); + + private final ConnectionState[] connectionStates = Util.make(() -> { + var states = new ConnectionState[MAX_CONDUITS]; + Arrays.fill(states, StaticConnectionStates.DISCONNECTED); + return states; + }); + + public ConduitConnection() { + } + + private ConduitConnection(List connectionStates) { + if (connectionStates.size() > MAX_CONDUITS) { + throw new IllegalArgumentException( + "Cannot store more than " + MAX_CONDUITS + " conduit types per bundle."); + } + + for (var i = 0; i < connectionStates.size(); i++) { + this.connectionStates[i] = connectionStates.get(i); + } + } + + public ConnectionState getConnectionState(int index) { + return connectionStates[index]; + } + + public void setConnectionState(int i, ConnectionState state) { + connectionStates[i] = state; + } + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java new file mode 100644 index 0000000000..415021dca7 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java @@ -0,0 +1,206 @@ +package com.enderio.conduits.common.conduit.bundle; + +import com.enderio.base.api.filter.ResourceFilter; +import com.enderio.base.common.init.EIOCapabilities; +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.ConduitCapabilities; +import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.ConduitBundleReader; +import com.enderio.conduits.api.bundle.ConduitInventory; +import com.enderio.conduits.api.upgrade.ConduitUpgrade; +import com.enderio.conduits.common.conduit.SlotData; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.common.util.INBTSerializable; +import net.neoforged.neoforge.items.IItemHandlerModifiable; + +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; + +public class NewConduitBundleInventory implements IItemHandlerModifiable, INBTSerializable { + + // TODO: Currently conduit inventories are fairly strict - we might be able to improve this in the future? + + public static int MAX_SLOTS_PER_CONDUIT = 3; + public static int MAX_CONNECTIONS = Direction.values().length; // 6 + + private static final String CONDUIT_INV_KEY = "ConduitInv"; + + private final ConduitBundleReader conduitBundle; + + private Map>, Map>> conduitSlots = new HashMap<>(); + + public NewConduitBundleInventory(ConduitBundleReader conduitBundle) { + this.conduitBundle = conduitBundle; + } + + protected void onChanged() { + } + + public ConduitInventory getInventoryFor(Holder> conduit) { + return new InventoryReference(this, conduit); + } + + public void removeConduit(Holder> conduit) { + conduitSlots.remove(conduit); + } + + @Override + public int getSlots() { + return MAX_SLOTS_PER_CONDUIT * NewConduitBundleBlockEntity.MAX_CONDUITS * MAX_CONNECTIONS; + } + + @Override + public ItemStack getStackInSlot(int slot) { + if (slot < 0 || slot > getSlots()) { + throw new IndexOutOfBoundsException("Slot out of bounds"); + } + + SlotData slotData = SlotData.of(slot); + if (slotData.conduitIndex() >= conduitBundle.getConduits().size()) { + return ItemStack.EMPTY; + } + + return getStackInSlot(conduitBundle.getConduits().get(slotData.conduitIndex()), slotData.direction(), slotData.slotType()); + } + + public ItemStack getStackInSlot(Holder> conduit, Direction side, SlotType slotType) { + return getStackInSlot(conduit, side, slotType.ordinal()); + } + + public ItemStack getStackInSlot(Holder> conduit, Direction side, int slot) { + if (!conduitBundle.hasConduitStrict(conduit)) { + throw new IllegalArgumentException("Conduit not found in bundle"); + } + + if (slot < 0 || slot >= MAX_SLOTS_PER_CONDUIT) { + throw new IndexOutOfBoundsException("Slot out of bounds"); + } + + var conduitSides = conduitSlots.computeIfAbsent(conduit, ignored -> new EnumMap<>(Direction.class)); + var slots = conduitSides.computeIfAbsent(side, ignored -> NonNullList.withSize(MAX_SLOTS_PER_CONDUIT, ItemStack.EMPTY)); + + return slots.get(slot); + } + + public void setStackInSlot(Holder> conduit, Direction side, int slot, ItemStack stack) { + if (!conduitBundle.hasConduitStrict(conduit)) { + throw new IllegalArgumentException("Conduit not found in bundle"); + } + + if (slot < 0 || slot >= MAX_SLOTS_PER_CONDUIT) { + throw new IndexOutOfBoundsException("Slot out of bounds"); + } + + var conduitSides = conduitSlots.computeIfAbsent(conduit, ignored -> new EnumMap<>(Direction.class)); + var slots = conduitSides.computeIfAbsent(side, ignored -> NonNullList.withSize(MAX_SLOTS_PER_CONDUIT, ItemStack.EMPTY)); + slots.set(slot, stack); + onChanged(); + } + + public void setStackInSlot(Holder> conduit, Direction side, SlotType slotType, ItemStack stack) { + setStackInSlot(conduit, side, slotType.ordinal(), stack); + } + + @Override + public void setStackInSlot(int slot, ItemStack stack) { + if (slot < 0 || slot > getSlots()) { + throw new IndexOutOfBoundsException("Slot out of bounds"); + } + + SlotData slotData = SlotData.of(slot); + if (slotData.conduitIndex() >= conduitBundle.getConduits().size()) { + return; + } + + setStackInSlot(conduitBundle.getConduits().get(slotData.conduitIndex()), slotData.direction(), slotData.slotType(), stack); + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + return null; + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return null; + } + + @Override + public int getSlotLimit(int slot) { + return 1; + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + if (slot >= getSlots()) { + return false; + } + + SlotData slotData = SlotData.of(slot); + if (slotData.conduitIndex() >= conduitBundle.getConduits().size()) { + return false; + } + + Holder> conduit = conduitBundle.getConduits().get(slotData.conduitIndex()); + + switch (slotData.slotType()) { + case FILTER_EXTRACT: + case FILTER_INSERT: + ResourceFilter resourceFilter = stack.getCapability(EIOCapabilities.Filter.ITEM); + if (resourceFilter == null) { + return false; + } + + return conduit.value().canApplyFilter(slotData.slotType(), resourceFilter); + case UPGRADE_EXTRACT: + ConduitUpgrade conduitUpgrade = stack.getCapability(ConduitCapabilities.CONDUIT_UPGRADE); + if (conduitUpgrade == null) { + return false; + } + + return conduit.value().canApplyUpgrade(slotData.slotType(), conduitUpgrade); + default: + return false; + } + } + + @Override + public CompoundTag serializeNBT(HolderLookup.Provider registries) { + CompoundTag tag = new CompoundTag(); + ListTag list = new ListTag(); + for (int i = 0; i < getSlots(); i++) { + ItemStack stack = getStackInSlot(i); + list.add(i, stack.saveOptional(registries)); + } + tag.put(CONDUIT_INV_KEY, list); + return tag; + } + + @Override + public void deserializeNBT(HolderLookup.Provider registries, CompoundTag tag) { + ListTag list = tag.getList(CONDUIT_INV_KEY, Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); i++) { + setStackInSlot(i, ItemStack.parseOptional(registries, list.getCompound(i))); + } + } + + private record InventoryReference(NewConduitBundleInventory inventory, Holder> conduit) implements ConduitInventory { + @Override + public ItemStack getStackInSlot(Direction side, SlotType slotType) { + return inventory.getStackInSlot(conduit, side, slotType); + } + + @Override + public void setStackInSlot(Direction side, SlotType slotType, ItemStack stack) { + inventory.setStackInSlot(conduit, side, slotType, stack); + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java new file mode 100644 index 0000000000..43b2136818 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java @@ -0,0 +1,187 @@ +package com.enderio.conduits.common.conduit.bundle; + +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.bundle.ConduitBundleReader; +import com.enderio.conduits.common.Area; +import com.enderio.conduits.common.conduit.OffsetHelper; +import com.enderio.conduits.api.connection.ConduitConnectionType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class NewConduitShape { + private final Map>, VoxelShape> conduitShapes = new HashMap<>(); + private final Map directionShapes = new HashMap<>(); + private static final VoxelShape CONNECTOR = Block.box(2.5f, 2.5, 15f, 13.5f, 13.5f, 16f); + public static final VoxelShape CONNECTION = Block.box(6.5f, 6.5f, 9.5, 9.5f, 9.5f, 16); + private static final VoxelShape CORE = Block.box(6.5f, 6.5f, 6.5f, 9.5f, 9.5f, 9.5f); + private VoxelShape totalShape = CORE; + + public NewConduitShape() { + + } + + public void updateConduit(ConduitBundleReader bundle) { + this.conduitShapes.clear(); + this.directionShapes.clear(); + for (Holder> conduit : bundle.getConduits()) { + updateShapeForConduit(bundle, conduit); + } + updateTotalShape(); + } + + public VoxelShape getShapeFromHit(BlockPos pos, HitResult result) { + return Optional.ofNullable(this.conduitShapes.get(getConduit(pos, result))).orElse(Shapes.empty()); + } + + @Nullable + public Holder> getConduit(BlockPos pos, HitResult result) { + return getLookUpValue(conduitShapes, pos, result); + } + + @Nullable + public Direction getDirection(BlockPos pos, HitResult result) { + return getLookUpValue(directionShapes, pos, result); + } + + @Nullable + private T getLookUpValue(Map shapes, BlockPos pos, HitResult result) { + for (Map.Entry entry : shapes.entrySet()) { + Vec3 vec3 = result.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); + Optional point = entry.getValue().closestPointTo(vec3); + if (point.isEmpty()) { + continue; + } + + if (point.get().closerThan(vec3, Mth.EPSILON)) { // can't be 0 due to double + return entry.getKey(); + } + } + + return null; + } + + private void updateTotalShape() { + this.totalShape = Shapes.empty(); + this.conduitShapes.values().forEach(s -> this.totalShape = Shapes.joinUnoptimized(this.totalShape, s, BooleanOp.OR)); + totalShape.optimize(); + } + + public VoxelShape getTotalShape() { + return this.totalShape; + } + + private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder> conduit) { + VoxelShape conduitShape = Shapes.empty(); + Direction.Axis axis = OffsetHelper.findMainAxis(conduitBundle); + Map>, List> offsets = new HashMap<>(); + for (Direction direction : Direction.values()) { + VoxelShape directionShape = directionShapes.getOrDefault(direction, Shapes.empty()); + if (conduitBundle.getConnectionType(direction, conduit) == ConduitConnectionType.CONNECTED_BLOCK) { + VoxelShape connectorShape = rotateVoxelShape(CONNECTOR, direction); + directionShape = Shapes.joinUnoptimized(directionShape, connectorShape, BooleanOp.OR); + conduitShape = Shapes.joinUnoptimized(conduitShape, connectorShape, BooleanOp.OR); + } + + var connectedTypes = conduitBundle.getConnectedConduits(direction); + if (connectedTypes.contains(conduit)) { + Vec3i offset = OffsetHelper.translationFor(direction.getAxis(), + OffsetHelper.offsetConduit(connectedTypes.indexOf(conduit), connectedTypes.size())); + offsets.computeIfAbsent(conduit, ignored -> new ArrayList<>()).add(offset); + VoxelShape connectionShape = rotateVoxelShape(CONNECTION, direction).move(offset.getX() * 3f / 16f, offset.getY() * 3f / 16f, + offset.getZ() * 3f / 16f); + directionShape = Shapes.joinUnoptimized(directionShape, connectionShape, BooleanOp.OR); + conduitShape = Shapes.joinUnoptimized(conduitShape, connectionShape, BooleanOp.OR); + } + directionShapes.put(direction, directionShape.optimize()); + } + + var allConduits = conduitBundle.getConduits(); + @Nullable Area box = null; + @Nullable Holder> notRendered = null; + int i = allConduits.indexOf(conduit); + if (i == -1) { + conduitShapes.put(conduit, Shapes.block()); + return; + } + + var type = allConduits.get(i); + @Nullable List offsetsForConduit = offsets.get(type); + if (offsetsForConduit != null) { + //all are pointing to the same xyz reference meaning that we can draw the core + if (offsetsForConduit.stream().distinct().count() != 1) { + box = new Area(offsetsForConduit.toArray(new Vec3i[0])); + } + } else { + notRendered = type; + } + + if (offsetsForConduit != null && (box == null || !box.contains(offsetsForConduit.get(0)))) { + conduitShape = Shapes.joinUnoptimized(conduitShape, + CORE.move(offsetsForConduit.get(0).getX() * 3f / 16f, offsetsForConduit.get(0).getY() * 3f / 16f, offsetsForConduit.get(0).getZ() * 3f / 16f), + BooleanOp.OR); + } + + if (box != null) { + if (notRendered != null) { + Vec3i offset = OffsetHelper.translationFor(axis, OffsetHelper.offsetConduit(i, allConduits.size())); + if (!box.contains(offset)) { + conduitShape = Shapes.joinUnoptimized(conduitShape, CORE.move(offset.getX() * 3f / 16f, offset.getY() * 3f / 16f, offset.getZ() * 3f / 16f), + BooleanOp.OR); + } + } + + conduitShape = Shapes.joinUnoptimized(conduitShape, CORE.move(box.getMin().getX() * 3f / 16f, box.getMin().getY() * 3f / 16f, box.getMin().getZ() * 3f / 16f), + BooleanOp.OR); + } else { + if (notRendered != null) { + Vec3i offset = OffsetHelper.translationFor(axis, OffsetHelper.offsetConduit(i, allConduits.size())); + conduitShape = Shapes.joinUnoptimized(conduitShape, CORE.move(offset.getX() * 3f / 16f, offset.getY() * 3f / 16f, offset.getZ() * 3f / 16f), BooleanOp.OR); + } + } + + conduitShapes.put(conduit, conduitShape.optimize()); + } + + /** + * Rotates a VoxelShape around the center to the specified Direction, Origin is SOUTH + * + * @param toRotate + * @param direction + * @return the rotated VoxelShape + */ + public static VoxelShape rotateVoxelShape(VoxelShape toRotate, Direction direction) { + VoxelShape[] buffer = new VoxelShape[] { toRotate, Shapes.empty() }; + if (direction.get2DDataValue() == -1) { + if (direction == Direction.DOWN) { + buffer[0].forAllBoxes( + (minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(minX, 1 - maxZ, minY, maxX, 1 - minZ, maxY))); + } else { + buffer[0].forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(minX, minZ, minY, maxX, maxZ, maxY))); + } + + return buffer[1]; + } + + for (int i = 0; i < (direction.get2DDataValue()) % 4; i++) { + buffer[0].forAllBoxes( + (minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(1 - maxZ, minY, minX, 1 - minZ, maxY, maxX))); + buffer[0] = buffer[1]; + buffer[1] = Shapes.empty(); + } + + return buffer[0]; + } + +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/package-info.java new file mode 100644 index 0000000000..a0fc67d334 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/package-info.java @@ -0,0 +1,4 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault + +package com.enderio.conduits.common.conduit.bundle; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java index 63bdaa03de..ea12f796b2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java @@ -7,6 +7,7 @@ import net.minecraft.network.codec.StreamCodec; import org.apache.commons.lang3.NotImplementedException; +@Deprecated(forRemoval = true, since = "7.2") public sealed interface ConnectionState permits StaticConnectionStates, DynamicConnectionState { Codec CODEC = diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java index 5c40d8a323..6fef3316cd 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.Map; +@Deprecated(forRemoval = true, since = "7.2") public record DynamicConnectionState( boolean isInsert, DyeColor insertChannel, @@ -70,8 +71,10 @@ public record DynamicConnectionState( ); public static DynamicConnectionState defaultConnection(Level level, BlockPos pos, Direction direction, Holder> type) { - Conduit.ConduitConnectionData defaultConnection = type.value().getDefaultConnection(level, pos, direction); - return new DynamicConnectionState(defaultConnection.isInsert(), DyeColor.GREEN, defaultConnection.isExtract(), DyeColor.GREEN, defaultConnection.control(), DyeColor.RED, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY); + //Conduit.ConduitConnectionData defaultConnection = type.value().getDefaultConnection(level, pos, direction); + //return new DynamicConnectionState(defaultConnection.isInsert(), DyeColor.GREEN, defaultConnection.isExtract(), DyeColor.GREEN, defaultConnection.control(), DyeColor.RED, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY); + // STUB + return new DynamicConnectionState(false, DyeColor.GREEN, true, DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java index 3927c158cd..c60d9064f2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java @@ -17,6 +17,7 @@ * {@linkplain StaticConnectionStates#DISCONNECTED DISCONNECTED} is for no Connection * {@linkplain StaticConnectionStates#DISABLED DISABLED} is for no connection and activly disabled, so they don't connect, when a conduit is placed next to it (this state is set using the wrench or when IO is both disabled the state returns to this) */ +@Deprecated(forRemoval = true, since = "7.2") public enum StaticConnectionStates implements ConnectionState, StringRepresentable { CONNECTED(0, "connected"), CONNECTED_ACTIVE(1, "connected_active"), diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitDataContainer.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java similarity index 98% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitDataContainer.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java index cd06064620..66990823df 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitDataContainer.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit; +package com.enderio.conduits.common.conduit.graph; import com.enderio.conduits.api.ConduitDataAccessor; import com.enderio.conduits.api.ConduitDataType; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitGraphContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java similarity index 98% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitGraphContext.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java index 141a5d3c22..a825ca3631 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitGraphContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit; +package com.enderio.conduits.common.conduit.graph; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.Conduit; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitGraphObject.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java similarity index 78% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitGraphObject.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java index dc992c0868..18a9c68aee 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitGraphObject.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit; +package com.enderio.conduits.common.conduit.graph; import com.enderio.base.api.UseOnly; import com.enderio.base.api.filter.ResourceFilter; @@ -10,6 +10,8 @@ import com.enderio.conduits.api.ConduitNode; import com.enderio.conduits.api.upgrade.ConduitUpgrade; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; +import com.enderio.conduits.api.bundle.ConduitInventory; +import com.enderio.conduits.api.connection.ConduitConnection; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.gigaherz.graph3.Graph; @@ -20,6 +22,9 @@ import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.neoforged.fml.LogicalSide; @@ -47,6 +52,10 @@ public class ConduitGraphObject implements GraphObject, Con private final ConduitDataContainer conduitDataContainer; private final Map connectionStates = new EnumMap<>(Direction.class); + private final Map connections = new EnumMap<>(Direction.class); + + private @Nullable ConduitInventory inventory; + public ConduitGraphObject(BlockPos pos) { this.pos = pos; this.conduitDataContainer = new ConduitDataContainer(); @@ -75,6 +84,23 @@ public ConduitNetwork getParentGraph() { return wrappedGraph; } + public void setInventory(@Nullable ConduitInventory inventory) { + this.inventory = inventory; + } + + public void setConnection(Direction side, @Nullable ConduitConnection connection) { + if (connection != null) { + connections.put(side, connection); + ioStates.put(side, + IOState.of(connection.canInput() ? connection.inputChannel() : null, + connection.canOutput() ? connection.outputChannel() : null, + connection.redstoneControl(), connection.redstoneChannel())); + } else { + connections.remove(side); + ioStates.remove(side); + } + } + public void pushState(Direction direction, DynamicConnectionState connectionState) { this.connectionStates.put(direction, connectionState); ioStates.put(direction, @@ -145,6 +171,14 @@ public ConduitGraphObject deepCopy() { return new ConduitGraphObject(pos, conduitDataContainer.deepCopy()); } + public Tag save(HolderLookup.Provider lookupProvider) { + return CODEC.encodeStart(lookupProvider.createSerializationContext(NbtOps.INSTANCE), this).getOrThrow(); + } + + public static ConduitGraphObject parse(HolderLookup.Provider lookupProvider, Tag tag) { + return CODEC.decode(lookupProvider.createSerializationContext(NbtOps.INSTANCE), tag).getOrThrow().getFirst(); + } + // Separate method to avoid breaking the graph public int hashContents() { return Objects.hash(pos, conduitDataContainer, ioStates, connectionStates); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitGraphUtility.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java similarity index 96% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitGraphUtility.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java index c9ae43652d..3e49339572 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitGraphUtility.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit; +package com.enderio.conduits.common.conduit.graph; import com.enderio.conduits.api.Conduit; import dev.gigaherz.graph3.Graph; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/WrappedConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java similarity index 95% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/WrappedConduitNetwork.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java index 9a2f98ef8a..9107d4934f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/WrappedConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit; +package com.enderio.conduits.common.conduit.graph; import com.enderio.conduits.api.ConduitNetwork; import com.enderio.conduits.api.ConduitNetworkContext; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index 4a607dfd91..d7d9699367 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -5,6 +5,8 @@ import com.enderio.conduits.api.ConduitNode; import com.enderio.conduits.api.ConduitType; import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.connection.ConduitConnection; +import com.enderio.conduits.api.connection.ConduitConnectionMode; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.util.TooltipUtil; @@ -17,6 +19,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; @@ -110,19 +113,26 @@ public void onRemoved(ConduitNode node, Level level, BlockPos pos) { } @Override - public ConduitConnectionData getDefaultConnection(Level level, BlockPos pos, Direction direction) { - IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, pos.relative(direction), direction.getOpposite()); + public ConduitConnection getDefaultConnection(Level level, BlockPos pos, Direction side) { + IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, pos.relative(side), side.getOpposite()); if (capability != null) { - if (!capability.canReceive() && !capability.canExtract()) { + ConduitConnectionMode mode; + + if (capability.canReceive() && capability.canExtract()) { + mode = ConduitConnectionMode.BOTH; + } else if (capability.canReceive()) { + mode = ConduitConnectionMode.IN; + } else { // This ensures that if there's an energy capability that might be pushing but won't allow pulling is present, we can still interact // For example Thermal's Dynamos report false until they have energy in them and flux networks always refuse. - return new ConduitConnectionData(false, true, RedstoneControl.ALWAYS_ACTIVE); + mode = ConduitConnectionMode.OUT; } - return new ConduitConnectionData(capability.canReceive(), capability.canExtract(), RedstoneControl.ALWAYS_ACTIVE); + // TODO: Old EnderIO was red, to not break EIO 7 we'll stick to green. + return new ConduitConnection(mode, DyeColor.GREEN, DyeColor.GREEN); } - return Conduit.super.getDefaultConnection(level, pos, direction); + return Conduit.super.getDefaultConnection(level, pos, side); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java index 27e4a9a3b1..3701bd0886 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java @@ -2,25 +2,21 @@ import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.EnderIOConduits; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; import com.enderio.regilite.holder.RegiliteBlockEntity; import com.enderio.regilite.registry.BlockEntityRegistry; -import net.minecraft.core.Direction; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; -import java.util.Set; -import java.util.stream.Collectors; - @EventBusSubscriber(modid = EnderIOConduits.MODULE_MOD_ID, bus = EventBusSubscriber.Bus.MOD) public class ConduitBlockEntities { private static final BlockEntityRegistry BLOCK_ENTITY_REGISTRY = EnderIOConduits.REGILITE.blockEntityRegistry(); - public static final RegiliteBlockEntity CONDUIT = BLOCK_ENTITY_REGISTRY - .registerBlockEntity("conduit", ConduitBundleBlockEntity::new, ConduitBlocks.CONDUIT); + public static final RegiliteBlockEntity CONDUIT = BLOCK_ENTITY_REGISTRY + .registerBlockEntity("conduit", NewConduitBundleBlockEntity::new, ConduitBlocks.CONDUIT); @SubscribeEvent public static void registerConduitCapabilities(RegisterCapabilitiesEvent event) { @@ -30,7 +26,7 @@ public static void registerConduitCapabilities(RegisterCapabilitiesEvent event) } private static void registerConduitCapability(RegisterCapabilitiesEvent event, BlockCapability capability) { - event.registerBlockEntity(capability, CONDUIT.get(), ConduitBundleBlockEntity.createConduitCap(capability)); + event.registerBlockEntity(capability, CONDUIT.get(), NewConduitBundleBlockEntity.createCapabilityProvider(capability)); } public static void register(IEventBus bus) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlocks.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlocks.java index e6f76603ef..81ab8242d9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlocks.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlocks.java @@ -4,7 +4,7 @@ import com.enderio.conduits.EnderIOConduits; import com.enderio.conduits.client.ConduitFacadeColor; import com.enderio.conduits.common.conduit.ConduitBlockItem; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlock; +import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlock; import com.enderio.conduits.data.model.ConduitBlockState; import com.enderio.regilite.holder.RegiliteBlock; import com.enderio.regilite.registry.BlockRegistry; @@ -19,8 +19,8 @@ public class ConduitBlocks { private static final ItemRegistry ITEM_REGISTRY = EnderIOConduits.REGILITE.itemRegistry(); private static final BlockRegistry BLOCK_REGISTRY = EnderIOConduits.REGILITE.blockRegistry(); - public static final RegiliteBlock CONDUIT = BLOCK_REGISTRY - .registerBlock("conduit", ConduitBundleBlock::new, + public static final RegiliteBlock CONDUIT = BLOCK_REGISTRY + .registerBlock("conduit", NewConduitBundleBlock::new, BlockBehaviour.Properties.of() .strength(1.5f, 10) .noLootTable() diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java index b9afba0b17..bf16bf146d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java @@ -2,8 +2,7 @@ import com.enderio.base.api.EnderIO; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.conduit.ConduitDataContainer; -import com.enderio.core.EnderCore; +import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.network.RegistryFriendlyByteBuf; diff --git a/enderio-machines/src/main/java/com/enderio/machines/common/init/MachineTravelTargets.java b/enderio-machines/src/main/java/com/enderio/machines/common/init/MachineTravelTargets.java index 2cb1d2ea9a..e75994ceec 100644 --- a/enderio-machines/src/main/java/com/enderio/machines/common/init/MachineTravelTargets.java +++ b/enderio-machines/src/main/java/com/enderio/machines/common/init/MachineTravelTargets.java @@ -13,6 +13,7 @@ public class MachineTravelTargets { public static final DeferredRegister> TRAVEL_TARGET_TYPES = DeferredRegister .create(EnderIORegistries.TRAVEL_TARGET_TYPES, EnderIO.NAMESPACE); + public static final DeferredRegister> TRAVEL_TARGET_SERIALIZERS = DeferredRegister .create(EnderIORegistries.TRAVEL_TARGET_SERIALIZERS, EnderIO.NAMESPACE); From 8339eb21a6f47041810aaf2a307b4fe25367e13b Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Fri, 3 Jan 2025 22:20:28 +0000 Subject: [PATCH 02/27] chore: spotlessApply --- .../com/enderio/conduits/api/Conduit.java | 3 +- .../com/enderio/conduits/api/ConduitApi.java | 3 +- .../com/enderio/conduits/api/ConduitData.java | 11 +- .../api/bundle/ConduitBundleAccessor.java | 2 +- .../api/bundle/ConduitBundleReader.java | 5 +- .../api/connection/ConduitConnection.java | 43 ++-- .../api/connection/ConduitConnectionMode.java | 11 +- .../api/connection/ConduitConnectionType.java | 11 +- .../conduits/client/ConduitClientSetup.java | 1 - .../conduits/client/gui/ConduitScreen.java | 88 ++++----- .../client/model/ConduitBlockModel.java | 2 +- .../conduit/bundle/ConduitBundleGeometry.java | 10 +- .../bundle/ConduitBundleRenderState.java | 20 +- .../conduit/bundle/NewConduitBundleModel.java | 17 +- .../common/conduit/ConduitSavedData.java | 1 - .../conduit/block/ConduitBundleBlock.java | 2 +- .../block/ConduitBundleBlockEntity.java | 8 +- .../conduit/bundle/NewConduitBundleBlock.java | 76 ++++--- .../bundle/NewConduitBundleBlockEntity.java | 187 +++++++++--------- .../bundle/NewConduitBundleInventory.java | 25 ++- .../conduit/bundle/NewConduitShape.java | 56 +++--- .../conduit/connection/ConnectionState.java | 1 - .../connection/DynamicConnectionState.java | 115 ++++++----- .../connection/StaticConnectionStates.java | 16 +- .../conduit/graph/ConduitDataContainer.java | 23 +-- .../conduit/graph/ConduitGraphContext.java | 42 ++-- .../conduit/graph/ConduitGraphObject.java | 10 +- .../conduit/graph/ConduitGraphUtility.java | 13 +- .../conduit/graph/WrappedConduitNetwork.java | 9 +- .../conduit/type/energy/EnergyConduit.java | 45 ++--- .../common/init/ConduitBlockEntities.java | 17 +- .../network/C2SSetConduitExtendedData.java | 18 +- 32 files changed, 441 insertions(+), 450 deletions(-) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index df6d56b6eb..61d37eca8e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -145,7 +145,8 @@ default TCapability proxyCapability(BlockCapability> { Codec> CODEC = EnderIOConduitsRegistries.CONDUIT_DATA_TYPE.byNameCodec() - .dispatch(ConduitData::type, ConduitDataType::codec); - StreamCodec> STREAM_CODEC = ByteBufCodecs.registry(EnderIOConduitsRegistries.Keys.CONDUIT_DATA_TYPE) - .dispatch(ConduitData::type, ConduitDataType::streamCodec); + .dispatch(ConduitData::type, ConduitDataType::codec); + StreamCodec> STREAM_CODEC = ByteBufCodecs + .registry(EnderIOConduitsRegistries.Keys.CONDUIT_DATA_TYPE) + .dispatch(ConduitData::type, ConduitDataType::streamCodec); /** * Allows copying of data from a client change. * By default allows no changes. */ default T withClientChanges(T guiData) { - //noinspection unchecked - return (T)this; + // noinspection unchecked + return (T) this; } T deepCopy(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java index 0abf528d21..65148c7386 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java @@ -34,7 +34,7 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { // region Connections // TODO: Should connections be accessible by API? - // Answer: probably not lol. + // Answer: probably not lol. /** * Attempt to connect this conduit something in the given direction. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java index 2c8f4a7829..0fd73149d1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -2,17 +2,16 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.ConduitConnection; +import com.enderio.conduits.api.connection.ConduitConnectionType; import com.enderio.conduits.api.facade.FacadeType; import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; -import com.enderio.conduits.api.connection.ConduitConnectionType; +import java.util.List; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import org.jetbrains.annotations.ApiStatus; -import java.util.List; - /** * Immutable access to a conduit bundle. */ diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java index 2141a55d97..349e2c1a47 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java @@ -10,37 +10,24 @@ // If a conduit does not support redstone control, dye control etc. then set them to a sensible value and ignore it. // TODO: In EnderIO 8 I would like this to be merged into ConduitData somehow. // we could do this in EIO 7, but it would be a much more significant API/save break. -public record ConduitConnection( - ConduitConnectionMode mode, - DyeColor inputChannel, - DyeColor outputChannel, - RedstoneControl redstoneControl, - DyeColor redstoneChannel -) { +public record ConduitConnection(ConduitConnectionMode mode, DyeColor inputChannel, DyeColor outputChannel, + RedstoneControl redstoneControl, DyeColor redstoneChannel) { - public static Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group( - ConduitConnectionMode.CODEC.fieldOf("mode").forGetter(ConduitConnection::mode), - DyeColor.CODEC.fieldOf("input_channel").forGetter(ConduitConnection::inputChannel), - DyeColor.CODEC.fieldOf("output_channel").forGetter(ConduitConnection::outputChannel), - RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(ConduitConnection::redstoneControl), - DyeColor.CODEC.fieldOf("redstone_channel").forGetter(ConduitConnection::redstoneChannel) - ).apply(instance, ConduitConnection::new) - ); + public static Codec CODEC = RecordCodecBuilder + .create(instance -> instance + .group(ConduitConnectionMode.CODEC.fieldOf("mode").forGetter(ConduitConnection::mode), + DyeColor.CODEC.fieldOf("input_channel").forGetter(ConduitConnection::inputChannel), + DyeColor.CODEC.fieldOf("output_channel").forGetter(ConduitConnection::outputChannel), + RedstoneControl.CODEC.fieldOf("redstone_control") + .forGetter(ConduitConnection::redstoneControl), + DyeColor.CODEC.fieldOf("redstone_channel").forGetter(ConduitConnection::redstoneChannel)) + .apply(instance, ConduitConnection::new)); public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ConduitConnectionMode.STREAM_CODEC, - ConduitConnection::mode, - DyeColor.STREAM_CODEC, - ConduitConnection::inputChannel, - DyeColor.STREAM_CODEC, - ConduitConnection::outputChannel, - RedstoneControl.STREAM_CODEC, - ConduitConnection::redstoneControl, - DyeColor.STREAM_CODEC, - ConduitConnection::redstoneChannel, - ConduitConnection::new - ); + ConduitConnectionMode.STREAM_CODEC, ConduitConnection::mode, DyeColor.STREAM_CODEC, + ConduitConnection::inputChannel, DyeColor.STREAM_CODEC, ConduitConnection::outputChannel, + RedstoneControl.STREAM_CODEC, ConduitConnection::redstoneControl, DyeColor.STREAM_CODEC, + ConduitConnection::redstoneChannel, ConduitConnection::new); // No-channel constructor public ConduitConnection(ConduitConnectionMode mode) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java index 068557d012..b0e3c088f1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java @@ -2,13 +2,12 @@ import com.mojang.serialization.Codec; import io.netty.buffer.ByteBuf; +import java.util.function.IntFunction; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.ByIdMap; import net.minecraft.util.StringRepresentable; -import java.util.function.IntFunction; - public enum ConduitConnectionMode implements StringRepresentable { /** * In mode - for conduits which deposit resources or signals into the attached block. @@ -26,10 +25,12 @@ public enum ConduitConnectionMode implements StringRepresentable { */ BOTH("both", true, true); - public static final Codec CODEC = StringRepresentable.fromEnum(ConduitConnectionMode::values); + public static final Codec CODEC = StringRepresentable + .fromEnum(ConduitConnectionMode::values); public static final IntFunction BY_ID = ByIdMap.continuous(Enum::ordinal, values(), - ByIdMap.OutOfBoundsStrategy.ZERO); - public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, Enum::ordinal); + ByIdMap.OutOfBoundsStrategy.ZERO); + public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, + Enum::ordinal); private final String name; private final boolean canInput; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java index d5e4fabc53..139492f3ea 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java @@ -2,13 +2,12 @@ import com.mojang.serialization.Codec; import io.netty.buffer.ByteBuf; +import java.util.function.IntFunction; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.ByIdMap; import net.minecraft.util.StringRepresentable; -import java.util.function.IntFunction; - public enum ConduitConnectionType implements StringRepresentable { /** * This conduit is not connected to anything. @@ -31,10 +30,12 @@ public enum ConduitConnectionType implements StringRepresentable { */ DISABLED("disabled"); - public static final Codec CODEC = StringRepresentable.fromEnum(ConduitConnectionType::values); + public static final Codec CODEC = StringRepresentable + .fromEnum(ConduitConnectionType::values); public static final IntFunction BY_ID = ByIdMap.continuous(Enum::ordinal, values(), - ByIdMap.OutOfBoundsStrategy.ZERO); - public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, Enum::ordinal); + ByIdMap.OutOfBoundsStrategy.ZERO); + public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, + Enum::ordinal); private final String name; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java index 87c3ab74c4..c79833c492 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java @@ -7,7 +7,6 @@ import com.enderio.conduits.client.gui.conduit.ConduitScreenExtensions; import com.enderio.conduits.client.gui.conduit.FluidConduitScreenExtension; import com.enderio.conduits.client.gui.conduit.ItemConduitScreenExtension; -import com.enderio.conduits.client.model.ConduitGeometry; import com.enderio.conduits.client.model.ConduitItemModelLoader; import com.enderio.conduits.client.model.FacadeItemGeometry; import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java index 03804358a3..af9cf4973b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java @@ -1,21 +1,21 @@ package com.enderio.conduits.client.gui; import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.ConduitDataAccessor; +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.base.client.gui.widget.DyeColorPickerWidget; +import com.enderio.base.client.gui.widget.RedstoneControlPickerWidget; +import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitData; +import com.enderio.conduits.api.ConduitDataAccessor; import com.enderio.conduits.api.ConduitDataType; import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.SlotType; import com.enderio.conduits.api.screen.ConduitScreenExtension; -import com.enderio.base.client.gui.widget.DyeColorPickerWidget; -import com.enderio.base.client.gui.widget.RedstoneControlPickerWidget; import com.enderio.conduits.client.gui.conduit.ConduitScreenExtensions; +import com.enderio.conduits.common.conduit.ConduitBundle; import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.base.common.lang.EIOLang; -import com.enderio.conduits.common.conduit.ConduitBundle; import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.menu.ConduitMenu; @@ -23,6 +23,9 @@ import com.enderio.conduits.common.network.C2SSetConduitExtendedData; import com.enderio.core.client.gui.screen.EnderContainerScreen; import com.enderio.core.client.gui.widgets.ToggleIconButton; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; @@ -33,10 +36,6 @@ import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; - public class ConduitScreen extends EnderContainerScreen { public static final ResourceLocation TEXTURE = EnderIO.loc("textures/gui/conduit.png"); @@ -51,10 +50,11 @@ public ConduitScreen(ConduitMenu pMenu, Inventory pPlayerInventory, Component ti this.imageWidth = WIDTH; this.imageHeight = HEIGHT; } - + @Override public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) { - //close and don't render if someone removed the conduit we are looking at or similar + // close and don't render if someone removed the conduit we are looking at or + // similar if (!menu.stillValid(minecraft.player)) { minecraft.player.closeContainer(); } else { @@ -74,9 +74,9 @@ protected void renderBg(GuiGraphics guiGraphics, float partialTicks, int mouseX, guiGraphics.blit(TEXTURE, 102, 7, 255, 0, 1, 97); } - for (SlotType type: SlotType.values()) { + for (SlotType type : SlotType.values()) { if (type.isAvailableFor(data)) { - guiGraphics.blit(TEXTURE, type.getX()-1, type.getY()-1, 206, 0, 18, 18); + guiGraphics.blit(TEXTURE, type.getX() - 1, type.getY() - 1, 206, 0, 18, 18); } } @@ -87,7 +87,7 @@ protected void renderBg(GuiGraphics guiGraphics, float partialTicks, int mouseX, protected void renderLabels(GuiGraphics guiGraphics, int pMouseX, int pMouseY) { ConduitMenuData data = getMenuData(); - guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INSERT, 22 + 16 + 2, 7 + 4, 4210752, false); + guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INSERT, 22 + 16 + 2, 7 + 4, 4210752, false); if (data.showBothEnable()) { guiGraphics.drawString(this.font, ConduitLang.CONDUIT_EXTRACT, 112 + 16 + 2, 7 + 4, 4210752, false); @@ -103,45 +103,35 @@ protected void init() { Vector2i pos = new Vector2i(22, 7).add(getGuiLeft(), getGuiTop()); addRenderableWidget( - ToggleIconButton.createCheckbox(pos.x(), pos.y(), - () -> getOnDynamic(dyn -> dyn.isInsert(), false), - bool -> actOnDynamic(dyn -> dyn.withEnabled(false, bool)))); + ToggleIconButton.createCheckbox(pos.x(), pos.y(), () -> getOnDynamic(dyn -> dyn.isInsert(), false), + bool -> actOnDynamic(dyn -> dyn.withEnabled(false, bool)))); if (data.showBothEnable()) { - addRenderableWidget( - ToggleIconButton.createCheckbox(pos.x() + 90, pos.y(), + addRenderableWidget(ToggleIconButton.createCheckbox(pos.x() + 90, pos.y(), () -> getOnDynamic(dyn -> dyn.isExtract(), false), bool -> actOnDynamic(dyn -> dyn.withEnabled(true, bool)))); } if (data.showColorInsert()) { - addRenderableWidget( - new DyeColorPickerWidget(pos.x(), pos.y() + 20, + addRenderableWidget(new DyeColorPickerWidget(pos.x(), pos.y() + 20, () -> getOnDynamic(dyn -> dyn.insertChannel(), DyeColor.GREEN), - color -> actOnDynamic(dyn -> dyn.withColor(false, color)), - EIOLang.CONDUIT_CHANNEL)); + color -> actOnDynamic(dyn -> dyn.withColor(false, color)), EIOLang.CONDUIT_CHANNEL)); } if (data.showColorExtract()) { - addRenderableWidget( - new DyeColorPickerWidget(pos.x() + 90, pos.y() + 20, + addRenderableWidget(new DyeColorPickerWidget(pos.x() + 90, pos.y() + 20, () -> getOnDynamic(dyn -> dyn.extractChannel(), DyeColor.GREEN), - color -> actOnDynamic(dyn -> dyn.withColor(true, color)), - EIOLang.CONDUIT_CHANNEL)); + color -> actOnDynamic(dyn -> dyn.withColor(true, color)), EIOLang.CONDUIT_CHANNEL)); } if (data.showRedstoneExtract()) { - addRenderableWidget( - new RedstoneControlPickerWidget(pos.x() + 90, pos.y() + 40, + addRenderableWidget(new RedstoneControlPickerWidget(pos.x() + 90, pos.y() + 40, () -> getOnDynamic(dyn -> dyn.control(), RedstoneControl.ACTIVE_WITH_SIGNAL), - mode -> actOnDynamic(dyn -> dyn.withRedstoneMode(mode)), - EIOLang.REDSTONE_MODE)); + mode -> actOnDynamic(dyn -> dyn.withRedstoneMode(mode)), EIOLang.REDSTONE_MODE)); - addRenderableWidget( - new DyeColorPickerWidget(pos.x() + 90 + 20, pos.y() + 40, + addRenderableWidget(new DyeColorPickerWidget(pos.x() + 90 + 20, pos.y() + 40, () -> getOnDynamic(dyn -> dyn.redstoneChannel(), DyeColor.GREEN), - color -> actOnDynamic(dyn -> dyn.withRedstoneChannel(color)), - EIOLang.REDSTONE_CHANNEL)); + color -> actOnDynamic(dyn -> dyn.withRedstoneChannel(color)), EIOLang.REDSTONE_CHANNEL)); } addConduitScreenExtensionWidgets(); @@ -153,10 +143,9 @@ private void addConduitScreenExtensionWidgets() { if (conduitScreenExtension != null) { conduitScreenExtension - .createWidgets(this, conduitDataAccessor, - this::sendExtendedConduitUpdate, menu::getDirection, - new Vector2i(22, 7).add(getGuiLeft(), getGuiTop())) - .forEach(this::addRenderableWidget); + .createWidgets(this, conduitDataAccessor, this::sendExtendedConduitUpdate, menu::getDirection, + new Vector2i(22, 7).add(getGuiLeft(), getGuiTop())) + .forEach(this::addRenderableWidget); } } @@ -170,8 +159,8 @@ private void addConduitSelectionButtons() { for (int i = 0; i < validConnections.size(); i++) { Holder> connection = validConnections.get(i); - addRenderableWidget(new ConduitSelectionButton(getGuiLeft() + 206, getGuiTop() + 4 + 24*i, connection, - this::getConduit, this::setConduitType)); + addRenderableWidget(new ConduitSelectionButton(getGuiLeft() + 206, getGuiTop() + 4 + 24 * i, connection, + this::getConduit, this::setConduitType)); } } @@ -179,22 +168,17 @@ private void sendExtendedConduitUpdate() { Holder> conduit = menu.getConduit(); ConduitGraphObject node = getBundle().getNodeFor(conduit); - PacketDistributor.sendToServer(new C2SSetConduitExtendedData( - menu.getBlockEntity().getBlockPos(), - menu.getConduit(), - node.conduitDataContainer())); + PacketDistributor.sendToServer(new C2SSetConduitExtendedData(menu.getBlockEntity().getBlockPos(), + menu.getConduit(), node.conduitDataContainer())); } private void actOnDynamic(Function map) { if (getConnectionState() instanceof DynamicConnectionState dyn) { - PacketDistributor.sendToServer(new C2SSetConduitConnectionState( - getMenu().getBlockEntity().getBlockPos(), - getMenu().getDirection(), - getMenu().getConduit(), - map.apply(dyn) - )); + PacketDistributor.sendToServer(new C2SSetConduitConnectionState(getMenu().getBlockEntity().getBlockPos(), + getMenu().getDirection(), getMenu().getConduit(), map.apply(dyn))); } } + private T getOnDynamic(Function map, T defaultValue) { return getConnectionState() instanceof DynamicConnectionState dyn ? map.apply(dyn) : defaultValue; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java index 6d6ebda602..485d137287 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java @@ -21,11 +21,11 @@ import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; import com.enderio.conduits.common.Area; import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.OffsetHelper; import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.core.data.model.ModelHelper; import com.mojang.math.Axis; import com.mojang.math.Transformation; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java index d1bace5d01..14b50f0318 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java @@ -3,6 +3,7 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; +import java.util.function.Function; import net.minecraft.client.renderer.block.model.ItemOverrides; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.BakedModel; @@ -13,22 +14,21 @@ import net.neoforged.neoforge.client.model.geometry.IGeometryLoader; import net.neoforged.neoforge.client.model.geometry.IUnbakedGeometry; -import java.util.function.Function; - public class ConduitBundleGeometry implements IUnbakedGeometry { public ConduitBundleGeometry() { } @Override - public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, - ItemOverrides overrides) { + public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, + Function spriteGetter, ModelState modelState, ItemOverrides overrides) { return new NewConduitBundleModel(); } public static class Loader implements IGeometryLoader { @Override - public ConduitBundleGeometry read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) throws JsonParseException { + public ConduitBundleGeometry read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) + throws JsonParseException { return new ConduitBundleGeometry(); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java index 552e1bba81..f560461ebc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java @@ -1,11 +1,14 @@ package com.enderio.conduits.client.model.rewrite.conduit.bundle; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.conduit.OffsetHelper; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.api.bundle.ConduitBundleReader; -import com.enderio.conduits.api.connection.ConduitConnectionType; import com.enderio.conduits.api.connection.ConduitConnection; +import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.common.conduit.OffsetHelper; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; @@ -13,10 +16,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.model.data.ModelProperty; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - public class ConduitBundleRenderState { public static final ModelProperty PROPERTY = new ModelProperty<>(); @@ -25,7 +24,8 @@ public class ConduitBundleRenderState { private List>> conduits; // TODO: Due to the API design, we need to capture the nodes at the moment. - // it could be changed to accept ConduitDataAccessor instead, then we can clone the data storage. + // it could be changed to accept ConduitDataAccessor instead, then we can clone + // the data storage. private Map>, ConduitGraphObject> conduitNodes; private Map>>> conduitsByDirection; @@ -41,7 +41,9 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { renderState.mainAxis = OffsetHelper.findMainAxis(bundle); renderState.conduits = List.copyOf(bundle.getConduits()); - renderState.conduitNodes = bundle.getConduits().stream().collect(HashMap::new, (m, c) -> m.put(c, bundle.getConduitNode(c).deepCopy()), Map::putAll); + renderState.conduitNodes = bundle.getConduits() + .stream() + .collect(HashMap::new, (m, c) -> m.put(c, bundle.getConduitNode(c).deepCopy()), Map::putAll); renderState.conduitsByDirection = new HashMap<>(); for (var side : Direction.values()) { renderState.conduitsByDirection.put(side, bundle.getConnectedConduits(side)); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java index f64b7e471e..99fbaf5642 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java @@ -1,5 +1,7 @@ package com.enderio.conduits.client.model.rewrite.conduit.bundle; +import static com.enderio.conduits.client.ConduitClientSetup.*; + import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.model.ConduitCoreModelModifier; @@ -17,6 +19,7 @@ import com.enderio.core.data.model.ModelHelper; import com.mojang.math.Axis; import com.mojang.math.Transformation; +import java.util.*; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -44,10 +47,6 @@ import org.joml.Quaternionf; import org.joml.Vector3f; -import java.util.*; - -import static com.enderio.conduits.client.ConduitClientSetup.*; - public class NewConduitBundleModel implements IDynamicBakedModel { public static final ModelProperty FACADE_MODEL_DATA = new ModelProperty<>(); @@ -125,13 +124,13 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction var connectionState = bundleState.getConnectionState(direction, conduit); if (connectionState != null) { - IQuadTransformer color = rotationTranslation - .andThen(new ColorQuadTransformer(connectionState.inputChannel(), connectionState.outputChannel())); + IQuadTransformer color = rotationTranslation.andThen(new ColorQuadTransformer( + connectionState.inputChannel(), connectionState.outputChannel())); BakedModel model = switch (connectionState.mode()) { - case IN -> modelOf(CONDUIT_IO_IN); - case OUT -> modelOf(CONDUIT_IO_OUT); - case BOTH -> modelOf(CONDUIT_IO_IN_OUT); + case IN -> modelOf(CONDUIT_IO_IN); + case OUT -> modelOf(CONDUIT_IO_OUT); + case BOTH -> modelOf(CONDUIT_IO_IN_OUT); }; if (model != null) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java index 0b73fb4d3b..6f9fac814d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java @@ -39,7 +39,6 @@ import net.minecraft.world.level.saveddata.SavedData; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.LogicalSide; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.tick.LevelTickEvent; import org.jetbrains.annotations.Nullable; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java index 885b7950dc..9ede542f44 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java @@ -8,12 +8,12 @@ import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.ConduitSavedData; import com.enderio.conduits.common.conduit.RightClickAction; import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitComponents; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java index 38e0d7c266..3a3fa6a38c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java @@ -13,10 +13,6 @@ import com.enderio.conduits.client.particle.ConduitBreakParticle; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; -import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; -import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; import com.enderio.conduits.common.conduit.ConduitSavedData; import com.enderio.conduits.common.conduit.ConduitShape; import com.enderio.conduits.common.conduit.RightClickAction; @@ -24,6 +20,10 @@ import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; +import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; +import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; +import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; +import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.menu.ConduitMenu; import com.enderio.core.common.blockentity.EnderBlockEntity; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java index e971e41f7e..3f5634f459 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java @@ -8,6 +8,7 @@ import com.enderio.conduits.common.conduit.RightClickAction; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitComponents; +import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -47,8 +48,6 @@ import net.neoforged.fml.loading.FMLLoader; import org.jetbrains.annotations.Nullable; -import java.util.Optional; - public class NewConduitBundleBlock extends Block implements EntityBlock { private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; @@ -65,8 +64,9 @@ public NewConduitBundleBlock(Properties properties) { @Override public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, - BlockEntityType blockEntityType) { - //return createTickerHelper(blockEntityType, typeSupplier.get(), EIOBlockEntity::tick); + BlockEntityType blockEntityType) { + // return createTickerHelper(blockEntityType, typeSupplier.get(), + // EIOBlockEntity::tick); return (level1, pos, state1, blockEntity) -> { if (blockEntity instanceof NewConduitBundleBlockEntity conduitBundleBlockEntity) { if (level.isClientSide) { @@ -85,7 +85,8 @@ protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, } @Override - protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, + CollisionContext context) { return getBundleShape(level, pos, false); } @@ -101,7 +102,8 @@ private VoxelShape getBundleShape(BlockGetter level, BlockPos pos, boolean canHi } } - // If there's no block entity, no shape - this will stop a bounding box flash when the bundle is first placed + // If there's no block entity, no shape - this will stop a bounding box flash + // when the bundle is first placed return Shapes.empty(); } @@ -116,7 +118,8 @@ protected boolean canBeReplaced(BlockState state, BlockPlaceContext useContext) } @Override - protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { + protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, + BlockPos neighborPos, boolean movedByPiston) { if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { conduit.updateConnections(level, pos, neighborPos, true); } @@ -129,7 +132,7 @@ protected void neighborChanged(BlockState state, Level level, BlockPos pos, Bloc @Override public BlockState getStateForPlacement(BlockPlaceContext context) { return defaultBlockState().setValue(WATERLOGGED, - context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); + context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); } @Override @@ -139,14 +142,14 @@ protected void createBlockStateDefinition(StateDefinition.Builder> conduit = conduitBundle.getShape() - .getConduit(((BlockHitResult) hit).getBlockPos(), hit); + .getConduit(((BlockHitResult) hit).getBlockPos(), hit); if (conduit == null) { if (!conduitBundle.getConduits().isEmpty()) { level.playSound(player, pos, SoundEvents.GENERIC_SMALL_FALL, SoundSource.BLOCKS, 1F, 1F); @@ -233,7 +241,7 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, SoundType soundtype = state.getSoundType(level, pos, player); level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); conduitBundle.removeConduit(conduit, player); @@ -259,8 +267,8 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, // region Item Interactions @Override - protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hitResult) { + protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, + Player player, InteractionHand hand, BlockHitResult hitResult) { if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { var result = addConduit(stack, level, pos, player, conduitBundle); @@ -279,7 +287,8 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev return super.useItemOn(stack, state, level, pos, player, hand, hitResult); } - private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos pos, Player player, NewConduitBundleBlockEntity conduitBundle) { + private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos pos, Player player, + NewConduitBundleBlockEntity conduitBundle) { // Get the conduit from the item Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit == null) { @@ -299,7 +308,7 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos if (!player.getAbilities().instabuild) { stack.shrink(1); player.getInventory() - .placeItemBackInInventory(ConduitBlockItem.getStackFor(upgradeResult.replacedConduit(), 1)); + .placeItemBackInInventory(ConduitBlockItem.getStackFor(upgradeResult.replacedConduit(), 1)); } } else if (addResult instanceof RightClickAction.Insert addedResult) { if (!player.getAbilities().instabuild) { @@ -307,7 +316,8 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos } } else { if (!FMLLoader.isProduction()) { - throw new IllegalStateException("ConduitBundleAccessor#canAddConduit returned true, but addConduit returned BLOCKED"); + throw new IllegalStateException( + "ConduitBundleAccessor#canAddConduit returned true, but addConduit returned BLOCKED"); } return ItemInteractionResult.FAIL; @@ -316,14 +326,15 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos BlockState blockState = level.getBlockState(pos); SoundType soundtype = blockState.getSoundType(level, pos, player); level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); } return ItemInteractionResult.sidedSuccess(level.isClientSide()); } - private ItemInteractionResult addFacade(ItemStack stack, Level level, BlockPos pos, Player player, NewConduitBundleBlockEntity conduitBundle) { + private ItemInteractionResult addFacade(ItemStack stack, Level level, BlockPos pos, Player player, + NewConduitBundleBlockEntity conduitBundle) { var facadeProvider = stack.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); if (facadeProvider == null || !facadeProvider.isValid()) { return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; @@ -350,7 +361,7 @@ private ItemInteractionResult addFacade(ItemStack stack, Level level, BlockPos p BlockState blockState = level.getBlockState(pos); SoundType soundtype = blockState.getSoundType(level, pos, player); level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); } @@ -362,7 +373,8 @@ private ItemInteractionResult addFacade(ItemStack stack, Level level, BlockPos p // region Hardcoded Redstone Logic @Override - public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos pos, @Nullable Direction direction) { + public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos pos, + @Nullable Direction direction) { if (direction == null) { return false; } @@ -400,7 +412,7 @@ private Optional getFacadeBlock(BlockGetter level, BlockPos pos) { @Override public BlockState getAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, - @Nullable BlockState queryState, @Nullable BlockPos queryPos) { + @Nullable BlockState queryState, @Nullable BlockPos queryPos) { Optional facade = getFacadeBlock(level, pos); if (facade.isPresent()) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java index b3be4c5e0f..6deeb5a3ac 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java @@ -6,6 +6,9 @@ import com.enderio.conduits.api.ConduitCapabilities; import com.enderio.conduits.api.SlotType; import com.enderio.conduits.api.bundle.ConduitBundleAccessor; +import com.enderio.conduits.api.connection.ConduitConnection; +import com.enderio.conduits.api.connection.ConduitConnectionMode; +import com.enderio.conduits.api.connection.ConduitConnectionType; import com.enderio.conduits.api.facade.FacadeType; import com.enderio.conduits.client.model.rewrite.conduit.bundle.ConduitBundleRenderState; import com.enderio.conduits.common.conduit.ConduitBlockItem; @@ -20,14 +23,22 @@ import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; -import com.enderio.conduits.api.connection.ConduitConnectionMode; -import com.enderio.conduits.api.connection.ConduitConnectionType; -import com.enderio.conduits.api.connection.ConduitConnection; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.core.common.blockentity.EnderBlockEntity; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.gigaherz.graph3.Graph; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -57,18 +68,6 @@ import net.neoforged.neoforge.client.model.data.ModelData; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - public final class NewConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor { // TODO: onConnectionsUpdated needs to be fired. @@ -206,7 +205,7 @@ public ModelData getModelData() { // region Capability Proxies public static ICapabilityProvider createCapabilityProvider( - BlockCapability cap) { + BlockCapability cap) { return (be, context) -> { for (Holder> conduit : be.getConduits()) { var proxiedCap = getProxiedCapability(cap, be, conduit, context); @@ -221,7 +220,7 @@ public static ICapabilityProvider TCap getProxiedCapability(BlockCapability capability, - NewConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { + NewConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { if (blockEntity.level == null) { return null; @@ -266,8 +265,8 @@ public boolean isFull() { */ private Optional>> findReplacementCandidate(Holder> possibleReplacement) { return conduits.stream() - .filter(existingConduit -> existingConduit.value().canBeReplacedBy(possibleReplacement)) - .findFirst(); + .filter(existingConduit -> existingConduit.value().canBeReplacedBy(possibleReplacement)) + .findFirst(); } /** @@ -378,10 +377,11 @@ public RightClickAction addConduit(Holder> conduit, @Nullable Player tryConnectTo(side, conduit, false); } - ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(getConduitNode(conduit).getGraph()), serverLevel); + ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(getConduitNode(conduit).getGraph()), + serverLevel); - if (result instanceof RightClickAction.Upgrade upgrade && - !upgrade.replacedConduit().value().canConnectTo(conduit)) { + if (result instanceof RightClickAction.Upgrade upgrade + && !upgrade.replacedConduit().value().canConnectTo(conduit)) { removeNeighborConnections(conduit); } @@ -398,8 +398,8 @@ public void removeConduit(Holder> conduit, @Nullable Player player) { if (!hasConduitStrict(conduit)) { if (!FMLLoader.isProduction()) { throw new IllegalArgumentException( - "Conduit: " + conduit.getRegisteredName() + " is not present in conduit bundle " - + Arrays.toString(conduits.stream().map(Holder::getRegisteredName).toArray())); + "Conduit: " + conduit.getRegisteredName() + " is not present in conduit bundle " + + Arrays.toString(conduits.stream().map(Holder::getRegisteredName).toArray())); } return; @@ -444,7 +444,7 @@ public void removeConduit(Holder> conduit, @Nullable Player player) { public void removeNeighborConnections(Holder> conduit) { for (Direction dir : Direction.values()) { if (level.getBlockEntity( - getBlockPos().relative(dir)) instanceof NewConduitBundleBlockEntity neighborBlockEntity) { + getBlockPos().relative(dir)) instanceof NewConduitBundleBlockEntity neighborBlockEntity) { neighborBlockEntity.disconnect(dir.getOpposite(), conduit); } } @@ -453,11 +453,11 @@ public void removeNeighborConnections(Holder> conduit) { for (Direction dir : Direction.values()) { BlockEntity blockEntity = level.getBlockEntity(getBlockPos().relative(dir)); if (blockEntity instanceof NewConduitBundleBlockEntity neighborBlockEntity - && neighborBlockEntity.hasConduitByType(conduit)) { + && neighborBlockEntity.hasConduitByType(conduit)) { Optional.of(neighborBlockEntity.getConduitNode(conduit)) - .map(ConduitGraphObject::getGraph) - .filter(Objects::nonNull) - .ifPresent(graph -> ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel)); + .map(ConduitGraphObject::getGraph) + .filter(Objects::nonNull) + .ifPresent(graph -> ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel)); } } } @@ -466,7 +466,7 @@ public void removeNeighborConnections(Holder> conduit) { private void dropItem(ItemStack stack) { if (level != null) { level.addFreshEntity( - new ItemEntity(level, getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), stack)); + new ItemEntity(level, getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), stack)); } } @@ -498,11 +498,12 @@ private void setNode(Holder> conduit, ConduitGraphObject loadedNode) @Override public List>> getConnectedConduits(Direction side) { - return conduitConnections.entrySet().stream() - .filter(e -> e.getValue().getType(side).isConnected()) - .map(Map.Entry::getKey) - .sorted(Comparator.comparingInt(ConduitSorter::getSortIndex)) - .toList(); + return conduitConnections.entrySet() + .stream() + .filter(e -> e.getValue().getType(side).isConnected()) + .map(Map.Entry::getKey) + .sorted(Comparator.comparingInt(ConduitSorter::getSortIndex)) + .toList(); } @Override @@ -525,8 +526,10 @@ public boolean isEndpoint(Direction side) { return conduitConnections.values().stream().anyMatch(c -> c.hasEndpoint(side)); } - // TODO: This needs a better name or to handle blocks as well as conduits before it can be exposed via the interface. - public boolean canConnectTo(Direction side, Holder> conduit, ConduitGraphObject otherNode, boolean isForcedConnection) { + // TODO: This needs a better name or to handle blocks as well as conduits before + // it can be exposed via the interface. + public boolean canConnectTo(Direction side, Holder> conduit, ConduitGraphObject otherNode, + boolean isForcedConnection) { if (level == null) { return false; } @@ -561,15 +564,18 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boolean throw new IllegalArgumentException("Conduit is not present in this bundle."); } - // Don't attempt a connection if we already have one, or we're disabled (and not forcing a connection) + // Don't attempt a connection if we already have one, or we're disabled (and not + // forcing a connection) ConduitConnectionType currentConnectionType = conduitConnections.get(conduit).getType(side); - if (currentConnectionType.isConnected() || (!isForcedConnection && currentConnectionType == ConduitConnectionType.DISABLED)) { + if (currentConnectionType.isConnected() + || (!isForcedConnection && currentConnectionType == ConduitConnectionType.DISABLED)) { return false; } var node = conduitNodes.get(conduit); - if (level.getBlockEntity(getBlockPos().relative(side)) instanceof NewConduitBundleBlockEntity neighbourConduitBundle) { + if (level.getBlockEntity( + getBlockPos().relative(side)) instanceof NewConduitBundleBlockEntity neighbourConduitBundle) { // Connect to another bundle which has a compatible conduit. if (neighbourConduitBundle.canConnectTo(side.getOpposite(), conduit, node, isForcedConnection)) { // Make connections to both sides @@ -588,7 +594,7 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boolean return false; } else if (conduit.value().canConnectTo(level, getBlockPos(), side) - || (isForcedConnection && conduit.value().canForceConnectTo(level, getBlockPos(), side))) { + || (isForcedConnection && conduit.value().canForceConnectTo(level, getBlockPos(), side))) { connectBlock(side, conduit); return true; } @@ -601,8 +607,8 @@ public void onConnectionsUpdated(Holder> conduit) { var node = getConduitNode(conduit); Set connectedSides = Arrays.stream(Direction.values()) - .filter(direction -> getConnectionType(direction, conduit).isConnected()) - .collect(Collectors.toSet()); + .filter(direction -> getConnectionType(direction, conduit).isConnected()) + .collect(Collectors.toSet()); conduit.value().onConnectionsUpdated(node, level, getBlockPos(), connectedSides); } @@ -624,9 +630,11 @@ private void connectBlock(Direction side, Holder> conduit) { updateShape(); } - // TODO: poorly named, we're disconnecting from another conduit on the given side. + // TODO: poorly named, we're disconnecting from another conduit on the given + // side. private void disconnect(Direction side, Holder> conduit) { - // TODO: Old disconnect does a lot more work than this... idk why it cycles through all conduits with canConnectTo + // TODO: Old disconnect does a lot more work than this... idk why it cycles + // through all conduits with canConnectTo boolean hasChanged = false; for (var c : conduits) { @@ -688,7 +696,8 @@ public void updateConnections(Level level, BlockPos pos, @Nullable BlockPos from @Override public boolean hasFacade() { - return !facadeProvider.isEmpty() && facadeProvider.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER) != null; + return !facadeProvider.isEmpty() + && facadeProvider.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER) != null; } @Override @@ -700,7 +709,7 @@ public Block getFacadeBlock() { var provider = facadeProvider.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); if (provider == null) { // TODO: How to handle this error gracefully? - // For now default to a bedrock facade. + // For now default to a bedrock facade. return Blocks.BEDROCK; } @@ -752,7 +761,8 @@ public Packet getUpdatePacket() { } @Override - public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { + public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, + HolderLookup.Provider lookupProvider) { super.onDataPacket(net, pkt, lookupProvider); // Update shape and model after receiving an update from the server. @@ -854,7 +864,8 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) if (!USE_LEGACY_SAVE_FORMAT) { // Save conduit nodes as another recovery option - // TODO: If we save the node, why do we need the additional CONDUIT_EXTRA_DATA tags... + // TODO: If we save the node, why do we need the additional CONDUIT_EXTRA_DATA + // tags... // ... the same nodes contain the data being saved. // Done in conduit list order. ListTag listTag = new ListTag(); @@ -880,8 +891,9 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) protected void saveAdditionalSynced(CompoundTag tag, HolderLookup.Provider registries) { super.saveAdditionalSynced(tag, registries); - // TODO: Only save here if we're using the new save format, if we're using old, add the new format in getUpdateTag? - // it'll mean much less data is sent. + // TODO: Only save here if we're using the new save format, if we're using old, + // add the new format in getUpdateTag? + // it'll mean much less data is sent. if (USE_LEGACY_SAVE_FORMAT) { var bundle = createLegacyBundle(); tag.put(ConduitNBTKeys.CONDUIT_BUNDLE, bundle.save(registries)); @@ -889,7 +901,9 @@ protected void saveAdditionalSynced(CompoundTag tag, HolderLookup.Provider regis if (!conduits.isEmpty()) { ListTag conduitList = new ListTag(); for (var conduit : conduits) { - conduitList.add(Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit).getOrThrow()); + conduitList.add( + Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit) + .getOrThrow()); } tag.put(CONDUITS_KEY, conduitList); } @@ -914,7 +928,8 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) if (tag.contains(CONDUITS_KEY)) { ListTag conduitList = tag.getList(CONDUITS_KEY, 10); for (var conduitTag : conduitList) { - conduits.add(Conduit.CODEC.parse(registries.createSerializationContext(NbtOps.INSTANCE), conduitTag).getOrThrow()); + conduits.add(Conduit.CODEC.parse(registries.createSerializationContext(NbtOps.INSTANCE), conduitTag) + .getOrThrow()); } } @@ -985,13 +1000,8 @@ private void loadFromLegacyBundle(LegacyConduitBundle bundle) { mode = ConduitConnectionMode.OUT; } - connections.setConnection(side, new ConduitConnection( - mode, - dynamicState.insertChannel(), - dynamicState.extractChannel(), - dynamicState.control(), - dynamicState.redstoneChannel() - )); + connections.setConnection(side, new ConduitConnection(mode, dynamicState.insertChannel(), + dynamicState.extractChannel(), dynamicState.control(), dynamicState.redstoneChannel())); inventory.setStackInSlot(conduit, side, SlotType.FILTER_INSERT, dynamicState.filterInsert()); inventory.setStackInSlot(conduit, side, SlotType.FILTER_EXTRACT, dynamicState.filterExtract()); @@ -1009,7 +1019,8 @@ private LegacyConduitBundle createLegacyBundle() { var connections = conduitConnections.get(conduit); for (Direction side : Direction.values()) { - var legacySide = legacyConnectionsMap.computeIfAbsent(side, ignored -> new LegacyConduitBundle.ConduitConnection()); + var legacySide = legacyConnectionsMap.computeIfAbsent(side, + ignored -> new LegacyConduitBundle.ConduitConnection()); var type = connections.getType(side); if (type == ConduitConnectionType.DISABLED) { @@ -1021,30 +1032,19 @@ private LegacyConduitBundle createLegacyBundle() { } else if (type == ConduitConnectionType.CONNECTED_BLOCK) { var connection = connections.getConnection(side); - var legacyConnection = new DynamicConnectionState( - connection.canInput(), - connection.inputChannel(), - connection.canOutput(), - connection.outputChannel(), - connection.redstoneControl(), - connection.redstoneChannel(), - inventory.getStackInSlot(conduit, side, SlotType.FILTER_INSERT), - inventory.getStackInSlot(conduit, side, SlotType.FILTER_EXTRACT), - inventory.getStackInSlot(conduit, side, SlotType.UPGRADE_EXTRACT) - ); + var legacyConnection = new DynamicConnectionState(connection.canInput(), connection.inputChannel(), + connection.canOutput(), connection.outputChannel(), connection.redstoneControl(), + connection.redstoneChannel(), + inventory.getStackInSlot(conduit, side, SlotType.FILTER_INSERT), + inventory.getStackInSlot(conduit, side, SlotType.FILTER_EXTRACT), + inventory.getStackInSlot(conduit, side, SlotType.UPGRADE_EXTRACT)); legacySide.setConnectionState(conduitIndex, legacyConnection); } } } - return new LegacyConduitBundle( - getBlockPos(), - conduits, - legacyConnectionsMap, - facadeProvider, - conduitNodes - ); + return new LegacyConduitBundle(getBlockPos(), conduits, legacyConnectionsMap, facadeProvider, conduitNodes); } // endregion @@ -1108,35 +1108,36 @@ public boolean hasEndpoint(Direction side) { // Matches the same data format as the original conduit bundle. // Enables us to convert between the new and old formats easily. @SuppressWarnings("removal") - private record LegacyConduitBundle( - BlockPos pos, - List>> conduits, - Map connections, - ItemStack facadeItem, - Map>, ConduitGraphObject> conduitNodes - ) { + private record LegacyConduitBundle(BlockPos pos, List>> conduits, + Map connections, ItemStack facadeItem, + Map>, ConduitGraphObject> conduitNodes) { + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( BlockPos.CODEC.fieldOf("pos").forGetter(i -> i.pos), Conduit.CODEC.listOf().fieldOf("conduits").forGetter(i -> i.conduits), Codec.unboundedMap(Direction.CODEC, ConduitConnection.CODEC) - .fieldOf("connections") - .forGetter(i -> i.connections), + .fieldOf("connections") + .forGetter(i -> i.connections), ItemStack.OPTIONAL_CODEC.optionalFieldOf("facade", ItemStack.EMPTY).forGetter(i -> i.facadeItem), - Codec.unboundedMap(Conduit.CODEC, ConduitGraphObject.CODEC).fieldOf("nodes").forGetter(i -> i.conduitNodes)) - .apply(instance, LegacyConduitBundle::new)); + Codec.unboundedMap(Conduit.CODEC, ConduitGraphObject.CODEC) + .fieldOf("nodes") + .forGetter(i -> i.conduitNodes)) + .apply(instance, LegacyConduitBundle::new)); public Tag save(HolderLookup.Provider lookupProvider) { return CODEC.encodeStart(lookupProvider.createSerializationContext(NbtOps.INSTANCE), this).getOrThrow(); } public static LegacyConduitBundle parse(HolderLookup.Provider lookupProvider, Tag tag) { - return CODEC.decode(lookupProvider.createSerializationContext(NbtOps.INSTANCE), tag).getOrThrow().getFirst(); + return CODEC.decode(lookupProvider.createSerializationContext(NbtOps.INSTANCE), tag) + .getOrThrow() + .getFirst(); } public static final class ConduitConnection { public static Codec CODEC = ConnectionState.CODEC.listOf(0, MAX_CONDUITS) - .xmap(ConduitConnection::new, i -> Arrays.stream(i.connectionStates).toList()); + .xmap(ConduitConnection::new, i -> Arrays.stream(i.connectionStates).toList()); private final ConnectionState[] connectionStates = Util.make(() -> { var states = new ConnectionState[MAX_CONDUITS]; @@ -1150,7 +1151,7 @@ public ConduitConnection() { private ConduitConnection(List connectionStates) { if (connectionStates.size() > MAX_CONDUITS) { throw new IllegalArgumentException( - "Cannot store more than " + MAX_CONDUITS + " conduit types per bundle."); + "Cannot store more than " + MAX_CONDUITS + " conduit types per bundle."); } for (var i = 0; i < connectionStates.size(); i++) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java index 415021dca7..09d202a184 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java @@ -9,6 +9,9 @@ import com.enderio.conduits.api.bundle.ConduitInventory; import com.enderio.conduits.api.upgrade.ConduitUpgrade; import com.enderio.conduits.common.conduit.SlotData; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; @@ -20,13 +23,10 @@ import net.neoforged.neoforge.common.util.INBTSerializable; import net.neoforged.neoforge.items.IItemHandlerModifiable; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; - public class NewConduitBundleInventory implements IItemHandlerModifiable, INBTSerializable { - // TODO: Currently conduit inventories are fairly strict - we might be able to improve this in the future? + // TODO: Currently conduit inventories are fairly strict - we might be able to + // improve this in the future? public static int MAX_SLOTS_PER_CONDUIT = 3; public static int MAX_CONNECTIONS = Direction.values().length; // 6 @@ -68,7 +68,8 @@ public ItemStack getStackInSlot(int slot) { return ItemStack.EMPTY; } - return getStackInSlot(conduitBundle.getConduits().get(slotData.conduitIndex()), slotData.direction(), slotData.slotType()); + return getStackInSlot(conduitBundle.getConduits().get(slotData.conduitIndex()), slotData.direction(), + slotData.slotType()); } public ItemStack getStackInSlot(Holder> conduit, Direction side, SlotType slotType) { @@ -85,7 +86,8 @@ public ItemStack getStackInSlot(Holder> conduit, Direction side, int } var conduitSides = conduitSlots.computeIfAbsent(conduit, ignored -> new EnumMap<>(Direction.class)); - var slots = conduitSides.computeIfAbsent(side, ignored -> NonNullList.withSize(MAX_SLOTS_PER_CONDUIT, ItemStack.EMPTY)); + var slots = conduitSides.computeIfAbsent(side, + ignored -> NonNullList.withSize(MAX_SLOTS_PER_CONDUIT, ItemStack.EMPTY)); return slots.get(slot); } @@ -100,7 +102,8 @@ public void setStackInSlot(Holder> conduit, Direction side, int slot, } var conduitSides = conduitSlots.computeIfAbsent(conduit, ignored -> new EnumMap<>(Direction.class)); - var slots = conduitSides.computeIfAbsent(side, ignored -> NonNullList.withSize(MAX_SLOTS_PER_CONDUIT, ItemStack.EMPTY)); + var slots = conduitSides.computeIfAbsent(side, + ignored -> NonNullList.withSize(MAX_SLOTS_PER_CONDUIT, ItemStack.EMPTY)); slots.set(slot, stack); onChanged(); } @@ -120,7 +123,8 @@ public void setStackInSlot(int slot, ItemStack stack) { return; } - setStackInSlot(conduitBundle.getConduits().get(slotData.conduitIndex()), slotData.direction(), slotData.slotType(), stack); + setStackInSlot(conduitBundle.getConduits().get(slotData.conduitIndex()), slotData.direction(), + slotData.slotType(), stack); } @Override @@ -192,7 +196,8 @@ public void deserializeNBT(HolderLookup.Provider registries, CompoundTag tag) { } } - private record InventoryReference(NewConduitBundleInventory inventory, Holder> conduit) implements ConduitInventory { + private record InventoryReference(NewConduitBundleInventory inventory, Holder> conduit) + implements ConduitInventory { @Override public ItemStack getStackInSlot(Direction side, SlotType slotType) { return inventory.getStackInSlot(conduit, side, slotType); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java index 43b2136818..6ec83d148d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java @@ -2,9 +2,10 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.bundle.ConduitBundleReader; +import com.enderio.conduits.api.connection.ConduitConnectionType; import com.enderio.conduits.common.Area; import com.enderio.conduits.common.conduit.OffsetHelper; -import com.enderio.conduits.api.connection.ConduitConnectionType; +import java.util.*; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -18,8 +19,6 @@ import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; -import java.util.*; - public class NewConduitShape { private final Map>, VoxelShape> conduitShapes = new HashMap<>(); private final Map directionShapes = new HashMap<>(); @@ -74,7 +73,8 @@ private T getLookUpValue(Map shapes, BlockPos pos, HitResult private void updateTotalShape() { this.totalShape = Shapes.empty(); - this.conduitShapes.values().forEach(s -> this.totalShape = Shapes.joinUnoptimized(this.totalShape, s, BooleanOp.OR)); + this.conduitShapes.values() + .forEach(s -> this.totalShape = Shapes.joinUnoptimized(this.totalShape, s, BooleanOp.OR)); totalShape.optimize(); } @@ -97,10 +97,10 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder new ArrayList<>()).add(offset); - VoxelShape connectionShape = rotateVoxelShape(CONNECTION, direction).move(offset.getX() * 3f / 16f, offset.getY() * 3f / 16f, - offset.getZ() * 3f / 16f); + VoxelShape connectionShape = rotateVoxelShape(CONNECTION, direction).move(offset.getX() * 3f / 16f, + offset.getY() * 3f / 16f, offset.getZ() * 3f / 16f); directionShape = Shapes.joinUnoptimized(directionShape, connectionShape, BooleanOp.OR); conduitShape = Shapes.joinUnoptimized(conduitShape, connectionShape, BooleanOp.OR); } @@ -108,8 +108,10 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder> notRendered = null; + @Nullable + Area box = null; + @Nullable + Holder> notRendered = null; int i = allConduits.indexOf(conduit); if (i == -1) { conduitShapes.put(conduit, Shapes.block()); @@ -117,9 +119,10 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder offsetsForConduit = offsets.get(type); + @Nullable + List offsetsForConduit = offsets.get(type); if (offsetsForConduit != null) { - //all are pointing to the same xyz reference meaning that we can draw the core + // all are pointing to the same xyz reference meaning that we can draw the core if (offsetsForConduit.stream().distinct().count() != 1) { box = new Area(offsetsForConduit.toArray(new Vec3i[0])); } @@ -128,26 +131,30 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder buffer[1] = Shapes.or(buffer[1], Shapes.box(minX, 1 - maxZ, minY, maxX, 1 - minZ, maxY))); + buffer[0].forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = Shapes.or(buffer[1], + Shapes.box(minX, 1 - maxZ, minY, maxX, 1 - minZ, maxY))); } else { - buffer[0].forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(minX, minZ, minY, maxX, maxZ, maxY))); + buffer[0].forAllBoxes((minX, minY, minZ, maxX, maxY, + maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(minX, minZ, minY, maxX, maxZ, maxY))); } return buffer[1]; } for (int i = 0; i < (direction.get2DDataValue()) % 4; i++) { - buffer[0].forAllBoxes( - (minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(1 - maxZ, minY, minX, 1 - minZ, maxY, maxX))); + buffer[0].forAllBoxes((minX, minY, minZ, maxX, maxY, + maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(1 - maxZ, minY, minX, 1 - minZ, maxY, maxX))); buffer[0] = buffer[1]; buffer[1] = Shapes.empty(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java index ea12f796b2..63bdaa03de 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java @@ -7,7 +7,6 @@ import net.minecraft.network.codec.StreamCodec; import org.apache.commons.lang3.NotImplementedException; -@Deprecated(forRemoval = true, since = "7.2") public sealed interface ConnectionState permits StaticConnectionStates, DynamicConnectionState { Codec CODEC = diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java index 6fef3316cd..cd0e5b9678 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java @@ -1,12 +1,14 @@ package com.enderio.conduits.common.conduit.connection; import com.enderio.base.api.UseOnly; +import com.enderio.base.api.misc.RedstoneControl; import com.enderio.base.api.network.MassiveStreamCodec; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.SlotType; -import com.enderio.base.api.misc.RedstoneControl; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import java.util.HashMap; +import java.util.Map; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -18,63 +20,46 @@ import net.minecraft.world.level.Level; import net.neoforged.fml.LogicalSide; -import java.util.HashMap; -import java.util.Map; - @Deprecated(forRemoval = true, since = "7.2") -public record DynamicConnectionState( - boolean isInsert, - DyeColor insertChannel, - boolean isExtract, - DyeColor extractChannel, - RedstoneControl control, - DyeColor redstoneChannel, - @UseOnly(LogicalSide.SERVER) ItemStack filterInsert, - @UseOnly(LogicalSide.SERVER) ItemStack filterExtract, - @UseOnly(LogicalSide.SERVER) ItemStack upgradeExtract -) implements ConnectionState { +public record DynamicConnectionState(boolean isInsert, DyeColor insertChannel, boolean isExtract, + DyeColor extractChannel, RedstoneControl control, DyeColor redstoneChannel, + @UseOnly(LogicalSide.SERVER) ItemStack filterInsert, @UseOnly(LogicalSide.SERVER) ItemStack filterExtract, + @UseOnly(LogicalSide.SERVER) ItemStack upgradeExtract) implements ConnectionState { - public static Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group( - Codec.BOOL.fieldOf("is_insert").forGetter(DynamicConnectionState::isInsert), - DyeColor.CODEC.fieldOf("insert_channel").forGetter(DynamicConnectionState::insertChannel), - Codec.BOOL.fieldOf("is_extract").forGetter(DynamicConnectionState::isExtract), - DyeColor.CODEC.fieldOf("extract_channel").forGetter(DynamicConnectionState::extractChannel), - RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(DynamicConnectionState::control), - DyeColor.CODEC.fieldOf("redstone_channel").forGetter(DynamicConnectionState::redstoneChannel), - ItemStack.OPTIONAL_CODEC.fieldOf("filter_insert").forGetter(DynamicConnectionState::filterInsert), - ItemStack.OPTIONAL_CODEC.fieldOf("filter_extract").forGetter(DynamicConnectionState::filterExtract), - ItemStack.OPTIONAL_CODEC.fieldOf("upgrade_extract").forGetter(DynamicConnectionState::upgradeExtract) - ).apply(instance, DynamicConnectionState::new) - ); + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance + .group(Codec.BOOL.fieldOf("is_insert").forGetter(DynamicConnectionState::isInsert), + DyeColor.CODEC.fieldOf("insert_channel").forGetter(DynamicConnectionState::insertChannel), + Codec.BOOL.fieldOf("is_extract").forGetter(DynamicConnectionState::isExtract), + DyeColor.CODEC.fieldOf("extract_channel").forGetter(DynamicConnectionState::extractChannel), + RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(DynamicConnectionState::control), + DyeColor.CODEC.fieldOf("redstone_channel").forGetter(DynamicConnectionState::redstoneChannel), + ItemStack.OPTIONAL_CODEC.fieldOf("filter_insert").forGetter(DynamicConnectionState::filterInsert), + ItemStack.OPTIONAL_CODEC.fieldOf("filter_extract").forGetter(DynamicConnectionState::filterExtract), + ItemStack.OPTIONAL_CODEC.fieldOf("upgrade_extract") + .forGetter(DynamicConnectionState::upgradeExtract)) + .apply(instance, DynamicConnectionState::new)); - public static StreamCodec STREAM_CODEC = MassiveStreamCodec.composite( - ByteBufCodecs.BOOL, - DynamicConnectionState::isInsert, - DyeColor.STREAM_CODEC, - DynamicConnectionState::insertChannel, - ByteBufCodecs.BOOL, - DynamicConnectionState::isExtract, - DyeColor.STREAM_CODEC, - DynamicConnectionState::extractChannel, - RedstoneControl.STREAM_CODEC, - DynamicConnectionState::control, - DyeColor.STREAM_CODEC, - DynamicConnectionState::redstoneChannel, - ItemStack.OPTIONAL_STREAM_CODEC, - DynamicConnectionState::filterInsert, - ItemStack.OPTIONAL_STREAM_CODEC, - DynamicConnectionState::filterExtract, - ItemStack.OPTIONAL_STREAM_CODEC, - DynamicConnectionState::upgradeExtract, - DynamicConnectionState::new - ); + public static StreamCodec STREAM_CODEC = MassiveStreamCodec + .composite(ByteBufCodecs.BOOL, DynamicConnectionState::isInsert, DyeColor.STREAM_CODEC, + DynamicConnectionState::insertChannel, ByteBufCodecs.BOOL, DynamicConnectionState::isExtract, + DyeColor.STREAM_CODEC, DynamicConnectionState::extractChannel, RedstoneControl.STREAM_CODEC, + DynamicConnectionState::control, DyeColor.STREAM_CODEC, DynamicConnectionState::redstoneChannel, + ItemStack.OPTIONAL_STREAM_CODEC, DynamicConnectionState::filterInsert, + ItemStack.OPTIONAL_STREAM_CODEC, DynamicConnectionState::filterExtract, + ItemStack.OPTIONAL_STREAM_CODEC, DynamicConnectionState::upgradeExtract, + DynamicConnectionState::new); - public static DynamicConnectionState defaultConnection(Level level, BlockPos pos, Direction direction, Holder> type) { - //Conduit.ConduitConnectionData defaultConnection = type.value().getDefaultConnection(level, pos, direction); - //return new DynamicConnectionState(defaultConnection.isInsert(), DyeColor.GREEN, defaultConnection.isExtract(), DyeColor.GREEN, defaultConnection.control(), DyeColor.RED, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY); + public static DynamicConnectionState defaultConnection(Level level, BlockPos pos, Direction direction, + Holder> type) { + // Conduit.ConduitConnectionData defaultConnection = + // type.value().getDefaultConnection(level, pos, direction); + // return new DynamicConnectionState(defaultConnection.isInsert(), + // DyeColor.GREEN, defaultConnection.isExtract(), DyeColor.GREEN, + // defaultConnection.control(), DyeColor.RED, ItemStack.EMPTY, ItemStack.EMPTY, + // ItemStack.EMPTY); // STUB - return new DynamicConnectionState(false, DyeColor.GREEN, true, DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY); + return new DynamicConnectionState(false, DyeColor.GREEN, true, DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, + DyeColor.RED, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY); } @Override @@ -96,23 +81,33 @@ public ItemStack getItem(SlotType slotType) { public DynamicConnectionState withItem(SlotType type, ItemStack stack) { Map items = new HashMap<>(); - for (SlotType type1: SlotType.values()) { - items.put(type1, type1 == type ? stack: getItem(type1)); + for (SlotType type1 : SlotType.values()) { + items.put(type1, type1 == type ? stack : getItem(type1)); } - return new DynamicConnectionState(isInsert, insertChannel, isExtract, extractChannel, control, redstoneChannel, items.get(SlotType.FILTER_INSERT), items.get(SlotType.FILTER_EXTRACT), items.get(SlotType.UPGRADE_EXTRACT)); + return new DynamicConnectionState(isInsert, insertChannel, isExtract, extractChannel, control, redstoneChannel, + items.get(SlotType.FILTER_INSERT), items.get(SlotType.FILTER_EXTRACT), + items.get(SlotType.UPGRADE_EXTRACT)); } + public DynamicConnectionState withEnabled(boolean forExtract, boolean value) { - return new DynamicConnectionState(!forExtract ? value : isInsert, insertChannel, forExtract ? value : isExtract, extractChannel, control, redstoneChannel, filterInsert, filterExtract, upgradeExtract); + return new DynamicConnectionState(!forExtract ? value : isInsert, insertChannel, forExtract ? value : isExtract, + extractChannel, control, redstoneChannel, filterInsert, filterExtract, upgradeExtract); } public DynamicConnectionState withColor(boolean forExtract, DyeColor value) { - return new DynamicConnectionState(isInsert, !forExtract ? value : insertChannel, isExtract, forExtract ? value : extractChannel, control, redstoneChannel, filterInsert, filterExtract, upgradeExtract); + return new DynamicConnectionState(isInsert, !forExtract ? value : insertChannel, isExtract, + forExtract ? value : extractChannel, control, redstoneChannel, filterInsert, filterExtract, + upgradeExtract); } + public DynamicConnectionState withRedstoneMode(RedstoneControl value) { - return new DynamicConnectionState(isInsert, insertChannel, isExtract, extractChannel, value, redstoneChannel, filterInsert, filterExtract, upgradeExtract); + return new DynamicConnectionState(isInsert, insertChannel, isExtract, extractChannel, value, redstoneChannel, + filterInsert, filterExtract, upgradeExtract); } + public DynamicConnectionState withRedstoneChannel(DyeColor value) { - return new DynamicConnectionState(isInsert, insertChannel, isExtract, extractChannel, control, value, filterInsert, filterExtract, upgradeExtract); + return new DynamicConnectionState(isInsert, insertChannel, isExtract, extractChannel, control, value, + filterInsert, filterExtract, upgradeExtract); } public boolean isEmpty() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java index c60d9064f2..10c5212fb6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java @@ -2,13 +2,12 @@ import com.mojang.serialization.Codec; import io.netty.buffer.ByteBuf; +import java.util.function.IntFunction; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.ByIdMap; import net.minecraft.util.StringRepresentable; -import java.util.function.IntFunction; - /** * This class is for all static ConnectionStates without being connected to a block. For this use {@link DynamicConnectionState}
* It's intended usage is to remove the full nullability things of ConnectionStates @@ -19,14 +18,15 @@ */ @Deprecated(forRemoval = true, since = "7.2") public enum StaticConnectionStates implements ConnectionState, StringRepresentable { - CONNECTED(0, "connected"), - CONNECTED_ACTIVE(1, "connected_active"), - DISCONNECTED(2, "disconnected"), + CONNECTED(0, "connected"), CONNECTED_ACTIVE(1, "connected_active"), DISCONNECTED(2, "disconnected"), DISABLED(3, "disabled"); - public static final Codec CODEC = StringRepresentable.fromEnum(StaticConnectionStates::values); - public static final IntFunction BY_ID = ByIdMap.continuous(key -> key.id, values(), ByIdMap.OutOfBoundsStrategy.ZERO); - public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, v -> v.id); + public static final Codec CODEC = StringRepresentable + .fromEnum(StaticConnectionStates::values); + public static final IntFunction BY_ID = ByIdMap.continuous(key -> key.id, values(), + ByIdMap.OutOfBoundsStrategy.ZERO); + public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, + v -> v.id); private final int id; private final String name; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java index 66990823df..c6e8186cda 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java @@ -1,9 +1,11 @@ package com.enderio.conduits.common.conduit.graph; +import com.enderio.conduits.api.ConduitData; import com.enderio.conduits.api.ConduitDataAccessor; import com.enderio.conduits.api.ConduitDataType; -import com.enderio.conduits.api.ConduitData; import com.mojang.serialization.Codec; +import java.util.Objects; +import java.util.Optional; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; @@ -13,19 +15,17 @@ import net.minecraft.util.ExtraCodecs; import org.jetbrains.annotations.Nullable; -import java.util.Objects; -import java.util.Optional; - /** * A safe way to store conduit data. */ public class ConduitDataContainer implements ConduitDataAccessor { public static Codec CODEC = ExtraCodecs.optionalEmptyMap(ConduitData.CODEC) - .xmap(ConduitDataContainer::new, i -> Optional.ofNullable(i.data)); + .xmap(ConduitDataContainer::new, i -> Optional.ofNullable(i.data)); - public static StreamCodec STREAM_CODEC = ByteBufCodecs.optional(ConduitData.STREAM_CODEC) - .map(ConduitDataContainer::new, i -> Optional.ofNullable(i.data)); + public static StreamCodec STREAM_CODEC = ByteBufCodecs + .optional(ConduitData.STREAM_CODEC) + .map(ConduitDataContainer::new, i -> Optional.ofNullable(i.data)); @Nullable private ConduitData data; @@ -50,7 +50,7 @@ public boolean hasData(ConduitDataType type) { @SuppressWarnings("unchecked") public > T getData(ConduitDataType type) { if (data != null && type == data.type()) { - return (T)data; + return (T) data; } return null; @@ -59,11 +59,11 @@ public > T getData(ConduitDataType type) { @SuppressWarnings("unchecked") public > T getOrCreateData(ConduitDataType type) { if (data != null && type == data.type()) { - return (T)data; + return (T) data; } data = type.factory().get(); - return (T)data; + return (T) data; } public void handleClientChanges(ConduitDataContainer clientDataContainer) { @@ -81,7 +81,8 @@ public void handleClientChanges(ConduitDataContainer clientDataContainer) { } @SuppressWarnings("unchecked") - private > T applyClientChanges(ConduitDataType type, ConduitDataContainer clientDataContainer) { + private > T applyClientChanges(ConduitDataType type, + ConduitDataContainer clientDataContainer) { T myData = getOrCreateData(type); T clientData = clientDataContainer.getData(type); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java index a825ca3631..bca6f37a9f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java @@ -1,11 +1,12 @@ package com.enderio.conduits.common.conduit.graph; -import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitNetworkContext; import com.enderio.conduits.api.ConduitNetworkContextAccessor; import com.enderio.conduits.api.ConduitNetworkContextType; +import com.enderio.conduits.api.EnderIOConduitsRegistries; import dev.gigaherz.graph3.Mergeable; +import java.util.Objects; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; @@ -14,8 +15,6 @@ import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; -import java.util.Objects; - public class ConduitGraphContext implements Mergeable, ConduitNetworkContextAccessor { @Nullable @@ -37,7 +36,7 @@ public boolean hasContext(ConduitNetworkContextType type) { @Override public > @Nullable T getContext(ConduitNetworkContextType type) { if (context != null && context.type() == type) { - return (T)context; + return (T) context; } return null; @@ -47,11 +46,11 @@ public boolean hasContext(ConduitNetworkContextType type) { @Override public > T getOrCreateContext(ConduitNetworkContextType type) { if (context != null && context.type() == type) { - return (T)context; + return (T) context; } context = type.factory().get(); - return (T)context; + return (T) context; } // region Mergable Implementation @@ -80,9 +79,9 @@ public ConduitGraphContext copy() { // endregion - private > Z castContext(){ - //noinspection unchecked - return (Z)context; + private > Z castContext() { + // noinspection unchecked + return (Z) context; } @Nullable @@ -95,7 +94,9 @@ public CompoundTag save(HolderLookup.Provider lookupProvider) { return null; } - var contextTypeKey = Objects.requireNonNull(EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE.getKey(context.type()), "Context type is not registered!"); + var contextTypeKey = Objects.requireNonNull( + EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE.getKey(context.type()), + "Context type is not registered!"); var tag = new CompoundTag(); tag.putString("Type", contextTypeKey.toString()); @@ -105,8 +106,11 @@ public CompoundTag save(HolderLookup.Provider lookupProvider) { // Gross. @SuppressWarnings("unchecked") - private > Tag encodeContext(HolderLookup.Provider lookupProvider, ConduitNetworkContextType type) { - return type.codec().encodeStart(lookupProvider.createSerializationContext(NbtOps.INSTANCE), (T)context).getOrThrow(); + private > Tag encodeContext(HolderLookup.Provider lookupProvider, + ConduitNetworkContextType type) { + return type.codec() + .encodeStart(lookupProvider.createSerializationContext(NbtOps.INSTANCE), (T) context) + .getOrThrow(); } public static > ConduitGraphContext of(T context) { @@ -117,22 +121,26 @@ public static ConduitGraphContext createNetworkContext() { return new ConduitGraphContext(); } - public static ConduitGraphContext loadNetworkContext(Holder> conduit, HolderLookup.Provider lookupProvider, CompoundTag contextTag) { + public static ConduitGraphContext loadNetworkContext(Holder> conduit, + HolderLookup.Provider lookupProvider, CompoundTag contextTag) { ConduitNetworkContext context = loadNetworkContext(conduit.value(), lookupProvider, contextTag); return new ConduitGraphContext(context); } @Nullable - private static ConduitNetworkContext loadNetworkContext(Conduit conduit, HolderLookup.Provider lookupProvider, CompoundTag contextTag) { + private static ConduitNetworkContext loadNetworkContext(Conduit conduit, HolderLookup.Provider lookupProvider, + CompoundTag contextTag) { ResourceLocation serializerKey = ResourceLocation.parse(contextTag.getString("Type")); - ConduitNetworkContextType contextType = Objects.requireNonNull(EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE.get(serializerKey), - "Unable to find conduit network context type with key " + serializerKey); + ConduitNetworkContextType contextType = Objects.requireNonNull( + EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE.get(serializerKey), + "Unable to find conduit network context type with key " + serializerKey); if (contextType.codec() == null) { return null; } - // TODO: We're using getOrThrow a lot for conduits. Should definitely make more robust/flexible. + // TODO: We're using getOrThrow a lot for conduits. Should definitely make more + // robust/flexible. CompoundTag data = contextTag.getCompound("Data"); return contextType.codec().parse(lookupProvider.createSerializationContext(NbtOps.INSTANCE), data).getOrThrow(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java index 18a9c68aee..ec76834797 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java @@ -8,10 +8,10 @@ import com.enderio.conduits.api.ConduitDataType; import com.enderio.conduits.api.ConduitNetwork; import com.enderio.conduits.api.ConduitNode; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; import com.enderio.conduits.api.bundle.ConduitInventory; import com.enderio.conduits.api.connection.ConduitConnection; +import com.enderio.conduits.api.upgrade.ConduitUpgrade; +import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.gigaherz.graph3.Graph; @@ -92,9 +92,9 @@ public void setConnection(Direction side, @Nullable ConduitConnection connection if (connection != null) { connections.put(side, connection); ioStates.put(side, - IOState.of(connection.canInput() ? connection.inputChannel() : null, - connection.canOutput() ? connection.outputChannel() : null, - connection.redstoneControl(), connection.redstoneChannel())); + IOState.of(connection.canInput() ? connection.inputChannel() : null, + connection.canOutput() ? connection.outputChannel() : null, connection.redstoneControl(), + connection.redstoneChannel())); } else { connections.remove(side); ioStates.remove(side); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java index 3e49339572..933b52e866 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java @@ -3,26 +3,27 @@ import com.enderio.conduits.api.Conduit; import dev.gigaherz.graph3.Graph; import dev.gigaherz.graph3.GraphObject; +import java.util.List; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import java.util.List; - public class ConduitGraphUtility { public static void integrate(Holder> conduit, GraphObject graphObject, - List> neighbours) { + List> neighbours) { Graph.integrate(graphObject, neighbours, Graph::new, g -> ConduitGraphContext.createNetworkContext()); } public static void integrateWithLoad(Holder> conduit, GraphObject graphObject, - List> neighbours, HolderLookup.Provider lookupProvider, CompoundTag contextTag) { - Graph.integrate(graphObject, neighbours, Graph::new, g -> ConduitGraphContext.loadNetworkContext(conduit, lookupProvider, contextTag)); + List> neighbours, HolderLookup.Provider lookupProvider, + CompoundTag contextTag) { + Graph.integrate(graphObject, neighbours, Graph::new, + g -> ConduitGraphContext.loadNetworkContext(conduit, lookupProvider, contextTag)); } public static void connect(Holder> conduit, GraphObject graphObject, - GraphObject neighbour) { + GraphObject neighbour) { Graph.connect(graphObject, neighbour, Graph::new, g -> ConduitGraphContext.createNetworkContext()); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java index 9107d4934f..b82ec3abde 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java @@ -5,9 +5,8 @@ import com.enderio.conduits.api.ConduitNetworkContextType; import com.enderio.conduits.api.ConduitNode; import dev.gigaherz.graph3.Graph; -import org.jetbrains.annotations.Nullable; - import java.util.Collection; +import org.jetbrains.annotations.Nullable; /** * Wrap the graph for public API consumption. @@ -16,10 +15,8 @@ public record WrappedConduitNetwork(Graph graph) implements @Override public Collection getNodes() { - //noinspection unchecked - return graph.getObjects().stream() - .map(object -> (ConduitNode) object) - .toList(); + // noinspection unchecked + return graph.getObjects().stream().map(object -> (ConduitNode) object).toList(); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index d7d9699367..f8ae5f0e13 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -4,7 +4,6 @@ import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitNode; import com.enderio.conduits.api.ConduitType; -import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.connection.ConduitConnection; import com.enderio.conduits.api.connection.ConduitConnectionMode; import com.enderio.conduits.common.init.ConduitLang; @@ -13,6 +12,7 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import java.util.function.Consumer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -29,29 +29,22 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Consumer; +public record EnergyConduit(ResourceLocation texture, Component description, int transferRatePerTick) + implements Conduit { -public record EnergyConduit( - ResourceLocation texture, - Component description, - int transferRatePerTick -) implements Conduit { - - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - builder -> builder - .group( - ResourceLocation.CODEC.fieldOf("texture").forGetter(Conduit::texture), - ComponentSerialization.CODEC.fieldOf("description").forGetter(Conduit::description), - Codec.INT.fieldOf("transfer_rate").forGetter(EnergyConduit::transferRatePerTick) - ).apply(builder, EnergyConduit::of) - ); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(builder -> builder + .group(ResourceLocation.CODEC.fieldOf("texture").forGetter(Conduit::texture), + ComponentSerialization.CODEC.fieldOf("description").forGetter(Conduit::description), + Codec.INT.fieldOf("transfer_rate").forGetter(EnergyConduit::transferRatePerTick)) + .apply(builder, EnergyConduit::of)); public static EnergyConduit of(ResourceLocation texture, Component description, int transferRate) { return new EnergyConduit(texture, description, transferRate); } private static final EnergyConduitTicker TICKER = new EnergyConduitTicker(); - private static final ConduitMenuData MENU_DATA = new ConduitMenuData.Simple(false, false, false, false, false, true); + private static final ConduitMenuData MENU_DATA = new ConduitMenuData.Simple(false, false, false, false, false, + true); // Not configurable - energy is instantaneous @Override @@ -90,7 +83,7 @@ public boolean canBeReplacedBy(Holder> otherConduit) { @Override public @Nullable TCap proxyCapability(BlockCapability capability, ConduitNode node, - Level level, BlockPos pos, @Nullable TContext context) { + Level level, BlockPos pos, @Nullable TContext context) { if (Capabilities.EnergyStorage.BLOCK == capability && (context == null || context instanceof Direction)) { if (context != null) { @@ -100,8 +93,8 @@ public boolean canBeReplacedBy(Holder> otherConduit) { } } - //noinspection unchecked - return (TCap)new EnergyConduitStorage(transferRatePerTick(), node); + // noinspection unchecked + return (TCap) new EnergyConduitStorage(transferRatePerTick(), node); } return null; @@ -114,7 +107,8 @@ public void onRemoved(ConduitNode node, Level level, BlockPos pos) { @Override public ConduitConnection getDefaultConnection(Level level, BlockPos pos, Direction side) { - IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, pos.relative(side), side.getOpposite()); + IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, pos.relative(side), + side.getOpposite()); if (capability != null) { ConduitConnectionMode mode; @@ -123,8 +117,10 @@ public ConduitConnection getDefaultConnection(Level level, BlockPos pos, Directi } else if (capability.canReceive()) { mode = ConduitConnectionMode.IN; } else { - // This ensures that if there's an energy capability that might be pushing but won't allow pulling is present, we can still interact - // For example Thermal's Dynamos report false until they have energy in them and flux networks always refuse. + // This ensures that if there's an energy capability that might be pushing but + // won't allow pulling is present, we can still interact + // For example Thermal's Dynamos report false until they have energy in them and + // flux networks always refuse. mode = ConduitConnectionMode.OUT; } @@ -136,7 +132,8 @@ public ConduitConnection getDefaultConnection(Level level, BlockPos pos, Directi } @Override - public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, + TooltipFlag pTooltipFlag) { String transferLimitFormatted = String.format("%,d", transferRatePerTick()); pTooltipAdder.accept(TooltipUtil.styledWithArgs(ConduitLang.ENERGY_RATE_TOOLTIP, transferLimitFormatted)); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java index 3701bd0886..4771ce5704 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java @@ -1,7 +1,7 @@ package com.enderio.conduits.common.init; -import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.EnderIOConduits; +import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; import com.enderio.regilite.holder.RegiliteBlockEntity; import com.enderio.regilite.registry.BlockEntityRegistry; @@ -16,17 +16,20 @@ public class ConduitBlockEntities { private static final BlockEntityRegistry BLOCK_ENTITY_REGISTRY = EnderIOConduits.REGILITE.blockEntityRegistry(); public static final RegiliteBlockEntity CONDUIT = BLOCK_ENTITY_REGISTRY - .registerBlockEntity("conduit", NewConduitBundleBlockEntity::new, ConduitBlocks.CONDUIT); + .registerBlockEntity("conduit", NewConduitBundleBlockEntity::new, ConduitBlocks.CONDUIT); @SubscribeEvent public static void registerConduitCapabilities(RegisterCapabilitiesEvent event) { - EnderIOConduitsRegistries.CONDUIT_TYPE.entrySet().stream() - .flatMap(e -> e.getValue().exposedCapabilities().stream()) - .forEach(e -> registerConduitCapability(event, e)); + EnderIOConduitsRegistries.CONDUIT_TYPE.entrySet() + .stream() + .flatMap(e -> e.getValue().exposedCapabilities().stream()) + .forEach(e -> registerConduitCapability(event, e)); } - private static void registerConduitCapability(RegisterCapabilitiesEvent event, BlockCapability capability) { - event.registerBlockEntity(capability, CONDUIT.get(), NewConduitBundleBlockEntity.createCapabilityProvider(capability)); + private static void registerConduitCapability(RegisterCapabilitiesEvent event, + BlockCapability capability) { + event.registerBlockEntity(capability, CONDUIT.get(), + NewConduitBundleBlockEntity.createCapabilityProvider(capability)); } public static void register(IEventBus bus) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java index bf16bf146d..82e5e82660 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java @@ -9,23 +9,15 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public record C2SSetConduitExtendedData( - BlockPos pos, - Holder> conduit, - ConduitDataContainer conduitDataContainer -) implements CustomPacketPayload { +public record C2SSetConduitExtendedData(BlockPos pos, Holder> conduit, + ConduitDataContainer conduitDataContainer) implements CustomPacketPayload { public static final Type TYPE = new Type<>(EnderIO.loc("c2s_conduit_extended_data")); public static StreamCodec STREAM_CODEC = StreamCodec.composite( - BlockPos.STREAM_CODEC, - C2SSetConduitExtendedData::pos, - Conduit.STREAM_CODEC, - C2SSetConduitExtendedData::conduit, - ConduitDataContainer.STREAM_CODEC, - C2SSetConduitExtendedData::conduitDataContainer, - C2SSetConduitExtendedData::new - ); + BlockPos.STREAM_CODEC, C2SSetConduitExtendedData::pos, Conduit.STREAM_CODEC, + C2SSetConduitExtendedData::conduit, ConduitDataContainer.STREAM_CODEC, + C2SSetConduitExtendedData::conduitDataContainer, C2SSetConduitExtendedData::new); @Override public Type type() { From 2566364ba709a5f6f0b10fcf5b045f7589928048 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Fri, 3 Jan 2025 22:27:28 +0000 Subject: [PATCH 03/27] chore: bump to 7.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 48c989b22b..c3052b4ae2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ neoForgeVersion=21.1.58 # The general release series for development build versioning # TODO: Could use this for tag sanity checks during CI builds? -versionSeries=7.1 +versionSeries=7.2 # Version ranges for mods.toml minecraftVersionRange=[1.21.1] From 952679dc2a48b3ad66e928ef564faa350d9523db Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 5 Jan 2025 01:11:09 +0000 Subject: [PATCH 04/27] chore: Lots of changes, see commit description - Tested a possible accessibility improvement - Copied over clone item stack - Aiming shapes now only show the conduit you're aiming at, rather than outlining the entire bundle stuff. - Fixed facades not working (sync and model issues) - Override particles for bundles due to a crash - need to implement this properly - Facades can now be placed standalone, without the need for an existing bundle. - Fixed a crash when breaking an RS node --- .../client/ConduitBundleExtension.java | 28 ++++ .../conduits/client/ConduitClientSetup.java | 7 + .../conduit/bundle/NewConduitBundleModel.java | 18 +- .../common/conduit/ConduitA11yManager.java | 40 +++++ .../common/conduit/ConduitBlockItem.java | 5 +- .../conduit/bundle/NewConduitBundleBlock.java | 155 ++++++++++++++++-- .../bundle/NewConduitBundleBlockEntity.java | 16 +- .../conduit/facades/ConduitFacadeItem.java | 37 ++++- 8 files changed, 276 insertions(+), 30 deletions(-) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java new file mode 100644 index 0000000000..83fcedb8d9 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java @@ -0,0 +1,28 @@ +package com.enderio.conduits.client; + +import net.minecraft.client.particle.ParticleEngine; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.HitResult; +import net.neoforged.neoforge.client.extensions.common.IClientBlockExtensions; + +public class ConduitBundleExtension implements IClientBlockExtensions { + + public static ConduitBundleExtension INSTANCE = new ConduitBundleExtension(); + + private ConduitBundleExtension() { + } + + @Override + public boolean addHitEffects(BlockState state, Level level, HitResult target, ParticleEngine manager) { + // TODO: Do it based on the aimed conduit + return true; + } + + @Override + public boolean addDestroyEffects(BlockState state, Level Level, BlockPos pos, ParticleEngine manager) { + // TODO: Do it based on the aimed conduit. + return true; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java index c79833c492..b74050bc35 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java @@ -12,6 +12,7 @@ import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; import com.enderio.conduits.client.model.conduit.modifier.FluidConduitCoreModelModifier; import com.enderio.conduits.client.model.rewrite.conduit.bundle.ConduitBundleGeometry; +import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.init.ConduitTypes; import java.util.ArrayList; import java.util.HashMap; @@ -24,6 +25,7 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.ModelEvent; +import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; @EventBusSubscriber(modid = EnderIOConduits.MODULE_MOD_ID, value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) public class ConduitClientSetup { @@ -86,6 +88,11 @@ public static void bakingModelsFinished(ModelEvent.BakingCompleted event) { } } + @SubscribeEvent + public static void registerClientExtensions(RegisterClientExtensionsEvent event) { + event.registerBlock(ConduitBundleExtension.INSTANCE, ConduitBlocks.CONDUIT); + } + private static ModelResourceLocation loc(String modelName) { ModelResourceLocation loc = ModelResourceLocation.standalone(EnderIO.loc(modelName)); MODEL_LOCATIONS.add(loc); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java index 99fbaf5642..e56e07dea3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java @@ -12,9 +12,7 @@ import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; import com.enderio.conduits.common.Area; -import com.enderio.conduits.common.conduit.ConduitBundle; import com.enderio.conduits.common.conduit.OffsetHelper; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.core.data.model.ModelHelper; import com.mojang.math.Axis; @@ -50,6 +48,7 @@ public class NewConduitBundleModel implements IDynamicBakedModel { public static final ModelProperty FACADE_MODEL_DATA = new ModelProperty<>(); + public static final ModelProperty FACADE_RENDERTYPE = new ModelProperty<>(); @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, @@ -310,7 +309,7 @@ public TextureAtlasSprite getParticleIcon(ModelData data) { return Minecraft.getInstance() .getBlockRenderer() .getBlockModel(bundleState.facade()) - .getParticleIcon(data.get(ConduitBundleBlockEntity.FACADE_MODEL_DATA)); + .getParticleIcon(data.get(FACADE_MODEL_DATA)); } return sprite(bundleState.getTexture(bundleState.conduits().getFirst())); } @@ -323,7 +322,7 @@ public ItemOverrides getOverrides() { @Override public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, @NotNull ModelData data) { - ChunkRenderTypeSet facadeRenderTypes = data.get(ConduitBundleBlockEntity.FACADE_RENDERTYPE); + ChunkRenderTypeSet facadeRenderTypes = data.get(FACADE_RENDERTYPE); ChunkRenderTypeSet renderTypes = ChunkRenderTypeSet.of(RenderType.cutout()); if (facadeRenderTypes != null) { renderTypes = ChunkRenderTypeSet.union(renderTypes, facadeRenderTypes); @@ -335,13 +334,14 @@ public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull Ran public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState state, ModelData modelData) { ModelData data = IDynamicBakedModel.super.getModelData(level, pos, state, modelData); ModelData.Builder builder = data.derive(); - ConduitBundle conduitBundle = data.get(ConduitBundleBlockEntity.BUNDLE_MODEL_PROPERTY); - if (conduitBundle != null && conduitBundle.hasFacade()) { - BlockState blockState = conduitBundle.facade().get().defaultBlockState(); + + ConduitBundleRenderState bundleState = data.get(ConduitBundleRenderState.PROPERTY); + if (bundleState != null && bundleState.hasFacade()) { + BlockState blockState = bundleState.facade(); BakedModel blockModel = Minecraft.getInstance().getBlockRenderer().getBlockModel(blockState); ModelData facadeData = blockModel.getModelData(level, pos, blockState, ModelData.EMPTY); - builder.with(ConduitBundleBlockEntity.FACADE_MODEL_DATA, facadeData); - builder.with(ConduitBundleBlockEntity.FACADE_RENDERTYPE, blockModel.getRenderTypes(blockState, + builder.with(FACADE_MODEL_DATA, facadeData); + builder.with(FACADE_RENDERTYPE, blockModel.getRenderTypes(blockState, new SingleThreadedRandomSource(state.getSeed(pos)), facadeData)); } return builder.build(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java new file mode 100644 index 0000000000..9392d0fb5f --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java @@ -0,0 +1,40 @@ +package com.enderio.conduits.common.conduit; + +import com.enderio.conduits.EnderIOConduits; +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.common.init.ConduitComponents; +import net.minecraft.core.Holder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.living.LivingEquipmentChangeEvent; +import org.jetbrains.annotations.Nullable; + +/** + * A11Y tools for conduit block behaviours. + */ +@EventBusSubscriber(/*value = Dist.CLIENT, */modid = EnderIOConduits.MODULE_MOD_ID, bus = EventBusSubscriber.Bus.GAME) +public class ConduitA11yManager { + + private static Holder> heldConduit; + + @Nullable + public static Holder> getHeldConduit() { + return heldConduit; + } + + @SubscribeEvent + public static void onEquipmentChanged(LivingEquipmentChangeEvent event) { + if (event.getEntity() instanceof Player player) { + // Only does the main hand + ItemStack mainItem = player.getMainHandItem(); + if (mainItem.has(ConduitComponents.CONDUIT)) { + heldConduit = mainItem.get(ConduitComponents.CONDUIT); + } else { + heldConduit = null; + } + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBlockItem.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBlockItem.java index 4363fbb3f9..d0e60f21c4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBlockItem.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBlockItem.java @@ -66,11 +66,8 @@ public InteractionResult place(BlockPlaceContext context) { @Nullable Player player = context.getPlayer(); BlockPos blockpos = context.getClickedPos(); - ItemStack itemstack = context.getItemInHand(); - Holder> conduit = itemstack.get(ConduitComponents.CONDUIT); - - // Pass through to existing block. + // Allow placing from the edge of an adjacent block BlockState blockState = level.getBlockState(blockpos); if (!blockState.canBeReplaced()) { // noinspection DataFlowIssue diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java index 3f5634f459..6cc7b84bde 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java @@ -4,11 +4,18 @@ import com.enderio.conduits.api.ConduitCapabilities; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; import com.enderio.conduits.client.particle.ConduitBreakParticle; +import com.enderio.conduits.common.conduit.ConduitA11yManager; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.RightClickAction; +import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import com.enderio.conduits.common.init.ConduitBlockEntities; +import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.init.ConduitComponents; import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.google.common.collect.ImmutableMap; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -19,15 +26,19 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; @@ -42,10 +53,13 @@ import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.neoforge.client.extensions.common.IClientBlockExtensions; import org.jetbrains.annotations.Nullable; public class NewConduitBundleBlock extends Block implements EntityBlock { @@ -79,11 +93,74 @@ public NewConduitBundleBlock(Properties properties) { }; } + // region Block Shape + @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { + if (conduit.hasFacade() && FacadeHelper.areFacadesVisible()) { + return Shapes.block(); + } + + // Ensure if a bundle is bugged with 0 conduits that it can be broken. + if (!conduit.getConduits().isEmpty()) { + // Only show the conduit that is being aimed at if this is a player. + if (context instanceof EntityCollisionContext entityCollisionContext) { + if (entityCollisionContext.getEntity() instanceof Player player) { + + // TODO: Config for this accessibility feature +// if (true) { +// var heldConduit = ConduitA11yManager.getHeldConduit(); +// +// // Option 1: always full +// // Return a full shape if the player is holding a conduit so they don't have to aim +//// if (heldConduit != null) { +//// return Shapes.block(); +//// return conduit.getShape().getEncompassingShape(); +//// } +// +// // Option 2: Full when present +// if (conduit.hasConduitStrict(heldConduit)) { +// return Shapes.block(); +// } +// } + + HitResult hit = visualPick(player); + if (hit.getType() == HitResult.Type.BLOCK) { + return conduit.getShape().getShapeFromHit(pos, hit); + } + } + } + + return conduit.getShape().getTotalShape(); + } + } + + // If there's no block entity, no shape - this will stop a bounding box flash + // when the bundle is first placed + return Shapes.empty(); + } + + private HitResult visualPick(Player player) { + double hitDistance = player.blockInteractionRange() + 5; + Vec3 from = player.getEyePosition(1); + + Vec3 viewVec = player.getViewVector(1); + Vec3 to = from.add(viewVec.scale(hitDistance)); + return player.level().clip(new ClipContext(from, to, ClipContext.Block.VISUAL, ClipContext.Fluid.NONE, player)); + } + + @Override + protected VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + // Needs separate handling so that the stock getShape can filter by VISUAL for player hit detection. return getBundleShape(level, pos, true); } + @Override + protected VoxelShape getInteractionShape(BlockState state, BlockGetter level, BlockPos pos) { + return super.getInteractionShape(state, level, pos); + } + @Override protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { @@ -107,6 +184,47 @@ private VoxelShape getBundleShape(BlockGetter level, BlockPos pos, boolean canHi return Shapes.empty(); } + // endregion + + // TODO: Review, I'm sure this could be neater + @Override + public ItemStack getCloneItemStack(BlockState state, HitResult target, LevelReader level, BlockPos pos, + Player player) { + if (level instanceof Level realLevel + && state.getOptionalValue(BlockStateProperties.WATERLOGGED).orElse(false)) { + var hitResult = Item.getPlayerPOVHitResult(realLevel, player, ClipContext.Fluid.NONE); + if (hitResult.getType() == HitResult.Type.MISS) { + return Items.AIR.getDefaultInstance(); + } + + if (hitResult.getBlockPos().equals(pos)) { + target = hitResult; + } else { + return level.getBlockState(hitResult.getBlockPos()) + .getCloneItemStack(hitResult, level, hitResult.getBlockPos(), player); + } + } + + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity blockEntity) { + if (blockEntity.hasFacade() && FacadeHelper.areFacadesVisible()) { + return blockEntity.getFacadeBlock().asItem().getDefaultInstance(); + } + + Holder> conduit = blockEntity.getShape().getConduit(pos, target); + if (conduit == null) { + if (blockEntity.getConduits().isEmpty()) { + return ItemStack.EMPTY; + } + + conduit = blockEntity.getConduits().getFirst(); + } + + return ConduitBlockItem.getStackFor(conduit, 1); + } + + return super.getCloneItemStack(state, target, level, pos, player); + } + @Override public @Nullable PushReaction getPistonPushReaction(BlockState state) { return PushReaction.BLOCK; @@ -148,8 +266,7 @@ public BlockState updateShape(BlockState state, Direction direction, BlockState } if (level.getBlockEntity(currentPos) instanceof NewConduitBundleBlockEntity conduit) { - // TODO.. - // conduit.updateShape(); + conduit.updateShape(); } return super.updateShape(state, direction, neighborState, level, currentPos, neighborPos); @@ -177,7 +294,6 @@ public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable L conduitBundle.addConduit(conduit, player); } else { // We might be placed using a facade item. If we are, apply the facade to the - // new bundle now. var facadeProvider = stack.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); if (facadeProvider != null && facadeProvider.isValid()) { conduitBundle.setFacadeProvider(stack); @@ -192,7 +308,8 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, // TODO: Destroying the last conduit in the block has a laggy disconnect for the // neighbours... - HitResult hit = player.pick(player.blockInteractionRange() + 5, 1, false); +// HitResult hit = player.pick(player.blockInteractionRange() + 5, 1, false); + HitResult hit = visualPick(player); if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { // Client side does nothing special to the bundle. @@ -228,8 +345,29 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, return false; } } else { - Holder> conduit = conduitBundle.getShape() - .getConduit(((BlockHitResult) hit).getBlockPos(), hit); + // TODO: accessibility feature flag + Holder> conduit = null; +// if (true) { +// // If the player is holding a conduit and this flag is enabled, they purposely want to break the held conduit. +// conduit = ConduitA11yManager.getHeldConduit(); +// +// // If we don't have the held conduit, exit now. +// if (conduit != null && !conduitBundle.hasConduitStrict(conduit)) { +// level.playSound(player, pos, SoundEvents.GENERIC_SMALL_FALL, SoundSource.BLOCKS, 1F, 1F); +// return false; +// } +// +// // TODO: If we adopt the strategy of only showing a bigger box when we're holding a conduit, we need to +// // fire a packet to the server because we can't read whether the player is using the accessibility option on the server. +// +// // TODO: It could also be possible to leave this in? Idk if this would accidentally fire if the client state is up to date... +// } + + if (conduit == null) { + conduit = conduitBundle.getShape() + .getConduit(((BlockHitResult) hit).getBlockPos(), hit); + } + if (conduit == null) { if (!conduitBundle.getConduits().isEmpty()) { level.playSound(player, pos, SoundEvents.GENERIC_SMALL_FALL, SoundSource.BLOCKS, 1F, 1F); @@ -458,9 +596,4 @@ public boolean supportsExternalFaceHiding(BlockState state) { } // endregion - - @Override - protected void spawnDestroyParticles(Level level, Player player, BlockPos pos, BlockState state) { - // Disabled for custom handling. - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java index 6deeb5a3ac..daf673efab 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java @@ -227,6 +227,10 @@ private static TCap getProxiedCapability(BlockCapability> conduit, @Nullable Player player) { } } + // Node remove event + var node = getConduitNode(conduit); + conduit.value().onRemoved(node, level, getBlockPos()); + // Remove neighbour connections removeNeighborConnections(conduit); // Remove from the inventory's storage. inventory.removeConduit(conduit); - // Node remove event - var node = conduitNodes.remove(conduit); - conduit.value().onRemoved(node, level, getBlockPos()); - // Remove from the graph. if (node.getGraph() != null) { node.getGraph().remove(node); @@ -433,6 +437,7 @@ public void removeConduit(Holder> conduit, @Nullable Player player) { // Remove from the bundle conduits.remove(conduit); conduitConnections.remove(conduit); + conduitNodes.remove(conduit); bundleChanged(); } @@ -971,6 +976,9 @@ private void loadFromLegacyBundle(LegacyConduitBundle bundle) { setNode(entry.getKey(), entry.getValue()); } + // Copy facade provider + facadeProvider = bundle.facadeItem.copy(); + // Copy legacy connections into the new bundle conduitConnections = new HashMap<>(); for (var conduit : conduits) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/facades/ConduitFacadeItem.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/facades/ConduitFacadeItem.java index d1df9b1cc1..ab0da654f6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/facades/ConduitFacadeItem.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/facades/ConduitFacadeItem.java @@ -2,16 +2,49 @@ import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.api.ConduitCapabilities; +import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.init.ConduitLang; import java.util.List; +import java.util.Map; + +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; -public class ConduitFacadeItem extends Item { +public class ConduitFacadeItem extends BlockItem { public ConduitFacadeItem(Properties properties) { - super(properties); + super(ConduitBlocks.CONDUIT.get(), properties); + } + + @Override + protected boolean canPlace(BlockPlaceContext context, BlockState state) { + // Must have a valid facade + var facade = context.getItemInHand().getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); + if (facade == null || !facade.isValid()) { + return false; + } + + return super.canPlace(context, state); + } + + @Override + public void registerBlocks(Map blockToItemMap, Item item) { + // Do not register + } + + @Override + public String getDescriptionId() { + return this.getOrCreateDescriptionId(); } @Override From 18796c70b643f00e7c5579d98987adeec8f6424f Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 5 Jan 2025 17:37:21 +0000 Subject: [PATCH 05/27] feat: Jade plugin to show the conduit name and fully hide a facaded bundle --- enderio-conduits/build.gradle.kts | 4 +++ .../jade/EIOConduitsJadePlugin.java | 28 +++++++++++++++++++ .../integration/jade/package-info.java | 4 +++ 3 files changed, 36 insertions(+) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/package-info.java diff --git a/enderio-conduits/build.gradle.kts b/enderio-conduits/build.gradle.kts index b44d9f1819..5857104e88 100644 --- a/enderio-conduits/build.gradle.kts +++ b/enderio-conduits/build.gradle.kts @@ -31,6 +31,7 @@ val graphlibVersion: String by project val graphlibVersionRange: String by project val cctMinecraftVersion: String by project val cctVersion: String by project +val jadeFileId: String by project configurations { runtimeClasspath.get().extendsFrom(create("localRuntime")) @@ -50,6 +51,9 @@ dependencies { compileOnly("cc.tweaked:cc-tweaked-$cctMinecraftVersion-core-api:$cctVersion") compileOnly("cc.tweaked:cc-tweaked-$cctMinecraftVersion-forge-api:$cctVersion") + // Jade for addon + compileOnly("curse.maven:jade-324717:${jadeFileId}") + // For painting recipe. // TODO: This isn't great. compileOnly(project(":enderio-machines")) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java b/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java new file mode 100644 index 0000000000..1df97dcfce --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java @@ -0,0 +1,28 @@ +package com.enderio.conduits.integration.jade; + +import com.enderio.conduits.api.bundle.ConduitBundleReader; +import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; +import com.enderio.conduits.common.init.ConduitBlocks; +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IWailaClientRegistration; +import snownee.jade.api.IWailaPlugin; +import snownee.jade.api.WailaPlugin; + +@WailaPlugin +public class EIOConduitsJadePlugin implements IWailaPlugin { + @Override + public void registerClient(IWailaClientRegistration registration) { + // Show the correct conduit (or facade item) + registration.usePickedResult(ConduitBlocks.CONDUIT.get()); + + // Completely replace the block accessor with the facade block if it exists + registration.addRayTraceCallback((hitResult, accessor, originalAccessor) -> { + if (accessor instanceof BlockAccessor blockAccessor) { + if (blockAccessor.getBlockEntity() instanceof ConduitBundleReader conduitBundle && conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()) { + return registration.blockAccessor().from(blockAccessor).blockState(conduitBundle.getFacadeBlock().defaultBlockState()).build(); + } + } + return accessor; + }); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/package-info.java new file mode 100644 index 0000000000..debf9e145c --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/package-info.java @@ -0,0 +1,4 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault + +package com.enderio.conduits.integration.jade; From 19431f68ad50ad8e17f9426007da0d246e8cf094 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 5 Jan 2025 20:07:39 +0000 Subject: [PATCH 06/27] chore: Remove conduit upgrades --- .../resources/assets/enderio/lang/en_us.json | 4 -- .../item/extraction_speed_upgrade_1.json | 6 -- .../item/extraction_speed_upgrade_2.json | 6 -- .../item/extraction_speed_upgrade_3.json | 6 -- .../item/extraction_speed_upgrade_4.json | 6 -- .../misc/extraction_speed_upgrade_1.json | 32 --------- .../extraction_speed_upgrade_1_upgrade.json | 32 --------- .../misc/extraction_speed_upgrade_2.json | 32 --------- .../extraction_speed_upgrade_2_upgrade.json | 32 --------- .../misc/extraction_speed_upgrade_3.json | 32 --------- .../extraction_speed_upgrade_3_upgrade.json | 32 --------- .../misc/extraction_speed_upgrade_4.json | 32 --------- .../recipe/extraction_speed_upgrade_1.json | 27 ------- .../extraction_speed_upgrade_1_upgrade.json | 19 ----- .../recipe/extraction_speed_upgrade_2.json | 27 ------- .../extraction_speed_upgrade_2_upgrade.json | 19 ----- .../recipe/extraction_speed_upgrade_3.json | 27 ------- .../extraction_speed_upgrade_3_upgrade.json | 19 ----- .../recipe/extraction_speed_upgrade_4.json | 27 ------- .../com/enderio/conduits/api/Conduit.java | 4 -- .../conduits/api/ConduitCapabilities.java | 3 - .../api/ConduitNetworkContextSerializer.java | 8 --- .../com/enderio/conduits/api/ConduitNode.java | 4 -- .../api/ticker/IOAwareConduitTicker.java | 6 -- .../conduits/api/upgrade/ConduitUpgrade.java | 4 -- .../conduits/api/upgrade/package-info.java | 4 -- .../components/ExtractionSpeedUpgrade.java | 21 ------ .../common/components/package-info.java | 4 -- .../block/ConduitBundleBlockEntity.java | 8 +-- .../bundle/NewConduitBundleInventory.java | 8 +-- .../conduit/graph/ConduitGraphObject.java | 6 -- .../conduit/type/fluid/FluidConduit.java | 7 -- .../type/fluid/FluidConduitTicker.java | 8 --- .../common/conduit/type/item/ItemConduit.java | 7 -- .../conduit/type/item/ItemConduitTicker.java | 4 -- .../conduit/upgrade/SpeedUpgradeItem.java | 18 ----- .../common/conduit/upgrade/package-info.java | 4 -- .../conduits/common/init/ConduitItems.java | 33 --------- .../conduits/data/recipe/ConduitRecipes.java | 71 ------------------- 39 files changed, 2 insertions(+), 647 deletions(-) delete mode 100644 enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_1.json delete mode 100644 enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_2.json delete mode 100644 enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_3.json delete mode 100644 enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_4.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_1.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_1_upgrade.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_2.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_2_upgrade.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_3.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_3_upgrade.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_4.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_1.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_1_upgrade.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_2.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_2_upgrade.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_3.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_3_upgrade.json delete mode 100644 enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_4.json delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextSerializer.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/upgrade/ConduitUpgrade.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/upgrade/package-info.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/components/ExtractionSpeedUpgrade.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/components/package-info.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/upgrade/SpeedUpgradeItem.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/upgrade/package-info.java diff --git a/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json b/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json index e18c6dddc0..ac80953435 100644 --- a/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json +++ b/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json @@ -14,10 +14,6 @@ "item.enderio.conduit.pressurized_fluid": "Pressurized Fluid Conduit", "item.enderio.conduit.redstone": "Redstone Conduit", "item.enderio.conduit_facade": "Conduit Facade", - "item.enderio.extraction_speed_upgrade_1": "Tier 1 Extraction Speed Upgrade", - "item.enderio.extraction_speed_upgrade_2": "Tier 2 Extraction Speed Upgrade", - "item.enderio.extraction_speed_upgrade_3": "Tier 3 Extraction Speed Upgrade", - "item.enderio.extraction_speed_upgrade_4": "Tier 4 Extraction Speed Upgrade", "item.enderio.hardened_conduit_facade": "Hardened Conduit Facade", "item.enderio.redstone_and_filter": "Redstone And Filter", "item.enderio.redstone_counting_filter": "Redstone Counting Filter", diff --git a/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_1.json b/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_1.json deleted file mode 100644 index bd0880e5f9..0000000000 --- a/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "enderio:item/extraction_speed_upgrade_1" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_2.json b/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_2.json deleted file mode 100644 index b5d38874f9..0000000000 --- a/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "enderio:item/extraction_speed_upgrade_2" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_3.json b/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_3.json deleted file mode 100644 index 3180e14fef..0000000000 --- a/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_3.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "enderio:item/extraction_speed_upgrade_3" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_4.json b/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_4.json deleted file mode 100644 index e2ac092ca1..0000000000 --- a/enderio-conduits/src/generated/resources/assets/enderio/models/item/extraction_speed_upgrade_4.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "enderio:item/extraction_speed_upgrade_4" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_1.json b/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_1.json deleted file mode 100644 index e4992dcade..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_1.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_ingredient": { - "conditions": { - "items": [ - { - "items": "enderio:redstone_alloy_ingot" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "enderio:extraction_speed_upgrade_1" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_ingredient" - ] - ], - "rewards": { - "recipes": [ - "enderio:extraction_speed_upgrade_1" - ] - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_1_upgrade.json b/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_1_upgrade.json deleted file mode 100644 index 895185355d..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_1_upgrade.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_ingredient": { - "conditions": { - "items": [ - { - "items": "enderio:conductive_alloy_ingot" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "enderio:extraction_speed_upgrade_1_upgrade" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_ingredient" - ] - ], - "rewards": { - "recipes": [ - "enderio:extraction_speed_upgrade_1_upgrade" - ] - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_2.json b/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_2.json deleted file mode 100644 index 2dbebf1f28..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_2.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_ingredient": { - "conditions": { - "items": [ - { - "items": "enderio:conductive_alloy_ingot" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "enderio:extraction_speed_upgrade_2" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_ingredient" - ] - ], - "rewards": { - "recipes": [ - "enderio:extraction_speed_upgrade_2" - ] - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_2_upgrade.json b/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_2_upgrade.json deleted file mode 100644 index 5e52d41bda..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_2_upgrade.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_ingredient": { - "conditions": { - "items": [ - { - "items": "enderio:conductive_alloy_ingot" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "enderio:extraction_speed_upgrade_2_upgrade" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_ingredient" - ] - ], - "rewards": { - "recipes": [ - "enderio:extraction_speed_upgrade_2_upgrade" - ] - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_3.json b/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_3.json deleted file mode 100644 index 5e21c03b6f..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_3.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_ingredient": { - "conditions": { - "items": [ - { - "items": "enderio:soularium_ingot" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "enderio:extraction_speed_upgrade_3" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_ingredient" - ] - ], - "rewards": { - "recipes": [ - "enderio:extraction_speed_upgrade_3" - ] - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_3_upgrade.json b/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_3_upgrade.json deleted file mode 100644 index ec6c9962d3..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_3_upgrade.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_ingredient": { - "conditions": { - "items": [ - { - "items": "enderio:energetic_alloy_ingot" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "enderio:extraction_speed_upgrade_3_upgrade" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_ingredient" - ] - ], - "rewards": { - "recipes": [ - "enderio:extraction_speed_upgrade_3_upgrade" - ] - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_4.json b/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_4.json deleted file mode 100644 index 66fbd2171c..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/advancement/recipes/misc/extraction_speed_upgrade_4.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_ingredient": { - "conditions": { - "items": [ - { - "items": "enderio:energetic_alloy_ingot" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "enderio:extraction_speed_upgrade_4" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_ingredient" - ] - ], - "rewards": { - "recipes": [ - "enderio:extraction_speed_upgrade_4" - ] - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_1.json b/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_1.json deleted file mode 100644 index 730df3164f..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_1.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "misc", - "key": { - "A": { - "tag": "c:ingots/redstone_alloy" - }, - "I": { - "tag": "c:ingots/iron" - }, - "P": { - "item": "minecraft:piston" - }, - "T": { - "item": "minecraft:redstone_torch" - } - }, - "pattern": [ - "III", - "APA", - "ATA" - ], - "result": { - "count": 2, - "id": "enderio:extraction_speed_upgrade_1" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_1_upgrade.json b/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_1_upgrade.json deleted file mode 100644 index e384958a55..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_1_upgrade.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "enderio:extraction_speed_upgrade_1" - }, - { - "tag": "c:ingots/conductive_alloy" - }, - { - "tag": "c:ingots/conductive_alloy" - } - ], - "result": { - "count": 1, - "id": "enderio:extraction_speed_upgrade_2" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_2.json b/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_2.json deleted file mode 100644 index 6c66df10bf..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_2.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "misc", - "key": { - "A": { - "tag": "c:ingots/conductive_alloy" - }, - "I": { - "tag": "c:ingots/iron" - }, - "P": { - "item": "minecraft:piston" - }, - "T": { - "item": "minecraft:redstone_torch" - } - }, - "pattern": [ - "III", - "APA", - "ATA" - ], - "result": { - "count": 2, - "id": "enderio:extraction_speed_upgrade_2" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_2_upgrade.json b/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_2_upgrade.json deleted file mode 100644 index 4088922f80..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_2_upgrade.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "enderio:extraction_speed_upgrade_2" - }, - { - "tag": "c:ingots/soularium" - }, - { - "tag": "c:ingots/soularium" - } - ], - "result": { - "count": 1, - "id": "enderio:extraction_speed_upgrade_3" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_3.json b/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_3.json deleted file mode 100644 index a7b8a396eb..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_3.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "misc", - "key": { - "A": { - "tag": "c:ingots/soularium" - }, - "I": { - "tag": "c:ingots/dark_steel" - }, - "P": { - "item": "minecraft:piston" - }, - "T": { - "item": "minecraft:redstone_torch" - } - }, - "pattern": [ - "III", - "APA", - "ATA" - ], - "result": { - "count": 2, - "id": "enderio:extraction_speed_upgrade_3" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_3_upgrade.json b/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_3_upgrade.json deleted file mode 100644 index 2fd3cb49f3..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_3_upgrade.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "enderio:extraction_speed_upgrade_3" - }, - { - "tag": "c:ingots/energetic_alloy" - }, - { - "tag": "c:ingots/energetic_alloy" - } - ], - "result": { - "count": 1, - "id": "enderio:extraction_speed_upgrade_4" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_4.json b/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_4.json deleted file mode 100644 index bca4686aec..0000000000 --- a/enderio-conduits/src/generated/resources/data/enderio/recipe/extraction_speed_upgrade_4.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "misc", - "key": { - "A": { - "tag": "c:ingots/energetic_alloy" - }, - "I": { - "tag": "c:ingots/dark_steel" - }, - "P": { - "item": "minecraft:piston" - }, - "T": { - "item": "minecraft:redstone_torch" - } - }, - "pattern": [ - "III", - "APA", - "ATA" - ], - "result": { - "count": 2, - "id": "enderio:extraction_speed_upgrade_4" - } -} \ No newline at end of file diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index 61d37eca8e..764f99a4fa 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -107,10 +107,6 @@ default boolean hasConnectionDelay() { return false; } - default boolean canApplyUpgrade(SlotType slotType, ConduitUpgrade conduitUpgrade) { - return false; - } - default boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { return false; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitCapabilities.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitCapabilities.java index 3dab87a20a..756bd3f916 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitCapabilities.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitCapabilities.java @@ -2,12 +2,9 @@ import com.enderio.base.api.EnderIO; import com.enderio.conduits.api.facade.ConduitFacadeProvider; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; import net.neoforged.neoforge.capabilities.ItemCapability; public class ConduitCapabilities { - public static final ItemCapability CONDUIT_UPGRADE = ItemCapability - .createVoid(EnderIO.loc("conduit_upgrade"), ConduitUpgrade.class); public static final ItemCapability CONDUIT_FACADE_PROVIDER = ItemCapability .createVoid(EnderIO.loc("conduit_facade_provider"), ConduitFacadeProvider.class); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextSerializer.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextSerializer.java deleted file mode 100644 index da31ab1c33..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextSerializer.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.enderio.conduits.api; - -import net.minecraft.nbt.CompoundTag; - -public interface ConduitNetworkContextSerializer> { - CompoundTag save(T context); - T load(CompoundTag tag); -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNode.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNode.java index d3d2b396fd..58274b49ef 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNode.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNode.java @@ -2,7 +2,6 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.DyeColor; @@ -14,9 +13,6 @@ public interface ConduitNode extends ConduitDataAccessor { Optional getIOState(Direction direction); BlockPos getPos(); - @Nullable - ConduitUpgrade getUpgrade(Direction direction); - @Nullable ResourceFilter getExtractFilter(Direction direction); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java index c9c4c8392d..2533cf6c4c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java @@ -6,7 +6,6 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitNetwork; import com.enderio.conduits.api.ConduitNode; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import net.minecraft.core.BlockPos; @@ -111,11 +110,6 @@ public BlockPos move() { return pos().relative(direction); } - @Nullable - public ConduitUpgrade upgrade() { - return node.getUpgrade(direction); - } - @Nullable public ResourceFilter extractFilter() { return node.getExtractFilter(direction); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/upgrade/ConduitUpgrade.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/upgrade/ConduitUpgrade.java deleted file mode 100644 index 469e2df96f..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/upgrade/ConduitUpgrade.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.enderio.conduits.api.upgrade; - -public interface ConduitUpgrade { -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/upgrade/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/upgrade/package-info.java deleted file mode 100644 index 2c67505d3c..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/upgrade/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault - -package com.enderio.conduits.api.upgrade; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/components/ExtractionSpeedUpgrade.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/components/ExtractionSpeedUpgrade.java deleted file mode 100644 index 67a4b990b4..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/components/ExtractionSpeedUpgrade.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.enderio.conduits.common.components; - -import com.enderio.conduits.api.upgrade.ConduitUpgrade; -import net.minecraft.core.component.DataComponentType; -import net.minecraft.world.item.ItemStack; - -import java.util.function.Supplier; - -public final class ExtractionSpeedUpgrade implements ConduitUpgrade { - private final Supplier> componentType; - private final ItemStack itemStack; - - public ExtractionSpeedUpgrade(Supplier> componentType, ItemStack itemStack) { - this.componentType = componentType; - this.itemStack = itemStack; - } - - public int tier() { - return itemStack.getOrDefault(componentType.get(), 0); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/components/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/components/package-info.java deleted file mode 100644 index b21beca9c9..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/components/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault - -package com.enderio.conduits.common.components; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java index 3a3fa6a38c..bb3eced170 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java @@ -9,7 +9,6 @@ import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitNode; import com.enderio.conduits.api.SlotType; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; import com.enderio.conduits.client.particle.ConduitBreakParticle; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.ConduitBundle; @@ -821,12 +820,7 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) { return conduit.value().canApplyFilter(slotData.slotType(), resourceFilter); case UPGRADE_EXTRACT: - ConduitUpgrade conduitUpgrade = stack.getCapability(ConduitCapabilities.CONDUIT_UPGRADE); - if (conduitUpgrade == null) { - return false; - } - - return conduit.value().canApplyUpgrade(slotData.slotType(), conduitUpgrade); + // Upgrades have been removed default: return false; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java index 09d202a184..b2c63d2537 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java @@ -7,7 +7,6 @@ import com.enderio.conduits.api.SlotType; import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.ConduitInventory; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; import com.enderio.conduits.common.conduit.SlotData; import java.util.EnumMap; import java.util.HashMap; @@ -165,12 +164,7 @@ public boolean isItemValid(int slot, ItemStack stack) { return conduit.value().canApplyFilter(slotData.slotType(), resourceFilter); case UPGRADE_EXTRACT: - ConduitUpgrade conduitUpgrade = stack.getCapability(ConduitCapabilities.CONDUIT_UPGRADE); - if (conduitUpgrade == null) { - return false; - } - - return conduit.value().canApplyUpgrade(slotData.slotType(), conduitUpgrade); + // Upgrades have been removed default: return false; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java index ec76834797..f5705553ee 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java @@ -10,7 +10,6 @@ import com.enderio.conduits.api.ConduitNode; import com.enderio.conduits.api.bundle.ConduitInventory; import com.enderio.conduits.api.connection.ConduitConnection; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -151,11 +150,6 @@ public void handleClientChanges(ConduitDataContainer clientDataContainer) { // endregion - @Override - public @Nullable ConduitUpgrade getUpgrade(Direction direction) { - return connectionStates.get(direction).upgradeExtract().getCapability(ConduitCapabilities.CONDUIT_UPGRADE); - } - @Override public @Nullable ResourceFilter getExtractFilter(Direction direction) { return connectionStates.get(direction).filterExtract().getCapability(EIOCapabilities.Filter.ITEM); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index b907b47cd4..22b635e852 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -7,8 +7,6 @@ import com.enderio.conduits.api.ConduitNode; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.SlotType; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; -import com.enderio.conduits.common.components.ExtractionSpeedUpgrade; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.util.TooltipUtil; @@ -101,11 +99,6 @@ public void onConnectTo(ConduitNode selfNode, ConduitNode otherNode) { } } - @Override - public boolean canApplyUpgrade(SlotType slotType, ConduitUpgrade conduitUpgrade) { - return conduitUpgrade instanceof ExtractionSpeedUpgrade; - } - @Override public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { return resourceFilter instanceof FluidStackFilter; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java index 49c571e0b6..d9c2d6e3fc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java @@ -5,7 +5,6 @@ import com.enderio.conduits.api.ConduitNetwork; import com.enderio.conduits.api.ConduitNode; import com.enderio.conduits.api.ticker.CapabilityAwareConduitTicker; -import com.enderio.conduits.common.components.ExtractionSpeedUpgrade; import com.enderio.conduits.common.init.ConduitTypes; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -19,19 +18,12 @@ import net.neoforged.neoforge.fluids.capability.IFluidHandler; import java.util.List; -import java.util.Optional; public class FluidConduitTicker extends CapabilityAwareConduitTicker { private int getScaledFluidRate(FluidConduit conduit, CapabilityConnection extractingConnection) { // Adjust for tick rate. Always flow up so we are at minimum meeting the required rate. int rate = (int)Math.ceil(conduit.transferRatePerTick() * (20.0 / conduit.graphTickRate())); - - // Apply speed upgrade - if (extractingConnection.upgrade() instanceof ExtractionSpeedUpgrade speedUpgrade) { - // TODO: Review scaling. - rate *= (int) Math.pow(2, speedUpgrade.tier()); - } return rate; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java index 0c02099f0c..6404e077ff 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java @@ -6,8 +6,6 @@ import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.SlotType; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; -import com.enderio.conduits.common.components.ExtractionSpeedUpgrade; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.util.TooltipUtil; @@ -60,11 +58,6 @@ public ConduitMenuData getMenuData() { return MENU_DATA; } - @Override - public boolean canApplyUpgrade(SlotType slotType, ConduitUpgrade conduitUpgrade) { - return conduitUpgrade instanceof ExtractionSpeedUpgrade; - } - @Override public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { return resourceFilter instanceof ItemStackFilter; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java index 774284e3e7..697b1b88ab 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java @@ -4,7 +4,6 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.ConduitNetwork; import com.enderio.conduits.api.ticker.CapabilityAwareConduitTicker; -import com.enderio.conduits.common.components.ExtractionSpeedUpgrade; import com.enderio.conduits.common.init.ConduitTypes; import java.util.List; import net.minecraft.core.Direction; @@ -27,9 +26,6 @@ protected void tickCapabilityGraph(ServerLevel level, ItemConduit conduit, List< int extracted = 0; int speed = conduit.transferRatePerCycle(); - if (extract.upgrade() instanceof ExtractionSpeedUpgrade speedUpgrade) { - speed *= (int) Math.pow(2, speedUpgrade.tier()); - } nextItem: for (int i = 0; i < extractHandler.getSlots(); i++) { ItemStack extractedItem = extractHandler.extractItem(i, speed - extracted, true); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/upgrade/SpeedUpgradeItem.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/upgrade/SpeedUpgradeItem.java deleted file mode 100644 index a332670444..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/upgrade/SpeedUpgradeItem.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.enderio.conduits.common.conduit.upgrade; - -import com.enderio.conduits.api.upgrade.ConduitUpgrade; -import com.enderio.conduits.common.components.ExtractionSpeedUpgrade; -import com.enderio.conduits.common.init.ConduitComponents; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.capabilities.ICapabilityProvider; - -public class SpeedUpgradeItem extends Item { - - public static final ICapabilityProvider CAPABILITY_PROVIDER - = (stack, v) -> new ExtractionSpeedUpgrade(ConduitComponents.EXTRACTION_SPEED_UPGRADE_TIER, stack); - - public SpeedUpgradeItem(Properties pProperties) { - super(pProperties); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/upgrade/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/upgrade/package-info.java deleted file mode 100644 index 22a89f8f7b..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/upgrade/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault - -package com.enderio.conduits.common.conduit.upgrade; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitItems.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitItems.java index c63b3a3323..2c66aeab4a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitItems.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitItems.java @@ -9,7 +9,6 @@ import com.enderio.conduits.client.ConduitFacadeColor; import com.enderio.conduits.common.conduit.facades.ComponentBackedConduitFacadeProvider; import com.enderio.conduits.common.conduit.facades.ConduitFacadeItem; -import com.enderio.conduits.common.conduit.upgrade.SpeedUpgradeItem; import com.enderio.conduits.common.redstone.DoubleRedstoneChannel; import com.enderio.conduits.common.redstone.RedstoneCountFilter; import com.enderio.conduits.common.redstone.RedstoneFilterItem; @@ -52,38 +51,6 @@ private static RegiliteItem conduitFacade(String name, Facade ComponentBackedConduitFacadeProvider.PROVIDER); } - public static final RegiliteItem EXTRACTION_SPEED_UPGRADE_1 = ITEM_REGISTRY - .registerItem("extraction_speed_upgrade_1", - properties -> new SpeedUpgradeItem( - properties.component(ConduitComponents.EXTRACTION_SPEED_UPGRADE_TIER, 1))) - .setTranslation("Tier 1 Extraction Speed Upgrade") - .setTab(EIOCreativeTabs.CONDUITS) - .addCapability(ConduitCapabilities.CONDUIT_UPGRADE, SpeedUpgradeItem.CAPABILITY_PROVIDER); - - public static final RegiliteItem EXTRACTION_SPEED_UPGRADE_2 = ITEM_REGISTRY - .registerItem("extraction_speed_upgrade_2", - properties -> new SpeedUpgradeItem( - properties.component(ConduitComponents.EXTRACTION_SPEED_UPGRADE_TIER, 2))) - .setTranslation("Tier 2 Extraction Speed Upgrade") - .setTab(EIOCreativeTabs.CONDUITS) - .addCapability(ConduitCapabilities.CONDUIT_UPGRADE, SpeedUpgradeItem.CAPABILITY_PROVIDER); - - public static final RegiliteItem EXTRACTION_SPEED_UPGRADE_3 = ITEM_REGISTRY - .registerItem("extraction_speed_upgrade_3", - properties -> new SpeedUpgradeItem( - properties.component(ConduitComponents.EXTRACTION_SPEED_UPGRADE_TIER, 3))) - .setTranslation("Tier 3 Extraction Speed Upgrade") - .setTab(EIOCreativeTabs.CONDUITS) - .addCapability(ConduitCapabilities.CONDUIT_UPGRADE, SpeedUpgradeItem.CAPABILITY_PROVIDER); - - public static final RegiliteItem EXTRACTION_SPEED_UPGRADE_4 = ITEM_REGISTRY - .registerItem("extraction_speed_upgrade_4", - properties -> new SpeedUpgradeItem( - properties.component(ConduitComponents.EXTRACTION_SPEED_UPGRADE_TIER, 4))) - .setTranslation("Tier 4 Extraction Speed Upgrade") - .setTab(EIOCreativeTabs.CONDUITS) - .addCapability(ConduitCapabilities.CONDUIT_UPGRADE, SpeedUpgradeItem.CAPABILITY_PROVIDER); - public static final RegiliteItem NOT_FILTER = createRedstoneFilter("redstone_not_filter", ConduitComponents.REDSTONE_NOT_FILTER, Unit.INSTANCE, RedstoneFilterItem.NOT_FILTER_PROVIDER, null); public static final RegiliteItem OR_FILTER = createRedstoneFilter("redstone_or_filter", diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java b/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java index bb11dfb8fa..5d724de684 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java @@ -53,7 +53,6 @@ protected void buildRecipes(RecipeOutput recipeOutput) { var enderEnergyConduit = conduitRegistry.getOrThrow(Conduits.ENDER_ENERGY); var redstoneConduit = conduitRegistry.getOrThrow(Conduits.REDSTONE); - buildUpgradeRecipes(recipeOutput); buildFilterRecipes(recipeOutput); buildFilterConversionRecipes(recipeOutput); buildFacadeCraftingRecipes(recipeOutput); @@ -157,76 +156,6 @@ protected void buildRecipes(RecipeOutput recipeOutput) { } - private void buildUpgradeRecipes(RecipeOutput recipeOutput) { - ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ConduitItems.EXTRACTION_SPEED_UPGRADE_1.get(), 2) - .pattern("III") - .pattern("APA") - .pattern("ATA") - .define('I', Tags.Items.INGOTS_IRON) - .define('P', Items.PISTON) - .define('T', Items.REDSTONE_TORCH) - .define('A', EIOTags.Items.INGOTS_REDSTONE_ALLOY) - .unlockedBy("has_ingredient", - InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.REDSTONE_ALLOY_INGOT)) - .save(recipeOutput); - - ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ConduitItems.EXTRACTION_SPEED_UPGRADE_2.get(), 2) - .pattern("III") - .pattern("APA") - .pattern("ATA") - .define('I', Tags.Items.INGOTS_IRON) - .define('P', Items.PISTON) - .define('T', Items.REDSTONE_TORCH) - .define('A', EIOTags.Items.INGOTS_CONDUCTIVE_ALLOY) - .unlockedBy("has_ingredient", - InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUCTIVE_ALLOY_INGOT)) - .save(recipeOutput); - - ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ConduitItems.EXTRACTION_SPEED_UPGRADE_2) - .requires(ConduitItems.EXTRACTION_SPEED_UPGRADE_1) - .requires(Ingredient.of(EIOTags.Items.INGOTS_CONDUCTIVE_ALLOY), 2) - .unlockedBy("has_ingredient", - InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUCTIVE_ALLOY_INGOT)) - .save(recipeOutput, EnderIO.loc("extraction_speed_upgrade_1_upgrade")); - - ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ConduitItems.EXTRACTION_SPEED_UPGRADE_3.get(), 2) - .pattern("III") - .pattern("APA") - .pattern("ATA") - .define('I', EIOTags.Items.INGOTS_DARK_STEEL) - .define('P', Items.PISTON) - .define('T', Items.REDSTONE_TORCH) - .define('A', EIOTags.Items.INGOTS_SOULARIUM) - .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.SOULARIUM_INGOT)) - .save(recipeOutput); - - ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ConduitItems.EXTRACTION_SPEED_UPGRADE_3) - .requires(ConduitItems.EXTRACTION_SPEED_UPGRADE_2) - .requires(Ingredient.of(EIOTags.Items.INGOTS_SOULARIUM), 2) - .unlockedBy("has_ingredient", - InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUCTIVE_ALLOY_INGOT)) - .save(recipeOutput, EnderIO.loc("extraction_speed_upgrade_2_upgrade")); - - ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ConduitItems.EXTRACTION_SPEED_UPGRADE_4.get(), 2) - .pattern("III") - .pattern("APA") - .pattern("ATA") - .define('I', EIOTags.Items.INGOTS_DARK_STEEL) - .define('P', Items.PISTON) - .define('T', Items.REDSTONE_TORCH) - .define('A', EIOTags.Items.INGOTS_ENERGETIC_ALLOY) - .unlockedBy("has_ingredient", - InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.ENERGETIC_ALLOY_INGOT)) - .save(recipeOutput); - - ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ConduitItems.EXTRACTION_SPEED_UPGRADE_4) - .requires(ConduitItems.EXTRACTION_SPEED_UPGRADE_3) - .requires(Ingredient.of(EIOTags.Items.INGOTS_ENERGETIC_ALLOY), 2) - .unlockedBy("has_ingredient", - InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.ENERGETIC_ALLOY_INGOT)) - .save(recipeOutput, EnderIO.loc("extraction_speed_upgrade_3_upgrade")); - } - private void buildFilterRecipes(RecipeOutput recipeOutput) { ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ConduitItems.NOT_FILTER) .define('T', Items.REDSTONE_TORCH) From 94570fcc8d51d434e28e409a6eddef984044088a Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Wed, 8 Jan 2025 11:12:23 +0000 Subject: [PATCH 07/27] chore: Save a large amount of work I'm not interested in documenting all the work and in progress changes here --- .../gui/screen/EnderContainerScreen.java | 32 +- .../core/common/menu/BaseBlockEntityMenu.java | 4 +- .../resources/assets/enderio/lang/en_us.json | 25 +- .../gui/widget/DyeColorPickerWidget.java | 3 +- .../enderio/base/common/lang/EIOEnumLang.java | 21 + .../com/enderio/base/common/lang/EIOLang.java | 20 +- .../mods/appeng/AE2ConduitsModule.java | 2 +- .../appeng/ConduitInWorldGridNodeHost.java | 4 +- .../modconduits/mods/appeng/MEConduit.java | 4 +- .../mods/mekanism/ChemicalConduit.java | 4 +- .../mods/mekanism/ChemicalConduitData.java | 4 +- .../ChemicalConduitScreenExtension.java | 2 +- .../mods/mekanism/ChemicalTicker.java | 4 +- .../modconduits/mods/mekanism/HeatTicker.java | 2 +- .../mods/mekanism/MekanismModule.java | 2 +- .../MultiCapabilityAwareConduitTicker.java | 4 +- .../mods/refinedstorage/RSConduit.java | 4 +- .../mods/refinedstorage/RSNetworkHost.java | 4 +- .../refinedstorage/RefinedStorageModule.java | 2 +- .../resources/assets/enderio/lang/en_us.json | 12 + .../com/enderio/conduits/EnderIOConduits.java | 4 +- .../com/enderio/conduits/api/Conduit.java | 59 +- .../com/enderio/conduits/api/ConduitNode.java | 39 - .../com/enderio/conduits/api/ConduitType.java | 2 + .../api/EnderIOConduitsRegistries.java | 19 +- .../bundle/AddConduitResult.java} | 12 +- .../api/bundle/ConduitBundleAccessor.java | 36 +- .../api/bundle/ConduitBundleReader.java | 25 +- .../conduits/api/bundle/ConduitInventory.java | 1 - .../conduits/api/{ => bundle}/SlotType.java | 4 +- .../api/connection/ConduitConnection.java | 70 -- .../api/connection/ConduitConnectionMode.java | 57 -- .../api/connection/ConduitConnectionType.java | 12 +- .../connection/config/ConnectionConfig.java | 39 + .../config/ConnectionConfigAccessor.java | 46 ++ .../config/ConnectionConfigType.java | 30 + .../io/ChannelResourceConnectionConfig.java | 10 + .../config/io/ResourceConnectionConfig.java | 23 + .../RedstoneControlledConnection.java | 15 + .../signal/ChannelSignalConnectionConfig.java | 10 + .../config/signal/SignalConnectionConfig.java | 30 + .../conduits/api/menu/ConduitMenuData.java | 41 + .../api/menu/ConduitMenuExtension.java | 35 + .../api/model/ConduitCoreModelModifier.java | 6 +- .../api/{ => network}/ConduitNetwork.java | 4 +- .../{ => network}/ConduitNetworkContext.java | 2 +- .../ConduitNetworkContextAccessor.java | 2 +- .../ConduitNetworkContextType.java | 2 +- .../api/network/node/ConduitNode.java | 37 + .../conduits/api/network/node/NodeData.java | 17 + .../api/network/node/NodeDataAccessor.java | 40 + .../api/network/node/NodeDataType.java | 8 + .../node/legacy}/ConduitData.java | 12 +- .../node/legacy}/ConduitDataAccessor.java | 6 +- .../node/legacy}/ConduitDataType.java | 2 +- .../api/screen/ConduitScreenExtension.java | 2 +- .../api/screen/NewConduitScreenExtension.java | 17 + .../ticker/CapabilityAwareConduitTicker.java | 4 +- .../conduits/api/ticker/ConduitTicker.java | 2 +- .../api/ticker/IOAwareConduitTicker.java | 53 +- .../api/ticker/LoadedAwareConduitTicker.java | 10 +- .../conduits/client/ConduitClientSetup.java | 6 +- .../conduits/client/gui/ConduitScreen.java | 21 +- .../client/gui/RedstoneCountFilterScreen.java | 3 +- .../RedstoneDoubleChannelFilterScreen.java | 5 +- .../conduit/FluidConduitScreenExtension.java | 9 +- .../conduit/ItemConduitScreenExtension.java | 11 +- .../NewItemConduitScreenExtension.java | 58 ++ .../client/gui/screen/NewConduitScreen.java | 193 +++++ .../client/model/ConduitBlockModel.java | 376 ---------- .../client/model/ConduitGeometry.java | 35 - .../model/{ => conduit}/ConduitItemModel.java | 2 +- .../{ => conduit}/ConduitItemModelLoader.java | 2 +- .../conduit/bundle/ConduitBundleGeometry.java | 4 +- .../bundle/ConduitBundleModel.java} | 23 +- .../bundle/ConduitBundleRenderState.java | 47 +- .../bundle/ConduitConnectionRenderState.java | 46 ++ .../facades}/FacadeItemGeometry.java | 2 +- .../facades}/FacadeItemModel.java | 2 +- .../FluidConduitCoreModelModifier.java | 19 +- .../common/conduit/ConduitBundle.java | 31 +- .../common/conduit/ConduitSavedData.java | 15 +- .../conduits/common/conduit/SlotData.java | 2 +- .../conduit/block/ConduitBundleBlock.java | 24 +- .../block/ConduitBundleBlockEntity.java | 39 +- .../conduit/bundle/NewConduitBundleBlock.java | 60 +- .../bundle/NewConduitBundleBlockEntity.java | 700 ++++++++++++------ .../bundle/NewConduitBundleInventory.java | 3 +- .../conduit/bundle/NewConduitShape.java | 83 ++- .../connection/DynamicConnectionState.java | 2 +- .../conduit/facades/ConduitFacadeItem.java | 20 + .../conduit/graph/ConduitConnectionHost.java | 20 + .../conduit/graph/ConduitDataContainer.java | 15 +- .../conduit/graph/ConduitGraphContext.java | 6 +- .../conduit/graph/ConduitGraphObject.java | 242 ++++-- .../conduit/graph/WrappedConduitNetwork.java | 8 +- .../common/conduit/graph/package-info.java | 4 + .../common/conduit/menu/NewConduitMenu.java | 151 ++++ .../conduit/type/energy/EnergyConduit.java | 53 +- .../energy/EnergyConduitConnectionConfig.java | 74 ++ .../energy/EnergyConduitNetworkContext.java | 8 +- .../type/energy/EnergyConduitStorage.java | 10 +- .../type/energy/EnergyConduitTicker.java | 4 +- .../conduit/type/fluid/FluidConduit.java | 102 ++- .../conduit/type/fluid/FluidConduitData.java | 11 +- .../fluid/FluidConduitNetworkContext.java | 57 ++ .../type/fluid/FluidConduitTicker.java | 51 +- .../common/conduit/type/item/ItemConduit.java | 45 +- .../item/ItemConduitConnectionConfig.java | 98 +++ .../conduit/type/item/ItemConduitData.java | 20 +- .../type/item/ItemConduitMenuData.java | 53 ++ .../type/item/ItemConduitNodeData.java | 46 ++ .../conduit/type/item/ItemConduitTicker.java | 28 +- .../type/redstone/RedstoneConduit.java | 54 +- .../type/redstone/RedstoneConduitData.java | 15 +- .../RedstoneConduitNetworkContext.java | 66 ++ .../type/redstone/RedstoneConduitTicker.java | 25 +- .../conduits/common/init/ConduitLang.java | 28 + .../conduits/common/init/ConduitMenus.java | 6 +- .../conduits/common/init/ConduitTypes.java | 48 +- .../conduits/common/init/Conduits.java | 14 +- .../cctweaked/EIOBundledRedstoneProvider.java | 32 +- .../conduits/common/menu/ConduitMenu.java | 2 +- .../conduits/common/menu/ConduitSlot.java | 2 +- .../common/network/ConduitNetwork.java | 12 + .../network/ConduitServerPayloadHandler.java | 52 ++ .../C2SConduitConnectionPacket.java | 12 + .../C2SSetConduitChannelPacket.java | 47 ++ .../C2SSetConduitRedstoneChannelPacket.java | 38 + .../C2SSetConduitRedstoneControlPacket.java | 39 + .../jade/EIOConduitsJadePlugin.java | 3 + .../blocks/base/block/MachineBlock.java | 1 + enderio/build.gradle.kts | 13 +- settings.gradle | 3 +- 134 files changed, 3073 insertions(+), 1392 deletions(-) delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNode.java rename enderio-conduits/src/main/java/com/enderio/conduits/{common/conduit/RightClickAction.java => api/bundle/AddConduitResult.java} (61%) rename enderio-conduits/src/main/java/com/enderio/conduits/api/{ => bundle}/SlotType.java (88%) delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigAccessor.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChannelResourceConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ResourceConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/ChannelSignalConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/SignalConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuData.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuExtension.java rename enderio-conduits/src/main/java/com/enderio/conduits/api/{ => network}/ConduitNetwork.java (58%) rename enderio-conduits/src/main/java/com/enderio/conduits/api/{ => network}/ConduitNetworkContext.java (79%) rename enderio-conduits/src/main/java/com/enderio/conduits/api/{ => network}/ConduitNetworkContextAccessor.java (89%) rename enderio-conduits/src/main/java/com/enderio/conduits/api/{ => network}/ConduitNetworkContextType.java (85%) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeData.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataAccessor.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataType.java rename enderio-conduits/src/main/java/com/enderio/conduits/api/{ => network/node/legacy}/ConduitData.java (70%) rename enderio-conduits/src/main/java/com/enderio/conduits/api/{ => network/node/legacy}/ConduitDataAccessor.java (81%) rename enderio-conduits/src/main/java/com/enderio/conduits/api/{ => network/node/legacy}/ConduitDataType.java (86%) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/NewConduitScreenExtension.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/NewItemConduitScreenExtension.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitGeometry.java rename enderio-conduits/src/main/java/com/enderio/conduits/client/model/{ => conduit}/ConduitItemModel.java (98%) rename enderio-conduits/src/main/java/com/enderio/conduits/client/model/{ => conduit}/ConduitItemModelLoader.java (97%) rename enderio-conduits/src/main/java/com/enderio/conduits/client/model/{rewrite => }/conduit/bundle/ConduitBundleGeometry.java (92%) rename enderio-conduits/src/main/java/com/enderio/conduits/client/model/{rewrite/conduit/bundle/NewConduitBundleModel.java => conduit/bundle/ConduitBundleModel.java} (95%) rename enderio-conduits/src/main/java/com/enderio/conduits/client/model/{rewrite => }/conduit/bundle/ConduitBundleRenderState.java (71%) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java rename enderio-conduits/src/main/java/com/enderio/conduits/client/model/{ => conduit/facades}/FacadeItemGeometry.java (97%) rename enderio-conduits/src/main/java/com/enderio/conduits/client/model/{ => conduit/facades}/FacadeItemModel.java (98%) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitConnectionHost.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/package-info.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitMenuData.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitNodeData.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java diff --git a/endercore/src/main/java/com/enderio/core/client/gui/screen/EnderContainerScreen.java b/endercore/src/main/java/com/enderio/core/client/gui/screen/EnderContainerScreen.java index 69add7d27f..1df1fc268d 100644 --- a/endercore/src/main/java/com/enderio/core/client/gui/screen/EnderContainerScreen.java +++ b/endercore/src/main/java/com/enderio/core/client/gui/screen/EnderContainerScreen.java @@ -55,35 +55,35 @@ protected void centerAlignTitleLabelX() { } @Override - public void render(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { + public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { if (menu instanceof LegacyBaseBlockEntityMenu baseBlockEntityMenu && baseBlockEntityMenu.getBlockEntity() == null) { return; } - super.render(pGuiGraphics, pMouseX, pMouseY, pPartialTick); + super.render(guiGraphics, mouseX, mouseY, partialTick); } @Override - protected void renderLabels(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY) { + protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { if (shouldRenderLabels) { - super.renderLabels(pGuiGraphics, pMouseX, pMouseY); + super.renderLabels(guiGraphics, mouseX, mouseY); } // Move back to screen space rather than aligned to the background coordinates - pGuiGraphics.pose().pushPose(); - pGuiGraphics.pose().translate(-leftPos, -topPos, 0.0D); + guiGraphics.pose().pushPose(); + guiGraphics.pose().translate(-leftPos, -topPos, 0.0D); int zOffset = 200; for (var layer : overlayRenderables.keySet()) { // Offset deeper for each layer. - pGuiGraphics.pose().pushPose(); + guiGraphics.pose().pushPose(); zOffset += 150; - pGuiGraphics.pose().translate(0.0D, 0.0D, zOffset); + guiGraphics.pose().translate(0.0D, 0.0D, zOffset); for (var overlay : overlayRenderables.get(layer)) { if (!(overlay instanceof AbstractWidget widget) || widget.isActive()) { - overlay.render(pGuiGraphics, pMouseX, pMouseY, + overlay.render(guiGraphics, mouseX, mouseY, Minecraft.getInstance().getTimer().getGameTimeDeltaPartialTick(false)); if (overlay instanceof BaseOverlay baseOverlay) { @@ -92,19 +92,19 @@ protected void renderLabels(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY) } } - pGuiGraphics.pose().popPose(); + guiGraphics.pose().popPose(); } - pGuiGraphics.pose().popPose(); + guiGraphics.pose().popPose(); - pGuiGraphics.pose().translate(0, 0, zOffset); + guiGraphics.pose().translate(0, 0, zOffset); - pGuiGraphics.pose().pushPose(); - pGuiGraphics.pose().translate(-leftPos, -topPos, 0.0D); + guiGraphics.pose().pushPose(); + guiGraphics.pose().translate(-leftPos, -topPos, 0.0D); - renderTooltip(pGuiGraphics, pMouseX, pMouseY); + renderTooltip(guiGraphics, mouseX, mouseY); - pGuiGraphics.pose().popPose(); + guiGraphics.pose().popPose(); } @Override diff --git a/endercore/src/main/java/com/enderio/core/common/menu/BaseBlockEntityMenu.java b/endercore/src/main/java/com/enderio/core/common/menu/BaseBlockEntityMenu.java index ca49f4d3e7..177b0a6d6a 100644 --- a/endercore/src/main/java/com/enderio/core/common/menu/BaseBlockEntityMenu.java +++ b/endercore/src/main/java/com/enderio/core/common/menu/BaseBlockEntityMenu.java @@ -40,7 +40,7 @@ public T getBlockEntity() { } @Override - public boolean stillValid(Player pPlayer) { - return Container.stillValidBlockEntity(getBlockEntity(), pPlayer); + public boolean stillValid(Player player) { + return Container.stillValidBlockEntity(getBlockEntity(), player); } } diff --git a/enderio-base/src/generated/resources/assets/enderio/lang/en_us.json b/enderio-base/src/generated/resources/assets/enderio/lang/en_us.json index 602309f146..69a6e1f469 100644 --- a/enderio-base/src/generated/resources/assets/enderio/lang/en_us.json +++ b/enderio-base/src/generated/resources/assets/enderio/lang/en_us.json @@ -238,16 +238,12 @@ "gui.enderio.collision.mobs_pass": "Not solid to monsters", "gui.enderio.collision.players_block": "Only solid to players", "gui.enderio.collision.players_pass": "Not solid to players", - "gui.enderio.conduit_channel": "Conduit-Channel", "gui.enderio.confirm": "Confirm", "gui.enderio.filter": "Filter", "gui.enderio.filter.blacklist": "BlackList", "gui.enderio.filter.nbt": "Match NBT", "gui.enderio.filter.nonbt": "Ignore NBT", "gui.enderio.filter.whitelist": "Whitelist", - "gui.enderio.fluid_conduit.change_fluid1": "Locked Fluid:", - "gui.enderio.fluid_conduit.change_fluid2": "Click to reset!", - "gui.enderio.fluid_conduit.change_fluid3": "Fluid: %s", "gui.enderio.ioconfig": "IO Configuration", "gui.enderio.ioconfig.both": "Push / Pull", "gui.enderio.ioconfig.disabled": "Disabled", @@ -265,13 +261,24 @@ "gui.enderio.redstone.active_with_signal": "Active with Signal", "gui.enderio.redstone.active_without_signal": "Active without Signal", "gui.enderio.redstone.always_active": "Always Active", + "gui.enderio.redstone.black": "Black", + "gui.enderio.redstone.blue": "Blue", + "gui.enderio.redstone.brown": "Brown", + "gui.enderio.redstone.cyan": "Cyan", + "gui.enderio.redstone.gray": "Gray", + "gui.enderio.redstone.green": "Green", + "gui.enderio.redstone.light_blue": "Light Blue", + "gui.enderio.redstone.light_gray": "Light Gray", + "gui.enderio.redstone.lime": "Lime", + "gui.enderio.redstone.magenta": "Magenta", "gui.enderio.redstone.mode": "Redstone Mode", "gui.enderio.redstone.never_active": "Never Active", - "gui.enderio.redstone_channel": "Redstone-Channel", - "gui.enderio.round_robin.disabled": "Round Robin Disabled", - "gui.enderio.round_robin.enabled": "Round Robin Enabled", - "gui.enderio.self_feed.disabled": "Self Feed Disabled", - "gui.enderio.self_feed.enabled": "Self Feed Enabled", + "gui.enderio.redstone.orange": "Orange", + "gui.enderio.redstone.pink": "Pink", + "gui.enderio.redstone.purple": "Purple", + "gui.enderio.redstone.red": "Red", + "gui.enderio.redstone.white": "White", + "gui.enderio.redstone.yellow": "Yellow", "gui.enderio.visible.false": "Hidden", "gui.enderio.visible.true": "Visible", "guidebook.enderio.book_title": "Book Title", diff --git a/enderio-base/src/main/java/com/enderio/base/client/gui/widget/DyeColorPickerWidget.java b/enderio-base/src/main/java/com/enderio/base/client/gui/widget/DyeColorPickerWidget.java index c5c9a0c075..7e2eb8f274 100644 --- a/enderio-base/src/main/java/com/enderio/base/client/gui/widget/DyeColorPickerWidget.java +++ b/enderio-base/src/main/java/com/enderio/base/client/gui/widget/DyeColorPickerWidget.java @@ -1,6 +1,7 @@ package com.enderio.base.client.gui.widget; import com.enderio.base.client.gui.icon.EIOEnumIcons; +import com.enderio.base.common.lang.EIOEnumLang; import com.enderio.core.client.gui.widgets.BaseEnumPickerWidget; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -39,7 +40,7 @@ public DyeColorPickerWidget(int pX, int pY, Supplier getter, Consumer< @Override @Nullable public Component getValueTooltip(DyeColor value) { - return null; + return EIOEnumLang.DYE_COLOR.get(value); } @Override diff --git a/enderio-base/src/main/java/com/enderio/base/common/lang/EIOEnumLang.java b/enderio-base/src/main/java/com/enderio/base/common/lang/EIOEnumLang.java index 4d28e6f5e1..640b2e783e 100644 --- a/enderio-base/src/main/java/com/enderio/base/common/lang/EIOEnumLang.java +++ b/enderio-base/src/main/java/com/enderio/base/common/lang/EIOEnumLang.java @@ -8,6 +8,7 @@ import com.enderio.regilite.Regilite; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; public class EIOEnumLang { @@ -20,6 +21,26 @@ public class EIOEnumLang { .addTranslation(RedstoneControl.NEVER_ACTIVE, "Never Active") .build(); + public static final EnumTranslationMap DYE_COLOR = builder(DyeColor.class, + "redstone") + .addTranslation(DyeColor.WHITE, "White") + .addTranslation(DyeColor.ORANGE, "Orange") + .addTranslation(DyeColor.MAGENTA, "Magenta") + .addTranslation(DyeColor.LIGHT_BLUE, "Light Blue") + .addTranslation(DyeColor.YELLOW, "Yellow") + .addTranslation(DyeColor.LIME, "Lime") + .addTranslation(DyeColor.PINK, "Pink") + .addTranslation(DyeColor.GRAY, "Gray") + .addTranslation(DyeColor.LIGHT_GRAY, "Light Gray") + .addTranslation(DyeColor.CYAN, "Cyan") + .addTranslation(DyeColor.PURPLE, "Purple") + .addTranslation(DyeColor.BLUE, "Blue") + .addTranslation(DyeColor.BROWN, "Brown") + .addTranslation(DyeColor.GREEN, "Green") + .addTranslation(DyeColor.RED, "Red") + .addTranslation(DyeColor.BLACK, "Black") + .build(); + public static final EnumTranslationMap GLASS_COLLISION = builder( GlassCollisionPredicate.class, "collision") .addTranslation(GlassCollisionPredicate.PLAYERS_PASS, "Not solid to players") diff --git a/enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java b/enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java index 38daedb175..bae90df157 100644 --- a/enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java +++ b/enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java @@ -57,26 +57,8 @@ public class EIOLang { public static final Component TOO_MANY_LEVELS = addTranslation("info", EnderIO.loc("too_many_levels"), "You have more than 21862 levels, that's too much XP."); - public static final Component CONDUIT_CHANNEL = addTranslation("gui", EnderIO.loc("conduit_channel"), - "Conduit-Channel"); - public static final Component REDSTONE_CHANNEL = addTranslation("gui", EnderIO.loc("redstone_channel"), - "Redstone-Channel"); public static final Component REDSTONE_MODE = addTranslation("gui", EnderIO.loc("redstone.mode"), - "Redstone Mode"); - public static final Component ROUND_ROBIN_ENABLED = addTranslation("gui", EnderIO.loc("round_robin.enabled"), - "Round Robin Enabled"); - public static final Component ROUND_ROBIN_DISABLED = addTranslation("gui", EnderIO.loc("round_robin.disabled"), - "Round Robin Disabled"); - public static final Component SELF_FEED_ENABLED = addTranslation("gui", EnderIO.loc("self_feed.enabled"), - "Self Feed Enabled"); - public static final Component SELF_FEED_DISABLED = addTranslation("gui", EnderIO.loc("self_feed.disabled"), - "Self Feed Disabled"); - public static final Component FLUID_CONDUIT_CHANGE_FLUID1 = addTranslation("gui", - EnderIO.loc("fluid_conduit.change_fluid1"), "Locked Fluid:"); - public static final Component FLUID_CONDUIT_CHANGE_FLUID2 = addTranslation("gui", - EnderIO.loc("fluid_conduit.change_fluid2"), "Click to reset!"); - public static final MutableComponent FLUID_CONDUIT_CHANGE_FLUID3 = addTranslation("gui", - EnderIO.loc("fluid_conduit.change_fluid3"), "Fluid: %s"); + "Redstone Mode"); public static final MutableComponent TANK_EMPTY_STRING = addTranslation("tooltip", EnderIO.loc("fluid_tank.tank_empty_tooltip"), "Empty tank"); diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/AE2ConduitsModule.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/AE2ConduitsModule.java index 59bbbfb021..6cf3bbb424 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/AE2ConduitsModule.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/AE2ConduitsModule.java @@ -7,7 +7,7 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitApi; import com.enderio.conduits.api.ConduitCapabilities; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.modconduits.ConduitModule; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/ConduitInWorldGridNodeHost.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/ConduitInWorldGridNodeHost.java index b7ecbb74e4..3171136114 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/ConduitInWorldGridNodeHost.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/ConduitInWorldGridNodeHost.java @@ -5,8 +5,8 @@ import appeng.api.networking.IManagedGridNode; import appeng.api.util.AECableType; import com.enderio.base.api.network.DumbStreamCodec; -import com.enderio.conduits.api.ConduitData; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.Direction; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/MEConduit.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/MEConduit.java index d76e38216e..1dba554470 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/MEConduit.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/MEConduit.java @@ -7,8 +7,8 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.ticker.ConduitTicker; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduit.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduit.java index 6f4773f0e1..dfaa859bbb 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduit.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduit.java @@ -3,9 +3,9 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitType; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.core.common.util.TooltipUtil; import com.mojang.serialization.Codec; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduitData.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduitData.java index e540540299..55e05b0c67 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduitData.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduitData.java @@ -1,7 +1,7 @@ package com.enderio.modconduits.mods.mekanism; -import com.enderio.conduits.api.ConduitData; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduitScreenExtension.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduitScreenExtension.java index dd522a6aa5..d63e1a9ffd 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduitScreenExtension.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduitScreenExtension.java @@ -1,7 +1,7 @@ package com.enderio.modconduits.mods.mekanism; import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.ConduitDataAccessor; +import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; import com.enderio.conduits.api.screen.ConduitScreenExtension; import com.enderio.core.common.util.TooltipUtil; import com.mojang.blaze3d.systems.RenderSystem; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalTicker.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalTicker.java index 7e25bc5c8e..4e37a5860c 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalTicker.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalTicker.java @@ -1,8 +1,8 @@ package com.enderio.modconduits.mods.mekanism; import com.enderio.conduits.api.ColoredRedstoneProvider; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.CapabilityAwareConduitTicker; import mekanism.api.Action; import mekanism.api.chemical.Chemical; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/HeatTicker.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/HeatTicker.java index e399e95f02..37b4db20f1 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/HeatTicker.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/HeatTicker.java @@ -1,7 +1,7 @@ package com.enderio.modconduits.mods.mekanism; import com.enderio.conduits.api.ColoredRedstoneProvider; -import com.enderio.conduits.api.ConduitNetwork; +import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.ticker.CapabilityAwareConduitTicker; import mekanism.api.heat.IHeatHandler; import net.minecraft.core.Direction; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MekanismModule.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MekanismModule.java index ec876aad8b..af720f9b3d 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MekanismModule.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MekanismModule.java @@ -5,7 +5,7 @@ import com.enderio.base.common.init.EIOCreativeTabs; import com.enderio.base.common.init.EIOItems; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.screen.RegisterConduitScreenExtensionsEvent; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MultiCapabilityAwareConduitTicker.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MultiCapabilityAwareConduitTicker.java index 4d583440a5..78426728f8 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MultiCapabilityAwareConduitTicker.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MultiCapabilityAwareConduitTicker.java @@ -2,8 +2,8 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.IOAwareConduitTicker; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RSConduit.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RSConduit.java index f6527bea4f..2c55e3b36d 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RSConduit.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RSConduit.java @@ -3,8 +3,8 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.ticker.ConduitTicker; import com.mojang.serialization.MapCodec; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RSNetworkHost.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RSNetworkHost.java index 55943edc21..5f9fb8fc1a 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RSNetworkHost.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RSNetworkHost.java @@ -1,8 +1,8 @@ package com.enderio.modconduits.mods.refinedstorage; import com.enderio.base.api.network.DumbStreamCodec; -import com.enderio.conduits.api.ConduitData; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RefinedStorageModule.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RefinedStorageModule.java index 2e3c23d537..066112c86f 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RefinedStorageModule.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RefinedStorageModule.java @@ -4,7 +4,7 @@ import com.enderio.base.common.init.EIOItems; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitApi; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.modconduits.ConduitModule; diff --git a/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json b/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json index ac80953435..f14899813a 100644 --- a/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json +++ b/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json @@ -1,7 +1,19 @@ { "block.enderio.conduit": "Conduit Bundle", + "gui.enderio.conduit.enabled": "Enabled", "gui.enderio.conduit.extract": "Extract", + "gui.enderio.conduit.input": "Input", "gui.enderio.conduit.insert": "Insert", + "gui.enderio.conduit.output": "Output", + "gui.enderio.conduit_channel": "Channel", + "gui.enderio.fluid_conduit.change_fluid1": "Locked Fluid:", + "gui.enderio.fluid_conduit.change_fluid2": "Click to reset!", + "gui.enderio.fluid_conduit.change_fluid3": "Fluid: %s", + "gui.enderio.redstone_channel": "Signal Color", + "gui.enderio.round_robin.disabled": "Round Robin Disabled", + "gui.enderio.round_robin.enabled": "Round Robin Enabled", + "gui.enderio.self_feed.disabled": "Self Feed Disabled", + "gui.enderio.self_feed.enabled": "Self Feed Enabled", "item.enderio.conduit": " Conduit", "item.enderio.conduit.ender_energy": "Ender Energy Conduit", "item.enderio.conduit.ender_fluid": "Ender Fluid Conduit", diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/EnderIOConduits.java b/enderio-conduits/src/main/java/com/enderio/conduits/EnderIOConduits.java index 28dbd775b0..cc61b76eeb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/EnderIOConduits.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/EnderIOConduits.java @@ -39,7 +39,7 @@ public class EnderIOConduits { public static Regilite REGILITE = new Regilite(EnderIO.NAMESPACE); public EnderIOConduits(IEventBus modEventBus, ModContainer modContainer) { - Conduits.register(modEventBus); + Conduits.register(); ConduitTypes.register(modEventBus); ConduitBlockEntities.register(modEventBus); ConduitMenus.register(modEventBus); @@ -56,6 +56,8 @@ public EnderIOConduits(IEventBus modEventBus, ModContainer modContainer) { public static void onNewRegistries(NewRegistryEvent event) { event.register(EnderIOConduitsRegistries.CONDUIT_TYPE); event.register(EnderIOConduitsRegistries.CONDUIT_DATA_TYPE); + event.register(EnderIOConduitsRegistries.CONDUIT_CONNECTION_CONFIG_TYPE); + event.register(EnderIOConduitsRegistries.CONDUIT_NODE_DATA_TYPE); event.register(EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index 764f99a4fa..cf401da977 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -2,16 +2,19 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.conduits.api.connection.ConduitConnection; -import com.enderio.conduits.api.connection.ConduitConnectionMode; +import com.enderio.conduits.api.bundle.SlotType; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; import com.enderio.conduits.api.ticker.ConduitTicker; -import com.enderio.conduits.api.upgrade.ConduitUpgrade; import com.mojang.serialization.Codec; import java.util.Set; import java.util.function.Consumer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.codec.ByteBufCodecs; @@ -25,6 +28,7 @@ import net.minecraft.world.item.component.TooltipProvider; import net.minecraft.world.level.Level; import net.neoforged.neoforge.capabilities.BlockCapability; +import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.Nullable; public interface Conduit> extends Comparable, TooltipProvider { @@ -113,8 +117,9 @@ default boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) /** * Gets the conduit texture to display, given the data. + * @param clientDataTag client data from {@link #getClientDataTag(ConduitNode)}. */ - default ResourceLocation getTexture(ConduitNode node) { + default ResourceLocation getTexture(@Nullable CompoundTag clientDataTag) { return texture(); } @@ -140,11 +145,51 @@ default TCapability proxyCapability(BlockCapability connectionConfigType(); + + /** + * Convert old conduit connection data into the new connection config. + * This is executed during world load, so no level is available to query. + * @implNote Only needs to be implemented if the conduit existed in Ender IO 7.1 or earlier. + * @deprecated Only for conversion of <7.1 conduit data. Will be removed in Ender IO 8. + */ + @Deprecated(since = "7.2") + ConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, + DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel); + + /** + * Copy legacy data from the old conduit data accessor to the new node however you wish. + * @implNote The node is guaranteed to have a network at this point, so the context can be accessed. + * @param node the node. + * @param legacyDataAccessor the legacy data. + */ + @Deprecated(since = "7.2") + default void copyLegacyData(ConduitNode node, ConduitDataAccessor legacyDataAccessor) { } + // endregion + + // region Custom Sync + + default boolean hasClientDataTag() { + return false; + } + + /** + * Create a custom tag for syncing data from node data or network context to the client for extra behaviours. + * @return custom sync data. + */ + default CompoundTag getClientDataTag(ConduitNode node) { + throw new NotImplementedException(); + } + + // endregion + @Override default void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNode.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNode.java deleted file mode 100644 index 58274b49ef..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNode.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.enderio.conduits.api; - -import com.enderio.base.api.filter.ResourceFilter; -import com.enderio.base.api.misc.RedstoneControl; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.item.DyeColor; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -public interface ConduitNode extends ConduitDataAccessor { - Optional getIOState(Direction direction); - BlockPos getPos(); - - @Nullable - ResourceFilter getExtractFilter(Direction direction); - - @Nullable - ResourceFilter getInsertFilter(Direction direction); - - @Nullable - ConduitNetwork getParentGraph(); - - record IOState(Optional insert, Optional extract, RedstoneControl control, DyeColor redstoneChannel) { - - public boolean isInsert() { - return insert().isPresent(); - } - - public boolean isExtract() { - return extract().isPresent(); - } - - public static IOState of(@Nullable DyeColor in, @Nullable DyeColor extract, RedstoneControl control, DyeColor redstoneChannel) { - return new IOState(Optional.ofNullable(in), Optional.ofNullable(extract), control, redstoneChannel); - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java index cd57ea75a7..040d0ff724 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java @@ -16,6 +16,8 @@ import java.util.Set; import java.util.function.BiFunction; +// TODO: Change this from an interface to a record + builder? +// No point in having an interface imo. public interface ConduitType> { Codec> CODEC = Codec.lazyInitialized(EnderIOConduitsRegistries.CONDUIT_TYPE::byNameCodec); StreamCodec> STREAM_CODEC = StreamCodec.recursive( diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java index eb36ee500b..bcbb4a9a11 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java @@ -1,9 +1,9 @@ package com.enderio.conduits.api; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitDataType; -import com.enderio.conduits.api.ConduitNetworkContextType; -import com.enderio.conduits.api.ConduitType; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.network.ConduitNetworkContextType; +import com.enderio.conduits.api.network.node.NodeDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -19,12 +19,23 @@ public class EnderIOConduitsRegistries { .sync(true) .create(); + public static final Registry> CONDUIT_NODE_DATA_TYPE = new RegistryBuilder<>(Keys.CONDUIT_NODE_DATA_TYPE) + .sync(true) + .create(); + + public static final Registry> CONDUIT_CONNECTION_CONFIG_TYPE = new RegistryBuilder<>(Keys.CONDUIT_CONNECTION_CONFIG_TYPE) + .sync(true) + .create(); + public static final Registry> CONDUIT_NETWORK_CONTEXT_TYPE = new RegistryBuilder<>(Keys.CONDUIT_NETWORK_CONTEXT_TYPE) .sync(true) .create(); public static class Keys { public static final ResourceKey>> CONDUIT_DATA_TYPE = createKey("conduit_data_type"); + + public static final ResourceKey>> CONDUIT_NODE_DATA_TYPE = createKey("conduit_node_data_type"); + public static final ResourceKey>> CONDUIT_CONNECTION_CONFIG_TYPE = createKey("conduit_connection_config_type"); public static final ResourceKey>> CONDUIT_NETWORK_CONTEXT_TYPE = createKey("conduit_network_context_type"); public static final ResourceKey>> CONDUIT_TYPE = createKey("conduit_type"); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/RightClickAction.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java similarity index 61% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/RightClickAction.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java index 1b41b593fb..dee463a3fe 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/RightClickAction.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java @@ -1,24 +1,26 @@ -package com.enderio.conduits.common.conduit; +package com.enderio.conduits.api.bundle; import com.enderio.conduits.api.Conduit; import net.minecraft.core.Holder; +import org.jetbrains.annotations.ApiStatus; -public sealed interface RightClickAction permits RightClickAction.Upgrade, RightClickAction.Blocked, RightClickAction.Insert{ - record Upgrade(Holder> replacedConduit) implements RightClickAction { +@ApiStatus.Experimental +public sealed interface AddConduitResult permits AddConduitResult.Upgrade, AddConduitResult.Blocked, AddConduitResult.Insert{ + record Upgrade(Holder> replacedConduit) implements AddConduitResult { @Override public String toString() { return "Upgrade[" + replacedConduit.getRegisteredName() + "]"; } } - final class Insert implements RightClickAction { + final class Insert implements AddConduitResult { @Override public String toString() { return "Insert"; } } - final class Blocked implements RightClickAction { + final class Blocked implements AddConduitResult { @Override public String toString() { return "Blocked"; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java index 65148c7386..0464ffca92 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java @@ -1,7 +1,8 @@ package com.enderio.conduits.api.bundle; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.conduit.RightClickAction; +import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.config.ConnectionConfig; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.world.entity.player.Player; @@ -10,20 +11,20 @@ import org.jetbrains.annotations.Nullable; /** - * + * Mutable access to a conduit bundle. */ @ApiStatus.Experimental public interface ConduitBundleAccessor extends ConduitBundleReader { - // TODO: RightClickAction should have a better name. Maybe AddConduitResult - boolean canAddConduit(Holder> conduit); /** - * - * @return + * Attempt to add a conduit to the bundle. + * @param conduit the conduit to add + * @param player the player adding the conduit, or null if performed from another source. + * @return the result of the add operation. */ - RightClickAction addConduit(Holder> conduit, @Nullable Player player); + AddConduitResult addConduit(Holder> conduit, @Nullable Player player); /** * Remove a conduit from the bundle. @@ -31,10 +32,21 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { */ void removeConduit(Holder> conduit, @Nullable Player player); + /** + * @param conduit the conduit to get the inventory for. + * @return the inventory for this conduit. + */ + ConduitInventory getInventory(Holder> conduit); + // region Connections - // TODO: Should connections be accessible by API? - // Answer: probably not lol. + /** + * @throws IllegalStateException if {@link #getConnectionType} is not {@link ConduitConnectionType#CONNECTED_BLOCK}. + * @throws IllegalArgumentException if the connection config is not the right type for this conduit. + * @param side + * @param config + */ + void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config); /** * Attempt to connect this conduit something in the given direction. @@ -45,12 +57,6 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { */ boolean tryConnectTo(Direction side, Holder> conduit, boolean isForcedConnection); -// void connectTo(Direction side, Holder> conduit); - -// void disconnect(Direction side, Holder> conduit); - -// void disableConnection(Direction side, Holder> conduit); - // endregion // region Facades diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java index 0fd73149d1..c9c99f6fd0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -1,16 +1,20 @@ package com.enderio.conduits.api.bundle; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.ConduitConnection; import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.facade.FacadeType; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; + import java.util.List; + +import com.enderio.conduits.api.network.node.ConduitNode; import net.minecraft.core.Direction; import net.minecraft.core.Holder; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; /** * Immutable access to a conduit bundle. @@ -24,9 +28,19 @@ public interface ConduitBundleReader { */ List>> getConduits(); - // TEMP + /** + * @throws IllegalArgumentException if the conduit is not present. + * @param conduit the conduit to get a node for. + * @return the conduit node. + */ + ConduitNode getConduitNode(Holder> conduit); - ConduitGraphObject getConduitNode(Holder> conduit); + /** + * @param conduit the conduit to get data for. + * @return the client data tag, or null if there is none or the conduit doesn't sync extra data. + */ + @Nullable + CompoundTag getConduitClientDataTag(Holder> conduit); /** * @implNote compare conduits using {@link Conduit#canConnectTo(Holder)} @@ -69,12 +83,11 @@ public interface ConduitBundleReader { ConduitConnectionType getConnectionType(Direction side, Holder> conduit); /** - * @throws IllegalStateException if {@link #getConnectionType} is not {@link ConduitConnectionType#CONNECTED_BLOCK}. * @param side * @param conduit * @return */ - ConduitConnection getConnection(Direction side, Holder> conduit); + ConnectionConfig getConnectionConfig(Direction side, Holder> conduit); /** * An endpoint is a side which has a "connection plate" to another block, rather than to continued line of bundles. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitInventory.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitInventory.java index 90c02cbbd6..d1f9a68f9c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitInventory.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitInventory.java @@ -1,6 +1,5 @@ package com.enderio.conduits.api.bundle; -import com.enderio.conduits.api.SlotType; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.ApiStatus; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/SlotType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java similarity index 88% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/SlotType.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java index f67376d2e4..451134e7a6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/SlotType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java @@ -1,4 +1,6 @@ -package com.enderio.conduits.api; +package com.enderio.conduits.api.bundle; + +import com.enderio.conduits.api.ConduitMenuData; public enum SlotType { FILTER_EXTRACT, diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java deleted file mode 100644 index 349e2c1a47..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnection.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.enderio.conduits.api.connection; - -import com.enderio.base.api.misc.RedstoneControl; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import io.netty.buffer.ByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.item.DyeColor; - -// If a conduit does not support redstone control, dye control etc. then set them to a sensible value and ignore it. -// TODO: In EnderIO 8 I would like this to be merged into ConduitData somehow. -// we could do this in EIO 7, but it would be a much more significant API/save break. -public record ConduitConnection(ConduitConnectionMode mode, DyeColor inputChannel, DyeColor outputChannel, - RedstoneControl redstoneControl, DyeColor redstoneChannel) { - - public static Codec CODEC = RecordCodecBuilder - .create(instance -> instance - .group(ConduitConnectionMode.CODEC.fieldOf("mode").forGetter(ConduitConnection::mode), - DyeColor.CODEC.fieldOf("input_channel").forGetter(ConduitConnection::inputChannel), - DyeColor.CODEC.fieldOf("output_channel").forGetter(ConduitConnection::outputChannel), - RedstoneControl.CODEC.fieldOf("redstone_control") - .forGetter(ConduitConnection::redstoneControl), - DyeColor.CODEC.fieldOf("redstone_channel").forGetter(ConduitConnection::redstoneChannel)) - .apply(instance, ConduitConnection::new)); - - public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ConduitConnectionMode.STREAM_CODEC, ConduitConnection::mode, DyeColor.STREAM_CODEC, - ConduitConnection::inputChannel, DyeColor.STREAM_CODEC, ConduitConnection::outputChannel, - RedstoneControl.STREAM_CODEC, ConduitConnection::redstoneControl, DyeColor.STREAM_CODEC, - ConduitConnection::redstoneChannel, ConduitConnection::new); - - // No-channel constructor - public ConduitConnection(ConduitConnectionMode mode) { - this(mode, DyeColor.GREEN, DyeColor.GREEN); - } - - // No-redstone constructor - public ConduitConnection(ConduitConnectionMode mode, DyeColor inputChannel, DyeColor outputChannel) { - this(mode, inputChannel, outputChannel, RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); - } - - public boolean canInput() { - return mode.canInput(); - } - - public boolean canOutput() { - return mode.canOutput(); - } - - public ConduitConnection withMode(ConduitConnectionMode mode) { - return new ConduitConnection(mode, inputChannel, outputChannel, redstoneControl, redstoneChannel); - } - - public ConduitConnection withInsertChannel(DyeColor insertChannel) { - return new ConduitConnection(mode, insertChannel, outputChannel, redstoneControl, redstoneChannel); - } - - public ConduitConnection withExtractChannel(DyeColor extractChannel) { - return new ConduitConnection(mode, inputChannel, extractChannel, redstoneControl, redstoneChannel); - } - - public ConduitConnection withRedstoneControl(RedstoneControl redstoneControl) { - return new ConduitConnection(mode, inputChannel, outputChannel, redstoneControl, redstoneChannel); - } - - public ConduitConnection withRedstoneChannel(DyeColor redstoneChannel) { - return new ConduitConnection(mode, inputChannel, outputChannel, redstoneControl, redstoneChannel); - } - -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java deleted file mode 100644 index b0e3c088f1..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionMode.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.enderio.conduits.api.connection; - -import com.mojang.serialization.Codec; -import io.netty.buffer.ByteBuf; -import java.util.function.IntFunction; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.util.ByIdMap; -import net.minecraft.util.StringRepresentable; - -public enum ConduitConnectionMode implements StringRepresentable { - /** - * In mode - for conduits which deposit resources or signals into the attached block. - */ - IN("in", true, false), - - /** - * Out mode - for conduits which extract resources or signals from the attached block. - */ - - OUT("out", false, true), - - /** - * Both mode - for conduits which can both insert and extract resources or signals from the attached block. - */ - BOTH("both", true, true); - - public static final Codec CODEC = StringRepresentable - .fromEnum(ConduitConnectionMode::values); - public static final IntFunction BY_ID = ByIdMap.continuous(Enum::ordinal, values(), - ByIdMap.OutOfBoundsStrategy.ZERO); - public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, - Enum::ordinal); - - private final String name; - private final boolean canInput; - private final boolean canOutput; - - ConduitConnectionMode(String name, boolean canInput, boolean canOutput) { - this.name = name; - this.canInput = canInput; - this.canOutput = canOutput; - } - - @Override - public String getSerializedName() { - return name; - } - - public boolean canInput() { - return canInput; - } - - public boolean canOutput() { - return canOutput; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java index 139492f3ea..a9fadd6249 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java @@ -1,13 +1,15 @@ package com.enderio.conduits.api.connection; -import com.mojang.serialization.Codec; import io.netty.buffer.ByteBuf; import java.util.function.IntFunction; + import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.ByIdMap; import net.minecraft.util.StringRepresentable; +import javax.annotation.Nullable; + public enum ConduitConnectionType implements StringRepresentable { /** * This conduit is not connected to anything. @@ -16,7 +18,6 @@ public enum ConduitConnectionType implements StringRepresentable { /** * This conduit is connected to a block for extract. - * A {@link ConduitConnectionMode} will describe the properties of the connection. */ CONNECTED_BLOCK("connected_block"), @@ -30,7 +31,7 @@ public enum ConduitConnectionType implements StringRepresentable { */ DISABLED("disabled"); - public static final Codec CODEC = StringRepresentable + public static final StringRepresentable.EnumCodec CODEC = StringRepresentable .fromEnum(ConduitConnectionType::values); public static final IntFunction BY_ID = ByIdMap.continuous(Enum::ordinal, values(), ByIdMap.OutOfBoundsStrategy.ZERO); @@ -68,4 +69,9 @@ public boolean isEndpoint() { public String getSerializedName() { return name; } + + @Nullable + public static ConduitConnectionType byName(@Nullable String name) { + return CODEC.byName(name); + } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java new file mode 100644 index 0000000000..8053f26036 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java @@ -0,0 +1,39 @@ +package com.enderio.conduits.api.connection.config; + +import com.enderio.conduits.api.EnderIOConduitsRegistries; +import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.mojang.serialization.Codec; +import org.apache.commons.lang3.NotImplementedException; +import org.jetbrains.annotations.ApiStatus; + +/** + * Replacement for {@link ConduitData} that is purely focussed on sided connection context. + * Any data stored in the entire node should now be stored in the network, an individual node should not have connectionless context. + */ +@ApiStatus.Experimental +public interface ConnectionConfig { + + Codec GENERIC_CODEC = EnderIOConduitsRegistries.CONDUIT_CONNECTION_CONFIG_TYPE.byNameCodec() + .dispatch(ConnectionConfig::type, ConnectionConfigType::codec); + + /** + * @return whether the conduit should still be connected with this configuration. + */ + default boolean isConnected() { + return true; + } + + /** + * Modify the config such that isConnected() is true again. + * This will ensure that when the connection is revived, it isn't invalid. + */ + default ConnectionConfig reconnected() { + if (this.isConnected()) { + return this; + } + + throw new NotImplementedException("This connection config type needs to implement reconnected()."); + } + + ConnectionConfigType type(); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigAccessor.java new file mode 100644 index 0000000000..5c35edd0d3 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigAccessor.java @@ -0,0 +1,46 @@ +package com.enderio.conduits.api.connection.config; + +import net.minecraft.core.Direction; +import org.jetbrains.annotations.ApiStatus; + +/** + * Provides access to connection configuration. + * Required to handle the potential of a conduit changing type and the data not being applicable anymore. + */ +@ApiStatus.Experimental +public interface ConnectionConfigAccessor { + + /** + * @param side the side to query. + * @return whether there is a connection on the given side. + */ + boolean isConnectedTo(Direction side); + + /** + * Get the connection config for the given side (generic). + * + * @param side the side to query. + * @return the connection config. + * @throws IllegalArgumentException if there is no connection on this side. + */ + ConnectionConfig getConnectionConfig(Direction side); + + /** + * Get the connection config for the given side (specific). + * + * @param side the side to query. + * @param type the type of connection config to get. + * @return the connection config. + * @throws IllegalArgumentException if there is no connection on this side. + * @throws IllegalStateException if the connection type does not match the requested type. + */ + T getConnectionConfig(Direction side, ConnectionConfigType type); + + /** + * Set the connection config for the given side. + * @param side the side to set. + * @param config the config to set. + * @throws IllegalArgumentException if there is no connection on this side or if the connection config is not the right type for this conduit. + */ + void setConnectionConfig(Direction side, ConnectionConfig config); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java new file mode 100644 index 0000000000..81ba421b17 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java @@ -0,0 +1,30 @@ +package com.enderio.conduits.api.connection.config; + +import com.enderio.conduits.api.connection.config.io.ChannelResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.mojang.serialization.MapCodec; + +import java.util.function.Supplier; + +public record ConnectionConfigType(Class clazz, MapCodec codec, Supplier defaultSupplier) { + public ConnectionConfigType { + + } + + public T getDefault() { + return defaultSupplier.get(); + } + + public boolean supportsIO() { + return ResourceConnectionConfig.class.isAssignableFrom(clazz); + } + + public boolean supportsIOChannels() { + return ChannelResourceConnectionConfig.class.isAssignableFrom(clazz); + } + + public boolean supportsRedstoneControl() { + return RedstoneControlledConnection.class.isAssignableFrom(clazz); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChannelResourceConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChannelResourceConnectionConfig.java new file mode 100644 index 0000000000..ee55b33d11 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChannelResourceConnectionConfig.java @@ -0,0 +1,10 @@ +package com.enderio.conduits.api.connection.config.io; + +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public interface ChannelResourceConnectionConfig extends ResourceConnectionConfig { + ChannelResourceConnectionConfig withInputChannel(DyeColor inputChannel); + ChannelResourceConnectionConfig withOutputChannel(DyeColor outputChannel); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ResourceConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ResourceConnectionConfig.java new file mode 100644 index 0000000000..949723d11c --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ResourceConnectionConfig.java @@ -0,0 +1,23 @@ +package com.enderio.conduits.api.connection.config.io; + +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public interface ResourceConnectionConfig extends ConnectionConfig { + boolean canInsert(); + boolean canExtract(); + + // TODO: A different way to make the arrows a different colour without having this in the interface? + DyeColor insertChannel(); + DyeColor extractChannel(); + + ResourceConnectionConfig withInsert(boolean canInsert); + ResourceConnectionConfig withExtract(boolean canExtract); + + @Override + default boolean isConnected() { + return canInsert() || canExtract(); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java new file mode 100644 index 0000000000..0c060fd57f --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java @@ -0,0 +1,15 @@ +package com.enderio.conduits.api.connection.config.redstone; + +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public interface RedstoneControlledConnection extends ConnectionConfig { + RedstoneControl redstoneControl(); + DyeColor redstoneChannel(); + + RedstoneControlledConnection withRedstoneControl(RedstoneControl redstoneControl); + RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/ChannelSignalConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/ChannelSignalConnectionConfig.java new file mode 100644 index 0000000000..e77dd71f57 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/ChannelSignalConnectionConfig.java @@ -0,0 +1,10 @@ +package com.enderio.conduits.api.connection.config.signal; + +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public interface ChannelSignalConnectionConfig extends SignalConnectionConfig { + ChannelSignalConnectionConfig withInputChannel(DyeColor inputChannel); + ChannelSignalConnectionConfig withOutputChannel(DyeColor outputChannel); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/SignalConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/SignalConnectionConfig.java new file mode 100644 index 0000000000..06c5d24efa --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/SignalConnectionConfig.java @@ -0,0 +1,30 @@ +package com.enderio.conduits.api.connection.config.signal; + +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public interface SignalConnectionConfig extends ConnectionConfig { + /** + * Whether this connection can receive signals. + */ + boolean canReceive(); + + /** + * Whether this connection can emit signals + */ + boolean canEmit(); + + DyeColor receiveChannel(); + DyeColor emitChannel(); + + ResourceConnectionConfig withReceive(boolean canReceive); + ResourceConnectionConfig withEmit(boolean canEmit); + + @Override + default boolean isConnected() { + return canReceive() && canEmit(); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuData.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuData.java new file mode 100644 index 0000000000..95e914737f --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuData.java @@ -0,0 +1,41 @@ +package com.enderio.conduits.api.menu; + +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.enderio.core.common.network.menu.SyncSlot; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; + +// TODO: Rubbish name +public abstract class ConduitMenuData { + + public interface ConduitMenuAccess { + Holder> conduit(); + Direction side(); + ConduitNode conduitNode(); + T getConnectionConfig(ConnectionConfigType type); + void setConnectionConfig(ConnectionConfig config); + + T addSyncSlot(T syncSlot); + T addUpdatableSyncSlot(T syncSlot); + void updateSlot(SyncSlot syncSlot); + } + + protected final ConduitMenuAccess menu; + + /** + * Server constructor + */ + public ConduitMenuData(ConduitNode node, ConduitMenuAccess menu) { + this.menu = menu; + } + + /** + * Client constructor + */ + public ConduitMenuData(ConduitMenuAccess menu) { + this.menu = menu; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuExtension.java new file mode 100644 index 0000000000..a6fc9ea201 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuExtension.java @@ -0,0 +1,35 @@ +package com.enderio.conduits.api.menu; + +import com.enderio.conduits.api.network.node.ConduitNode; +import org.jetbrains.annotations.ApiStatus; + +import java.util.Map; +import java.util.function.Consumer; + +@ApiStatus.Experimental +public class ConduitMenuExtension { + // Enables custom button actions (like changing round robin mode) etc. for the menu. + // this is simple enough for 90% of use cases, and others can go ahead and use a packet. + private Map> customButtonActions; + + @ApiStatus.Internal + public boolean onMenuButtonClicked(ConduitNode node, int id) { + if (customButtonActions.containsKey(id)) { + customButtonActions.get(id).accept(node); + return true; + } + + return false; + } + + public static class Builder { + private Builder() { + } + + public Builder addCustomButtonAction(int buttonId, Runnable action) { + // TODO: Add to map. + + return this; + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitCoreModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitCoreModelModifier.java index 619511c6fd..69c2054958 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitCoreModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitCoreModelModifier.java @@ -1,12 +1,14 @@ package com.enderio.conduits.api.model; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.enderio.conduits.api.network.node.NodeData; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.Direction; import net.minecraft.core.Holder; +import net.minecraft.nbt.CompoundTag; import net.minecraft.util.RandomSource; import org.jetbrains.annotations.Nullable; @@ -16,7 +18,7 @@ public interface ConduitCoreModelModifier { /** * Create additional quads to be rendered at the point of conduit connection. */ - default List createConnectionQuads(Holder> conduit, ConduitNode node, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, + default List createConnectionQuads(Holder> conduit, @Nullable CompoundTag clientDataTag, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, @Nullable RenderType type) { return List.of(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetwork.java similarity index 58% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetwork.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetwork.java index f27c8edae0..00b88e3c42 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetwork.java @@ -1,4 +1,6 @@ -package com.enderio.conduits.api; +package com.enderio.conduits.api.network; + +import com.enderio.conduits.api.network.node.ConduitNode; import java.util.Collection; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContext.java similarity index 79% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContext.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContext.java index 6081744a26..4223933f8e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContext.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.api; +package com.enderio.conduits.api.network; public interface ConduitNetworkContext> { T mergeWith(T other); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextAccessor.java similarity index 89% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextAccessor.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextAccessor.java index db226d2d6c..e873e3aca9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextAccessor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextAccessor.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.api; +package com.enderio.conduits.api.network; import org.jetbrains.annotations.Nullable; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextType.java similarity index 85% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextType.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextType.java index fb64bd1c6f..3d95325c0c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitNetworkContextType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextType.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.api; +package com.enderio.conduits.api.network; import com.mojang.serialization.Codec; import org.jetbrains.annotations.Nullable; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java new file mode 100644 index 0000000000..83c2ca02a0 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java @@ -0,0 +1,37 @@ +package com.enderio.conduits.api.network.node; + +import com.enderio.base.api.filter.ResourceFilter; +import com.enderio.conduits.api.connection.config.ConnectionConfigAccessor; +import com.enderio.conduits.api.network.ConduitNetwork; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import org.jetbrains.annotations.Nullable; + +public interface ConduitNode extends NodeDataAccessor, ConnectionConfigAccessor { + // TODO: A better way to determine if a node's bundle is loaded. + + /** + * @throws IllegalStateException if the node is not loaded in the world. + * @return the world position of the node. + */ + BlockPos getPos(); + + @Nullable + ResourceFilter getExtractFilter(Direction direction); + + @Nullable + ResourceFilter getInsertFilter(Direction direction); + + // TODO: investigate nullability for this interface? + @Nullable ConduitNetwork getNetwork(); + + /** + * @return whether this node's bundle is loaded and ticking in the world + */ + boolean isLoaded(); + + /** + * Mark the node as dirty, causing the owning bundle to save and sync. + */ + void markDirty(); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeData.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeData.java new file mode 100644 index 0000000000..575d8ef4c4 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeData.java @@ -0,0 +1,17 @@ +package com.enderio.conduits.api.network.node; + +import com.enderio.conduits.api.EnderIOConduitsRegistries; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.mojang.serialization.Codec; + +/** + * Data which is stored on each conduit node. This is not synced to the client. + * If you want to sync data from here to the client, use {@link com.enderio.conduits.api.Conduit#getClientDataTag(ConduitNode)}. + * For connection-related settings, use {@link ConnectionConfig}. + */ +public interface NodeData { + Codec GENERIC_CODEC = EnderIOConduitsRegistries.CONDUIT_NODE_DATA_TYPE.byNameCodec() + .dispatch(NodeData::type, NodeDataType::codec); + + NodeDataType type(); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataAccessor.java new file mode 100644 index 0000000000..1c368f872a --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataAccessor.java @@ -0,0 +1,40 @@ +package com.enderio.conduits.api.network.node; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +@ApiStatus.Experimental +public interface NodeDataAccessor { + boolean hasNodeData(NodeDataType type); + + /** + * Get the data attached to this node, with no preferred type. + * @return The attached data or null if there is no data. + */ + @Nullable + NodeData getNodeData(); + + /** + * Get the data attached to this node. + * @param type The expected data type. + * @return The attached data or null if there is no data -or- the data is of a different type. + */ + @Nullable + T getNodeData(NodeDataType type); + + /** + * Gets the data attached to this node. + * @param type The data type that is expected. + * @return The stored data that matched this type, or a new instance of the data. + * @implNote If a conduit data of a different type exists in this node, it will be replaced. + */ + T getOrCreateNodeData(NodeDataType type); + + /** + * Set the data attached to this node. + * + * @param data + * @param + */ + void setNodeData(@Nullable T data); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataType.java new file mode 100644 index 0000000000..616f507b55 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataType.java @@ -0,0 +1,8 @@ +package com.enderio.conduits.api.network.node; + +import com.mojang.serialization.MapCodec; + +import java.util.function.Supplier; + +public record NodeDataType(MapCodec codec, Supplier factory) { +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitData.java similarity index 70% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitData.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitData.java index 37f41b602f..3b73751691 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitData.java @@ -1,9 +1,12 @@ -package com.enderio.conduits.api; +package com.enderio.conduits.api.network.node.legacy; +import com.enderio.conduits.api.EnderIOConduitsRegistries; +import com.enderio.conduits.api.network.node.NodeData; import com.mojang.serialization.Codec; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import org.jetbrains.annotations.Nullable; public interface ConduitData> { Codec> CODEC = EnderIOConduitsRegistries.CONDUIT_DATA_TYPE.byNameCodec() @@ -24,4 +27,11 @@ default T withClientChanges(T guiData) { T deepCopy(); ConduitDataType type(); + + /** + * Convert to modern node data. + * @return the new node data, or null if this data should be discarded. + */ + @Nullable + NodeData toNodeData(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitDataAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataAccessor.java similarity index 81% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitDataAccessor.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataAccessor.java index dbdad4ee65..5c2d500065 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitDataAccessor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataAccessor.java @@ -1,12 +1,10 @@ -package com.enderio.conduits.api; +package com.enderio.conduits.api.network.node.legacy; import org.jetbrains.annotations.Nullable; public interface ConduitDataAccessor { boolean hasData(ConduitDataType type); - // TODO: I want to add setData at some point and maybe enforce conduit data as records? - /** * Get the data attached to this node. * @param type The expected data type. @@ -22,6 +20,4 @@ public interface ConduitDataAccessor { * @implNote If a conduit data of a different type exists in this node, it will be replaced. */ > T getOrCreateData(ConduitDataType type); - - //> T setData(T data); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitDataType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java similarity index 86% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitDataType.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java index 1532901c93..e61af6bd51 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitDataType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.api; +package com.enderio.conduits.api.network.node.legacy; import com.mojang.serialization.MapCodec; import net.minecraft.network.RegistryFriendlyByteBuf; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java index 97bb5b9af8..1e51c446f7 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java @@ -1,6 +1,6 @@ package com.enderio.conduits.api.screen; -import com.enderio.conduits.api.ConduitDataAccessor; +import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.Direction; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/NewConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/NewConduitScreenExtension.java new file mode 100644 index 0000000000..09cf769bc0 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/NewConduitScreenExtension.java @@ -0,0 +1,17 @@ +package com.enderio.conduits.api.screen; + +import com.enderio.conduits.api.menu.ConduitMenuData; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.nbt.CompoundTag; +import org.joml.Vector2i; + +import java.util.List; + +/** + * Extend the conduit screen with additional widgets. + */ +public interface NewConduitScreenExtension { + + List createWidgets(Screen screen, T menuData, CompoundTag clientDataTag, Vector2i widgetsStart); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/CapabilityAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/CapabilityAwareConduitTicker.java index 4c405d7b21..3885c44b88 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/CapabilityAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/CapabilityAwareConduitTicker.java @@ -2,8 +2,8 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java index c0d86d8252..ac0029a2a2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java @@ -2,7 +2,7 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNetwork; +import com.enderio.conduits.api.network.ConduitNetwork; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java index 2533cf6c4c..6a5905c93e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java @@ -4,8 +4,10 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import net.minecraft.core.BlockPos; @@ -24,18 +26,21 @@ default void tickGraph(ServerLevel level, TConduit conduit, List lo ListMultimap extracts = ArrayListMultimap.create(); ListMultimap inserts = ArrayListMultimap.create(); for (ConduitNode node : loadedNodes) { - for (Direction direction : Direction.values()) { - node.getIOState(direction).ifPresent(ioState -> { - ioState - .extract() - .filter(extract -> isRedstoneMode(conduit, level, node.getPos(), ioState, coloredRedstoneProvider)) - .ifPresent(color -> extracts.get(color).add(new Connection(direction, node))); - ioState - .insert() - .ifPresent(color -> inserts.get(color).add(new Connection(direction, node))); - }); + for (Direction side : Direction.values()) { + if (node.isConnectedTo(side)) { + if (node.getConnectionConfig(side) instanceof ResourceConnectionConfig config) { + if (config.canInsert() && isActive(level, side, node, coloredRedstoneProvider)) { + extracts.get(config.extractChannel()).add(new Connection(side, node)); + } + + if (config.canExtract()) { + inserts.get(config.insertChannel()).add(new Connection(side, node)); + } + } + } } } + for (DyeColor color : DyeColor.values()) { List extractList = extracts.get(color); List insertList = inserts.get(color); @@ -60,29 +65,31 @@ void tickColoredGraph( ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - default boolean isRedstoneMode(TConduit conduit, ServerLevel level, BlockPos pos, ConduitNode.IOState state, - ColoredRedstoneProvider coloredRedstoneProvider) { - if (!conduit.getMenuData().showRedstoneExtract()) { + default boolean isActive(ServerLevel level, Direction side, ConduitNode node, ColoredRedstoneProvider coloredRedstoneProvider) { + var connectionConfig = node.getConnectionConfig(side); + if (!(connectionConfig instanceof RedstoneControlledConnection redstoneControlledConnection)) { return true; } - if (state.control() == RedstoneControl.ALWAYS_ACTIVE) { + if (redstoneControlledConnection.redstoneControl() == RedstoneControl.ALWAYS_ACTIVE) { return true; } - if (state.control() == RedstoneControl.NEVER_ACTIVE) { + if (redstoneControlledConnection.redstoneControl() == RedstoneControl.NEVER_ACTIVE) { return false; } - boolean hasRedstone = false; - for (Direction direction : Direction.values()) { - if (level.getSignal(pos.relative(direction), direction) > 0) { - hasRedstone = true; - break; + boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), redstoneControlledConnection.redstoneChannel()); + if (!hasRedstone) { + for (Direction direction : Direction.values()) { + if (level.getSignal(node.getPos().relative(direction), direction) > 0) { + hasRedstone = true; + break; + } } } - return state.control().isActive(hasRedstone || coloredRedstoneProvider.isRedstoneActive(level, pos, state.redstoneChannel())); + return redstoneControlledConnection.redstoneControl().isActive(hasRedstone); } class Connection { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java index 88dcffa039..43848edff2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java @@ -2,8 +2,8 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; @@ -15,7 +15,7 @@ public interface LoadedAwareConduitTicker> ex @Override default void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { List nodeIdentifiers = graph.getNodes() - .stream().filter(node -> isLoaded(level, node.getPos())) + .stream().filter(ConduitNode::isLoaded) .toList(); tickGraph(level, conduit, nodeIdentifiers, graph, coloredRedstoneProvider); @@ -24,8 +24,4 @@ default void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph void tickGraph(ServerLevel level, TConduit type, List loadedNodes, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - - default boolean isLoaded(Level level, BlockPos pos) { - return level.isLoaded(pos) && level.shouldTickBlocksAt(pos); - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java index b74050bc35..6d9ecdea34 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java @@ -7,11 +7,11 @@ import com.enderio.conduits.client.gui.conduit.ConduitScreenExtensions; import com.enderio.conduits.client.gui.conduit.FluidConduitScreenExtension; import com.enderio.conduits.client.gui.conduit.ItemConduitScreenExtension; -import com.enderio.conduits.client.model.ConduitItemModelLoader; -import com.enderio.conduits.client.model.FacadeItemGeometry; +import com.enderio.conduits.client.model.conduit.ConduitItemModelLoader; +import com.enderio.conduits.client.model.conduit.facades.FacadeItemGeometry; import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; import com.enderio.conduits.client.model.conduit.modifier.FluidConduitCoreModelModifier; -import com.enderio.conduits.client.model.rewrite.conduit.bundle.ConduitBundleGeometry; +import com.enderio.conduits.client.model.conduit.bundle.ConduitBundleGeometry; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.init.ConduitTypes; import java.util.ArrayList; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java index af9cf4973b..ca89ab52a3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java @@ -6,11 +6,11 @@ import com.enderio.base.client.gui.widget.RedstoneControlPickerWidget; import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitData; -import com.enderio.conduits.api.ConduitDataAccessor; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.screen.ConduitScreenExtension; import com.enderio.conduits.client.gui.conduit.ConduitScreenExtensions; import com.enderio.conduits.common.conduit.ConduitBundle; @@ -115,13 +115,13 @@ protected void init() { if (data.showColorInsert()) { addRenderableWidget(new DyeColorPickerWidget(pos.x(), pos.y() + 20, () -> getOnDynamic(dyn -> dyn.insertChannel(), DyeColor.GREEN), - color -> actOnDynamic(dyn -> dyn.withColor(false, color)), EIOLang.CONDUIT_CHANNEL)); + color -> actOnDynamic(dyn -> dyn.withColor(false, color)), ConduitLang.CONDUIT_CHANNEL)); } if (data.showColorExtract()) { addRenderableWidget(new DyeColorPickerWidget(pos.x() + 90, pos.y() + 20, () -> getOnDynamic(dyn -> dyn.extractChannel(), DyeColor.GREEN), - color -> actOnDynamic(dyn -> dyn.withColor(true, color)), EIOLang.CONDUIT_CHANNEL)); + color -> actOnDynamic(dyn -> dyn.withColor(true, color)), ConduitLang.CONDUIT_CHANNEL)); } if (data.showRedstoneExtract()) { @@ -131,7 +131,7 @@ protected void init() { addRenderableWidget(new DyeColorPickerWidget(pos.x() + 90 + 20, pos.y() + 40, () -> getOnDynamic(dyn -> dyn.redstoneChannel(), DyeColor.GREEN), - color -> actOnDynamic(dyn -> dyn.withRedstoneChannel(color)), EIOLang.REDSTONE_CHANNEL)); + color -> actOnDynamic(dyn -> dyn.withRedstoneChannel(color)), ConduitLang.REDSTONE_CHANNEL)); } addConduitScreenExtensionWidgets(); @@ -168,8 +168,8 @@ private void sendExtendedConduitUpdate() { Holder> conduit = menu.getConduit(); ConduitGraphObject node = getBundle().getNodeFor(conduit); - PacketDistributor.sendToServer(new C2SSetConduitExtendedData(menu.getBlockEntity().getBlockPos(), - menu.getConduit(), node.conduitDataContainer())); +// PacketDistributor.sendToServer(new C2SSetConduitExtendedData(menu.getBlockEntity().getBlockPos(), +// menu.getConduit(), node.conduitDataContainer())); } private void actOnDynamic(Function map) { @@ -215,7 +215,8 @@ private ConduitBundle getBundle() { private class ClientConduitDataAccessor implements ConduitDataAccessor { private ConduitDataAccessor getCurrentDataAccessor() { - return getBundle().getNodeFor(menu.getConduit()); +// return getBundle().getNodeFor(menu.getConduit()); + return null; } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneCountFilterScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneCountFilterScreen.java index 99e294a996..e6a27aba24 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneCountFilterScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneCountFilterScreen.java @@ -3,6 +3,7 @@ import com.enderio.base.api.EnderIO; import com.enderio.base.client.gui.widget.DyeColorPickerWidget; import com.enderio.base.common.lang.EIOLang; +import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.menu.RedstoneCountFilterMenu; import com.enderio.core.client.gui.screen.EIOScreen; import net.minecraft.client.gui.components.Button; @@ -26,7 +27,7 @@ protected void init() { addRenderableWidget(new DyeColorPickerWidget(this.leftPos + 15, this.topPos + 30, getMenu().getFilter()::getChannel, getMenu()::setChannel, - EIOLang.REDSTONE_CHANNEL)); + ConduitLang.REDSTONE_CHANNEL)); EditBox pWidget = new EditBox(this.font, this.leftPos + 60, this.topPos + 20, 60, 20, Component.literal("" + getMenu().getFilter().getMaxCount())) { @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneDoubleChannelFilterScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneDoubleChannelFilterScreen.java index e7ca60fe35..8e4b4f9697 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneDoubleChannelFilterScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneDoubleChannelFilterScreen.java @@ -3,6 +3,7 @@ import com.enderio.base.api.EnderIO; import com.enderio.base.client.gui.widget.DyeColorPickerWidget; import com.enderio.base.common.lang.EIOLang; +import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.menu.RedstoneDoubleChannelFilterMenu; import com.enderio.core.client.gui.screen.EIOScreen; import net.minecraft.network.chat.Component; @@ -25,11 +26,11 @@ protected void init() { addRenderableWidget(new DyeColorPickerWidget(this.leftPos + 15, this.topPos + 30, getMenu().getChannels()::getFirstChannel, getMenu()::setFirstChannel, - EIOLang.REDSTONE_CHANNEL)); + ConduitLang.REDSTONE_CHANNEL)); addRenderableWidget(new DyeColorPickerWidget(this.leftPos + 15 + 60, this.topPos + 30, getMenu().getChannels()::getSecondChannel, getMenu()::setSecondChannel, - EIOLang.REDSTONE_CHANNEL)); + ConduitLang.REDSTONE_CHANNEL)); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java index df63618c01..066a98a88a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java @@ -1,10 +1,11 @@ package com.enderio.conduits.client.gui.conduit; import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.ConduitDataAccessor; +import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; import com.enderio.conduits.api.screen.ConduitScreenExtension; import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.common.conduit.type.fluid.FluidConduitData; +import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.util.TooltipUtil; import com.mojang.blaze3d.systems.RenderSystem; @@ -68,10 +69,10 @@ public void updateWidgetNarration(NarrationElementOutput pNarrationElementOutput @Override public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, float pPartialTick) { if (isHoveredOrFocused()) { - MutableComponent tooltip = EIOLang.FLUID_CONDUIT_CHANGE_FLUID1.copy(); - tooltip.append("\n").append(EIOLang.FLUID_CONDUIT_CHANGE_FLUID2); + MutableComponent tooltip = ConduitLang.FLUID_CONDUIT_CHANGE_FLUID1.copy(); + tooltip.append("\n").append(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID2); if (!currentFluid.get().isSame(Fluids.EMPTY)) { - tooltip.append("\n").append(TooltipUtil.withArgs(EIOLang.FLUID_CONDUIT_CHANGE_FLUID3, currentFluid.get().getFluidType().getDescription())); + tooltip.append("\n").append(TooltipUtil.withArgs(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID3, currentFluid.get().getFluidType().getDescription())); } setTooltip(Tooltip.create(TooltipUtil.style(tooltip))); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ItemConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ItemConduitScreenExtension.java index de46f0fe8c..12f0aa6426 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ItemConduitScreenExtension.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ItemConduitScreenExtension.java @@ -1,9 +1,10 @@ package com.enderio.conduits.client.gui.conduit; import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.ConduitDataAccessor; +import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; import com.enderio.conduits.api.screen.ConduitScreenExtension; import com.enderio.base.common.lang.EIOLang; +import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.client.gui.widgets.ToggleIconButton; import net.minecraft.client.gui.components.AbstractWidget; @@ -35,8 +36,8 @@ public List createWidgets(Screen screen, ConduitDataAccessor con 16, ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, - EIOLang.ROUND_ROBIN_ENABLED, - EIOLang.ROUND_ROBIN_DISABLED, + ConduitLang.ROUND_ROBIN_ENABLED, + ConduitLang.ROUND_ROBIN_DISABLED, () -> conduitDataAccessor.getOrCreateData(ConduitTypes.Data.ITEM.get()).get(direction.get()).isRoundRobin, bool -> { var data = conduitDataAccessor.getOrCreateData(ConduitTypes.Data.ITEM.get()); @@ -52,8 +53,8 @@ public List createWidgets(Screen screen, ConduitDataAccessor con 16, ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, - EIOLang.SELF_FEED_ENABLED, - EIOLang.SELF_FEED_DISABLED, + ConduitLang.SELF_FEED_ENABLED, + ConduitLang.SELF_FEED_DISABLED, () -> conduitDataAccessor.getOrCreateData(ConduitTypes.Data.ITEM.get()).get(direction.get()).isSelfFeed, bool -> { var data = conduitDataAccessor.getOrCreateData(ConduitTypes.Data.ITEM.get()); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/NewItemConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/NewItemConduitScreenExtension.java new file mode 100644 index 0000000000..3b37481671 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/NewItemConduitScreenExtension.java @@ -0,0 +1,58 @@ +package com.enderio.conduits.client.gui.conduit; + +import com.enderio.base.api.EnderIO; +import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; +import com.enderio.conduits.api.screen.ConduitScreenExtension; +import com.enderio.conduits.api.screen.NewConduitScreenExtension; +import com.enderio.conduits.common.conduit.type.item.ItemConduitMenuData; +import com.enderio.conduits.common.init.ConduitLang; +import com.enderio.conduits.common.init.ConduitTypes; +import com.enderio.core.client.gui.widgets.ToggleIconButton; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import org.joml.Vector2i; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class NewItemConduitScreenExtension implements NewConduitScreenExtension { + + private static final ResourceLocation ICON_ROUND_ROBIN_ENABLED = EnderIO.loc("icon/round_robin_enabled"); + private static final ResourceLocation ICON_ROUND_ROBIN_DISABLED = EnderIO.loc("icon/round_robin_disabled"); + private static final ResourceLocation ICON_SELF_FEED_ENABLED = EnderIO.loc("icon/self_feed_enabled"); + private static final ResourceLocation ICON_SELF_FEED_DISABLED = EnderIO.loc("icon/self_feed_disabled"); + + @Override + public List createWidgets(Screen screen, ItemConduitMenuData menuData, CompoundTag clientDataTag, Vector2i widgetsStart) { + List widgets = new ArrayList<>(); + + widgets.add(ToggleIconButton.of( + widgetsStart.x() + 110, + widgetsStart.y() + 20, + 16, + 16, + ICON_ROUND_ROBIN_ENABLED, + ICON_ROUND_ROBIN_DISABLED, + ConduitLang.ROUND_ROBIN_ENABLED, + ConduitLang.ROUND_ROBIN_DISABLED, + menuData::isRoundRobin, + menuData::setIsRoundRobin)); + + widgets.add(ToggleIconButton.of( + widgetsStart.x() + 130, + widgetsStart.y() + 20, + 16, + 16, + ICON_SELF_FEED_ENABLED, + ICON_SELF_FEED_DISABLED, + ConduitLang.SELF_FEED_ENABLED, + ConduitLang.SELF_FEED_DISABLED, + menuData::isSelfFeed, + menuData::setIsSelfFeed)); + return widgets; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java new file mode 100644 index 0000000000..4a32d2346d --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java @@ -0,0 +1,193 @@ +package com.enderio.conduits.client.gui.screen; + +import com.enderio.base.api.EnderIO; +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.base.client.gui.widget.DyeColorPickerWidget; +import com.enderio.base.client.gui.widget.RedstoneControlPickerWidget; +import com.enderio.base.common.lang.EIOLang; +import com.enderio.conduits.api.bundle.SlotType; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ChannelResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.common.conduit.menu.NewConduitMenu; +import com.enderio.conduits.common.init.ConduitLang; +import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; +import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; +import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; +import com.enderio.core.client.gui.screen.EnderContainerScreen; +import com.enderio.core.client.gui.widgets.ToggleIconButton; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.neoforged.neoforge.network.PacketDistributor; + +public class NewConduitScreen extends EnderContainerScreen { + public static final ResourceLocation TEXTURE = EnderIO.loc("textures/gui/conduit.png"); + private static final int WIDTH = 206; + private static final int HEIGHT = 195; + + public NewConduitScreen(NewConduitMenu pMenu, Inventory pPlayerInventory, Component pTitle) { + super(pMenu, pPlayerInventory, pTitle); + +// this.shouldRenderLabels = true; + this.imageWidth = WIDTH; + this.imageHeight = HEIGHT; + } + + @Override + protected void init() { + super.init(); + + // Left column + int leftX = getGuiLeft() + 22; + int leftY = getGuiTop() + 7; + + // Right column + int rightX = getGuiLeft() + 22 + 90; + int rightY = getGuiTop() + 7; + + // Add enable checkboxes + if (menu.connectionConfigType().supportsIO()) { + addRenderableWidget(ToggleIconButton.createCheckbox(leftX, leftY, () -> getIOConnectionConfig().canInsert(), + newVal -> handleButtonPress(NewConduitMenu.BUTTON_TOGGLE_0_ID))); + addRenderableWidget(ToggleIconButton.createCheckbox(rightX, rightY, () -> getIOConnectionConfig().canExtract(), + newVal -> handleButtonPress(NewConduitMenu.BUTTON_TOGGLE_1_ID))); + + leftY += 20; + rightY += 20; + } else { + addRenderableWidget(ToggleIconButton.createCheckbox(leftX, leftY, this::isConnected, + newVal -> handleButtonPress(NewConduitMenu.BUTTON_TOGGLE_0_ID))); + + leftY += 20; + } + + // Channels + if (menu.connectionConfigType().supportsIOChannels()) { + addRenderableWidget(new DyeColorPickerWidget(leftX, leftY, + () -> getChannelledIOConnectionConfig().insertChannel(), + color -> PacketDistributor.sendToServer(new C2SSetConduitChannelPacket(pos(), menu.getSide(), menu.getSelectedConduit(), + C2SSetConduitChannelPacket.Side.INPUT, color)), + ConduitLang.CONDUIT_CHANNEL)); + + addRenderableWidget(new DyeColorPickerWidget(rightX, rightY, + () -> getChannelledIOConnectionConfig().extractChannel(), + color -> PacketDistributor.sendToServer(new C2SSetConduitChannelPacket(pos(), menu.getSide(), menu.getSelectedConduit(), + C2SSetConduitChannelPacket.Side.OUTPUT, color)), + ConduitLang.CONDUIT_CHANNEL)); + + leftY += 20; + rightY += 20; + } + + // Redstone Control + if (menu.connectionConfigType().supportsRedstoneControl()) { + final AbstractWidget redstoneControlButton = addRenderableWidget(new DyeColorPickerWidget(rightX + 20, rightY, + () -> getRedstoneControlledConnectionConfig().redstoneChannel(), + color -> PacketDistributor.sendToServer(new C2SSetConduitRedstoneChannelPacket(pos(), menu.getSide(), menu.getSelectedConduit(), color)), + ConduitLang.REDSTONE_CHANNEL)); + + RedstoneControl redstoneControl = getRedstoneControlledConnectionConfig().redstoneControl(); + redstoneControlButton.visible = redstoneControl != RedstoneControl.NEVER_ACTIVE && + redstoneControl != RedstoneControl.ALWAYS_ACTIVE; + + addRenderableWidget(new RedstoneControlPickerWidget(rightX, rightY, + () -> getRedstoneControlledConnectionConfig().redstoneControl(), + mode -> { + PacketDistributor.sendToServer(new C2SSetConduitRedstoneControlPacket(pos(), menu.getSide(), menu.getSelectedConduit(), mode)); + redstoneControlButton.visible = mode != RedstoneControl.NEVER_ACTIVE && mode != RedstoneControl.ALWAYS_ACTIVE; + }, + EIOLang.REDSTONE_MODE)); + + rightY += 20; + } + + // TODO: Screen extensions + + // TODO: Conduit selection buttons + } + + private BlockPos pos() { + return menu.getBlockEntity().getBlockPos(); + } + + private boolean isConnected() { + return menu.isConnected(); + } + + private ConnectionConfig getConnectionConfig() { + return menu.connectionConfig(); + } + + private ResourceConnectionConfig getIOConnectionConfig() { + if (!menu.connectionConfigType().supportsIO()) { + throw new IllegalStateException("Connection config type does not support IO"); + } + + if (!(getConnectionConfig() instanceof ResourceConnectionConfig resourceConnectionConfig)) { + throw new IllegalStateException("Connection config is not an IO connection config. Mismatch between connection type class and instance."); + } + + return resourceConnectionConfig; + } + + private ChannelResourceConnectionConfig getChannelledIOConnectionConfig() { + if (!menu.connectionConfigType().supportsIOChannels()) { + throw new IllegalStateException("Connection config type does not support IO"); + } + + if (!(getConnectionConfig() instanceof ChannelResourceConnectionConfig chanelledIOConnectionConfig)) { + throw new IllegalStateException("Connection config is not an IO connection config. Mismatch between connection type class and instance."); + } + + return chanelledIOConnectionConfig; + } + + private RedstoneControlledConnection getRedstoneControlledConnectionConfig() { + if (!menu.connectionConfigType().supportsRedstoneControl()) { + throw new IllegalStateException("Connection config type does not support redstone control"); + } + + if (!(getConnectionConfig() instanceof RedstoneControlledConnection redstoneControlledConnection)) { + throw new IllegalStateException("Connection config is not a redstone controlled connection config. Mismatch between connection type class and instance."); + } + + return redstoneControlledConnection; + } + + @Override + protected void renderBg(GuiGraphics guiGraphics, float v, int i, int i1) { + guiGraphics.blit(TEXTURE, getGuiLeft(), getGuiTop(), 0, 0, imageWidth, imageHeight); + + if (menu.connectionConfigType().supportsIO()) { + guiGraphics.blit(TEXTURE, getGuiLeft() + 102, getGuiTop() + 7, 255, 0, 1, 97); + } + + // TODO + for (SlotType type : SlotType.values()) { +// if (type.isAvailableFor(data)) { +// guiGraphics.blit(TEXTURE, type.getX() - 1, type.getY() - 1, 206, 0, 18, 18); +// } + } + } + + @Override + protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, mouseX, mouseY); + + if (menu.connectionConfigType().supportsIO()) { + // TODO: Test for a signal type -or- adopt input/output as the standard. + guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INSERT, 22 + 16 + 2, 7 + 4, 4210752, false); + guiGraphics.drawString(this.font, ConduitLang.CONDUIT_EXTRACT, 112 + 16 + 2, 7 + 4, 4210752, false); + +// guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INPUT, 22 + 16 + 2, 7 + 4, 4210752, false); +// guiGraphics.drawString(this.font, ConduitLang.CONDUIT_OUTPUT, 112 + 16 + 2, 7 + 4, 4210752, false); + } else { + guiGraphics.drawString(this.font, ConduitLang.CONDUIT_ENABLED, 22 + 16 + 2, 7 + 4, 4210752, false); + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java deleted file mode 100644 index 485d137287..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitBlockModel.java +++ /dev/null @@ -1,376 +0,0 @@ -package com.enderio.conduits.client.model; - -import static com.enderio.conduits.client.ConduitClientSetup.BOX; -import static com.enderio.conduits.client.ConduitClientSetup.CONDUIT_CONNECTION; -import static com.enderio.conduits.client.ConduitClientSetup.CONDUIT_CONNECTION_BOX; -import static com.enderio.conduits.client.ConduitClientSetup.CONDUIT_CONNECTOR; -import static com.enderio.conduits.client.ConduitClientSetup.CONDUIT_CORE; -import static com.enderio.conduits.client.ConduitClientSetup.CONDUIT_IO_IN; -import static com.enderio.conduits.client.ConduitClientSetup.CONDUIT_IO_IN_OUT; -import static com.enderio.conduits.client.ConduitClientSetup.CONDUIT_IO_OUT; -import static com.enderio.conduits.client.ConduitClientSetup.CONDUIT_IO_REDSTONE; -import static com.enderio.conduits.client.ConduitClientSetup.modelOf; - -import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNode; -import com.enderio.conduits.api.facade.FacadeType; -import com.enderio.conduits.api.model.ConduitCoreModelModifier; -import com.enderio.conduits.client.ConduitFacadeColor; -import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; -import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; -import com.enderio.conduits.common.Area; -import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.OffsetHelper; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; -import com.enderio.conduits.common.conduit.connection.ConnectionState; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; -import com.enderio.core.data.model.ModelHelper; -import com.mojang.math.Axis; -import com.mojang.math.Transformation; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.block.model.ItemOverrides; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.core.Vec3i; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.RandomSource; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.SingleThreadedRandomSource; -import net.neoforged.neoforge.client.ChunkRenderTypeSet; -import net.neoforged.neoforge.client.model.IDynamicBakedModel; -import net.neoforged.neoforge.client.model.IQuadTransformer; -import net.neoforged.neoforge.client.model.QuadTransformers; -import net.neoforged.neoforge.client.model.data.ModelData; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.joml.Quaternionf; -import org.joml.Vector3f; - -public class ConduitBlockModel implements IDynamicBakedModel { - - @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, - ModelData extraData, @Nullable RenderType renderType) { - - List quads = new ArrayList<>(); - ConduitBundle conduitBundle = extraData.get(ConduitBundleBlockEntity.BUNDLE_MODEL_PROPERTY); - ModelData data = extraData.get(ConduitBundleBlockEntity.FACADE_MODEL_DATA); - - if (conduitBundle != null) { - if (FacadeHelper.areFacadesVisible()) { - IQuadTransformer transformer = quad -> quad.tintIndex = ConduitFacadeColor - .moveTintIndex(quad.getTintIndex()); - Optional facadeOpt = conduitBundle.facade(); - if (facadeOpt.isPresent()) { - BlockState facade = facadeOpt.get().defaultBlockState(); - var model = Minecraft.getInstance().getBlockRenderer().getBlockModel(facade); - var facadeQuads = model.getQuads(facade, side, rand, data, renderType); - - if (renderType != null && model.getRenderTypes(facade, rand, data).contains(renderType)) { - quads.addAll(transformer.process(facadeQuads)); - } - } - - // If the facade should hide the conduits, escape early. - if (conduitBundle.hasFacade()) { - boolean areConduitsHidden = conduitBundle.facadeType() - .map(FacadeType::doesHideConduits) - .orElse(false); - - if (areConduitsHidden) { - return quads; - } - } - } - - Direction.Axis axis = OffsetHelper.findMainAxis(conduitBundle); - Map>, List> offsets = new HashMap<>(); - - for (Direction direction : Direction.values()) { - boolean isEnd = conduitBundle.isConnectionEnd(direction); - Direction preRotation = rotateDirection(direction, side); - IQuadTransformer rotation = QuadTransformers.applying(rotateTransformation(direction)); - - if (isEnd) { - quads.addAll(rotation.process( - modelOf(CONDUIT_CONNECTOR).getQuads(state, preRotation, rand, extraData, renderType))); - } - - var connectedTypes = conduitBundle.getConnectedConduits(direction); - for (int i = 0; i < connectedTypes.size(); i++) { - Holder> conduit = connectedTypes.get(i); - ConduitGraphObject node = conduitBundle.getNodeFor(conduit); - - Vec3i offset = OffsetHelper.translationFor(direction.getAxis(), - OffsetHelper.offsetConduit(i, connectedTypes.size())); - offsets.computeIfAbsent(conduit, ignored -> new ArrayList<>()).add(offset); - IQuadTransformer rotationTranslation = rotation - .andThen(QuadTransformers.applying(translateTransformation(offset))); - quads.addAll(new ConduitTextureEmissiveQuadTransformer(sprite(conduitBundle, conduit), 0) - .andThen(rotationTranslation) - .process(modelOf(CONDUIT_CONNECTION).getQuads(state, preRotation, rand, extraData, - renderType))); - - ConduitCoreModelModifier conduitCoreModifier = ConduitCoreModelModifiers - .getModifier(conduit.value().type()); - if (conduitCoreModifier != null) { - quads.addAll(rotationTranslation.process(conduitCoreModifier.createConnectionQuads(conduit, - node, side, direction, rand, renderType))); - } - - if (isEnd) { - quads.addAll(rotationTranslation.process(modelOf(CONDUIT_CONNECTION_BOX).getQuads(state, - preRotation, rand, extraData, renderType))); - - ConnectionState connectionState = conduitBundle.getConnectionState(direction, conduit); - if (connectionState instanceof DynamicConnectionState dyn) { - IQuadTransformer color = rotationTranslation - .andThen(new ColorQuadTransformer(dyn.insertChannel(), dyn.extractChannel())); - BakedModel model = null; - if (dyn.isExtract() && dyn.isInsert()) { - model = modelOf(CONDUIT_IO_IN_OUT); - } else if (dyn.isInsert()) { - model = modelOf(CONDUIT_IO_IN); - } else if (dyn.isExtract()) { - model = modelOf(CONDUIT_IO_OUT); - } - - if (model != null) { - quads.addAll( - color.process(model.getQuads(state, preRotation, rand, extraData, renderType))); - } - - if (dyn.control() == RedstoneControl.ACTIVE_WITH_SIGNAL - || dyn.control() == RedstoneControl.ACTIVE_WITHOUT_SIGNAL) { - quads.addAll(rotationTranslation - .andThen(new ColorQuadTransformer(null, dyn.redstoneChannel())) - .process(modelOf(CONDUIT_IO_REDSTONE).getQuads(state, preRotation, rand, - extraData, renderType))); - } - } - } - } - } - - var allTypes = conduitBundle.getConduits(); - @Nullable - Area box = null; - Map>, Integer> notRendered = new HashMap<>(); - List>> rendered = new ArrayList<>(); - for (int i = 0; i < allTypes.size(); i++) { - var type = allTypes.get(i); - @Nullable - List offsetsForType = offsets.get(type); - if (offsetsForType != null) { - // all are pointing to the same xyz reference meaning that we can draw the core - if (offsetsForType.stream().distinct().count() == 1) { - rendered.add(type); - } else { - if (box == null) { - box = new Area(offsetsForType.toArray(new Vec3i[0])); - } else { - offsetsForType.forEach(box::makeContain); - } - } - } else { - notRendered.put(type, i); - } - } - - Set duplicateFinder = new HashSet<>(); - // rendered have only one distinct pos, so I can safely assume get(0) is valid - List duplicatePositions = rendered.stream() - .map(offsets::get) - .map(List::getFirst) - .filter(n -> !duplicateFinder.add(n)) - .toList(); - for (Vec3i duplicatePosition : duplicatePositions) { - if (box == null) { - box = new Area(duplicatePosition); - } else { - box.makeContain(duplicatePosition); - } - } - for (Holder> toRender : rendered) { - List offsetsForType = offsets.get(toRender); - if (box == null || !box.contains(offsetsForType.getFirst())) { - quads.addAll(new ConduitTextureEmissiveQuadTransformer(sprite(conduitBundle, toRender), 0) - .andThen(QuadTransformers.applying(translateTransformation(offsetsForType.getFirst()))) - .process(modelOf(CONDUIT_CORE).getQuads(state, side, rand, extraData, renderType))); - } - } - - if (box != null) { - for (Map.Entry>, Integer> notRenderedEntry : notRendered.entrySet()) { - Vec3i offset = OffsetHelper.translationFor(axis, - OffsetHelper.offsetConduit(notRenderedEntry.getValue(), allTypes.size())); - if (!box.contains(offset)) { - quads.addAll(new ConduitTextureEmissiveQuadTransformer( - sprite(conduitBundle, notRenderedEntry.getKey()), 0) - .andThen(QuadTransformers.applying(translateTransformation(offset))) - .process(modelOf(CONDUIT_CORE).getQuads(state, side, rand, extraData, - renderType))); - } - } - - quads.addAll(new BoxTextureQuadTransformer(box.size()) - .andThen(QuadTransformers.applying(translateTransformation(box.getMin()))) - .process(modelOf(BOX).getQuads(state, side, rand, extraData, renderType))); - } else { - for (Map.Entry>, Integer> notRenderedEntry : notRendered.entrySet()) { - quads.addAll(new ConduitTextureEmissiveQuadTransformer( - sprite(conduitBundle, notRenderedEntry.getKey()), 0).andThen( - QuadTransformers.applying(translateTransformation(OffsetHelper.translationFor(axis, - OffsetHelper.offsetConduit(notRenderedEntry.getValue(), allTypes.size()))))) - .process(modelOf(CONDUIT_CORE).getQuads(state, side, rand, extraData, renderType))); - } - } - } - - return quads; - } - - /** - * @param toDirection the Direction you want to transform to from the Bottom as base - * @param toTransform the Direction to follow the same Transformation as bottom -> toDirection - * @return the Direction toTransform was transformed to - */ - @Nullable - public static Direction rotateDirection(Direction toDirection, @Nullable Direction toTransform) { - if (toTransform == null) { - return null; - } - - return switch (toDirection) { - case DOWN -> toTransform; - case UP -> toTransform.getClockWise(Direction.Axis.Z).getClockWise(Direction.Axis.Z); - case NORTH -> toTransform.getCounterClockWise(Direction.Axis.X); - case SOUTH -> toTransform.getClockWise(Direction.Axis.X); - case WEST -> toTransform.getCounterClockWise(Direction.Axis.Z); - case EAST -> toTransform.getClockWise(Direction.Axis.Z); - }; - } - - public static Transformation rotateTransformation(Direction toDirection) { - Quaternionf quaternion = new Quaternionf(); - switch (toDirection) { - case UP -> quaternion.mul(Axis.ZP.rotationDegrees(180)); - case NORTH -> quaternion.mul(Axis.XP.rotationDegrees(90)); - case SOUTH -> quaternion.mul(Axis.XN.rotationDegrees(90)); - case WEST -> quaternion.mul(Axis.ZN.rotationDegrees(90)); - case EAST -> quaternion.mul(Axis.ZP.rotationDegrees(90)); - default -> { - } - } - Transformation transformation = new Transformation(null, quaternion, null, null); - return transformation.applyOrigin(new Vector3f(.5f, .5f, .5f)); - } - - private static Transformation translateTransformation(Vec3i offset) { - return new Transformation(scale(offset, 3 / 16f), null, null, null); - } - - private static Vector3f scale(Vec3i vector, float scaler) { - return new Vector3f(vector.getX() * scaler, vector.getY() * scaler, vector.getZ() * scaler); - } - - @Override - public boolean useAmbientOcclusion() { - return true; - } - - @Override - public boolean isGui3d() { - return false; - } - - @Override - public boolean usesBlockLight() { - return false; - } - - @Override - public boolean isCustomRenderer() { - return false; - } - - @Override - public TextureAtlasSprite getParticleIcon() { - return ModelHelper.getMissingTexture(); - } - - @Override - public TextureAtlasSprite getParticleIcon(ModelData data) { - ConduitBundle conduitBundle = data.get(ConduitBundleBlockEntity.BUNDLE_MODEL_PROPERTY); // TODO temp particle - // fix - if (conduitBundle == null || conduitBundle.getConduits().isEmpty()) { - return ModelHelper.getMissingTexture(); - } - if (conduitBundle.hasFacade()) { - return Minecraft.getInstance() - .getBlockRenderer() - .getBlockModel(conduitBundle.facade().get().defaultBlockState()) - .getParticleIcon(data.get(ConduitBundleBlockEntity.FACADE_MODEL_DATA)); - } - return sprite(conduitBundle, conduitBundle.getConduits().getFirst()); - } - - @Override - public ItemOverrides getOverrides() { - return ItemOverrides.EMPTY; - } - - @Override - public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, - @NotNull ModelData data) { - ChunkRenderTypeSet facadeRenderTypes = data.get(ConduitBundleBlockEntity.FACADE_RENDERTYPE); - ChunkRenderTypeSet renderTypes = ChunkRenderTypeSet.of(RenderType.cutout()); - if (facadeRenderTypes != null) { - renderTypes = ChunkRenderTypeSet.union(renderTypes, facadeRenderTypes); - } - return renderTypes; - } - - @Override - public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState state, ModelData modelData) { - ModelData data = IDynamicBakedModel.super.getModelData(level, pos, state, modelData); - ModelData.Builder builder = data.derive(); - ConduitBundle conduitBundle = data.get(ConduitBundleBlockEntity.BUNDLE_MODEL_PROPERTY); - if (conduitBundle != null && conduitBundle.hasFacade()) { - BlockState blockState = conduitBundle.facade().get().defaultBlockState(); - BakedModel blockModel = Minecraft.getInstance().getBlockRenderer().getBlockModel(blockState); - ModelData facadeData = blockModel.getModelData(level, pos, blockState, ModelData.EMPTY); - builder.with(ConduitBundleBlockEntity.FACADE_MODEL_DATA, facadeData); - builder.with(ConduitBundleBlockEntity.FACADE_RENDERTYPE, blockModel.getRenderTypes(blockState, - new SingleThreadedRandomSource(state.getSeed(pos)), facadeData)); - } - return builder.build(); - } - - private static TextureAtlasSprite sprite(ConduitBundle conduitBundle, Holder> type) { - ConduitNode node = conduitBundle.getNodeFor(type); - ResourceLocation textureLocation = type.value().getTexture(node); - return Minecraft.getInstance().getModelManager().getAtlas(InventoryMenu.BLOCK_ATLAS).getSprite(textureLocation); - } - - private static boolean isMissingModel(BakedModel model) { - return model == Minecraft.getInstance().getModelManager().getMissingModel(); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitGeometry.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitGeometry.java deleted file mode 100644 index 3ceefe06a2..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitGeometry.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.enderio.conduits.client.model; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import net.minecraft.client.renderer.block.model.ItemOverrides; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.client.resources.model.Material; -import net.minecraft.client.resources.model.ModelBaker; -import net.minecraft.client.resources.model.ModelState; -import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext; -import net.neoforged.neoforge.client.model.geometry.IGeometryLoader; -import net.neoforged.neoforge.client.model.geometry.IUnbakedGeometry; - -import java.util.function.Function; - -public class ConduitGeometry implements IUnbakedGeometry { - - public ConduitGeometry() { - } - - @Override - public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, - ItemOverrides overrides) { - return new ConduitBlockModel(); - } - - public static class Loader implements IGeometryLoader { - @Override - public ConduitGeometry read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) throws JsonParseException { - return new ConduitGeometry(); - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitItemModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModel.java similarity index 98% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitItemModel.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModel.java index 7fe168d40d..77ee763d9b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitItemModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModel.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.client.model; +package com.enderio.conduits.client.model.conduit; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.common.init.ConduitComponents; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitItemModelLoader.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModelLoader.java similarity index 97% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitItemModelLoader.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModelLoader.java index 8ae3901a54..f5011a0c8f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/ConduitItemModelLoader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModelLoader.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.client.model; +package com.enderio.conduits.client.model.conduit; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonElement; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleGeometry.java similarity index 92% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleGeometry.java index 14b50f0318..274d91b09c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleGeometry.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleGeometry.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.client.model.rewrite.conduit.bundle; +package com.enderio.conduits.client.model.conduit.bundle; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; @@ -22,7 +22,7 @@ public ConduitBundleGeometry() { @Override public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, ItemOverrides overrides) { - return new NewConduitBundleModel(); + return new ConduitBundleModel(); } public static class Loader implements IGeometryLoader { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java similarity index 95% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java index e56e07dea3..14b924c943 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/NewConduitBundleModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.client.model.rewrite.conduit.bundle; +package com.enderio.conduits.client.model.conduit.bundle; import static com.enderio.conduits.client.ConduitClientSetup.*; @@ -13,7 +13,6 @@ import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; import com.enderio.conduits.common.Area; import com.enderio.conduits.common.conduit.OffsetHelper; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.core.data.model.ModelHelper; import com.mojang.math.Axis; import com.mojang.math.Transformation; @@ -28,6 +27,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.Vec3i; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import net.minecraft.world.inventory.InventoryMenu; @@ -45,7 +45,7 @@ import org.joml.Quaternionf; import org.joml.Vector3f; -public class NewConduitBundleModel implements IDynamicBakedModel { +public class ConduitBundleModel implements IDynamicBakedModel { public static final ModelProperty FACADE_MODEL_DATA = new ModelProperty<>(); public static final ModelProperty FACADE_RENDERTYPE = new ModelProperty<>(); @@ -98,7 +98,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction var connectedTypes = bundleState.getConnectedConduits(direction); for (int i = 0; i < connectedTypes.size(); i++) { Holder> conduit = connectedTypes.get(i); - ConduitGraphObject node = bundleState.getNode(conduit); + CompoundTag clientData = bundleState.getConduitClientDataTag(conduit); Vec3i offset = OffsetHelper.translationFor(direction.getAxis(), OffsetHelper.offsetConduit(i, connectedTypes.size())); @@ -114,7 +114,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction .getModifier(conduit.value().type()); if (conduitCoreModifier != null) { quads.addAll(rotationTranslation.process(conduitCoreModifier.createConnectionQuads(conduit, - node, side, direction, rand, renderType))); + clientData, side, direction, rand, renderType))); } if (isEnd) { @@ -126,11 +126,14 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction IQuadTransformer color = rotationTranslation.andThen(new ColorQuadTransformer( connectionState.inputChannel(), connectionState.outputChannel())); - BakedModel model = switch (connectionState.mode()) { - case IN -> modelOf(CONDUIT_IO_IN); - case OUT -> modelOf(CONDUIT_IO_OUT); - case BOTH -> modelOf(CONDUIT_IO_IN_OUT); - }; + BakedModel model = null; + if (connectionState.canInput() && connectionState.canOutput()) { + model = modelOf(CONDUIT_IO_IN_OUT); + } else if (connectionState.canInput()) { + model = modelOf(CONDUIT_IO_IN); + } else if (connectionState.canOutput()) { + model = modelOf(CONDUIT_IO_OUT); + } if (model != null) { quads.addAll( diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java similarity index 71% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java index f560461ebc..bd9e85ae28 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/rewrite/conduit/bundle/ConduitBundleRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java @@ -1,36 +1,31 @@ -package com.enderio.conduits.client.model.rewrite.conduit.bundle; +package com.enderio.conduits.client.model.conduit.bundle; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.bundle.ConduitBundleReader; -import com.enderio.conduits.api.connection.ConduitConnection; import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.network.node.NodeData; import com.enderio.conduits.common.conduit.OffsetHelper; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; + import java.util.HashMap; import java.util.List; import java.util.Map; import net.minecraft.core.Direction; import net.minecraft.core.Holder; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.model.data.ModelProperty; +import org.jetbrains.annotations.Nullable; public class ConduitBundleRenderState { public static final ModelProperty PROPERTY = new ModelProperty<>(); private Direction.Axis mainAxis; - private List>> conduits; - - // TODO: Due to the API design, we need to capture the nodes at the moment. - // it could be changed to accept ConduitDataAccessor instead, then we can clone - // the data storage. - private Map>, ConduitGraphObject> conduitNodes; - + private Map>, CompoundTag> conduitClientData; private Map>>> conduitsByDirection; - - private Map>, ConduitConnection>> conduitConnections; + private Map>, ConduitConnectionRenderState>> conduitConnections; private boolean hasFacade; private BlockState facadeBlockstate; @@ -41,9 +36,15 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { renderState.mainAxis = OffsetHelper.findMainAxis(bundle); renderState.conduits = List.copyOf(bundle.getConduits()); - renderState.conduitNodes = bundle.getConduits() - .stream() - .collect(HashMap::new, (m, c) -> m.put(c, bundle.getConduitNode(c).deepCopy()), Map::putAll); + + renderState.conduitClientData = new HashMap<>(); + for (var conduit : renderState.conduits) { + var tag = bundle.getConduitClientDataTag(conduit); + if (tag != null) { + renderState.conduitClientData.put(conduit, tag.copy()); + } + } + renderState.conduitsByDirection = new HashMap<>(); for (var side : Direction.values()) { renderState.conduitsByDirection.put(side, bundle.getConnectedConduits(side)); @@ -51,10 +52,12 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { renderState.conduitConnections = new HashMap<>(); for (var side : Direction.values()) { - HashMap>, ConduitConnection> conduits = new HashMap<>(); + HashMap>, ConduitConnectionRenderState> conduits = new HashMap<>(); for (var conduit : renderState.conduits) { if (bundle.getConnectionType(side, conduit) == ConduitConnectionType.CONNECTED_BLOCK) { - conduits.put(conduit, bundle.getConnection(side, conduit)); + var connectionConfig = bundle.getConnectionConfig(side, conduit); + var connectionRenderState = ConduitConnectionRenderState.of(connectionConfig); + conduits.put(conduit, connectionRenderState); } } @@ -77,8 +80,9 @@ public List>> conduits() { return conduits; } - public ConduitGraphObject getNode(Holder> conduit) { - return conduitNodes.get(conduit); + @Nullable + public CompoundTag getConduitClientDataTag(Holder> conduit) { + return conduitClientData.get(conduit); } public List>> getConnectedConduits(Direction side) { @@ -89,7 +93,7 @@ public boolean isConnectionEndpoint(Direction side) { return !conduitConnections.get(side).isEmpty(); } - public ConduitConnection getConnectionState(Direction side, Holder> conduit) { + public ConduitConnectionRenderState getConnectionState(Direction side, Holder> conduit) { return conduitConnections.get(side).get(conduit); } @@ -98,8 +102,7 @@ public Direction.Axis mainAxis() { } public ResourceLocation getTexture(Holder> conduit) { - var node = getNode(conduit); - return conduit.value().getTexture(node); + return conduit.value().getTexture(getConduitClientDataTag(conduit)); } public boolean hasFacade() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java new file mode 100644 index 0000000000..f3ef7a74c7 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java @@ -0,0 +1,46 @@ +package com.enderio.conduits.client.model.conduit.bundle; + +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import net.minecraft.world.item.DyeColor; + +public record ConduitConnectionRenderState( + boolean canInput, + DyeColor inputChannel, + boolean canOutput, + DyeColor outputChannel, + RedstoneControl redstoneControl, + DyeColor redstoneChannel +) { + public static ConduitConnectionRenderState of(ConnectionConfig connectionConfig) { + boolean canInput = false; + boolean canOutput = false; + DyeColor inputChannel = DyeColor.GREEN; + DyeColor outputChannel = DyeColor.GREEN; + if (connectionConfig instanceof ResourceConnectionConfig resourceConnectionConfig) { + canInput = resourceConnectionConfig.canInsert(); + canOutput = resourceConnectionConfig.canExtract(); + inputChannel = resourceConnectionConfig.insertChannel(); + outputChannel = resourceConnectionConfig.extractChannel(); + } + + RedstoneControl redstoneControl = RedstoneControl.ALWAYS_ACTIVE; + DyeColor redstoneChannel = DyeColor.RED; + + if (connectionConfig instanceof RedstoneControlledConnection redstoneControlledConnection) { + redstoneControl = redstoneControlledConnection.redstoneControl(); + redstoneChannel = redstoneControlledConnection.redstoneChannel(); + } + + return new ConduitConnectionRenderState( + canInput, + inputChannel, + canOutput, + outputChannel, + redstoneControl, + redstoneChannel + ); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/FacadeItemGeometry.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemGeometry.java similarity index 97% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/model/FacadeItemGeometry.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemGeometry.java index bb4f1a6814..479bb4d615 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/FacadeItemGeometry.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemGeometry.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.client.model; +package com.enderio.conduits.client.model.conduit.facades; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/FacadeItemModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemModel.java similarity index 98% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/model/FacadeItemModel.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemModel.java index 01a9a7fbfa..b92a92cbaf 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/FacadeItemModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemModel.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.client.model; +package com.enderio.conduits.client.model.conduit.facades; import static com.enderio.conduits.client.ConduitClientSetup.modelOf; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitCoreModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitCoreModelModifier.java index aae49e0196..37b27ba2e0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitCoreModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitCoreModelModifier.java @@ -2,8 +2,9 @@ import com.enderio.base.api.EnderIO; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.model.ConduitCoreModelModifier; +import com.enderio.conduits.api.network.node.NodeData; import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; import com.enderio.conduits.common.conduit.type.fluid.FluidConduitData; import com.enderio.conduits.common.init.ConduitTypes; @@ -15,6 +16,9 @@ import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.Direction; import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.level.block.Blocks; @@ -32,16 +36,21 @@ public class FluidConduitCoreModelModifier implements ConduitCoreModelModifier { private static final ModelResourceLocation FLUID_MODEL = ModelResourceLocation.standalone(EnderIO.loc("block/extra/fluids")); @Override - public List createConnectionQuads(Holder> conduit, ConduitNode node, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, + public List createConnectionQuads(Holder> conduit, @Nullable CompoundTag clientDataTag, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, @Nullable RenderType type) { if (!(conduit.value() instanceof FluidConduit fluidConduit && fluidConduit.isMultiFluid())) { return List.of(); } - FluidConduitData data = node.getData(ConduitTypes.Data.FLUID.get()); + if (clientDataTag == null || !clientDataTag.contains("LockedFluid")) { + return List.of(); + } + + ResourceLocation lockedFluidId = ResourceLocation.parse(clientDataTag.getString("LockedFluid")); + Fluid lockedFluid = BuiltInRegistries.FLUID.get(lockedFluidId); - if (data != null && !data.lockedFluid().isSame(Fluids.EMPTY)) { - return new FluidPaintQuadTransformer(data.lockedFluid()) + if (!lockedFluid.isSame(Fluids.EMPTY)) { + return new FluidPaintQuadTransformer(lockedFluid) .process(Minecraft.getInstance().getModelManager().getModel(FLUID_MODEL) .getQuads(Blocks.COBBLESTONE.defaultBlockState(), facing, rand, ModelData.EMPTY, type)); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java index 244dec18f8..ce2541451e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java @@ -2,7 +2,8 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitCapabilities; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.AddConduitResult; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.facade.FacadeType; import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; @@ -53,12 +54,7 @@ public final class ConduitBundle { Codec.unboundedMap(Conduit.CODEC, ConduitGraphObject.CODEC).fieldOf("nodes").forGetter(i -> i.conduitNodes)) .apply(instance, ConduitBundle::new)); - public static StreamCodec STREAM_CODEC = StreamCodec.composite( - BlockPos.STREAM_CODEC, i -> i.pos, Conduit.STREAM_CODEC.apply(ByteBufCodecs.list()), i -> i.conduits, - ByteBufCodecs.map(HashMap::new, Direction.STREAM_CODEC, ConduitConnection.STREAM_CODEC), i -> i.connections, - ItemStack.OPTIONAL_STREAM_CODEC, i -> i.facadeItem, - ByteBufCodecs.map(HashMap::new, Conduit.STREAM_CODEC, ConduitGraphObject.STREAM_CODEC), i -> i.conduitNodes, - ConduitBundle::new); + public static StreamCodec STREAM_CODEC = null; public static NetworkDataSlot.CodecType DATA_SLOT_TYPE = new NetworkDataSlot.CodecType<>(CODEC, STREAM_CODEC); @@ -109,13 +105,13 @@ public void onChanged() { /** * @return an action containing the conduit that is now not in this bundle */ - public RightClickAction addConduit(Level level, Holder> conduit, Player player) { + public AddConduitResult addConduit(Level level, Holder> conduit, Player player) { if (conduits.size() == MAX_CONDUITS) { - return new RightClickAction.Blocked(); + return new AddConduitResult.Blocked(); } if (conduits.contains(conduit)) { - return new RightClickAction.Blocked(); + return new AddConduitResult.Blocked(); } // New node @@ -132,7 +128,7 @@ public RightClickAction addConduit(Level level, Holder> conduit, Play ConduitGraphObject prevNode = conduitNodes.remove(first.get()); if (prevNode != null) { - node = new ConduitGraphObject(pos, prevNode.conduitDataContainer()); // new node with old data + node = new ConduitGraphObject(pos, prevNode.getNodeData()); // new node with old data conduit.value().onRemoved(prevNode, level, pos); if (!level.isClientSide() && prevNode.getGraph() != null) { prevNode.getGraph().remove(prevNode); @@ -143,14 +139,14 @@ public RightClickAction addConduit(Level level, Holder> conduit, Play conduit.value().onCreated(node, level, pos, player); onChanged(); - return new RightClickAction.Upgrade(first.get()); + return new AddConduitResult.Upgrade(first.get()); } // some conduit says no (like higher energy conduit) if (conduits.stream() .anyMatch(existingConduit -> !existingConduit.value().canBeInSameBundle(conduit) || !conduit.value().canBeInSameBundle(existingConduit))) { - return new RightClickAction.Blocked(); + return new AddConduitResult.Blocked(); } // sort the list, so order is consistent @@ -178,7 +174,7 @@ public RightClickAction addConduit(Level level, Holder> conduit, Play } onChanged(); - return new RightClickAction.Insert(); + return new AddConduitResult.Insert(); } public void onLoad(Level level, BlockPos pos) { @@ -362,7 +358,7 @@ public void setNodeFor(Holder> conduit, ConduitGraphObject node) { if (index >= 0) { var state = connection.getConnectionState(index); if (state instanceof DynamicConnectionState dynamicState) { - node.pushState(direction, dynamicState); +// node.pushState(direction, dynamicState); } } } @@ -404,7 +400,6 @@ public int hashCode() { // breaking the graph. for (var entry : conduitNodes.entrySet()) { hash = 31 * hash + entry.getKey().hashCode(); - hash = 31 * hash + entry.getValue().hashContents(); } return hash; @@ -424,7 +419,7 @@ public ConduitBundle deepCopy() { }, pos); bundle.conduits.addAll(conduits); connections.forEach((dir, connection) -> bundle.connections.put(dir, connection.deepCopy())); - conduitNodes.forEach((conduit, node) -> bundle.setNodeFor(conduit, node.deepCopy())); +// conduitNodes.forEach((conduit, node) -> bundle.setNodeFor(conduit, node.deepCopy())); bundle.facadeItem = facadeItem.copy(); return bundle; } @@ -474,7 +469,7 @@ public void connectTo(Level level, BlockPos pos, ConduitGraphObject conduitGraph if (end) { var state = DynamicConnectionState.defaultConnection(level, pos, direction, type); connectionStates[typeIndex] = state; - conduitGraphObject.pushState(direction, state); +// conduitGraphObject.pushState(direction, state); } else { connectionStates[typeIndex] = StaticConnectionStates.CONNECTED; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java index 6f9fac814d..ebfdecc4d8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java @@ -9,7 +9,7 @@ import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; import com.enderio.conduits.common.conduit.graph.WrappedConduitNetwork; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.init.Conduits; import com.mojang.datafixers.util.Pair; @@ -37,14 +37,13 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.saveddata.SavedData; -import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.tick.LevelTickEvent; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; -@EventBusSubscriber(modid = EnderIOConduits.MODULE_MOD_ID, value = Dist.DEDICATED_SERVER) +@EventBusSubscriber(modid = EnderIOConduits.MODULE_MOD_ID) public class ConduitSavedData extends SavedData { private final Map>, List>> networks = new HashMap<>(); @@ -278,6 +277,7 @@ public ConduitGraphObject takeUnloadedNodeIdentifier(Holder> conduit, LOGGER.warn("Conduit data is missing!"); return null; } + Map chunkMap = typeMap.get(chunkPos); if (chunkMap == null) { LOGGER.warn("Conduit data is missing!"); @@ -343,6 +343,7 @@ private > void tickConduitGraph(ServerLevel serverLevel, Ho int conduitId, ConduitTicker ticker, Graph graph) { int conduitTickRate = conduit.value().graphTickRate(); + // TODO: Offsets for networks so they don't all tick on the same tick. if (serverLevel.getGameTime() % conduitTickRate == conduitId % conduitTickRate) { // noinspection unchecked ticker.tickGraph(serverLevel, (T) conduit.value(), new WrappedConduitNetwork(graph), @@ -368,8 +369,12 @@ private static boolean isRedstoneActive(ServerLevel serverLevel, BlockPos pos, D } var node = blockEntity.getBundle().getNodeFor(redstoneConduit.get()); - RedstoneConduitData data = node.getData(ConduitTypes.Data.REDSTONE.get()); - return data != null && data.isActive(color); + if (node.getNetwork() == null) { + return false; + } + + var context = node.getNetwork().getContext(RedstoneConduitNetworkContext.TYPE); + return context != null && context.isActive(color); } public static void addPotentialGraph(Holder> conduit, Graph graph, diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/SlotData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/SlotData.java index 80980e3321..a3630db80a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/SlotData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/SlotData.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.conduit; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.SlotType; import net.minecraft.core.Direction; public record SlotData(Direction direction, int conduitIndex, SlotType slotType) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java index 9ede542f44..02eee2420e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java @@ -9,7 +9,7 @@ import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.ConduitBundle; import com.enderio.conduits.common.conduit.ConduitSavedData; -import com.enderio.conduits.common.conduit.RightClickAction; +import com.enderio.conduits.api.bundle.AddConduitResult; import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; @@ -17,10 +17,9 @@ import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitComponents; -import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.init.Conduits; import com.enderio.conduits.common.redstone.RedstoneInsertFilter; -import java.util.Objects; + import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -224,18 +223,18 @@ private Optional addConduit(ConduitBundleBlockEntity bloc return Optional.empty(); } - RightClickAction action = blockEntity.addType(conduit, player); + AddConduitResult action = blockEntity.addType(conduit, player); ItemInteractionResult result; - if (action instanceof RightClickAction.Upgrade upgradeAction) { + if (action instanceof AddConduitResult.Upgrade upgradeAction) { if (!player.getAbilities().instabuild) { stack.shrink(1); player.getInventory() .placeItemBackInInventory(ConduitBlockItem.getStackFor(upgradeAction.replacedConduit(), 1)); } result = ItemInteractionResult.sidedSuccess(isClientSide); - } else if (action instanceof RightClickAction.Insert) { + } else if (action instanceof AddConduitResult.Insert) { if (!player.getAbilities().instabuild) { stack.shrink(1); } @@ -287,7 +286,7 @@ private void internalHandleYeta(Holder> conduit, @Nullable Direction ConnectionState connectionState = bundle.getConnectionState(direction, conduit); if (connectionState instanceof DynamicConnectionState dyn) { - bundle.getNodeFor(conduit).clearState(direction); +// bundle.getNodeFor(conduit).clearState(direction); blockEntity.dropConnectionItems(dyn); bundle.setConnectionState(direction, conduit, StaticConnectionStates.DISABLED); blockEntity.updateShape(); @@ -632,12 +631,13 @@ public int getSignal(BlockState pBlockState, BlockGetter level, BlockPos pos, Di return 0; } - if (!conduitBundle.getNodeFor(redstoneConduit).hasData(ConduitTypes.Data.REDSTONE.get())) { - return 0; - } +// if (!conduitBundle.getNodeFor(redstoneConduit).hasData(ConduitTypes.Data.REDSTONE.get())) { +// return 0; +// } - RedstoneConduitData data = conduitBundle.getNodeFor(redstoneConduit).getData(ConduitTypes.Data.REDSTONE.get()); - return getSignalOutput(dyn, Objects.requireNonNull(data)); +// RedstoneConduitData data = conduitBundle.getNodeFor(redstoneConduit).getData(ConduitTypes.Data.REDSTONE.get()); +// return getSignalOutput(dyn, Objects.requireNonNull(data)); + return 0; } return 0; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java index bb3eced170..ce85977c66 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java @@ -5,16 +5,15 @@ import com.enderio.base.common.init.EIOCapabilities; import com.enderio.conduits.ConduitNBTKeys; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitCapabilities; import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.ConduitNode; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.client.particle.ConduitBreakParticle; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.ConduitBundle; import com.enderio.conduits.common.conduit.ConduitSavedData; import com.enderio.conduits.common.conduit.ConduitShape; -import com.enderio.conduits.common.conduit.RightClickAction; +import com.enderio.conduits.api.bundle.AddConduitResult; import com.enderio.conduits.common.conduit.SlotData; import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; @@ -141,7 +140,7 @@ public void handleConnectionStateUpdate(Direction direction, Holder> // Update node IO state. var node = bundle.getNodeFor(conduit); - node.pushState(direction, connectionState); +// node.pushState(direction, connectionState); // Proxied capabilities are likely to have changed. level.invalidateCapabilities(worldPosition); @@ -154,7 +153,7 @@ public void handleConnectionStateUpdate(Direction direction, Holder> @EnsureSide(EnsureSide.Side.SERVER) public void handleConduitDataUpdate(Holder> conduit, ConduitDataContainer clientDataContainer) { var node = getBundle().getNodeFor(conduit); - node.handleClientChanges(clientDataContainer); +// node.handleClientChanges(clientDataContainer); } // endregion @@ -262,7 +261,7 @@ public void updateConnections(Level level, BlockPos pos, @Nullable BlockPos from ConnectionState connectionState = bundle.getConnectionState(direction, conduit); if (connectionState instanceof DynamicConnectionState dyn) { if (!conduit.value().canForceConnectTo(level, pos, direction)) { - bundle.getNodeFor(conduit).clearState(direction); +// bundle.getNodeFor(conduit).clearState(direction); dropConnectionItems(dyn); bundle.setConnectionState(direction, conduit, StaticConnectionStates.DISCONNECTED); updateShape(); @@ -285,8 +284,8 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider lookupProvi ListTag listTag = new ListTag(); for (Holder> conduit : bundle.getConduits()) { - var data = bundle.getNodeFor(conduit).conduitDataContainer(); - listTag.add(data.save(lookupProvider)); +// var data = bundle.getNodeFor(conduit).conduitDataContainer(); +// listTag.add(data.save(lookupProvider)); } tag.put(ConduitNBTKeys.CONDUIT_EXTRA_DATA, listTag); @@ -335,8 +334,8 @@ public boolean hasType(Holder> conduit) { return bundle.hasType(conduit); } - public RightClickAction addType(Holder> conduit, Player player) { - RightClickAction action = bundle.addConduit(level, conduit, player); + public AddConduitResult addType(Holder> conduit, Player player) { + AddConduitResult action = bundle.addConduit(level, conduit, player); // something has changed if (action.hasChanged()) { @@ -359,7 +358,7 @@ public RightClickAction addType(Holder> conduit, Player player) { ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(thisNode.getGraph()), serverLevel); } - if (action instanceof RightClickAction.Upgrade upgrade + if (action instanceof AddConduitResult.Upgrade upgrade && !upgrade.replacedConduit().value().canConnectTo(conduit)) { removeNeighborConnections(upgrade.replacedConduit()); } @@ -389,16 +388,16 @@ public Optional> tryConnectTo(Direction dir, Ho conduit.value().onConnectTo(firstNode, secondNode); - if (firstNode.getParentGraph() != null) { - for (var node : firstNode.getParentGraph().getNodes()) { + if (firstNode.getNetwork() != null) { + for (var node : firstNode.getNetwork().getNodes()) { if (node != firstNode) { conduit.value().onConnectTo(firstNode, node); } } } - if (secondNode.getParentGraph() != null && firstNode.getParentGraph() != secondNode.getParentGraph()) { - for (var node : secondNode.getParentGraph().getNodes()) { + if (secondNode.getNetwork() != null && firstNode.getNetwork() != secondNode.getNetwork()) { + for (var node : secondNode.getNetwork().getNodes()) { if (node != secondNode) { conduit.value().onConnectTo(secondNode, node); } @@ -683,6 +682,12 @@ private static TCap getProxiedCapability(BlockCapability { + buf.writeBlockPos(pos); + buf.writeEnum(conduitConnection.getFirst()); + Conduit.STREAM_CODEC.encode(buf, conduitConnection.getSecond()); + }); + } + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } + + return super.useWithoutItem(state, level, pos, player, hitResult); + } + + // endregion + // region Item Interactions @Override @@ -440,15 +458,15 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos // Do not consult the bundle on the client. if (!level.isClientSide()) { // Attempt to add to the bundle - RightClickAction addResult = conduitBundle.addConduit(conduit, player); + AddConduitResult addResult = conduitBundle.addConduit(conduit, player); - if (addResult instanceof RightClickAction.Upgrade upgradeResult) { + if (addResult instanceof AddConduitResult.Upgrade upgradeResult) { if (!player.getAbilities().instabuild) { stack.shrink(1); player.getInventory() .placeItemBackInInventory(ConduitBlockItem.getStackFor(upgradeResult.replacedConduit(), 1)); } - } else if (addResult instanceof RightClickAction.Insert addedResult) { + } else if (addResult instanceof AddConduitResult.Insert addedResult) { if (!player.getAbilities().instabuild) { stack.shrink(1); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java index daf673efab..95e33a81f1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java @@ -1,28 +1,30 @@ package com.enderio.conduits.common.conduit.bundle; -import com.enderio.base.api.UseOnly; import com.enderio.conduits.ConduitNBTKeys; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitCapabilities; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.ConduitInventory; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.bundle.ConduitBundleAccessor; -import com.enderio.conduits.api.connection.ConduitConnection; -import com.enderio.conduits.api.connection.ConduitConnectionMode; import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.facade.FacadeType; -import com.enderio.conduits.client.model.rewrite.conduit.bundle.ConduitBundleRenderState; +import com.enderio.conduits.api.network.node.NodeData; +import com.enderio.conduits.client.model.conduit.bundle.ConduitBundleRenderState; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.ConduitSavedData; import com.enderio.conduits.common.conduit.ConduitSorter; -import com.enderio.conduits.common.conduit.RightClickAction; +import com.enderio.conduits.api.bundle.AddConduitResult; import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; +import com.enderio.conduits.common.conduit.graph.ConduitConnectionHost; import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; +import com.enderio.conduits.common.conduit.menu.NewConduitMenu; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.core.common.blockentity.EnderBlockEntity; import com.mojang.serialization.Codec; @@ -39,6 +41,8 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; + +import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -49,36 +53,34 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.network.Connection; +import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.Clearable; +import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.fml.LogicalSide; import net.neoforged.fml.loading.FMLLoader; import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.ICapabilityProvider; import net.neoforged.neoforge.client.model.data.ModelData; +import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.Nullable; -public final class NewConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor { - - // TODO: onConnectionsUpdated needs to be fired. - // TODO: need to drop items when connections are removed etc. - // TODO: model is not making junction boxes correctly... +public final class NewConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor, Clearable { public static final int MAX_CONDUITS = 9; - // TODO: The new save format is actually not finished yet. - private static final boolean USE_LEGACY_SAVE_FORMAT = true; - private ItemStack facadeProvider = ItemStack.EMPTY; private List>> conduits = new ArrayList<>(); @@ -88,14 +90,20 @@ public final class NewConduitBundleBlockEntity extends EnderBlockEntity implemen private final NewConduitBundleInventory inventory; // Map of all conduit nodes for this bundle. - private Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); + private final Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); // Used to recover missing nodes when loading the bundle. private final Map>, ConduitGraphObject> lazyNodes = new HashMap<>(); - private ListTag lazyNodeNBT = new ListTag(); + private ListTag lazyNodeNBT = null; + private Map>, NodeData> lazyNodeData = null; + + // The client has no nodes, so we hold the data like this. + private final Map>, CompoundTag> clientConduitDataTags = new HashMap<>(); private final NewConduitShape shape = new NewConduitShape(); + private boolean hasDirtyNodes = false; + // Deferred connection check private ConduitBundleBlockEntity.UpdateState checkConnection = ConduitBundleBlockEntity.UpdateState.NONE; @@ -106,7 +114,6 @@ public NewConduitBundleBlockEntity(BlockPos worldPosition, BlockState blockState @Override protected void onChanged() { setChanged(); - // TODO: Do we need to do anything else here? } }; } @@ -120,6 +127,17 @@ public void serverTick() { if (checkConnection.isInitialized()) { updateConnections(level, getBlockPos(), null, false); } + + if (this.level.getGameTime() % 5 == 0) { + if (hasDirtyNodes) { + // This is for sending updates to clients when the nodes are dirty + // as such we only fire a block update + // TODO: We're also saving here, but maybe we shouldn't bother? + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); + setChanged(); + hasDirtyNodes = false; + } + } } } @@ -181,7 +199,7 @@ public void updateShape() { shape.updateConduit(this); } - @UseOnly(LogicalSide.CLIENT) + @EnsureSide(EnsureSide.Side.CLIENT) public void updateModel() { requestModelDataUpdate(); if (level != null) { @@ -200,6 +218,51 @@ public ModelData getModelData() { // TODO + public boolean canBeOrIsConnection(Direction side, Holder> conduit) { + if (level == null) { + return false; + } + + // If we've lost the conduit + if (!hasConduitStrict(conduit)) { + return false; + } + + // Cannot create a connection to a bundle + if (level.getBlockEntity(getBlockPos().relative(side)) instanceof NewConduitBundleBlockEntity) { + return false; + } + + // If they've managed to open the menu, a connection could already have been established + // TODO: Maybe create a map to track canConnect from the conduit so this is a guarantee. + return true; + } + + public MenuProvider getMenuProvider(Direction side, Holder> conduit) { + return new ConduitMenuProvider(side, conduit); + } + + private class ConduitMenuProvider implements MenuProvider { + + private final Direction side; + private final Holder> conduit; + + private ConduitMenuProvider(Direction side, Holder> conduit) { + this.side = side; + this.conduit = conduit; + } + + @Override + public Component getDisplayName() { + return conduit.value().description(); + } + + @Override + public @Nullable AbstractContainerMenu createMenu(int containerId, Inventory inventory, Player player) { + return new NewConduitMenu(containerId, inventory, NewConduitBundleBlockEntity.this, side, conduit); + } + } + // endregion // region Capability Proxies @@ -227,7 +290,7 @@ private static TCap getProxiedCapability(BlockCapability TCap getProxiedCapability(BlockCapability>> getConduits() { - return conduits; + return List.copyOf(conduits); } @Override @@ -303,51 +366,54 @@ public boolean canAddConduit(Holder> conduit) { } @Override - public RightClickAction addConduit(Holder> conduit, @Nullable Player player) { + public AddConduitResult addConduit(Holder> conduit, @Nullable Player player) { if (level == null || !(level instanceof ServerLevel serverLevel)) { - return new RightClickAction.Blocked(); + return new AddConduitResult.Blocked(); } if (isFull()) { - return new RightClickAction.Blocked(); + return new AddConduitResult.Blocked(); } if (hasConduitStrict(conduit)) { - return new RightClickAction.Blocked(); + return new AddConduitResult.Blocked(); } // Attempt to upgrade an existing conduit. - RightClickAction result; + AddConduitResult result; var replacementCandidate = findReplacementCandidate(conduit); if (replacementCandidate.isPresent()) { int replacementIndex = conduits.indexOf(replacementCandidate.get()); conduits.set(replacementIndex, conduit); - ConduitGraphObject oldNode = conduitNodes.remove(replacementCandidate.get()); + // Add connections entry + var oldConnectionContainer = conduitConnections.remove(replacementCandidate.get()); + conduitConnections.put(conduit, oldConnectionContainer.copyFor(conduit)); // TODO: Remove incompatible connections! + + if (!level.isClientSide()) { + ConduitGraphObject oldNode = conduitNodes.remove(replacementCandidate.get()); + + ConduitGraphObject newNode; + if (oldNode != null) { + // Copy data into the node + newNode = new ConduitGraphObject(getBlockPos(), oldNode.getNodeData()); + conduit.value().onRemoved(oldNode, level, getBlockPos()); + oldNode.getGraph().remove(oldNode); + } else { + newNode = new ConduitGraphObject(getBlockPos()); + } - ConduitGraphObject newNode; - if (oldNode != null) { - // Copy data into the node - newNode = new ConduitGraphObject(getBlockPos(), oldNode.conduitDataContainer()); - conduit.value().onRemoved(oldNode, level, getBlockPos()); - oldNode.getGraph().remove(oldNode); - } else { - newNode = new ConduitGraphObject(getBlockPos()); + setNode(conduit, newNode); + conduit.value().onCreated(newNode, level, getBlockPos(), player); } - setNode(conduit, newNode); - conduit.value().onCreated(newNode, level, getBlockPos(), player); - - result = new RightClickAction.Upgrade(replacementCandidate.get()); + result = new AddConduitResult.Upgrade(replacementCandidate.get()); } else { // Ensure there are no incompatible conduits. if (!isConduitCompatibleWithExisting(conduit)) { - return new RightClickAction.Blocked(); + return new AddConduitResult.Blocked(); } - // Create the new node - ConduitGraphObject node = new ConduitGraphObject(getBlockPos()); - // Ensure the conduits list is sorted correctly. int id = ConduitSorter.getSortIndex(conduit); var addBefore = conduits.stream().filter(c -> ConduitSorter.getSortIndex(c) > id).findFirst(); @@ -357,34 +423,46 @@ public RightClickAction addConduit(Holder> conduit, @Nullable Player conduits.add(conduit); } - // Add the node - setNode(conduit, node); - // Add connections entry conduitConnections.put(conduit, new ConnectionContainer(conduit)); - // NeoForge contains a patch that calls onLoad after the conduit has been placed - // if it's the first one, so onCreated would be called twice. it's easier to - // detect here - if (conduits.size() != 1) { - conduit.value().onCreated(node, level, getBlockPos(), player); + if (!level.isClientSide()) { + // Create the new node + ConduitGraphObject node = new ConduitGraphObject(getBlockPos()); + + // Add the node + setNode(conduit, node); + + // NeoForge contains a patch that calls onLoad after the conduit has been placed + // if it's the first one, so onCreated would be called twice. it's easier to + // detect here + if (conduits.size() != 1) { + conduit.value().onCreated(node, level, getBlockPos(), player); + } } - result = new RightClickAction.Insert(); + result = new AddConduitResult.Insert(); } - // Attach the new node to its own graph - ConduitGraphUtility.integrate(conduit, getConduitNode(conduit), List.of()); + if (!level.isClientSide()) { + // Attach the new node to its own graph + var node = getConduitNode(conduit); + ConduitGraphUtility.integrate(conduit, node, List.of()); + + // Attach the bundle + node.attach(new ConnectionHost(this, conduit)); + } // Now attempt to make connections. for (Direction side : Direction.values()) { tryConnectTo(side, conduit, false); } - ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(getConduitNode(conduit).getGraph()), - serverLevel); + if (!level.isClientSide()) { + ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(getConduitNode(conduit).getGraph()), serverLevel); + } - if (result instanceof RightClickAction.Upgrade upgrade + if (result instanceof AddConduitResult.Upgrade upgrade && !upgrade.replacedConduit().value().canConnectTo(conduit)) { removeNeighborConnections(conduit); } @@ -419,21 +497,24 @@ public void removeConduit(Holder> conduit, @Nullable Player player) { } } - // Node remove event - var node = getConduitNode(conduit); - conduit.value().onRemoved(node, level, getBlockPos()); - // Remove neighbour connections removeNeighborConnections(conduit); - // Remove from the inventory's storage. - inventory.removeConduit(conduit); + // Node remove event + if (!level.isClientSide()) { + var node = getConduitNode(conduit); + conduit.value().onRemoved(node, level, getBlockPos()); + node.detach(); - // Remove from the graph. - if (node.getGraph() != null) { - node.getGraph().remove(node); + // Remove from the graph. + if (node.getGraph() != null) { + node.getGraph().remove(node); + } } + // Remove from the inventory's storage. + inventory.removeConduit(conduit); + // Remove from the bundle conduits.remove(conduit); conduitConnections.remove(conduit); @@ -476,25 +557,43 @@ private void dropItem(ItemStack stack) { } @Override + public ConduitInventory getInventory(Holder> conduit) { + if (!hasConduitStrict(conduit)) { + throw new IllegalStateException("Conduit not found in bundle."); + } + + return inventory.getInventoryFor(conduit); + } + + @EnsureSide(EnsureSide.Side.SERVER) public ConduitGraphObject getConduitNode(Holder> conduit) { + if (!hasConduitByType(conduit)) { + throw new IllegalStateException("Conduit not found in bundle."); + } + return conduitNodes.get(conduit); } + @Override + @Nullable + public CompoundTag getConduitClientDataTag(Holder> conduit) { + if (!conduit.value().hasClientDataTag()) { + return null; + } + + if (level != null && !level.isClientSide()) { + return conduit.value().getClientDataTag(getConduitNode(conduit)); + } + + return clientConduitDataTags.get(conduit); + } + + @EnsureSide(EnsureSide.Side.SERVER) private void setNode(Holder> conduit, ConduitGraphObject loadedNode) { conduitNodes.put(conduit, loadedNode); - // Give the node a reference to its inventory. - loadedNode.setInventory(inventory.getInventoryFor(conduit)); - - // Push the current connections through to the node. - var connections = conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new); - for (Direction side : Direction.values()) { - if (connections.getType(side) == ConduitConnectionType.CONNECTED_BLOCK) { - loadedNode.setConnection(side, connections.getConnection(side)); - } else { - loadedNode.setConnection(side, null); - } - } + // Attach to the node to provide connection data and inventory. + loadedNode.attach(new ConnectionHost(this, conduit)); } // endregion @@ -517,13 +616,29 @@ public ConduitConnectionType getConnectionType(Direction side, Holder } @Override - public ConduitConnection getConnection(Direction side, Holder> conduit) { - var connections = conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new); - if (connections.getType(side) != ConduitConnectionType.CONNECTED_BLOCK) { - throw new IllegalStateException("Conduit is not connected to a block on this side."); + public ConnectionConfig getConnectionConfig(Direction side, Holder> conduit) { + return conduitConnections.get(conduit).getConfig(side); + } + + @Override + public void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config) { + if (config.type() != conduit.value().connectionConfigType()) { + throw new IllegalArgumentException("Connection config is not the right type for this conduit."); + } + + conduitConnections.get(conduit).setConfig(side, config); + bundleChanged(); + } + + // Intended for use by the menu, might need a better interface? + @EnsureSide(EnsureSide.Side.SERVER) + public void setConnectionType(Direction side, Holder> conduit, ConduitConnectionType type) { + if (!hasConduitStrict(conduit)) { + throw new IllegalArgumentException("Conduit is not present in this bundle."); } - return conduitConnections.get(conduit).getConnection(side); + conduitConnections.get(conduit).setType(side, type); + bundleChanged(); } @Override @@ -588,12 +703,14 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boolean neighbourConduitBundle.connectConduit(side.getOpposite(), conduit); // Fire node connection events - var neighbourNode = neighbourConduitBundle.getConduitNode(conduit); - conduit.value().onConnectTo(node, neighbourNode); - conduit.value().onConnectTo(neighbourNode, node); + if (!level.isClientSide()) { + var neighbourNode = neighbourConduitBundle.getConduitNode(conduit); + conduit.value().onConnectTo(node, neighbourNode); + conduit.value().onConnectTo(neighbourNode, node); - // Connect the graphs together - ConduitGraphUtility.connect(conduit, node, neighbourNode); + // Connect the graphs together + ConduitGraphUtility.connect(conduit, node, neighbourNode); + } return true; } @@ -620,7 +737,8 @@ public void onConnectionsUpdated(Holder> conduit) { } private void connectConduit(Direction side, Holder> conduit) { - conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new).connectConduit(side); + conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) + .setType(side, ConduitConnectionType.CONNECTED_CONDUIT); onConnectionsUpdated(conduit); setChanged(); level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); @@ -628,7 +746,8 @@ private void connectConduit(Direction side, Holder> conduit) { } private void connectBlock(Direction side, Holder> conduit) { - conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new).connectBlock(side); + conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) + .setType(side, ConduitConnectionType.CONNECTED_BLOCK); onConnectionsUpdated(conduit); setChanged(); level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); @@ -638,13 +757,11 @@ private void connectBlock(Direction side, Holder> conduit) { // TODO: poorly named, we're disconnecting from another conduit on the given // side. private void disconnect(Direction side, Holder> conduit) { - // TODO: Old disconnect does a lot more work than this... idk why it cycles - // through all conduits with canConnectTo - boolean hasChanged = false; for (var c : conduits) { if (c.value().canConnectTo(conduit)) { - conduitConnections.computeIfAbsent(c, ConnectionContainer::new).disconnect(side); + conduitConnections.computeIfAbsent(c, ConnectionContainer::new) + .setType(side, ConduitConnectionType.NONE); onConnectionsUpdated(c); hasChanged = true; } @@ -686,7 +803,6 @@ public void updateConnections(Level level, BlockPos pos, @Nullable BlockPos from tryConnectTo(side, conduit, false); } else if (currentConnectionType == ConduitConnectionType.CONNECTED_BLOCK) { if (!conduit.value().canForceConnectTo(level, getBlockPos(), side)) { - dropConnectionItems(side, conduit); disconnect(side, conduit); onConnectionsUpdated(conduit); } @@ -766,11 +882,9 @@ public Packet getUpdatePacket() { } @Override - public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, - HolderLookup.Provider lookupProvider) { + public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { super.onDataPacket(net, pkt, lookupProvider); - // Update shape and model after receiving an update from the server. updateShape(); updateModel(); } @@ -779,7 +893,6 @@ public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, public void handleUpdateTag(CompoundTag syncData, HolderLookup.Provider lookupProvider) { super.handleUpdateTag(syncData, lookupProvider); - // Update shape and model after receiving an update from the server. updateShape(); updateModel(); } @@ -797,7 +910,7 @@ public void setLevel(Level level) { } } - @UseOnly(LogicalSide.SERVER) + @EnsureSide(EnsureSide.Side.SERVER) private void loadFromSavedData() { if (!(level instanceof ServerLevel serverLevel)) { return; @@ -809,23 +922,40 @@ private void loadFromSavedData() { loadConduitFromSavedData(savedData, type, i); } - lazyNodeNBT.clear(); + lazyNodeData = null; + lazyNodeNBT = null; } - @UseOnly(LogicalSide.SERVER) + @EnsureSide(EnsureSide.Side.SERVER) private void loadConduitFromSavedData(ConduitSavedData savedData, Holder> conduit, int typeIndex) { - if (level == null) { + if (level == null || !(level instanceof ServerLevel serverLevel)) { return; } ConduitGraphObject node = savedData.takeUnloadedNodeIdentifier(conduit, this.worldPosition); if (node == null && conduitNodes.get(conduit) == null) { - ConduitDataContainer dataContainer = null; - if (typeIndex < lazyNodeNBT.size()) { - dataContainer = ConduitDataContainer.parse(level.registryAccess(), lazyNodeNBT.getCompound(typeIndex)); + // Attempt to recover node data + NodeData nodeData = null; + if (lazyNodeData != null && lazyNodeData.containsKey(conduit)) { + nodeData = lazyNodeData.remove(conduit); + } + + if (nodeData == null) { + // Attempt to load legacy recovery data. + ConduitDataContainer dataContainer = null; + if (lazyNodeNBT != null && typeIndex < lazyNodeNBT.size()) { + dataContainer = ConduitDataContainer.parse(level.registryAccess(), lazyNodeNBT.getCompound(typeIndex)); + } + + if (dataContainer != null) { + node = new ConduitGraphObject(getBlockPos(), dataContainer); + } else { + node = new ConduitGraphObject(getBlockPos()); + } + } else { + node = new ConduitGraphObject(getBlockPos(), nodeData); } - node = new ConduitGraphObject(worldPosition, dataContainer); ConduitGraphUtility.integrate(conduit, node, List.of()); setNode(conduit, node); lazyNodes.put(conduit, node); @@ -844,6 +974,7 @@ public void onChunkUnloaded() { for (var conduit : conduits) { var node = conduitNodes.get(conduit); conduit.value().onRemoved(node, level, getBlockPos()); + node.detach(); savedData.putUnloadedNodeIdentifier(conduit, this.worldPosition, node); } } @@ -861,63 +992,90 @@ public void setRemoved() { private static final String CONNECTIONS_KEY = "Connections"; private static final String NODES_KEY = "Nodes"; public static final String CONDUIT_INV_KEY = "ConduitInv"; + public static final String NODE_DATA_KEY = "NodeData"; + + private static final String CONDUIT_CLIENT_SYNC_DATA_KEY = "ConduitSyncTags"; + + @Override + public CompoundTag getUpdateTag(HolderLookup.Provider registries) { + CompoundTag updateTag = super.getUpdateTag(registries); + + // Send conduit sync data + ListTag nodeDataList = new ListTag(); + + for (var conduit : conduits) { + if (conduit.value().hasClientDataTag()) { + var node = getConduitNode(conduit); + CompoundTag tag = new CompoundTag(); + tag.put("Conduit", Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit).getOrThrow()); + tag.put("Data", conduit.value().getClientDataTag(node)); + nodeDataList.add(tag); + } + } + + updateTag.put(CONDUIT_CLIENT_SYNC_DATA_KEY, nodeDataList); + return updateTag; + } @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { super.saveAdditional(tag, registries); tag.put(CONDUIT_INV_KEY, inventory.serializeNBT(registries)); - if (!USE_LEGACY_SAVE_FORMAT) { - // Save conduit nodes as another recovery option - // TODO: If we save the node, why do we need the additional CONDUIT_EXTRA_DATA - // tags... - // ... the same nodes contain the data being saved. - // Done in conduit list order. - ListTag listTag = new ListTag(); - for (Holder> conduit : conduits) { - var data = conduitNodes.get(conduit); - listTag.add(data.save(registries)); - } - tag.put(NODES_KEY, listTag); - } + var serializationContext = registries.createSerializationContext(NbtOps.INSTANCE); - // Save node data in case of need for recovery - // Done in conduit list order. - ListTag listTag = new ListTag(); + // NEW: Save node data in case of need for recovery + ListTag nodeData = new ListTag(); for (Holder> conduit : conduits) { - var data = conduitNodes.get(conduit).conduitDataContainer(); - listTag.add(data.save(registries)); - } + var data = conduitNodes.get(conduit).getNodeData(); - tag.put(ConduitNBTKeys.CONDUIT_EXTRA_DATA, listTag); + if (data != null) { + CompoundTag nodeTag = new CompoundTag(); + nodeTag.put("Conduit", Conduit.CODEC.encodeStart(serializationContext, conduit).getOrThrow()); + nodeTag.put("Data", NodeData.GENERIC_CODEC.encodeStart(serializationContext, data).getOrThrow()); + nodeData.add(nodeTag); + } + } + tag.put(NODE_DATA_KEY, nodeData); } @Override protected void saveAdditionalSynced(CompoundTag tag, HolderLookup.Provider registries) { super.saveAdditionalSynced(tag, registries); - // TODO: Only save here if we're using the new save format, if we're using old, - // add the new format in getUpdateTag? - // it'll mean much less data is sent. - if (USE_LEGACY_SAVE_FORMAT) { - var bundle = createLegacyBundle(); - tag.put(ConduitNBTKeys.CONDUIT_BUNDLE, bundle.save(registries)); - } else { - if (!conduits.isEmpty()) { - ListTag conduitList = new ListTag(); - for (var conduit : conduits) { - conduitList.add( - Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit) - .getOrThrow()); - } - tag.put(CONDUITS_KEY, conduitList); + if (!conduits.isEmpty()) { + ListTag conduitList = new ListTag(); + for (var conduit : conduits) { + conduitList.add( + Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit) + .getOrThrow()); } + tag.put(CONDUITS_KEY, conduitList); + + // Save connections + ListTag conduitConnectionsList = new ListTag(); + for (var conduit : conduits) { + ListTag connectionsList = new ListTag(); + for (Direction side : Direction.values()) { + CompoundTag connectionTag = new CompoundTag(); + connectionTag.putString("Side", side.getSerializedName()); + connectionTag.putString("Type", getConnectionType(side, conduit).getSerializedName()); + + var config = getConnectionConfig(side, conduit); + if (!config.equals(config.type().getDefault())) { + connectionTag.put("Config", ConnectionConfig.GENERIC_CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), config).getOrThrow()); + } - // TODO: Save connections + connectionsList.add(connectionTag); + } - if (!facadeProvider.isEmpty()) { - tag.put(FACADE_PROVIDER_KEY, facadeProvider.save(registries)); + conduitConnectionsList.add(connectionsList); } + tag.put(CONNECTIONS_KEY, conduitConnectionsList); + } + + if (!facadeProvider.isEmpty()) { + tag.put(FACADE_PROVIDER_KEY, facadeProvider.save(registries)); } } @@ -926,30 +1084,52 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) super.loadAdditional(tag, registries); if (tag.contains(ConduitNBTKeys.CONDUIT_BUNDLE)) { + // Convert the legacy bundle to the new format var bundle = LegacyConduitBundle.parse(registries, tag.getCompound(ConduitNBTKeys.CONDUIT_BUNDLE)); loadFromLegacyBundle(bundle); } else { // New save format - if (tag.contains(CONDUITS_KEY)) { - ListTag conduitList = tag.getList(CONDUITS_KEY, 10); + conduits.clear(); + if (tag.contains(CONDUITS_KEY, Tag.TAG_LIST)) { + // Get untyped list tag. + ListTag conduitList = (ListTag)tag.get(CONDUITS_KEY); for (var conduitTag : conduitList) { conduits.add(Conduit.CODEC.parse(registries.createSerializationContext(NbtOps.INSTANCE), conduitTag) .getOrThrow()); } } - // TODO: Load connections + // Load connections + conduitConnections.clear(); + if (tag.contains(CONNECTIONS_KEY)) { + ListTag conduitConnectionsList = tag.getList(CONNECTIONS_KEY, Tag.TAG_LIST); + + for (int i = 0; i < conduitConnectionsList.size(); i++) { + ListTag connectionsList = conduitConnectionsList.getList(i); + Holder> conduit = conduits.get(i); + + ConnectionContainer connections = new ConnectionContainer(conduit); + for (int j = 0; j < connectionsList.size(); j++) { + CompoundTag connectionTag = connectionsList.getCompound(j); + Direction side = Direction.byName(connectionTag.getString("Side")); + ConduitConnectionType type = ConduitConnectionType.byName(connectionTag.getString("Type")); + + if (side != null && type != null) { + connections.setType(side, type); + + if (connectionTag.contains("Config")) { + ConnectionConfig config = ConnectionConfig.GENERIC_CODEC.parse(registries.createSerializationContext(NbtOps.INSTANCE), connectionTag.get("Config")).getOrThrow(); + connections.setConfig(side, config); + } + } + } - if (tag.contains(FACADE_PROVIDER_KEY)) { - facadeProvider = ItemStack.parseOptional(registries, tag.getCompound(FACADE_PROVIDER_KEY)); + conduitConnections.put(conduit, connections); + } } - if (tag.contains(NODES_KEY)) { - ListTag listTag = tag.getList(NODES_KEY, Tag.TAG_COMPOUND); - for (int i = 0; i < listTag.size(); i++) { - var data = ConduitGraphObject.parse(registries, listTag.getCompound(i)); - setNode(conduits.get(i), data); - } + if (tag.contains(FACADE_PROVIDER_KEY)) { + facadeProvider = ItemStack.parseOptional(registries, tag.getCompound(FACADE_PROVIDER_KEY)); } } @@ -961,6 +1141,40 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) // Load node data used for recovery if (tag.contains(ConduitNBTKeys.CONDUIT_EXTRA_DATA)) { lazyNodeNBT = tag.getList(ConduitNBTKeys.CONDUIT_EXTRA_DATA, Tag.TAG_COMPOUND); + } else if (tag.contains(NODE_DATA_KEY)) { + var list = tag.getList(NODE_DATA_KEY, Tag.TAG_COMPOUND); + lazyNodeData = new HashMap<>(); + + var serializationContext = registries.createSerializationContext(NbtOps.INSTANCE); + + for (int i = 0; i < list.size(); i++) { + var nodeTag = list.getCompound(i); + var conduitParseResult = Conduit.CODEC.parse(serializationContext, nodeTag.get("Conduit")); + + if (conduitParseResult.isError()) { + continue; + } + + var dataParseResult = NodeData.GENERIC_CODEC.parse(serializationContext, nodeTag.get("Data")); + if (dataParseResult.isError()) { + continue; + } + + lazyNodeData.put(conduitParseResult.getOrThrow(), dataParseResult.getOrThrow()); + } + } + + // Load synced node data + if (tag.contains(CONDUIT_CLIENT_SYNC_DATA_KEY)) { + clientConduitDataTags.clear(); + + ListTag nodeDataList = tag.getList(CONDUIT_CLIENT_SYNC_DATA_KEY, Tag.TAG_COMPOUND); + var serializationContext = registries.createSerializationContext(NbtOps.INSTANCE); + for (int i = 0; i < nodeDataList.size(); i++) { + CompoundTag nodeTag = nodeDataList.getCompound(i); + var conduit = Conduit.CODEC.parse(serializationContext, nodeTag.get("Conduit")).getOrThrow(); + clientConduitDataTags.put(conduit, nodeTag.getCompound("Data")); + } } } @@ -970,12 +1184,6 @@ private void loadFromLegacyBundle(LegacyConduitBundle bundle) { conduits = new ArrayList<>(); conduits.addAll(bundle.conduits); - // Copy conduit nodes across - conduitNodes = new HashMap<>(); - for (var entry : bundle.conduitNodes.entrySet()) { - setNode(entry.getKey(), entry.getValue()); - } - // Copy facade provider facadeProvider = bundle.facadeItem.copy(); @@ -991,68 +1199,33 @@ private void loadFromLegacyBundle(LegacyConduitBundle bundle) { var state = legacySide.getConnectionState(conduitIndex); if (state == StaticConnectionStates.CONNECTED || state == StaticConnectionStates.CONNECTED_ACTIVE) { - connections.internalSetType(side, ConduitConnectionType.CONNECTED_CONDUIT); + connections.setType(side, ConduitConnectionType.CONNECTED_CONDUIT); } else if (state == StaticConnectionStates.DISCONNECTED) { - connections.internalSetType(side, ConduitConnectionType.NONE); + connections.setType(side, ConduitConnectionType.NONE); } else if (state == StaticConnectionStates.DISABLED) { - connections.internalSetType(side, ConduitConnectionType.DISABLED); + connections.setType(side, ConduitConnectionType.DISABLED); } else if (state instanceof DynamicConnectionState dynamicState) { - connections.internalSetType(side, ConduitConnectionType.CONNECTED_BLOCK); - - ConduitConnectionMode mode; - if (dynamicState.isInsert() && dynamicState.isExtract()) { - mode = ConduitConnectionMode.BOTH; - } else if (dynamicState.isInsert()) { - mode = ConduitConnectionMode.IN; - } else { - mode = ConduitConnectionMode.OUT; - } + connections.setType(side, ConduitConnectionType.CONNECTED_BLOCK); - connections.setConnection(side, new ConduitConnection(mode, dynamicState.insertChannel(), - dynamicState.extractChannel(), dynamicState.control(), dynamicState.redstoneChannel())); + connections.setConfig(side, conduit.value().convertConnection(dynamicState.isInsert(), dynamicState.isExtract(), + dynamicState.insertChannel(), dynamicState.extractChannel(), dynamicState.control(), + dynamicState.redstoneChannel())); inventory.setStackInSlot(conduit, side, SlotType.FILTER_INSERT, dynamicState.filterInsert()); inventory.setStackInSlot(conduit, side, SlotType.FILTER_EXTRACT, dynamicState.filterExtract()); - inventory.setStackInSlot(conduit, side, SlotType.UPGRADE_EXTRACT, dynamicState.upgradeExtract()); } } } } - @SuppressWarnings("removal") - private LegacyConduitBundle createLegacyBundle() { - Map legacyConnectionsMap = new EnumMap<>(Direction.class); - for (var conduit : conduits) { - int conduitIndex = conduits.indexOf(conduit); - var connections = conduitConnections.get(conduit); - - for (Direction side : Direction.values()) { - var legacySide = legacyConnectionsMap.computeIfAbsent(side, - ignored -> new LegacyConduitBundle.ConduitConnection()); - - var type = connections.getType(side); - if (type == ConduitConnectionType.DISABLED) { - legacySide.setConnectionState(conduitIndex, StaticConnectionStates.DISABLED); - } else if (type == ConduitConnectionType.NONE) { - legacySide.setConnectionState(conduitIndex, StaticConnectionStates.DISCONNECTED); - } else if (type == ConduitConnectionType.CONNECTED_CONDUIT) { - legacySide.setConnectionState(conduitIndex, StaticConnectionStates.CONNECTED); - } else if (type == ConduitConnectionType.CONNECTED_BLOCK) { - var connection = connections.getConnection(side); - - var legacyConnection = new DynamicConnectionState(connection.canInput(), connection.inputChannel(), - connection.canOutput(), connection.outputChannel(), connection.redstoneControl(), - connection.redstoneChannel(), - inventory.getStackInSlot(conduit, side, SlotType.FILTER_INSERT), - inventory.getStackInSlot(conduit, side, SlotType.FILTER_EXTRACT), - inventory.getStackInSlot(conduit, side, SlotType.UPGRADE_EXTRACT)); - - legacySide.setConnectionState(conduitIndex, legacyConnection); - } - } + @Override + public void clearContent() { + // Remove all conduits and facades, this is normally called by /set + for (var conduit : getConduits()) { + removeConduit(conduit, null); } - return new LegacyConduitBundle(getBlockPos(), conduits, legacyConnectionsMap, facadeProvider, conduitNodes); + clearFacade(); } // endregion @@ -1060,7 +1233,7 @@ private LegacyConduitBundle createLegacyBundle() { private class ConnectionContainer { private final Holder> conduit; private final Map connectionTypes = new EnumMap<>(Direction.class); - private final Map connectionData = new EnumMap<>(Direction.class); + private final Map connectionConfigs = new EnumMap<>(Direction.class); public ConnectionContainer(Holder> conduit) { this.conduit = conduit; @@ -1069,47 +1242,93 @@ public ConnectionContainer(Holder> conduit) { } } + public ConnectionContainer copyFor(Holder> conduit) { + var copy = new ConnectionContainer(conduit); + copy.connectionTypes.putAll(connectionTypes); + + // Only copy connection config if compatible. + if (this.conduit.value().connectionConfigType() == conduit.value().connectionConfigType()) { + copy.connectionConfigs.putAll(connectionConfigs); + } + return copy; + } + public ConduitConnectionType getType(Direction side) { return connectionTypes.getOrDefault(side, ConduitConnectionType.NONE); } - /** - * @deprecated Used for legacy data loading only. - */ - @Deprecated - public void internalSetType(Direction side, ConduitConnectionType type) { + public void setType(Direction side, ConduitConnectionType type) { connectionTypes.put(side, type); + + if (type == ConduitConnectionType.CONNECTED_BLOCK) { + if (connectionConfigs.containsKey(side)) { + var config = connectionConfigs.get(side); + if (!config.isConnected()) { + connectionConfigs.put(side, config.reconnected()); + } + } + } + } + + public ConnectionConfig getConfig(Direction side) { + var defaultConfig = conduit.value().connectionConfigType().getDefault(); + var config = connectionConfigs.getOrDefault(side, defaultConfig); + + // Ensure the connection type is correct. + // If it isn't, revert to the default. + if (config.type() != conduit.value().connectionConfigType()) { + config = conduit.value().connectionConfigType().getDefault(); + connectionConfigs.put(side, config); + bundleChanged(); // TODO: is this right? + } + + return config; } - private void connectConduit(Direction side) { - connectionTypes.put(side, ConduitConnectionType.CONNECTED_CONDUIT); - connectionData.remove(side); - conduitNodes.get(conduit).setConnection(side, null); + public void setConfig(Direction side, ConnectionConfig config) { + connectionConfigs.put(side, config); } - private void connectBlock(Direction side) { - connectionTypes.put(side, ConduitConnectionType.CONNECTED_BLOCK); - var defaultConnection = conduit.value().getDefaultConnection(level, getBlockPos(), side); - setConnection(side, defaultConnection); + public boolean hasEndpoint(Direction side) { + return getType(side) == ConduitConnectionType.CONNECTED_BLOCK; } + } - private void disconnect(Direction side) { - connectionTypes.put(side, ConduitConnectionType.NONE); - connectionData.remove(side); - conduitNodes.get(conduit).setConnection(side, null); + private record ConnectionHost(NewConduitBundleBlockEntity conduitBundle, Holder> conduit) implements ConduitConnectionHost { + + @Override + public BlockPos pos() { + return conduitBundle.getBlockPos(); } - public ConduitConnection getConnection(Direction side) { - return connectionData.get(side); + @Override + public boolean isConnectedTo(Direction side) { + return conduitBundle.getConnectionType(side, conduit) == ConduitConnectionType.CONNECTED_BLOCK; } - public void setConnection(Direction side, ConduitConnection connection) { - connectionData.put(side, connection); - conduitNodes.get(conduit).setConnection(side, connection); + @Override + public ConnectionConfig getConnectionConfig(Direction side) { + return conduitBundle.getConnectionConfig(side, conduit); } - public boolean hasEndpoint(Direction side) { - return getType(side) == ConduitConnectionType.CONNECTED_BLOCK; + @Override + public void setConnectionConfig(Direction side, ConnectionConfig connectionConfig) { + throw new NotImplementedException(); + } + + @Override + public ConduitInventory inventory() { + return conduitBundle.getInventory(conduit); + } + + @Override + public void onNodeDirty() { + conduitBundle.hasDirtyNodes = true; + } + + @Override + public boolean isLoaded() { + return conduitBundle.level != null && conduitBundle.level.isLoaded(pos()) && conduitBundle.level.shouldTickBlocksAt(pos()); } } @@ -1132,10 +1351,6 @@ private record LegacyConduitBundle(BlockPos pos, List>> condui .forGetter(i -> i.conduitNodes)) .apply(instance, LegacyConduitBundle::new)); - public Tag save(HolderLookup.Provider lookupProvider) { - return CODEC.encodeStart(lookupProvider.createSerializationContext(NbtOps.INSTANCE), this).getOrThrow(); - } - public static LegacyConduitBundle parse(HolderLookup.Provider lookupProvider, Tag tag) { return CODEC.decode(lookupProvider.createSerializationContext(NbtOps.INSTANCE), tag) .getOrThrow() @@ -1153,9 +1368,6 @@ public static final class ConduitConnection { return states; }); - public ConduitConnection() { - } - private ConduitConnection(List connectionStates) { if (connectionStates.size() > MAX_CONDUITS) { throw new IllegalArgumentException( @@ -1170,10 +1382,6 @@ private ConduitConnection(List connectionStates) { public ConnectionState getConnectionState(int index) { return connectionStates[index]; } - - public void setConnectionState(int i, ConnectionState state) { - connectionStates[i] = state; - } } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java index b2c63d2537..44e17f0056 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java @@ -3,8 +3,7 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.common.init.EIOCapabilities; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitCapabilities; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.ConduitInventory; import com.enderio.conduits.common.conduit.SlotData; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java index 6ec83d148d..20e3539760 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java @@ -6,12 +6,15 @@ import com.enderio.conduits.common.Area; import com.enderio.conduits.common.conduit.OffsetHelper; import java.util.*; + +import com.mojang.datafixers.util.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.Vec3i; import net.minecraft.util.Mth; import net.minecraft.world.level.block.Block; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.BooleanOp; @@ -20,8 +23,12 @@ import org.jetbrains.annotations.Nullable; public class NewConduitShape { + + private final Map>>, VoxelShape> conduitConnections = new HashMap<>(); private final Map>, VoxelShape> conduitShapes = new HashMap<>(); - private final Map directionShapes = new HashMap<>(); + + private final Map>, List> individualShapes = new HashMap<>(); + private static final VoxelShape CONNECTOR = Block.box(2.5f, 2.5, 15f, 13.5f, 13.5f, 16f); public static final VoxelShape CONNECTION = Block.box(6.5f, 6.5f, 9.5, 9.5f, 9.5f, 16); private static final VoxelShape CORE = Block.box(6.5f, 6.5f, 6.5f, 9.5f, 9.5f, 9.5f); @@ -33,15 +40,36 @@ public NewConduitShape() { public void updateConduit(ConduitBundleReader bundle) { this.conduitShapes.clear(); - this.directionShapes.clear(); + this.conduitConnections.clear(); + this.individualShapes.clear(); for (Holder> conduit : bundle.getConduits()) { updateShapeForConduit(bundle, conduit); } updateTotalShape(); } + // TODO: Looks weird when the connecting boxes arrive, but this at least now matches 1.12 behaviour. public VoxelShape getShapeFromHit(BlockPos pos, HitResult result) { - return Optional.ofNullable(this.conduitShapes.get(getConduit(pos, result))).orElse(Shapes.empty()); + var aimedConduit = getConduit(pos, result); + + if (aimedConduit == null || !individualShapes.containsKey(aimedConduit)) { + return Shapes.empty(); + } + + Vec3 vec3 = result.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); + + for (var shape : individualShapes.get(aimedConduit)) { + Optional point = shape.closestPointTo(vec3); + if (point.isEmpty()) { + continue; + } + + if (point.get().closerThan(vec3, Mth.EPSILON)) { // can't be 0 due to double + return shape; + } + } + + return Shapes.empty(); } @Nullable @@ -50,14 +78,14 @@ public Holder> getConduit(BlockPos pos, HitResult result) { } @Nullable - public Direction getDirection(BlockPos pos, HitResult result) { - return getLookUpValue(directionShapes, pos, result); + public Pair>> getConnectionFromHit(BlockPos pos, HitResult hit) { + return getLookUpValue(conduitConnections, pos, hit); } @Nullable private T getLookUpValue(Map shapes, BlockPos pos, HitResult result) { + Vec3 vec3 = result.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); for (Map.Entry entry : shapes.entrySet()) { - Vec3 vec3 = result.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); Optional point = entry.getValue().closestPointTo(vec3); if (point.isEmpty()) { continue; @@ -83,15 +111,22 @@ public VoxelShape getTotalShape() { } private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder> conduit) { + List individualShapeList = individualShapes.computeIfAbsent(conduit, ignored -> new ArrayList<>()); + VoxelShape conduitShape = Shapes.empty(); Direction.Axis axis = OffsetHelper.findMainAxis(conduitBundle); Map>, List> offsets = new HashMap<>(); for (Direction direction : Direction.values()) { - VoxelShape directionShape = directionShapes.getOrDefault(direction, Shapes.empty()); + // Only create and save connection shape if it's a block connection, as that's what the lookup is for. + VoxelShape conduitConnectionShape = null; + + // TODO: Lift the connector plate out of updateShapeForConduit? if (conduitBundle.getConnectionType(direction, conduit) == ConduitConnectionType.CONNECTED_BLOCK) { VoxelShape connectorShape = rotateVoxelShape(CONNECTOR, direction); - directionShape = Shapes.joinUnoptimized(directionShape, connectorShape, BooleanOp.OR); conduitShape = Shapes.joinUnoptimized(conduitShape, connectorShape, BooleanOp.OR); + conduitConnectionShape = connectorShape; + + individualShapeList.add(connectorShape); } var connectedTypes = conduitBundle.getConnectedConduits(direction); @@ -101,10 +136,18 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder new ArrayList<>()).add(offset); VoxelShape connectionShape = rotateVoxelShape(CONNECTION, direction).move(offset.getX() * 3f / 16f, offset.getY() * 3f / 16f, offset.getZ() * 3f / 16f); - directionShape = Shapes.joinUnoptimized(directionShape, connectionShape, BooleanOp.OR); conduitShape = Shapes.joinUnoptimized(conduitShape, connectionShape, BooleanOp.OR); + + if (conduitConnectionShape != null) { + conduitConnectionShape = Shapes.join(conduitConnectionShape, connectionShape, BooleanOp.OR); + } + + individualShapeList.add(connectionShape); + } + + if (conduitConnectionShape != null) { + conduitConnections.put(new Pair<>(direction, conduit), conduitConnectionShape); } - directionShapes.put(direction, directionShape.optimize()); } var allConduits = conduitBundle.getConduits(); @@ -118,21 +161,22 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder offsetsForConduit = offsets.get(type); + List offsetsForConduit = offsets.get(conduit); if (offsetsForConduit != null) { // all are pointing to the same xyz reference meaning that we can draw the core if (offsetsForConduit.stream().distinct().count() != 1) { box = new Area(offsetsForConduit.toArray(new Vec3i[0])); } } else { - notRendered = type; + notRendered = conduit; } + VoxelShape coreShape = Shapes.empty(); + if (offsetsForConduit != null && (box == null || !box.contains(offsetsForConduit.get(0)))) { - conduitShape = Shapes.joinUnoptimized( - conduitShape, CORE.move(offsetsForConduit.get(0).getX() * 3f / 16f, + coreShape = Shapes.joinUnoptimized( + coreShape, CORE.move(offsetsForConduit.get(0).getX() * 3f / 16f, offsetsForConduit.get(0).getY() * 3f / 16f, offsetsForConduit.get(0).getZ() * 3f / 16f), BooleanOp.OR); } @@ -141,24 +185,27 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder> conduit(); + BlockPos pos(); + boolean isConnectedTo(Direction side); + ConnectionConfig getConnectionConfig(Direction side); + void setConnectionConfig(Direction side, ConnectionConfig connectionConfig); + ConduitInventory inventory(); + void onNodeDirty(); + boolean isLoaded(); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java index c6e8186cda..17e86a0f68 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java @@ -1,8 +1,8 @@ package com.enderio.conduits.common.conduit.graph; -import com.enderio.conduits.api.ConduitData; -import com.enderio.conduits.api.ConduitDataAccessor; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.mojang.serialization.Codec; import java.util.Objects; import java.util.Optional; @@ -42,10 +42,19 @@ private ConduitDataContainer(Optional> data) { this.data = data.orElse(null); } + public boolean hasData() { + return data != null; + } + public boolean hasData(ConduitDataType type) { return data != null && data.type() == type; } + @Nullable + public ConduitData getData() { + return data; + } + @Nullable @SuppressWarnings("unchecked") public > T getData(ConduitDataType type) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java index bca6f37a9f..75a538624c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java @@ -1,9 +1,9 @@ package com.enderio.conduits.common.conduit.graph; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNetworkContext; -import com.enderio.conduits.api.ConduitNetworkContextAccessor; -import com.enderio.conduits.api.ConduitNetworkContextType; +import com.enderio.conduits.api.network.ConduitNetworkContext; +import com.enderio.conduits.api.network.ConduitNetworkContextAccessor; +import com.enderio.conduits.api.network.ConduitNetworkContextType; import com.enderio.conduits.api.EnderIOConduitsRegistries; import dev.gigaherz.graph3.Mergeable; import java.util.Objects; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java index f5705553ee..ddd65a55bc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java @@ -1,68 +1,86 @@ package com.enderio.conduits.common.conduit.graph; -import com.enderio.base.api.UseOnly; import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.common.init.EIOCapabilities; -import com.enderio.conduits.api.ConduitCapabilities; -import com.enderio.conduits.api.ConduitData; -import com.enderio.conduits.api.ConduitDataType; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; -import com.enderio.conduits.api.bundle.ConduitInventory; -import com.enderio.conduits.api.connection.ConduitConnection; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.network.node.NodeData; +import com.enderio.conduits.api.network.node.NodeDataType; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.enderio.conduits.api.bundle.SlotType; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.gigaherz.graph3.Graph; import dev.gigaherz.graph3.GraphObject; -import java.util.EnumMap; -import java.util.Map; -import java.util.Objects; + import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.neoforged.fml.LogicalSide; import org.jetbrains.annotations.Nullable; public class ConduitGraphObject implements GraphObject, ConduitNode { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance + private static final Codec LEGACY_CODEC = RecordCodecBuilder.create(instance -> instance .group(BlockPos.CODEC.fieldOf("pos").forGetter(ConduitGraphObject::getPos), - ConduitDataContainer.CODEC.fieldOf("data").forGetter(i -> i.conduitDataContainer)) + ConduitDataContainer.CODEC.fieldOf("data").forGetter(i -> i.legacyDataContainer)) .apply(instance, ConduitGraphObject::new)); - public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - BlockPos.STREAM_CODEC, ConduitGraphObject::getPos, ConduitDataContainer.STREAM_CODEC, - i -> i.conduitDataContainer, ConduitGraphObject::new); + private static final Codec NEW_CODEC = RecordCodecBuilder.create(instance -> instance + .group(BlockPos.CODEC.fieldOf("pos").forGetter(ConduitGraphObject::getPos), + NodeData.GENERIC_CODEC.optionalFieldOf("node_data").forGetter(i -> Optional.ofNullable(i.nodeData))) + .apply(instance, ConduitGraphObject::new)); - private final BlockPos pos; + public static final Codec CODEC = Codec.withAlternative(NEW_CODEC, LEGACY_CODEC); + + private BlockPos pos; @Nullable private Graph graph = null; + @Nullable private WrappedConduitNetwork wrappedGraph = null; - private final Map ioStates = new EnumMap<>(Direction.class); - private final ConduitDataContainer conduitDataContainer; - private final Map connectionStates = new EnumMap<>(Direction.class); + @Nullable + private ConduitDataContainer legacyDataContainer = null; - private final Map connections = new EnumMap<>(Direction.class); + @Nullable + private NodeData nodeData; - private @Nullable ConduitInventory inventory; + // TODO: Instead of a special construct, we could just pass the type and bundle in? + @Nullable + private ConduitConnectionHost connectionHost; public ConduitGraphObject(BlockPos pos) { this.pos = pos; - this.conduitDataContainer = new ConduitDataContainer(); + this.nodeData = null; } public ConduitGraphObject(BlockPos pos, ConduitDataContainer conduitDataContainer) { this.pos = pos; - this.conduitDataContainer = conduitDataContainer; + + // Convert the old data + this.legacyDataContainer = conduitDataContainer; + var oldData = legacyDataContainer.getData(); + if (oldData != null) { + this.nodeData = oldData.toNodeData(); + } else { + this.nodeData = null; + } + } + + public ConduitGraphObject(BlockPos pos, @Nullable NodeData nodeData) { + this.pos = pos; + this.nodeData = nodeData; + } + + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + private ConduitGraphObject(BlockPos pos, Optional nodeData) { + this.pos = pos; + this.nodeData = nodeData.orElse(null); } @Nullable @@ -75,94 +93,169 @@ public Graph getGraph() { public void setGraph(@Nullable Graph graph) { this.graph = graph; this.wrappedGraph = graph == null ? null : new WrappedConduitNetwork(graph); + upgradeLegacyData(); } @Nullable @Override - public ConduitNetwork getParentGraph() { + public ConduitNetwork getNetwork() { return wrappedGraph; } - public void setInventory(@Nullable ConduitInventory inventory) { - this.inventory = inventory; + public void attach(ConduitConnectionHost connectionHost) { + if (!connectionHost.pos().equals(pos)) { + throw new IllegalArgumentException("Connection host and node position do not match!"); + } + + this.connectionHost = connectionHost; + upgradeLegacyData(); } - public void setConnection(Direction side, @Nullable ConduitConnection connection) { - if (connection != null) { - connections.put(side, connection); - ioStates.put(side, - IOState.of(connection.canInput() ? connection.inputChannel() : null, - connection.canOutput() ? connection.outputChannel() : null, connection.redstoneControl(), - connection.redstoneChannel())); - } else { - connections.remove(side); - ioStates.remove(side); - } + public void detach() { + this.connectionHost = null; } - public void pushState(Direction direction, DynamicConnectionState connectionState) { - this.connectionStates.put(direction, connectionState); - ioStates.put(direction, - IOState.of(connectionState.isInsert() ? connectionState.insertChannel() : null, - connectionState.isExtract() ? connectionState.extractChannel() : null, - connectionState.control(), connectionState.redstoneChannel())); + public BlockPos getPos() { + return pos; } - public Optional getIOState(Direction direction) { - return Optional.ofNullable(ioStates.get(direction)); + // TODO: Remove in EnderIO 8. + // Convert old conduit data to the new formats. + private void upgradeLegacyData() { + if (graph == null || connectionHost == null) { + return; + } + + if (legacyDataContainer == null || !legacyDataContainer.hasData()) { + return; + } + + // Upgrade with old data + //noinspection deprecation + connectionHost.conduit().value().copyLegacyData(this, legacyDataContainer); + legacyDataContainer = null; } - public void clearState(Direction direction) { - ioStates.remove(direction); + // region Node Data + + @Override + public boolean hasNodeData(NodeDataType type) { + return nodeData != null && nodeData.type() == type; } - public BlockPos getPos() { - return pos; + @Override + public @Nullable NodeData getNodeData() { + return nodeData; } - // region Conduit Data + @Override + public @Nullable T getNodeData(NodeDataType type) { + if (nodeData != null && type == nodeData.type()) { + //noinspection unchecked + return (T) nodeData; + } - // We're implementing ConduitDataAccessor for ease here, but we just pass - // through to the container. + return null; + } @Override - public boolean hasData(ConduitDataType type) { - return conduitDataContainer.hasData(type); + public T getOrCreateNodeData(NodeDataType type) { + if (nodeData != null && type == nodeData.type()) { + //noinspection unchecked + return (T) nodeData; + } + + nodeData = type.factory().get(); + //noinspection unchecked + return (T) nodeData; } @Override - public > @Nullable T getData(ConduitDataType type) { - return conduitDataContainer.getData(type); + public void setNodeData(@Nullable T data) { + nodeData = data; } + // endregion + + // region Connection Config + @Override - public > T getOrCreateData(ConduitDataType type) { - return conduitDataContainer.getOrCreateData(type); + public boolean isConnectedTo(Direction side) { + if (connectionHost == null) { + throw new IllegalStateException("No connection host!"); + } + + return connectionHost.isConnectedTo(side); } - public ConduitDataContainer conduitDataContainer() { - return conduitDataContainer; + @Override + public ConnectionConfig getConnectionConfig(Direction side) { + if (connectionHost == null) { + throw new IllegalStateException("No connection host!"); + } + + return connectionHost.getConnectionConfig(side); + } + + @Override + public T getConnectionConfig(Direction side, ConnectionConfigType type) { + var config = getConnectionConfig(side); + + if (config.type() != type) { + throw new IllegalStateException("Connection config type mismatch! Conversion failed somewhere in the bundle."); + } + + //noinspection unchecked + return (T)config; } - public void handleClientChanges(ConduitDataContainer clientDataContainer) { - conduitDataContainer.handleClientChanges(clientDataContainer); + @Override + public void setConnectionConfig(Direction side, ConnectionConfig config) { + if (connectionHost == null) { + throw new IllegalStateException("No connection host!"); + } + + if (config.type() != connectionHost.getConnectionConfig(side).type()) { + throw new IllegalArgumentException("Connection config type mismatch!"); + } + + connectionHost.setConnectionConfig(side, config); } // endregion @Override public @Nullable ResourceFilter getExtractFilter(Direction direction) { - return connectionStates.get(direction).filterExtract().getCapability(EIOCapabilities.Filter.ITEM); + if (connectionHost == null) { + throw new IllegalStateException("No connection host!"); + } + + return connectionHost.inventory().getStackInSlot(direction, SlotType.FILTER_EXTRACT).getCapability(EIOCapabilities.Filter.ITEM); } @Override public @Nullable ResourceFilter getInsertFilter(Direction direction) { - return connectionStates.get(direction).filterInsert().getCapability(EIOCapabilities.Filter.ITEM); + if (connectionHost == null) { + throw new IllegalStateException("No connection host!"); + } + + return connectionHost.inventory().getStackInSlot(direction, SlotType.FILTER_INSERT).getCapability(EIOCapabilities.Filter.ITEM); } - @UseOnly(LogicalSide.CLIENT) - public ConduitGraphObject deepCopy() { - return new ConduitGraphObject(pos, conduitDataContainer.deepCopy()); + @Override + public boolean isLoaded() { + if (connectionHost == null) { + return false; + } + + return connectionHost.isLoaded(); + } + + @Override + public void markDirty() { + if (connectionHost != null) { + connectionHost.onNodeDirty(); + } } public Tag save(HolderLookup.Provider lookupProvider) { @@ -172,9 +265,4 @@ public Tag save(HolderLookup.Provider lookupProvider) { public static ConduitGraphObject parse(HolderLookup.Provider lookupProvider, Tag tag) { return CODEC.decode(lookupProvider.createSerializationContext(NbtOps.INSTANCE), tag).getOrThrow().getFirst(); } - - // Separate method to avoid breaking the graph - public int hashContents() { - return Objects.hash(pos, conduitDataContainer, ioStates, connectionStates); - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java index b82ec3abde..40f677062b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/WrappedConduitNetwork.java @@ -1,9 +1,9 @@ package com.enderio.conduits.common.conduit.graph; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNetworkContext; -import com.enderio.conduits.api.ConduitNetworkContextType; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.ConduitNetworkContext; +import com.enderio.conduits.api.network.ConduitNetworkContextType; +import com.enderio.conduits.api.network.node.ConduitNode; import dev.gigaherz.graph3.Graph; import java.util.Collection; import org.jetbrains.annotations.Nullable; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/package-info.java new file mode 100644 index 0000000000..a19f14d171 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/package-info.java @@ -0,0 +1,4 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault + +package com.enderio.conduits.common.conduit.graph; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java new file mode 100644 index 0000000000..0024550ee8 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java @@ -0,0 +1,151 @@ +package com.enderio.conduits.common.conduit.menu; + +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; +import com.enderio.conduits.common.init.ConduitBlockEntities; +import com.enderio.conduits.common.init.ConduitMenus; +import com.enderio.core.common.menu.BaseBlockEntityMenu; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +public class NewConduitMenu extends BaseBlockEntityMenu { + + public static final int BUTTON_TOGGLE_0_ID = 0; + public static final int BUTTON_TOGGLE_1_ID = 1; + public static final int BUTTON_SELECT_CONDUIT_START_ID = 2; + public static final int BUTTON_SELECT_CONDUIT_ID_COUNT = NewConduitBundleBlockEntity.MAX_CONDUITS; + + private static final int RESERVED_BUTTON_ID_COUNT = BUTTON_SELECT_CONDUIT_START_ID + BUTTON_SELECT_CONDUIT_ID_COUNT + 1; + + private final Direction side; + private Holder> selectedConduit; // TODO: Sync with sync slot instead of using initial menu open? + + public NewConduitMenu(int containerId, Inventory playerInventory, NewConduitBundleBlockEntity blockEntity, Direction side, Holder> selectedConduit) { + super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory, blockEntity); + + this.side = side; + this.selectedConduit = selectedConduit; + + // TODO: Add conduit slots. + + addPlayerInventorySlots(23, 113); + } + + public NewConduitMenu(int containerId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { + super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory, buf, ConduitBlockEntities.CONDUIT.get()); + + side = buf.readEnum(Direction.class); + selectedConduit = Conduit.STREAM_CODEC.decode(buf); + + // TODO: Add conduit slots. + + addPlayerInventorySlots(23, 113); + } + + public Direction getSide() { + return side; + } + + public Holder> getSelectedConduit() { + return selectedConduit; + } + + private ConduitNode conduitNode() { + return getBlockEntity().getConduitNode(selectedConduit); + } + + public ConnectionConfigType connectionConfigType() { + return selectedConduit.value().connectionConfigType(); + } + + public ConnectionConfig connectionConfig() { + return getBlockEntity().getConnectionConfig(side, selectedConduit); + } + + public boolean isConnected() { + return getBlockEntity().getConnectionType(side, selectedConduit) == ConduitConnectionType.CONNECTED_BLOCK; + } + + public CompoundTag getClientDataTag() { + return getBlockEntity().getConduitClientDataTag(selectedConduit); + } + + @Override + public boolean stillValid(Player player) { + // TODO: canBeOrIsValidConnection. + return super.stillValid(player) && getBlockEntity().hasConduitStrict(selectedConduit) && + getBlockEntity().canBeOrIsConnection(side, selectedConduit); + } + + @Override + public boolean clickMenuButton(Player player, int id) { + var bundle = getBlockEntity(); + var currentConfig = connectionConfig(); + + switch (id) { + case BUTTON_TOGGLE_0_ID: + if (currentConfig instanceof ResourceConnectionConfig ioConfig) { + var newConfig = ioConfig.withInsert(!ioConfig.canInsert()); + bundle.setConnectionConfig(side, selectedConduit, newConfig); + + if (newConfig.isConnected()) { + bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.CONNECTED_BLOCK); + } else { + bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.NONE); + } + } else { + // Non IO connections are controlled soley by the connection type. + var connectionType = bundle.getConnectionType(side, selectedConduit); + if (connectionType == ConduitConnectionType.CONNECTED_BLOCK) { + bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.NONE); + } else { + bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.CONNECTED_BLOCK); + } + } + + return true; + case BUTTON_TOGGLE_1_ID: + if (currentConfig instanceof ResourceConnectionConfig ioConfig) { + var newConfig = ioConfig.withExtract(!ioConfig.canExtract()); + bundle.setConnectionConfig(side, selectedConduit, newConfig); + + if (newConfig.isConnected()) { + bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.CONNECTED_BLOCK); + } else { + bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.NONE); + } + } + return true; + } + + if (id >= BUTTON_SELECT_CONDUIT_START_ID && id <= BUTTON_SELECT_CONDUIT_START_ID + BUTTON_SELECT_CONDUIT_ID_COUNT) { + // TODO: attempt to change to a different conduit on the same face. + var conduitList = getBlockEntity().getConduits(); + + // TODO Find and switch to conduit and tell the client. + } + +// if (id >= RESERVED_BUTTON_ID_COUNT) { +// if (menuConfig().onMenuButtonClicked(conduitNode(), id - RESERVED_BUTTON_ID_COUNT)) { +// return true; +// } +// } + + return super.clickMenuButton(player, id); + } + + @Override + public ItemStack quickMoveStack(Player player, int i) { + return null; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index f8ae5f0e13..aadeed0a65 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -1,11 +1,13 @@ package com.enderio.conduits.common.conduit.type.energy; +import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitType; -import com.enderio.conduits.api.connection.ConduitConnection; -import com.enderio.conduits.api.connection.ConduitConnectionMode; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.util.TooltipUtil; @@ -25,10 +27,11 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.Capabilities; -import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +// TODO: Redstone control isn't working properly - the cap needs to refuse input to the node if the connection being fed into is blocked by a redstone signal. + public record EnergyConduit(ResourceLocation texture, Component description, int transferRatePerTick) implements Conduit { @@ -87,8 +90,17 @@ public boolean canBeReplacedBy(Holder> otherConduit) { if (Capabilities.EnergyStorage.BLOCK == capability && (context == null || context instanceof Direction)) { if (context != null) { - var state = node.getIOState((Direction) context); - if (state.isPresent() && !state.get().isExtract()) { + // No connection, no cap. + if (!node.isConnectedTo((Direction) context)) { + return null; + } + + var config = node.getConnectionConfig((Direction) context); + if (!config.isConnected()) { + return null; + } + + if (config instanceof ResourceConnectionConfig ioConfig && !ioConfig.canInsert()) { return null; } } @@ -106,29 +118,14 @@ public void onRemoved(ConduitNode node, Level level, BlockPos pos) { } @Override - public ConduitConnection getDefaultConnection(Level level, BlockPos pos, Direction side) { - IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, pos.relative(side), - side.getOpposite()); - if (capability != null) { - ConduitConnectionMode mode; - - if (capability.canReceive() && capability.canExtract()) { - mode = ConduitConnectionMode.BOTH; - } else if (capability.canReceive()) { - mode = ConduitConnectionMode.IN; - } else { - // This ensures that if there's an energy capability that might be pushing but - // won't allow pulling is present, we can still interact - // For example Thermal's Dynamos report false until they have energy in them and - // flux networks always refuse. - mode = ConduitConnectionMode.OUT; - } - - // TODO: Old EnderIO was red, to not break EIO 7 we'll stick to green. - return new ConduitConnection(mode, DyeColor.GREEN, DyeColor.GREEN); - } + public ConnectionConfigType connectionConfigType() { + return ConduitTypes.ConnectionTypes.ENERGY.get(); + } - return Conduit.super.getDefaultConnection(level, pos, side); + @Override + public ConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, + RedstoneControl redstoneControl, DyeColor redstoneChannel) { + return new EnergyConduitConnectionConfig(isInsert, isExtract, redstoneControl, redstoneChannel); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java new file mode 100644 index 0000000000..f16858c77f --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java @@ -0,0 +1,74 @@ +package com.enderio.conduits.common.conduit.type.energy; + +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.item.DyeColor; + +public record EnergyConduitConnectionConfig( + boolean canInsert, + boolean canExtract, + RedstoneControl redstoneControl, + DyeColor redstoneChannel +) implements ResourceConnectionConfig, RedstoneControlledConnection { + + public static EnergyConduitConnectionConfig DEFAULT = new EnergyConduitConnectionConfig(true, true, RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group( + Codec.BOOL.fieldOf("can_insert").forGetter(EnergyConduitConnectionConfig::canInsert), + Codec.BOOL.fieldOf("can_extract").forGetter(EnergyConduitConnectionConfig::canExtract), + RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(EnergyConduitConnectionConfig::redstoneControl), + DyeColor.CODEC.fieldOf("redstone_channel").forGetter(EnergyConduitConnectionConfig::redstoneChannel) + ).apply(instance, EnergyConduitConnectionConfig::new) + ); + + public static final ConnectionConfigType TYPE = + new ConnectionConfigType<>(EnergyConduitConnectionConfig.class, CODEC, () -> DEFAULT); + + @Override + public ConnectionConfig reconnected() { + return new EnergyConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.canExtract, redstoneControl, redstoneChannel); + } + + @Override + public DyeColor insertChannel() { + return DyeColor.RED; + } + + @Override + public DyeColor extractChannel() { + return DyeColor.RED; + } + + + @Override + public ResourceConnectionConfig withInsert(boolean canInsert) { + return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); + } + + @Override + public ResourceConnectionConfig withExtract(boolean canExtract) { + return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); + } + + @Override + public ConnectionConfigType type() { + return TYPE; + } + + @Override + public RedstoneControlledConnection withRedstoneControl(RedstoneControl redstoneControl) { + return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); + } + + @Override + public RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel) { + return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java index 7230c39e4a..bd8f92fc3f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java @@ -1,7 +1,7 @@ package com.enderio.conduits.common.conduit.type.energy; -import com.enderio.conduits.api.ConduitNetworkContext; -import com.enderio.conduits.api.ConduitNetworkContextType; +import com.enderio.conduits.api.network.ConduitNetworkContext; +import com.enderio.conduits.api.network.ConduitNetworkContextType; import com.enderio.conduits.common.init.Conduits; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -15,6 +15,8 @@ public class EnergyConduitNetworkContext implements ConduitNetworkContext TYPE = new ConduitNetworkContextType<>(CODEC, EnergyConduitNetworkContext::new); + private int energyStored = 0; private int rotatingIndex = 0; @@ -61,6 +63,6 @@ public EnergyConduitNetworkContext copy() { @Override public ConduitNetworkContextType type() { - return Conduits.ContextSerializers.ENERGY.get(); + return TYPE; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java index 2ff66c4c12..04d4f0c6ff 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.conduit.type.energy; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.common.init.Conduits; import net.neoforged.neoforge.energy.IEnergyStorage; @@ -17,7 +17,7 @@ public int receiveEnergy(int toReceive, boolean simulate) { return 0; } - EnergyConduitNetworkContext context = node.getParentGraph().getOrCreateContext(Conduits.ContextSerializers.ENERGY.get()); + var context = node.getNetwork().getOrCreateContext(EnergyConduitNetworkContext.TYPE); // Cap to transfer rate. toReceive = Math.min(transferRate(), toReceive); @@ -37,7 +37,7 @@ public int extractEnergy(int toExtract, boolean simulate) { @Override public int getEnergyStored() { - EnergyConduitNetworkContext context = node.getParentGraph().getContext(Conduits.ContextSerializers.ENERGY.get()); + var context = node.getNetwork().getContext(EnergyConduitNetworkContext.TYPE); if (context == null) { return 0; } @@ -49,7 +49,7 @@ public int getEnergyStored() { public int getMaxEnergyStored() { // Capacity is transfer rate + nodeCount * transferRatePerTick / 2 (expanded). // This ensures at least the transfer rate of the cable is available, but capacity doesn't grow outrageously. - int nodeCount = node.getParentGraph().getNodes().size(); + int nodeCount = node.getNetwork().getNodes().size(); // The maximum number of nodes before the network capacity is INT_MAX. int maxNodesBeforeLimit = Integer.MAX_VALUE / (transferRate() / ENERGY_BUFFER_SCALER) - ENERGY_BUFFER_SCALER; @@ -70,6 +70,6 @@ public boolean canExtract() { // This means we don't have to worry about checking if we can extract at this point. @Override public boolean canReceive() { - return node.getParentGraph() != null; + return node.getNetwork() != null; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java index 33dc7f72de..b1362866c9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java @@ -1,7 +1,7 @@ package com.enderio.conduits.common.conduit.type.energy; import com.enderio.conduits.api.ColoredRedstoneProvider; -import com.enderio.conduits.api.ConduitNetwork; +import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.ticker.IOAwareConduitTicker; import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import com.enderio.conduits.common.init.Conduits; @@ -29,7 +29,7 @@ public void tickColoredGraph(ServerLevel level, EnergyConduit conduit, List { - private static final Logger LOGGER = LogUtils.getLogger(); - public static final MapCodec CODEC = RecordCodecBuilder .mapCodec( builder -> builder @@ -76,32 +84,82 @@ public boolean canBeReplacedBy(Holder> otherConduit) { @Override public boolean canConnectTo(ConduitNode selfNode, ConduitNode otherNode) { - FluidConduitData selfData = selfNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); - FluidConduitData otherData = otherNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); + // Ensure the networks are not locked to different fluids before connecting. + var selfNetwork = selfNode.getNetwork(); + var otherNetwork = otherNode.getNetwork(); + + // If one network does not yet exist, then we're good to connect. + if (selfNetwork == null || otherNetwork == null) { + return true; + } + + var selfContext = selfNetwork.getContext(FluidConduitNetworkContext.TYPE); + var otherContext = otherNetwork.getContext(FluidConduitNetworkContext.TYPE); + + // If either is null, it isn't locked. + if (selfContext == null || otherContext == null) { + return true; + } + + return selfContext.lockedFluid() == otherContext.lockedFluid(); + } + + @Override + public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { + return resourceFilter instanceof FluidStackFilter; + } + + @Override + public ConnectionConfigType connectionConfigType() { +// return SimpleRedstoneControlledConnectionConfig.TYPE; + return null; + } - return selfData.lockedFluid() == null || otherData.lockedFluid() == null - || selfData.lockedFluid() == otherData.lockedFluid(); + @Override + public ConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, + RedstoneControl redstoneControl, DyeColor redstoneChannel) { +// return new SimpleRedstoneControlledConnectionConfig(ConduitConnectionMode.of(isInsert, isExtract), inputChannel, outputChannel, +// redstoneControl, redstoneChannel); + return null; } @Override - public void onConnectTo(ConduitNode selfNode, ConduitNode otherNode) { - FluidConduitData selfData = selfNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); - FluidConduitData otherData = otherNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); + public void copyLegacyData(ConduitNode node, ConduitDataAccessor legacyDataAccessor) { + var legacyData = legacyDataAccessor.getData(ConduitTypes.Data.FLUID.get()); + if (legacyData == null) { + return; + } - if (selfData.lockedFluid() != null) { - if (otherData.lockedFluid() != null && selfData.lockedFluid() != otherData.lockedFluid()) { - LOGGER.warn("incompatible fluid conduits merged"); - } + var context = Objects.requireNonNull(node.getNetwork()).getOrCreateContext(FluidConduitNetworkContext.TYPE); - otherData.setLockedFluid(selfData.lockedFluid()); - } else if (otherData.lockedFluid() != null) { - selfData.setLockedFluid(otherData.lockedFluid()); + if (!context.lockedFluid().isSame(Fluids.EMPTY)) { + return; } + + // Copy locked fluid from old data. + context.setLockedFluid(legacyData.lockedFluid()); } @Override - public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { - return resourceFilter instanceof FluidStackFilter; + public boolean hasClientDataTag() { + return true; + } + + @Override + public CompoundTag getClientDataTag(ConduitNode node) { + var tag = new CompoundTag(); + + if (node.getNetwork() == null) { + return tag; + } + + var context = node.getNetwork().getContext(FluidConduitNetworkContext.TYPE); + if (context == null) { + return tag; + } + + tag.putString("LockedFluid", BuiltInRegistries.FLUID.getKey(context.lockedFluid()).toString()); + return tag; } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitData.java index 123937ea26..093460de8c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitData.java @@ -1,7 +1,8 @@ package com.enderio.conduits.common.conduit.type.fluid; -import com.enderio.conduits.api.ConduitData; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.NodeData; +import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.common.init.ConduitTypes; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; @@ -16,7 +17,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Objects; -import java.util.Optional; public class FluidConduitData implements ConduitData { @@ -84,6 +84,11 @@ public ConduitDataType type() { return ConduitTypes.Data.FLUID.get(); } + @Override + public @Nullable NodeData toNodeData() { + return null; + } + @Override public int hashCode() { return Objects.hash(shouldReset, lockedFluid); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java new file mode 100644 index 0000000000..1f953a9c05 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java @@ -0,0 +1,57 @@ +package com.enderio.conduits.common.conduit.type.fluid; + +import com.enderio.conduits.api.network.ConduitNetworkContext; +import com.enderio.conduits.api.network.ConduitNetworkContextType; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; + +// TODO: packet to clear the fluid lock. +public class FluidConduitNetworkContext implements ConduitNetworkContext { + + public static Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + BuiltInRegistries.FLUID.byNameCodec() + .optionalFieldOf("locked_fluid", Fluids.EMPTY) + .forGetter(FluidConduitNetworkContext::lockedFluid) + ).apply(instance, FluidConduitNetworkContext::new) + ); + + public static ConduitNetworkContextType TYPE = new ConduitNetworkContextType<>(CODEC, FluidConduitNetworkContext::new); + + private Fluid lockedFluid; + + public FluidConduitNetworkContext() { + this(Fluids.EMPTY); + } + + public FluidConduitNetworkContext(Fluid lockedFluid) { + this.lockedFluid = lockedFluid; + } + + public Fluid lockedFluid() { + return lockedFluid; + } + + public void setLockedFluid(Fluid lockedFluid) { + this.lockedFluid = lockedFluid; + } + + @Override + public FluidConduitNetworkContext mergeWith(FluidConduitNetworkContext other) { + // Not doing anything here because these graph's should not merge unless the locked fluid is the same. + return this; + } + + @Override + public FluidConduitNetworkContext copy() { + return new FluidConduitNetworkContext(lockedFluid); + } + + @Override + public ConduitNetworkContextType type() { + return TYPE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java index d9c2d6e3fc..a19368d048 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java @@ -2,8 +2,8 @@ import com.enderio.base.api.filter.FluidStackFilter; import com.enderio.conduits.api.ColoredRedstoneProvider; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.CapabilityAwareConduitTicker; import com.enderio.conduits.common.init.ConduitTypes; import net.minecraft.core.Direction; @@ -69,21 +69,21 @@ public void tickGraph( ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { - boolean shouldReset = false; - for (var loadedNode : loadedNodes) { - FluidConduitData fluidExtendedData = loadedNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); - if (fluidExtendedData.shouldReset()) { - shouldReset = true; - fluidExtendedData.setShouldReset(false); - } - } - - if (shouldReset) { - for (var loadedNode : loadedNodes) { - FluidConduitData fluidExtendedData = loadedNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); - fluidExtendedData.setLockedFluid(Fluids.EMPTY); - } - } +// boolean shouldReset = false; +// for (var loadedNode : loadedNodes) { +// FluidConduitData fluidExtendedData = loadedNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); +// if (fluidExtendedData.shouldReset()) { +// shouldReset = true; +// fluidExtendedData.setShouldReset(false); +// } +// } +// +// if (shouldReset) { +// for (var loadedNode : loadedNodes) { +// FluidConduitData fluidExtendedData = loadedNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); +// fluidExtendedData.setLockedFluid(Fluids.EMPTY); +// } +// } super.tickGraph(level, conduit, loadedNodes, graph, coloredRedstoneProvider); } @@ -96,14 +96,15 @@ protected void tickCapabilityGraph( ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + var context = graph.getOrCreateContext(FluidConduitNetworkContext.TYPE); + for (CapabilityConnection extract : extracts) { IFluidHandler extractHandler = extract.capability(); - FluidConduitData fluidExtendedData = extract.node().getOrCreateData(ConduitTypes.Data.FLUID.get()); final int fluidRate = getScaledFluidRate(conduit, extract); - if (!fluidExtendedData.lockedFluid().isSame(Fluids.EMPTY)) { - doFluidTransfer(new FluidStack(fluidExtendedData.lockedFluid(), fluidRate), extract, inserts); + if (!context.lockedFluid().isSame(Fluids.EMPTY)) { + doFluidTransfer(new FluidStack(context.lockedFluid(), fluidRate), extract, inserts); } else { int remaining = fluidRate; @@ -116,14 +117,12 @@ protected void tickCapabilityGraph( remaining = doFluidTransfer(new FluidStack(fluid, remaining), extract, inserts); if (!conduit.isMultiFluid() && remaining < fluidRate) { - for (ConduitNode node : graph.getNodes()) { - if (fluid instanceof FlowingFluid flowing) { - fluid = flowing.getSource(); - } - - node.getOrCreateData(ConduitTypes.Data.FLUID.get()).setLockedFluid(fluid); + if (fluid instanceof FlowingFluid flowing) { + fluid = flowing.getSource(); } + context.setLockedFluid(fluid); + break; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java index 6404e077ff..a4726ba6ba 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java @@ -2,19 +2,27 @@ import com.enderio.base.api.filter.ItemStackFilter; import com.enderio.base.api.filter.ResourceFilter; +import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitType; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.SlotType; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.menu.ConduitMenuExtension; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.util.TooltipUtil; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.item.TooltipFlag; import org.jetbrains.annotations.NotNull; @@ -84,6 +92,41 @@ public boolean showDebugTooltip() { return true; } + @Override + public ConnectionConfigType connectionConfigType() { + return ConduitTypes.ConnectionTypes.ITEM.get(); + } + + // TODO: Move conversions into the connection config type. + @Override + public ConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, + RedstoneControl redstoneControl, DyeColor redstoneChannel) { + + return new ItemConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel, redstoneControl, + redstoneChannel, false, false, 0); + } + + @Override + public void copyLegacyData(ConduitNode node, ConduitDataAccessor legacyDataAccessor) { + var legacyData = legacyDataAccessor.getData(ConduitTypes.Data.ITEM.get()); + if (legacyData == null) { + return; + } + + // Copy connection config + for (Direction side : Direction.values()) { + if (node.isConnectedTo(side)) { + var oldSideConfig = legacyData.get(side); + var currentConfig = node.getConnectionConfig(side, ItemConduitConnectionConfig.TYPE); + + node.setConnectionConfig(side, currentConfig + .withRoundRobin(oldSideConfig.isRoundRobin) + .withSelfFeed(oldSideConfig.isSelfFeed) + .withPriority(oldSideConfig.priority)); + } + } + } + @Override public int compareTo(@NotNull ItemConduit o) { double selfEffectiveSpeed = transferRatePerCycle() * (20.0 / graphTickRate()); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java new file mode 100644 index 0000000000..d7dd90c302 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java @@ -0,0 +1,98 @@ +package com.enderio.conduits.common.conduit.type.item; + +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ChannelResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.common.init.ConduitTypes; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.item.DyeColor; + +public record ItemConduitConnectionConfig( + boolean canInsert, + DyeColor insertChannel, + boolean canExtract, + DyeColor extractChannel, + RedstoneControl redstoneControl, + DyeColor redstoneChannel, + boolean isRoundRobin, + boolean isSelfFeed, + int priority +) implements ChannelResourceConnectionConfig, RedstoneControlledConnection { + + public static ItemConduitConnectionConfig DEFAULT = new ItemConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.GREEN, + RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group( + Codec.BOOL.fieldOf("can_insert").forGetter(ItemConduitConnectionConfig::canInsert), + DyeColor.CODEC.fieldOf("insert_channel").forGetter(ItemConduitConnectionConfig::insertChannel), + Codec.BOOL.fieldOf("can_extract").forGetter(ItemConduitConnectionConfig::canExtract), + DyeColor.CODEC.fieldOf("extract_channel").forGetter(ItemConduitConnectionConfig::extractChannel), + RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(ItemConduitConnectionConfig::redstoneControl), + DyeColor.CODEC.fieldOf("redstone_channel").forGetter(ItemConduitConnectionConfig::redstoneChannel), + Codec.BOOL.fieldOf("is_round_robin").forGetter(ItemConduitConnectionConfig::isRoundRobin), + Codec.BOOL.fieldOf("is_self_feed").forGetter(ItemConduitConnectionConfig::isSelfFeed), + Codec.INT.fieldOf("priority").forGetter(ItemConduitConnectionConfig::priority) + ).apply(instance, ItemConduitConnectionConfig::new) + ); + + public static ConnectionConfigType TYPE = new ConnectionConfigType<>(ItemConduitConnectionConfig.class, CODEC, () -> DEFAULT); + + @Override + public ConnectionConfig reconnected() { + return new ItemConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.insertChannel, DEFAULT.canExtract, DEFAULT.extractChannel, redstoneControl, + redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + @Override + public ResourceConnectionConfig withInsert(boolean canInsert) { + return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + @Override + public ResourceConnectionConfig withExtract(boolean canExtract) { + return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + @Override + public ChannelResourceConnectionConfig withInputChannel(DyeColor inputChannel) { + return new ItemConduitConnectionConfig(canInsert, inputChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + @Override + public ChannelResourceConnectionConfig withOutputChannel(DyeColor outputChannel) { + return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, outputChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + @Override + public RedstoneControlledConnection withRedstoneControl(RedstoneControl redstoneControl) { + return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + @Override + public RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel) { + return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + public ItemConduitConnectionConfig withRoundRobin(boolean isRoundRobin) { + return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + public ItemConduitConnectionConfig withSelfFeed(boolean isSelfFeed) { + return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + public ItemConduitConnectionConfig withPriority(int priority) { + return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + @Override + public ConnectionConfigType type() { + return ConduitTypes.ConnectionTypes.ITEM.get(); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitData.java index 16d3199127..fca58cdb23 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitData.java @@ -1,7 +1,8 @@ package com.enderio.conduits.common.conduit.type.item; -import com.enderio.conduits.api.ConduitDataType; -import com.enderio.conduits.api.ConduitData; +import com.enderio.conduits.api.network.node.NodeData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitData; import com.enderio.conduits.common.init.ConduitTypes; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; @@ -11,6 +12,7 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -69,6 +71,20 @@ public ConduitDataType type() { return ConduitTypes.Data.ITEM.get(); } + @Override + public @Nullable NodeData toNodeData() { + // Convert to the new node data format + Map roundRobinIndexes = new HashMap<>(); + for (var side : Direction.values()) { + var sidedData = itemSidedData.get(side); + if (sidedData != null && sidedData.isRoundRobin) { + roundRobinIndexes.put(side, sidedData.rotatingIndex); + } + } + + return new ItemConduitNodeData(roundRobinIndexes); + } + @Override public ItemConduitData deepCopy() { var newSidedData = new HashMap(Direction.values().length); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitMenuData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitMenuData.java new file mode 100644 index 0000000000..3436abfcdc --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitMenuData.java @@ -0,0 +1,53 @@ +package com.enderio.conduits.common.conduit.type.item; + +import com.enderio.conduits.api.menu.ConduitMenuData; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.enderio.core.common.network.menu.BoolSyncSlot; + +public class ItemConduitMenuData extends ConduitMenuData { + + private final BoolSyncSlot isRoundRobinSlot; + private final BoolSyncSlot isSelfFeedSlot; + + public ItemConduitMenuData(ConduitNode node, ConduitMenuAccess menu) { + super(node, menu); + + // TODO: add updatable sync slot. + isRoundRobinSlot = menu.addUpdatableSyncSlot( + BoolSyncSlot.readOnly(() -> connectionConfig().isRoundRobin()) + ); + + isSelfFeedSlot = menu.addUpdatableSyncSlot( + BoolSyncSlot.readOnly(() -> connectionConfig().isSelfFeed()) + ); + } + + public ItemConduitMenuData(ConduitMenuAccess menu) { + super(menu); + + isRoundRobinSlot = BoolSyncSlot.standalone(); + isSelfFeedSlot = BoolSyncSlot.standalone(); + } + + public ItemConduitConnectionConfig connectionConfig() { + return menu.getConnectionConfig(ItemConduitConnectionConfig.TYPE); + } + + public boolean isRoundRobin() { + return isRoundRobinSlot.get(); + } + + public void setIsRoundRobin(boolean isRoundRobin) { + isRoundRobinSlot.set(isRoundRobin); + menu.updateSlot(isRoundRobinSlot); + } + + public boolean isSelfFeed() { + return isSelfFeedSlot.get(); + } + + public void setIsSelfFeed(boolean isSelfFeed) { + isSelfFeedSlot.set(isSelfFeed); + menu.updateSlot(isSelfFeedSlot); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitNodeData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitNodeData.java new file mode 100644 index 0000000000..948253f472 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitNodeData.java @@ -0,0 +1,46 @@ +package com.enderio.conduits.common.conduit.type.item; + +import com.enderio.conduits.api.network.node.NodeData; +import com.enderio.conduits.api.network.node.NodeDataType; +import com.enderio.conduits.common.init.ConduitTypes; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Direction; + +import java.util.HashMap; +import java.util.Map; + +/** + * Stores round-robin indexes for this node. + */ +public final class ItemConduitNodeData implements NodeData { + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance + .group(Codec.unboundedMap(Direction.CODEC, Codec.INT).fieldOf("round_robin_indexes").forGetter(i -> i.roundRobinIndexes)) + .apply(instance, ItemConduitNodeData::new)); + + public static NodeDataType TYPE = new NodeDataType<>(ItemConduitNodeData.CODEC, ItemConduitNodeData::new); + private final Map roundRobinIndexes; + + public ItemConduitNodeData() { + this(Map.of()); + } + + public ItemConduitNodeData(Map roundRobinIndexes) { + this.roundRobinIndexes = new HashMap<>(roundRobinIndexes); + } + + @Override + public NodeDataType type() { + return ConduitTypes.NodeData.ITEM.get(); + } + + public int getIndex(Direction side) { + return roundRobinIndexes.getOrDefault(side, 0); + } + + public void setIndex(Direction side, int index) { + roundRobinIndexes.put(side, index); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java index 697b1b88ab..9de47cdadc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java @@ -2,10 +2,12 @@ import com.enderio.base.api.filter.ItemStackFilter; import com.enderio.conduits.api.ColoredRedstoneProvider; -import com.enderio.conduits.api.ConduitNetwork; +import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.ticker.CapabilityAwareConduitTicker; import com.enderio.conduits.common.init.ConduitTypes; + import java.util.List; + import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; @@ -22,6 +24,8 @@ protected void tickCapabilityGraph(ServerLevel level, ItemConduit conduit, List< ColoredRedstoneProvider coloredRedstoneProvider) { toNextExtract: for (CapabilityConnection extract : extracts) { + ItemConduitNodeData nodeData = extract.node().getOrCreateNodeData(ConduitTypes.NodeData.ITEM.get()); + IItemHandler extractHandler = extract.capability(); int extracted = 0; @@ -39,23 +43,21 @@ protected void tickCapabilityGraph(ServerLevel level, ItemConduit conduit, List< } } - ItemConduitData.ItemSidedData sidedExtractData = extract.node() - .getOrCreateData(ConduitTypes.Data.ITEM.get()) - .compute(extract.direction()); + var connectionConfig = extract.node().getConnectionConfig(extract.direction(), ConduitTypes.ConnectionTypes.ITEM.get()); - if (sidedExtractData.isRoundRobin) { - if (inserts.size() <= sidedExtractData.rotatingIndex) { - sidedExtractData.rotatingIndex = 0; + int startingIndex = 0; + if (connectionConfig.isRoundRobin()) { + startingIndex = nodeData.getIndex(extract.direction()); + if (inserts.size() <= startingIndex) { + startingIndex = 0; } - } else { - sidedExtractData.rotatingIndex = 0; } - for (int j = sidedExtractData.rotatingIndex; j < sidedExtractData.rotatingIndex + inserts.size(); j++) { + for (int j = startingIndex; j < startingIndex + inserts.size(); j++) { int insertIndex = j % inserts.size(); CapabilityConnection insert = inserts.get(insertIndex); - if (!sidedExtractData.isSelfFeed && extract.direction() == insert.direction() + if (!connectionConfig.isSelfFeed() && extract.direction() == insert.direction() && extract.pos() == insert.pos()) { continue; } @@ -73,8 +75,8 @@ protected void tickCapabilityGraph(ServerLevel level, ItemConduit conduit, List< extracted += successfullyInserted; extractHandler.extractItem(i, successfullyInserted, false); if (extracted >= speed || isEmpty(extractHandler, i + 1)) { - if (sidedExtractData.isRoundRobin) { - sidedExtractData.rotatingIndex = insertIndex + 1; + if (connectionConfig.isRoundRobin()) { + nodeData.setIndex(extract.direction(), insertIndex + 1); } continue toNextExtract; } else { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java index 9b60c4c034..13493f448e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java @@ -1,20 +1,27 @@ package com.enderio.conduits.common.conduit.type.redstone; import com.enderio.base.api.filter.ResourceFilter; +import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.menu.ConduitMenuExtension; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.ConduitNode; import com.enderio.conduits.api.ConduitType; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.redstone.RedstoneExtractFilter; import com.enderio.conduits.common.redstone.RedstoneInsertFilter; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public record RedstoneConduit( ResourceLocation texture, @@ -63,9 +70,46 @@ public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) } @Override - public ResourceLocation getTexture(ConduitNode node) { - RedstoneConduitData data = node.getData(ConduitTypes.Data.REDSTONE.get()); - return data != null && data.isActive() ? activeTexture() : texture(); + public ResourceLocation getTexture(@Nullable CompoundTag clientDataTag) { + if (clientDataTag != null) { + return clientDataTag.contains("IsActive") && clientDataTag.getBoolean("IsActive") ? activeTexture() : texture(); + } + + return texture(); + } + + @Override + public ConnectionConfigType connectionConfigType() { +// return SimpleConnectionConfig.TYPE; + return null; + } + + @Override + public ConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, + RedstoneControl redstoneControl, DyeColor redstoneChannel) { +// return new SimpleConnectionConfig(ConduitConnectionMode.of(isInsert, isExtract), inputChannel, outputChannel); + return null; + } + + @Override + public boolean hasClientDataTag() { + return true; + } + + @Override + public CompoundTag getClientDataTag(ConduitNode node) { + var tag = new CompoundTag(); + + if (node.getNetwork() == null) { + return tag; + } + + var context = node.getNetwork().getContext(RedstoneConduitNetworkContext.TYPE); + if (context != null) { + tag.putBoolean("IsActive", context.isActive()); + } + + return tag; } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitData.java index ed5bed66bb..cf2308314b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitData.java @@ -1,7 +1,8 @@ package com.enderio.conduits.common.conduit.type.redstone; -import com.enderio.conduits.api.ConduitData; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.network.node.NodeData; +import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.common.init.ConduitTypes; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; @@ -10,6 +11,7 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.Nullable; import java.util.EnumMap; import java.util.HashMap; @@ -49,6 +51,11 @@ public ConduitDataType type() { return ConduitTypes.Data.REDSTONE.get(); } + @Override + public @Nullable NodeData toNodeData() { + return null; + } + public boolean isActive() { return isActive; } @@ -61,6 +68,10 @@ public int getSignal(DyeColor color) { return activeColors.getOrDefault(color, 0); } + public Map getActiveColors() { + return activeColors; + } + public void clearActive() { activeColors.clear(); isActive = false; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java new file mode 100644 index 0000000000..02968e0704 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java @@ -0,0 +1,66 @@ +package com.enderio.conduits.common.conduit.type.redstone; + +import com.enderio.conduits.api.network.ConduitNetworkContext; +import com.enderio.conduits.api.network.ConduitNetworkContextType; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.item.DyeColor; + +import java.util.HashMap; +import java.util.Map; + +public class RedstoneConduitNetworkContext implements ConduitNetworkContext { + + // Redstone context is not saved as it is recalculated every graph tick if the network is active. + public static ConduitNetworkContextType TYPE = new ConduitNetworkContextType<>(null, RedstoneConduitNetworkContext::new); + + private boolean isActive; + private Map channelSignals = new HashMap<>(); + + public RedstoneConduitNetworkContext() { + } + + private RedstoneConduitNetworkContext(boolean isActive, HashMap channelSignals) { + this.isActive = isActive; + this.channelSignals = channelSignals; + } + + public boolean isActive() { + return isActive; + } + + public boolean isActive(DyeColor color) { + return channelSignals.containsKey(color); + } + + public int getSignal(DyeColor color) { + return channelSignals.getOrDefault(color, 0); + } + + public void clear() { + channelSignals.clear(); + isActive = false; + } + + public void setSignal(DyeColor color, int signal) { + channelSignals.put(color, signal); + isActive = channelSignals.values().stream().anyMatch(i -> i > 0); + } + + @Override + public RedstoneConduitNetworkContext mergeWith(RedstoneConduitNetworkContext other) { + // Merge the two maps + return null; + } + + @Override + public RedstoneConduitNetworkContext copy() { + // Ticker will handle any changes to this, so we don't have to worry about it + return new RedstoneConduitNetworkContext(isActive, new HashMap<>(channelSignals)); + } + + @Override + public ConduitNetworkContextType type() { + return TYPE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java index 3c0add1e9b..7e52793d53 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java @@ -1,8 +1,8 @@ package com.enderio.conduits.common.conduit.type.redstone; import com.enderio.conduits.api.ColoredRedstoneProvider; -import com.enderio.conduits.api.ConduitNetwork; -import com.enderio.conduits.api.ConduitNode; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.IOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.init.ConduitTypes; @@ -42,17 +42,20 @@ public boolean canForceConnectTo(Level level, BlockPos conduitPos, Direction dir public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { - Collection nodeIdentifiers = graph.getNodes(); + Collection nodes = graph.getNodes(); + + RedstoneConduitNetworkContext context = graph.getOrCreateContext(RedstoneConduitNetworkContext.TYPE); + boolean isActiveBeforeTick = context.isActive(); + context.clear(); activeColors.clear(); - tickGraph(level, conduit, nodeIdentifiers.stream().filter(node -> isLoaded(level, node.getPos())).toList(), + tickGraph(level, conduit, nodes.stream().filter(ConduitNode::isLoaded).toList(), graph, coloredRedstoneProvider); - for (var nodeIdentifier : nodeIdentifiers) { - RedstoneConduitData data = nodeIdentifier.getOrCreateData(ConduitTypes.Data.REDSTONE.get()); - data.clearActive(); - for (var entry : activeColors.entrySet()) { - data.setActiveColor(entry.getKey(), entry.getValue()); + // If active changed, nodes need to be synced. + if (context.isActive() != isActiveBeforeTick) { + for (var node : nodes) { + node.markDirty(); } } } @@ -62,6 +65,8 @@ public void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List extracts, DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + RedstoneConduitNetworkContext networkContext = graph.getOrCreateContext(RedstoneConduitNetworkContext.TYPE); + for (Connection extract : extracts) { int signal; if (extract.extractFilter() instanceof RedstoneExtractFilter filter) { @@ -71,7 +76,7 @@ public void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List 0) { - activeColors.put(color, Math.max(activeColors.getOrDefault(color, 0), signal)); + networkContext.setSignal(color, signal); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java index 68887a2d2b..f2be768231 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java @@ -33,6 +33,30 @@ public class ConduitLang { // endregion + // region Conduit Screen Tooltips + + public static final Component CONDUIT_CHANNEL = addTranslation("gui", EnderIO.loc("conduit_channel"), + "Channel"); + public static final Component REDSTONE_CHANNEL = addTranslation("gui", EnderIO.loc("redstone_channel"), + "Signal Color"); + + public static final Component ROUND_ROBIN_ENABLED = addTranslation("gui", EnderIO.loc("round_robin.enabled"), + "Round Robin Enabled"); + public static final Component ROUND_ROBIN_DISABLED = addTranslation("gui", EnderIO.loc("round_robin.disabled"), + "Round Robin Disabled"); + public static final Component SELF_FEED_ENABLED = addTranslation("gui", EnderIO.loc("self_feed.enabled"), + "Self Feed Enabled"); + public static final Component SELF_FEED_DISABLED = addTranslation("gui", EnderIO.loc("self_feed.disabled"), + "Self Feed Disabled"); + public static final Component FLUID_CONDUIT_CHANGE_FLUID1 = addTranslation("gui", + EnderIO.loc("fluid_conduit.change_fluid1"), "Locked Fluid:"); + public static final Component FLUID_CONDUIT_CHANGE_FLUID2 = addTranslation("gui", + EnderIO.loc("fluid_conduit.change_fluid2"), "Click to reset!"); + public static final MutableComponent FLUID_CONDUIT_CHANGE_FLUID3 = addTranslation("gui", + EnderIO.loc("fluid_conduit.change_fluid3"), "Fluid: %s"); + + // endregion + public static final MutableComponent GRAPH_TICK_RATE_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit.debug.tick_rate"), "Graph Ticks: %s/sec"); @@ -52,9 +76,13 @@ public class ConduitLang { public static final MutableComponent ITEM_EFFECTIVE_RATE_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit.item.effective_rate"), "Effective Rate: %s Items/sec"); + public static final Component CONDUIT_ENABLED = addTranslation("gui", EnderIO.loc("conduit.enabled"), "Enabled"); public static final Component CONDUIT_INSERT = addTranslation("gui", EnderIO.loc("conduit.insert"), "Insert"); public static final Component CONDUIT_EXTRACT = addTranslation("gui", EnderIO.loc("conduit.extract"), "Extract"); + public static final Component CONDUIT_INPUT = addTranslation("gui", EnderIO.loc("conduit.input"), "Input"); + public static final Component CONDUIT_OUTPUT = addTranslation("gui", EnderIO.loc("conduit.output"), + "Output"); public static final MutableComponent TRANSPARENT_FACADE_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit_facade.transparent"), diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java index 09904ef6aa..265137b784 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java @@ -5,6 +5,8 @@ import com.enderio.conduits.client.gui.RedstoneCountFilterScreen; import com.enderio.conduits.client.gui.RedstoneDoubleChannelFilterScreen; import com.enderio.conduits.client.gui.RedstoneTimerFilterScreen; +import com.enderio.conduits.client.gui.screen.NewConduitScreen; +import com.enderio.conduits.common.conduit.menu.NewConduitMenu; import com.enderio.conduits.common.menu.ConduitMenu; import com.enderio.conduits.common.menu.RedstoneCountFilterMenu; import com.enderio.conduits.common.menu.RedstoneDoubleChannelFilterMenu; @@ -16,8 +18,8 @@ public class ConduitMenus { private static final MenuRegistry MENU_REGISTRY = EnderIOConduits.REGILITE.menuRegistry(); - public static final RegiliteMenu CONDUIT_MENU = MENU_REGISTRY - .registerMenu("conduit", ConduitMenu::factory, () -> ConduitScreen::new); + public static final RegiliteMenu CONDUIT_MENU = MENU_REGISTRY + .registerMenu("conduit", NewConduitMenu::new, () -> NewConduitScreen::new); public static final RegiliteMenu REDSTONE_DOUBLE_CHANNEL_FILTER = MENU_REGISTRY .registerMenu("redstone_and_filter", RedstoneDoubleChannelFilterMenu::factory, () -> RedstoneDoubleChannelFilterScreen::new); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java index d173107bd4..94a8c30e7c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java @@ -1,17 +1,27 @@ package com.enderio.conduits.common.init; import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.ConduitDataType; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.network.ConduitNetworkContextType; +import com.enderio.conduits.api.network.node.NodeDataType; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.common.conduit.type.energy.EnergyConduit; +import com.enderio.conduits.common.conduit.type.energy.EnergyConduitConnectionConfig; +import com.enderio.conduits.common.conduit.type.energy.EnergyConduitNetworkContext; import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; import com.enderio.conduits.common.conduit.type.fluid.FluidConduitData; +import com.enderio.conduits.common.conduit.type.fluid.FluidConduitNetworkContext; import com.enderio.conduits.common.conduit.type.item.ItemConduit; +import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig; import com.enderio.conduits.common.conduit.type.item.ItemConduitData; +import com.enderio.conduits.common.conduit.type.item.ItemConduitNodeData; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduit; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; import java.util.function.Supplier; + +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.registries.DeferredRegister; @@ -48,8 +58,44 @@ public static class Data { RedstoneConduitData.STREAM_CODEC, RedstoneConduitData::new)); } + public static class ConnectionTypes { + private static final DeferredRegister> CONNECTION_TYPES = DeferredRegister + .create(EnderIOConduitsRegistries.CONDUIT_CONNECTION_CONFIG_TYPE, EnderIO.NAMESPACE); + + public static final Supplier> ITEM = CONNECTION_TYPES.register("item", + () -> ItemConduitConnectionConfig.TYPE); + + public static final Supplier> ENERGY = CONNECTION_TYPES.register("energy", + () -> EnergyConduitConnectionConfig.TYPE); + } + + public static class NodeData { + private static final DeferredRegister> NODE_DATA_TYPES = DeferredRegister + .create(EnderIOConduitsRegistries.CONDUIT_NODE_DATA_TYPE, EnderIO.NAMESPACE); + + public static final Supplier> ITEM = NODE_DATA_TYPES + .register("item", () -> ItemConduitNodeData.TYPE); + } + + public static class ContextTypes { + public static final DeferredRegister> CONDUIT_NETWORK_CONTEXT_TYPES = DeferredRegister + .create(EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE, EnderIO.NAMESPACE); + + public static final Supplier> ENERGY = CONDUIT_NETWORK_CONTEXT_TYPES + .register("energy", () -> EnergyConduitNetworkContext.TYPE); + + public static final Supplier> REDSTONE = CONDUIT_NETWORK_CONTEXT_TYPES + .register("redstone", () -> RedstoneConduitNetworkContext.TYPE); + + public static final Supplier> FLUID = CONDUIT_NETWORK_CONTEXT_TYPES + .register("fluid", () -> FluidConduitNetworkContext.TYPE); + } + public static void register(IEventBus bus) { CONDUIT_TYPES.register(bus); Data.CONDUIT_DATA_TYPES.register(bus); + ConnectionTypes.CONNECTION_TYPES.register(bus); + NodeData.NODE_DATA_TYPES.register(bus); + ContextTypes.CONDUIT_NETWORK_CONTEXT_TYPES.register(bus); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java index 325a9dc42b..4344e76aa1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java @@ -2,7 +2,7 @@ import com.enderio.base.api.EnderIO; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitNetworkContextType; +import com.enderio.conduits.api.network.ConduitNetworkContextType; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.common.conduit.type.energy.EnergyConduit; import com.enderio.conduits.common.conduit.type.energy.EnergyConduitNetworkContext; @@ -68,16 +68,6 @@ public static void bootstrap(BootstrapContext> context) { // ConduitLang.ENDER_ITEM_CONDUIT, 4, 5)); } - public static class ContextSerializers { - public static final DeferredRegister> CONDUIT_NETWORK_CONTEXT_TYPES = DeferredRegister - .create(EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE, EnderIO.NAMESPACE); - - public static final Supplier> ENERGY = CONDUIT_NETWORK_CONTEXT_TYPES - .register("energy", () -> new ConduitNetworkContextType<>(EnergyConduitNetworkContext.CODEC, - EnergyConduitNetworkContext::new)); - } - - public static void register(IEventBus bus) { - ContextSerializers.CONDUIT_NETWORK_CONTEXT_TYPES.register(bus); + public static void register() { } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java index d99f82b2af..a5d535aa4d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java @@ -25,22 +25,22 @@ public int getBundledRedstoneOutput(Level world, BlockPos pos, Direction side) { Holder> redstoneConduit = world.holderOrThrow(Conduits.REDSTONE); - if (be instanceof ConduitBundleBlockEntity conduit) { - ConnectionState connectionState = conduit.getBundle().getConnectionState(side, redstoneConduit); - if (connectionState instanceof DynamicConnectionState dyn && dyn.isInsert()) { - RedstoneConduitData data = conduit.getBundle().getNodeFor(redstoneConduit).getData(ConduitTypes.Data.REDSTONE.get()); - if (data == null) { - return -1; - } - - int out = 0; - - for (DyeColor color : DyeColor.values()) { - out |= (data.isActive(color) ? 1 : 0) << color.getId(); - } - return out; - } - } +// if (be instanceof ConduitBundleBlockEntity conduit) { +// ConnectionState connectionState = conduit.getBundle().getConnectionState(side, redstoneConduit); +// if (connectionState instanceof DynamicConnectionState dyn && dyn.isInsert()) { +// RedstoneConduitData data = conduit.getBundle().getNodeFor(redstoneConduit).getData(ConduitTypes.Data.REDSTONE.get()); +// if (data == null) { +// return -1; +// } +// +// int out = 0; +// +// for (DyeColor color : DyeColor.values()) { +// out |= (data.isActive(color) ? 1 : 0) << color.getId(); +// } +// return out; +// } +// } return -1; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java index 1bbe0698bf..9614a87001 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java @@ -1,7 +1,7 @@ package com.enderio.conduits.common.menu; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.common.conduit.ConduitBundle; import com.enderio.conduits.common.conduit.block.ConduitBundleBlock; import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitSlot.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitSlot.java index 1eafc8d759..ca139bf9b7 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitSlot.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitSlot.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.menu; -import com.enderio.conduits.api.SlotType; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.common.conduit.ConduitBundle; import com.enderio.conduits.common.conduit.SlotData; import net.minecraft.core.Direction; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java index 0193d8349f..24cfbf0209 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java @@ -1,6 +1,9 @@ package com.enderio.conduits.common.network; import com.enderio.conduits.EnderIOConduits; +import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; +import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; +import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; import com.enderio.core.EnderCore; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -34,6 +37,15 @@ public static void register(final RegisterPayloadHandlersEvent event) { registrar.playToServer(CountFilterPacket.TYPE, CountFilterPacket.STREAM_CODEC, ConduitServerPayloadHandler.getInstance()::handleCountFilter); + + registrar.playToServer(C2SSetConduitChannelPacket.TYPE, C2SSetConduitChannelPacket.STREAM_CODEC, + ConduitServerPayloadHandler.getInstance()::handleSetConduitChannelPacket); + + registrar.playToServer(C2SSetConduitRedstoneControlPacket.TYPE, C2SSetConduitRedstoneControlPacket.STREAM_CODEC, + ConduitServerPayloadHandler.getInstance()::handleSetConduitRedstoneControlPacket); + + registrar.playToServer(C2SSetConduitRedstoneChannelPacket.TYPE, C2SSetConduitRedstoneChannelPacket.STREAM_CODEC, + ConduitServerPayloadHandler.getInstance()::handleSetConduitRedstoneChannelPacket); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java index 11cef6a3a2..e76c8329fe 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java @@ -1,14 +1,23 @@ package com.enderio.conduits.common.network; import com.enderio.base.common.init.EIOCapabilities; +import com.enderio.conduits.api.bundle.ConduitBundleAccessor; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ChannelResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import com.enderio.conduits.common.menu.ConduitMenu; +import com.enderio.conduits.common.network.connections.C2SConduitConnectionPacket; +import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; +import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; +import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; import com.enderio.conduits.common.redstone.DoubleRedstoneChannel; import com.enderio.conduits.common.redstone.RedstoneCountFilter; import com.enderio.conduits.common.redstone.RedstoneTimerFilter; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.apache.logging.log4j.util.TriConsumer; public class ConduitServerPayloadHandler { private static final ConduitServerPayloadHandler INSTANCE = new ConduitServerPayloadHandler(); @@ -74,4 +83,47 @@ public void handleCountFilter(CountFilterPacket packet, IPayloadContext context) } }); } + + public void handleSetConduitChannelPacket(C2SSetConduitChannelPacket packet, IPayloadContext context) { + handleConduitConfigPacket(packet, context, (p, conduitBundle, currentConfig) -> { + if (currentConfig instanceof ChannelResourceConnectionConfig channelledConnectionConfig) { + if (packet.channelSide() == C2SSetConduitChannelPacket.Side.INPUT) { + conduitBundle.setConnectionConfig(p.side(), p.conduit(), + channelledConnectionConfig.withInputChannel(p.channelColor())); + } else { + conduitBundle.setConnectionConfig(p.side(), p.conduit(), + channelledConnectionConfig.withOutputChannel(p.channelColor())); + } + } + }); + } + + public void handleSetConduitRedstoneControlPacket(C2SSetConduitRedstoneControlPacket packet, IPayloadContext context) { + handleConduitConfigPacket(packet, context, (p, conduitBundle, currentConfig) -> { + if (currentConfig instanceof RedstoneControlledConnection redstoneControlledConnection) { + conduitBundle.setConnectionConfig(p.side(), p.conduit(), + redstoneControlledConnection.withRedstoneControl(p.redstoneControl())); + } + }); + } + + public void handleSetConduitRedstoneChannelPacket(C2SSetConduitRedstoneChannelPacket packet, IPayloadContext context) { + handleConduitConfigPacket(packet, context, (p, conduitBundle, currentConfig) -> { + if (currentConfig instanceof RedstoneControlledConnection redstoneControlledConnection) { + conduitBundle.setConnectionConfig(p.side(), p.conduit(), + redstoneControlledConnection.withRedstoneChannel(p.redstoneChannel())); + } + }); + } + + private void handleConduitConfigPacket(T packet, IPayloadContext context, TriConsumer packetConsumer) { + context.enqueueWork(() -> { + var level = context.player().level(); + BlockEntity be = level.getBlockEntity(packet.pos()); + if (be instanceof ConduitBundleAccessor conduitBundle) { + var currentConfig = conduitBundle.getConnectionConfig(packet.side(), packet.conduit()); + packetConsumer.accept(packet, conduitBundle, currentConfig); + } + }); + } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java new file mode 100644 index 0000000000..a01d6cea82 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java @@ -0,0 +1,12 @@ +package com.enderio.conduits.common.network.connections; + +import com.enderio.conduits.api.Conduit; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; + +public interface C2SConduitConnectionPacket { + BlockPos pos(); + Direction side(); + Holder> conduit(); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java new file mode 100644 index 0000000000..d91efa2a96 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java @@ -0,0 +1,47 @@ +package com.enderio.conduits.common.network.connections; + +import com.enderio.base.api.EnderIO; +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.Conduit; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.item.DyeColor; + +public record C2SSetConduitChannelPacket( + BlockPos pos, + Direction side, + Holder> conduit, + Side channelSide, + DyeColor channelColor +) implements C2SConduitConnectionPacket, CustomPacketPayload { + + public static Type TYPE = new Type<>(EnderIO.loc("conduit_channel")); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, + C2SSetConduitChannelPacket::pos, + Direction.STREAM_CODEC, + C2SSetConduitChannelPacket::side, + Conduit.STREAM_CODEC, + C2SSetConduitChannelPacket::conduit, + ByteBufCodecs.BOOL.map(b -> b ? Side.INPUT : Side.OUTPUT, s -> s == Side.INPUT), + C2SSetConduitChannelPacket::channelSide, + DyeColor.STREAM_CODEC, + C2SSetConduitChannelPacket::channelColor, + C2SSetConduitChannelPacket::new + ); + + public enum Side { + INPUT, OUTPUT, + } + + @Override + public Type type() { + return TYPE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java new file mode 100644 index 0000000000..99bfa579f2 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java @@ -0,0 +1,38 @@ +package com.enderio.conduits.common.network.connections; + +import com.enderio.base.api.EnderIO; +import com.enderio.conduits.api.Conduit; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.item.DyeColor; + +public record C2SSetConduitRedstoneChannelPacket( + BlockPos pos, + Direction side, + Holder> conduit, + DyeColor redstoneChannel +) implements C2SConduitConnectionPacket, CustomPacketPayload { + + public static Type TYPE = new Type<>(EnderIO.loc("conduit_redstone_channel")); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, + C2SSetConduitRedstoneChannelPacket::pos, + Direction.STREAM_CODEC, + C2SSetConduitRedstoneChannelPacket::side, + Conduit.STREAM_CODEC, + C2SSetConduitRedstoneChannelPacket::conduit, + DyeColor.STREAM_CODEC, + C2SSetConduitRedstoneChannelPacket::redstoneChannel, + C2SSetConduitRedstoneChannelPacket::new + ); + + @Override + public Type type() { + return TYPE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java new file mode 100644 index 0000000000..4778cde0de --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java @@ -0,0 +1,39 @@ +package com.enderio.conduits.common.network.connections; + +import com.enderio.base.api.EnderIO; +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.Conduit; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.item.DyeColor; + +public record C2SSetConduitRedstoneControlPacket( + BlockPos pos, + Direction side, + Holder> conduit, + RedstoneControl redstoneControl +) implements C2SConduitConnectionPacket, CustomPacketPayload { + + public static Type TYPE = new Type<>(EnderIO.loc("conduit_redstone_control")); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, + C2SSetConduitRedstoneControlPacket::pos, + Direction.STREAM_CODEC, + C2SSetConduitRedstoneControlPacket::side, + Conduit.STREAM_CODEC, + C2SSetConduitRedstoneControlPacket::conduit, + RedstoneControl.STREAM_CODEC, + C2SSetConduitRedstoneControlPacket::redstoneControl, + C2SSetConduitRedstoneControlPacket::new + ); + + @Override + public Type type() { + return TYPE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java b/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java index 1df97dcfce..d058675423 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java @@ -10,6 +10,9 @@ @WailaPlugin public class EIOConduitsJadePlugin implements IWailaPlugin { + + // TODO: Could implement stuff like a waila tooltip for bound souls. + @Override public void registerClient(IWailaClientRegistration registration) { // Show the correct conduit (or facade item) diff --git a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/MachineBlock.java b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/MachineBlock.java index 6befbdee67..cbb1e611de 100644 --- a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/MachineBlock.java +++ b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/MachineBlock.java @@ -76,6 +76,7 @@ protected boolean canOpenMenu() { @Override protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { + // Attempt to open machine menu. if (canOpenMenu()) { // var menuProvider = this.getMenuProvider(state, level, pos); diff --git a/enderio/build.gradle.kts b/enderio/build.gradle.kts index f43df0b153..5690509dd0 100644 --- a/enderio/build.gradle.kts +++ b/enderio/build.gradle.kts @@ -34,12 +34,14 @@ dependencies { jarJar(project(":enderio-base")) jarJar(project(":enderio-machines")) jarJar(project(":enderio-conduits")) - jarJar(project(":enderio-conduits-modded")) + // TODO: REENABLE! +// jarJar(project(":enderio-conduits-modded")) jarJar(project(":enderio-armory")) implementation(project(":enderio-base")) implementation(project(":enderio-machines")) implementation(project(":enderio-conduits")) - implementation(project(":enderio-conduits-modded")) + // TODO! +// implementation(project(":enderio-conduits-modded")) implementation(project(":enderio-armory")) // JEI @@ -121,9 +123,10 @@ neoForge { sourceSet(project(":enderio-conduits").sourceSets["main"]) } - create("enderio_conduits_modded") { - sourceSet(project(":enderio-conduits-modded").sourceSets["main"]) - } + // TODO! +// create("enderio_conduits_modded") { +// sourceSet(project(":enderio-conduits-modded").sourceSets["main"]) +// } create("enderio_armory") { sourceSet(project(":enderio-armory").sourceSets["main"]) diff --git a/settings.gradle b/settings.gradle index 76ead61fdb..05698113ed 100644 --- a/settings.gradle +++ b/settings.gradle @@ -33,7 +33,8 @@ include("enderio-armory") include("enderio-base") include("enderio-machines") include("enderio-conduits") -include("enderio-conduits-modded") +// TODO: Reenable once API is more stable again. +//include("enderio-conduits-modded") // Combined project include("enderio") From 588922a96e3788304c778958324e63552f9ac316 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Wed, 8 Jan 2025 16:13:40 +0000 Subject: [PATCH 08/27] chore: misc work on connections --- .../com/enderio/conduits/api/Conduit.java | 20 ++-- .../api/bundle/ConduitBundleAccessor.java | 4 +- .../api/bundle/ConduitBundleReader.java | 6 +- ...nectionType.java => ConnectionStatus.java} | 20 ++-- .../config/ConnectionConfigType.java | 8 +- .../io/ChannelResourceConnectionConfig.java | 10 -- .../io/ChanneledIOConnectionConfig.java | 13 +++ .../config/io/IOConnectionConfig.java | 21 ++++ .../config/io/ResourceConnectionConfig.java | 23 ---- .../signal/ChannelSignalConnectionConfig.java | 10 -- .../config/signal/SignalConnectionConfig.java | 30 ----- .../api/menu/ConduitMenuComponent.java | 34 ++++++ .../conduits/api/menu/ConduitMenuData.java | 41 ------- .../conduits/api/menu/ConduitMenuLayout.java | 10 ++ .../conduits/api/menu/ConduitMenuType.java | 70 ++++++++++++ ...odifier.java => ConduitModelModifier.java} | 14 ++- ...> RegisterConduitModelModifiersEvent.java} | 4 +- .../api/screen/NewConduitScreenExtension.java | 17 --- .../ticker/CapabilityAwareConduitTicker.java | 71 ------------ .../conduits/api/ticker/ConduitTicker.java | 12 -- .../api/ticker/IOAwareConduitTicker.java | 8 +- .../conduits/client/ConduitClientSetup.java | 16 +-- .../NewItemConduitScreenExtension.java | 58 ---------- .../client/gui/screen/NewConduitScreen.java | 56 ++++++++-- .../conduit/bundle/ConduitBundleModel.java | 12 +- .../bundle/ConduitBundleRenderState.java | 10 +- .../bundle/ConduitConnectionRenderState.java | 33 ++++-- ...ifiers.java => ConduitModelModifiers.java} | 12 +- .../modifier/EnergyConduitModelModifier.java | 11 ++ ...er.java => FluidConduitModelModifier.java} | 8 +- .../common/conduit/ConduitBundle.java | 8 +- .../block/ConduitBundleBlockEntity.java | 12 +- .../conduit/bundle/NewConduitBundleBlock.java | 5 - .../bundle/NewConduitBundleBlockEntity.java | 104 +++++++++--------- .../conduit/bundle/NewConduitShape.java | 5 +- .../common/conduit/menu/NewConduitMenu.java | 36 +++--- .../conduit/type/energy/EnergyConduit.java | 11 +- .../energy/EnergyConduitConnectionConfig.java | 19 +--- .../type/energy/EnergyConduitTicker.java | 11 -- .../conduit/type/fluid/FluidConduit.java | 13 ++- .../common/conduit/type/item/ItemConduit.java | 10 ++ .../item/ItemConduitConnectionConfig.java | 16 +-- .../type/item/ItemConduitMenuData.java | 53 --------- .../type/redstone/RedstoneConduit.java | 20 ++++ .../type/redstone/RedstoneConduitTicker.java | 15 --- .../conduits/common/init/ConduitMenus.java | 2 - .../network/ConduitServerPayloadHandler.java | 4 +- 47 files changed, 464 insertions(+), 542 deletions(-) rename enderio-conduits/src/main/java/com/enderio/conduits/api/connection/{ConduitConnectionType.java => ConnectionStatus.java} (68%) delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChannelResourceConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ResourceConnectionConfig.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/ChannelSignalConnectionConfig.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/SignalConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuComponent.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuData.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuLayout.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java rename enderio-conduits/src/main/java/com/enderio/conduits/api/model/{ConduitCoreModelModifier.java => ConduitModelModifier.java} (73%) rename enderio-conduits/src/main/java/com/enderio/conduits/api/model/{RegisterConduitCoreModelModifiersEvent.java => RegisterConduitModelModifiersEvent.java} (83%) delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/NewConduitScreenExtension.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/CapabilityAwareConduitTicker.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/NewItemConduitScreenExtension.java rename enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/{ConduitCoreModelModifiers.java => ConduitModelModifiers.java} (71%) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/EnergyConduitModelModifier.java rename enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/{FluidConduitCoreModelModifier.java => FluidConduitModelModifier.java} (90%) delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitMenuData.java diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index cf401da977..c2c59982b9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -73,6 +73,8 @@ default int graphTickRate() { ConduitMenuData getMenuData(); + // region Conduit Checks + default boolean canBeInSameBundle(Holder> otherConduit) { return true; } @@ -84,26 +86,30 @@ default boolean canBeReplacedBy(Holder> otherConduit) { /** * @return true if both types are compatible */ - default boolean canConnectTo(Holder> other) { + default boolean canConnectToConduit(Holder> other) { return this.equals(other.value()); } + // endregion + + // region Connection Checks + /** * This can be used to prevent connection between nodes with incompatible data. * @return true if both nodes are compatible. */ - default boolean canConnectTo(ConduitNode selfNode, ConduitNode otherNode) { + default boolean canConnectNodes(ConduitNode selfNode, ConduitNode otherNode) { return true; } - default boolean canConnectTo(Level level, BlockPos conduitPos, Direction direction) { - return getTicker().canConnectTo(level, conduitPos, direction); - } + boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction); - default boolean canForceConnectTo(Level level, BlockPos conduitPos, Direction direction) { - return getTicker().canForceConnectTo(level, conduitPos, direction); + default boolean canForceConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { + return canConnectToBlock(level, conduitPos, direction); } + // endregion + /** * @return if this is not always able to determine connectivity to its neighbours at time of placement, but the tick later */ diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java index 0464ffca92..29b284a06c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java @@ -1,7 +1,7 @@ package com.enderio.conduits.api.bundle; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -41,7 +41,7 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { // region Connections /** - * @throws IllegalStateException if {@link #getConnectionType} is not {@link ConduitConnectionType#CONNECTED_BLOCK}. + * @throws IllegalStateException if {@link #getConnectionStatus} is not {@link ConnectionStatus#CONNECTED_BLOCK}. * @throws IllegalArgumentException if the connection config is not the right type for this conduit. * @param side * @param config diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java index c9c99f6fd0..bcd379fc80 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -1,7 +1,7 @@ package com.enderio.conduits.api.bundle; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.facade.FacadeType; @@ -43,7 +43,7 @@ public interface ConduitBundleReader { CompoundTag getConduitClientDataTag(Holder> conduit); /** - * @implNote compare conduits using {@link Conduit#canConnectTo(Holder)} + * @implNote compare conduits using {@link Conduit#canConnectToConduit(Holder)} * @param conduit the conduit to check for * @return whether the bundle has this conduit, or another which is compatible. */ @@ -80,7 +80,7 @@ public interface ConduitBundleReader { * @param conduit * @return */ - ConduitConnectionType getConnectionType(Direction side, Holder> conduit); + ConnectionStatus getConnectionStatus(Direction side, Holder> conduit); /** * @param side diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConnectionStatus.java similarity index 68% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConnectionStatus.java index a9fadd6249..bb17aa819c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConduitConnectionType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConnectionStatus.java @@ -10,11 +10,11 @@ import javax.annotation.Nullable; -public enum ConduitConnectionType implements StringRepresentable { +public enum ConnectionStatus implements StringRepresentable { /** * This conduit is not connected to anything. */ - NONE("none"), + DISCONNECTED("none"), /** * This conduit is connected to a block for extract. @@ -31,16 +31,16 @@ public enum ConduitConnectionType implements StringRepresentable { */ DISABLED("disabled"); - public static final StringRepresentable.EnumCodec CODEC = StringRepresentable - .fromEnum(ConduitConnectionType::values); - public static final IntFunction BY_ID = ByIdMap.continuous(Enum::ordinal, values(), + public static final StringRepresentable.EnumCodec CODEC = StringRepresentable + .fromEnum(ConnectionStatus::values); + public static final IntFunction BY_ID = ByIdMap.continuous(Enum::ordinal, values(), ByIdMap.OutOfBoundsStrategy.ZERO); - public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, + public static final StreamCodec STREAM_CODEC = ByteBufCodecs.idMapper(BY_ID, Enum::ordinal); private final String name; - ConduitConnectionType(String name) { + ConnectionStatus(String name) { this.name = name; } @@ -48,14 +48,14 @@ public enum ConduitConnectionType implements StringRepresentable { * @return Whether a new connection can be made from this face. */ public boolean canConnect() { - return this == NONE; + return this == DISCONNECTED; } /** * @return Whether this face is connected. */ public boolean isConnected() { - return this != NONE && this != DISABLED; + return this != DISCONNECTED && this != DISABLED; } /** @@ -71,7 +71,7 @@ public String getSerializedName() { } @Nullable - public static ConduitConnectionType byName(@Nullable String name) { + public static ConnectionStatus byName(@Nullable String name) { return CODEC.byName(name); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java index 81ba421b17..1324a59643 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java @@ -1,7 +1,7 @@ package com.enderio.conduits.api.connection.config; -import com.enderio.conduits.api.connection.config.io.ChannelResourceConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.mojang.serialization.MapCodec; @@ -17,11 +17,11 @@ public T getDefault() { } public boolean supportsIO() { - return ResourceConnectionConfig.class.isAssignableFrom(clazz); + return IOConnectionConfig.class.isAssignableFrom(clazz); } public boolean supportsIOChannels() { - return ChannelResourceConnectionConfig.class.isAssignableFrom(clazz); + return ChanneledIOConnectionConfig.class.isAssignableFrom(clazz); } public boolean supportsRedstoneControl() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChannelResourceConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChannelResourceConnectionConfig.java deleted file mode 100644 index ee55b33d11..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChannelResourceConnectionConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.enderio.conduits.api.connection.config.io; - -import net.minecraft.world.item.DyeColor; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public interface ChannelResourceConnectionConfig extends ResourceConnectionConfig { - ChannelResourceConnectionConfig withInputChannel(DyeColor inputChannel); - ChannelResourceConnectionConfig withOutputChannel(DyeColor outputChannel); -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java new file mode 100644 index 0000000000..115904d6cd --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java @@ -0,0 +1,13 @@ +package com.enderio.conduits.api.connection.config.io; + +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public interface ChanneledIOConnectionConfig extends IOConnectionConfig { + DyeColor insertChannel(); + DyeColor extractChannel(); + + ChanneledIOConnectionConfig withInputChannel(DyeColor inputChannel); + ChanneledIOConnectionConfig withOutputChannel(DyeColor outputChannel); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java new file mode 100644 index 0000000000..6c4c68cbb6 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java @@ -0,0 +1,21 @@ +package com.enderio.conduits.api.connection.config.io; + +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public interface IOConnectionConfig extends ConnectionConfig { + + // TODO: canSend/canReceive? Might be clearer when used with Redstone signals? + + boolean canInsert(); + boolean canExtract(); + + IOConnectionConfig withInsert(boolean canInsert); + IOConnectionConfig withExtract(boolean canExtract); + + @Override + default boolean isConnected() { + return canInsert() || canExtract(); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ResourceConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ResourceConnectionConfig.java deleted file mode 100644 index 949723d11c..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ResourceConnectionConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.enderio.conduits.api.connection.config.io; - -import com.enderio.conduits.api.connection.config.ConnectionConfig; -import net.minecraft.world.item.DyeColor; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public interface ResourceConnectionConfig extends ConnectionConfig { - boolean canInsert(); - boolean canExtract(); - - // TODO: A different way to make the arrows a different colour without having this in the interface? - DyeColor insertChannel(); - DyeColor extractChannel(); - - ResourceConnectionConfig withInsert(boolean canInsert); - ResourceConnectionConfig withExtract(boolean canExtract); - - @Override - default boolean isConnected() { - return canInsert() || canExtract(); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/ChannelSignalConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/ChannelSignalConnectionConfig.java deleted file mode 100644 index e77dd71f57..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/ChannelSignalConnectionConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.enderio.conduits.api.connection.config.signal; - -import net.minecraft.world.item.DyeColor; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public interface ChannelSignalConnectionConfig extends SignalConnectionConfig { - ChannelSignalConnectionConfig withInputChannel(DyeColor inputChannel); - ChannelSignalConnectionConfig withOutputChannel(DyeColor outputChannel); -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/SignalConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/SignalConnectionConfig.java deleted file mode 100644 index 06c5d24efa..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/signal/SignalConnectionConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.enderio.conduits.api.connection.config.signal; - -import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; -import net.minecraft.world.item.DyeColor; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public interface SignalConnectionConfig extends ConnectionConfig { - /** - * Whether this connection can receive signals. - */ - boolean canReceive(); - - /** - * Whether this connection can emit signals - */ - boolean canEmit(); - - DyeColor receiveChannel(); - DyeColor emitChannel(); - - ResourceConnectionConfig withReceive(boolean canReceive); - ResourceConnectionConfig withEmit(boolean canEmit); - - @Override - default boolean isConnected() { - return canReceive() && canEmit(); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuComponent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuComponent.java new file mode 100644 index 0000000000..58f9ce6038 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuComponent.java @@ -0,0 +1,34 @@ +package com.enderio.conduits.api.menu; + +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.mojang.datafixers.types.Func; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; + +// TODO: is this stupid? +// It allows most menus to be defined without the need for custom widget logic. +@ApiStatus.Experimental +public sealed interface ConduitMenuComponent { + int x(); + int y(); + + record Text(int x, int y, Component text) implements ConduitMenuComponent { + } + + record ToggleButton(int x, int y, Component title, ResourceLocation enabledSprite, ResourceLocation disabledSprite, Function getter, Function onToggle) implements ConduitMenuComponent { + } + + record ColorPicker(int x, int y, Component title, Function getter, BiFunction setter) implements ConduitMenuComponent { + } + + record RedstoneControlPicker(int x, int y, Component title, Function getter, BiFunction setter) implements ConduitMenuComponent { + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuData.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuData.java deleted file mode 100644 index 95e914737f..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuData.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.enderio.conduits.api.menu; - -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.core.common.network.menu.SyncSlot; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; - -// TODO: Rubbish name -public abstract class ConduitMenuData { - - public interface ConduitMenuAccess { - Holder> conduit(); - Direction side(); - ConduitNode conduitNode(); - T getConnectionConfig(ConnectionConfigType type); - void setConnectionConfig(ConnectionConfig config); - - T addSyncSlot(T syncSlot); - T addUpdatableSyncSlot(T syncSlot); - void updateSlot(SyncSlot syncSlot); - } - - protected final ConduitMenuAccess menu; - - /** - * Server constructor - */ - public ConduitMenuData(ConduitNode node, ConduitMenuAccess menu) { - this.menu = menu; - } - - /** - * Client constructor - */ - public ConduitMenuData(ConduitMenuAccess menu) { - this.menu = menu; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuLayout.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuLayout.java new file mode 100644 index 0000000000..be94775f25 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuLayout.java @@ -0,0 +1,10 @@ +package com.enderio.conduits.api.menu; + +import net.minecraft.network.chat.Component; + +public sealed interface ConduitMenuLayout permits ConduitMenuLayout.SingleColumn, ConduitMenuLayout.TwoColumns { + record SingleColumn(Component title, Runnable toggled) implements ConduitMenuLayout {} + + record TwoColumns(Component leftTitle, Runnable toggleLeft, Component rightTitle, Runnable toggleRight) implements + ConduitMenuLayout {} +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java new file mode 100644 index 0000000000..a4a441827b --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java @@ -0,0 +1,70 @@ +package com.enderio.conduits.api.menu; + +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class ConduitMenuType { + + private final ConnectionConfigType connectionConfigType; + private final ConduitMenuLayout layout; + private final List> components; + + private ConduitMenuType(ConnectionConfigType connectionConfigType, ConduitMenuLayout layout, List> components) { + this.connectionConfigType = connectionConfigType; + this.layout = layout; + this.components = List.copyOf(components); + } + + public ConnectionConfigType connectionType() { + return connectionConfigType; + } + + public ConduitMenuLayout layout() { + return layout; + } + + public List> components() { + return components; + } + + public static , TConnectionConfig extends ConnectionConfig> Builder builder(ConnectionConfigType connectionConfigType) { + return new Builder<>(connectionConfigType); + } + + public static class Builder, TConnectionConfig extends ConnectionConfig> { + private final ConnectionConfigType connectionConfigType; + + @Nullable + private ConduitMenuLayout layout; + + private List> components = new ArrayList<>(); + + private Builder(ConnectionConfigType connectionConfigType) { + this.connectionConfigType = connectionConfigType; + } + + public Builder layout(ConduitMenuLayout layout) { + this.layout = layout; + return this; + } + + public Builder addComponent(ConduitMenuComponent component) { + this.components.add(component); + return this; + } + + public ConduitMenuType build() { + if (layout == null) { + throw new IllegalStateException("Layout must be set"); + } + + return new ConduitMenuType<>(connectionConfigType, layout, components); + } + } + +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitCoreModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java similarity index 73% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitCoreModelModifier.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java index 69c2054958..a501e45635 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitCoreModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java @@ -1,8 +1,6 @@ package com.enderio.conduits.api.model; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.network.node.NodeData; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.ModelResourceLocation; @@ -10,11 +8,21 @@ import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.RandomSource; +import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.Nullable; import java.util.List; -public interface ConduitCoreModelModifier { +public interface ConduitModelModifier { + + /** + * Used when the connection config does not support coloured connections. + * @return the colour to render arrows if not specified by the connection config. + */ + default DyeColor getDefaultArrowColor() { + return DyeColor.GREEN; + } + /** * Create additional quads to be rendered at the point of conduit connection. */ diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitCoreModelModifiersEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java similarity index 83% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitCoreModelModifiersEvent.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java index 41366d7c71..56e38e537f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitCoreModelModifiersEvent.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java @@ -8,9 +8,9 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public class RegisterConduitCoreModelModifiersEvent extends Event implements IModBusEvent { +public class RegisterConduitModelModifiersEvent extends Event implements IModBusEvent { public interface ConduitCoreModelModifierFactory { - ConduitCoreModelModifier createModifier(); + ConduitModelModifier createModifier(); } private final Map, ConduitCoreModelModifierFactory> modifiers = new ConcurrentHashMap<>(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/NewConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/NewConduitScreenExtension.java deleted file mode 100644 index 09cf769bc0..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/NewConduitScreenExtension.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.enderio.conduits.api.screen; - -import com.enderio.conduits.api.menu.ConduitMenuData; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.nbt.CompoundTag; -import org.joml.Vector2i; - -import java.util.List; - -/** - * Extend the conduit screen with additional widgets. - */ -public interface NewConduitScreenExtension { - - List createWidgets(Screen screen, T menuData, CompoundTag clientDataTag, Vector2i widgetsStart); -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/CapabilityAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/CapabilityAwareConduitTicker.java deleted file mode 100644 index 3885c44b88..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/CapabilityAwareConduitTicker.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.enderio.conduits.api.ticker; - -import com.enderio.conduits.api.ColoredRedstoneProvider; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.network.ConduitNetwork; -import com.enderio.conduits.api.network.node.ConduitNode; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.Level; -import net.neoforged.neoforge.capabilities.BlockCapability; - -import java.util.ArrayList; -import java.util.List; - -public abstract class CapabilityAwareConduitTicker, TCap> implements IOAwareConduitTicker { - - @Override - public final void tickColoredGraph(ServerLevel level, TConduit conduit, List inserts, List extracts, - DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { - - List insertCaps = new ArrayList<>(); - for (Connection insert : inserts) { - // TODO: we should have bundle block entities cache neighbour capabilities... - TCap capability = level.getCapability(getCapability(), insert.move(), insert.direction().getOpposite()); - if (capability != null) { - insertCaps.add(new CapabilityConnection(insert.direction(), insert.node(), capability)); - } - } - - if (!insertCaps.isEmpty()) { - List extractCaps = new ArrayList<>(); - - for (Connection extract : extracts) { - TCap capability = level.getCapability(getCapability(), extract.move(), extract.direction().getOpposite()); - if (capability != null) { - extractCaps.add(new CapabilityConnection(extract.direction(), extract.node(), capability)); - } - } - - if (!extractCaps.isEmpty()) { - tickCapabilityGraph(level, conduit, insertCaps, extractCaps, graph, coloredRedstoneProvider); - } - } - } - - @Override - public boolean canConnectTo(Level level, BlockPos conduitPos, Direction direction) { - TCap capability = level.getCapability(getCapability(), conduitPos.relative(direction), direction.getOpposite()); - return capability != null; - } - - protected abstract void tickCapabilityGraph(ServerLevel level, TConduit conduit, List inserts, - List extracts, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - - protected abstract BlockCapability getCapability(); - - public class CapabilityConnection extends Connection { - private final TCap capability; - - public CapabilityConnection(Direction dir, ConduitNode node, TCap capability) { - super(dir, node); - this.capability = capability; - } - - public TCap capability() { - return this.capability; - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java index ac0029a2a2..ce446fadbf 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java @@ -12,16 +12,4 @@ public interface ConduitTicker> { void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - - /** - * @return Whether the conduit can interact with the block in this direction - */ - boolean canConnectTo(Level level, BlockPos conduitPos, Direction direction); - - /** - * @return if the conduit is allowed to have a forced connection (with the wrench) but won't necessarily connect when placed - */ - default boolean canForceConnectTo(Level level, BlockPos conduitPos, Direction direction) { - return canConnectTo(level, conduitPos, direction); - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java index 6a5905c93e..fa1975862e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java @@ -4,7 +4,7 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; @@ -28,12 +28,12 @@ default void tickGraph(ServerLevel level, TConduit conduit, List lo for (ConduitNode node : loadedNodes) { for (Direction side : Direction.values()) { if (node.isConnectedTo(side)) { - if (node.getConnectionConfig(side) instanceof ResourceConnectionConfig config) { - if (config.canInsert() && isActive(level, side, node, coloredRedstoneProvider)) { + if (node.getConnectionConfig(side) instanceof IOConnectionConfig config) { + if (config.canExtract() && isActive(level, side, node, coloredRedstoneProvider)) { extracts.get(config.extractChannel()).add(new Connection(side, node)); } - if (config.canExtract()) { + if (config.canInsert()) { inserts.get(config.insertChannel()).add(new Connection(side, node)); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java index 6d9ecdea34..982792f1de 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java @@ -2,15 +2,16 @@ import com.enderio.base.api.EnderIO; import com.enderio.conduits.EnderIOConduits; -import com.enderio.conduits.api.model.RegisterConduitCoreModelModifiersEvent; +import com.enderio.conduits.api.model.RegisterConduitModelModifiersEvent; import com.enderio.conduits.api.screen.RegisterConduitScreenExtensionsEvent; import com.enderio.conduits.client.gui.conduit.ConduitScreenExtensions; import com.enderio.conduits.client.gui.conduit.FluidConduitScreenExtension; import com.enderio.conduits.client.gui.conduit.ItemConduitScreenExtension; import com.enderio.conduits.client.model.conduit.ConduitItemModelLoader; import com.enderio.conduits.client.model.conduit.facades.FacadeItemGeometry; -import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; -import com.enderio.conduits.client.model.conduit.modifier.FluidConduitCoreModelModifier; +import com.enderio.conduits.client.model.conduit.modifier.ConduitModelModifiers; +import com.enderio.conduits.client.model.conduit.modifier.EnergyConduitModelModifier; +import com.enderio.conduits.client.model.conduit.modifier.FluidConduitModelModifier; import com.enderio.conduits.client.model.conduit.bundle.ConduitBundleGeometry; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.init.ConduitTypes; @@ -53,8 +54,9 @@ public static void clientSetup(FMLClientSetupEvent event) { } @SubscribeEvent - public static void registerConduitCoreModelModifiers(RegisterConduitCoreModelModifiersEvent event) { - event.register(ConduitTypes.FLUID.get(), FluidConduitCoreModelModifier::new); + public static void registerConduitCoreModelModifiers(RegisterConduitModelModifiersEvent event) { + event.register(ConduitTypes.FLUID.get(), FluidConduitModelModifier::new); + event.register(ConduitTypes.ENERGY.get(), EnergyConduitModelModifier::new); } @SubscribeEvent @@ -77,8 +79,8 @@ public static void registerModels(ModelEvent.RegisterAdditional event) { } // Ensure conduit model modifiers are ready, then load all model dependencies. - ConduitCoreModelModifiers.init(); - ConduitCoreModelModifiers.getAllModelDependencies().forEach(event::register); + ConduitModelModifiers.init(); + ConduitModelModifiers.getAllModelDependencies().forEach(event::register); } @SubscribeEvent diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/NewItemConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/NewItemConduitScreenExtension.java deleted file mode 100644 index 3b37481671..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/NewItemConduitScreenExtension.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.enderio.conduits.client.gui.conduit; - -import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; -import com.enderio.conduits.api.screen.ConduitScreenExtension; -import com.enderio.conduits.api.screen.NewConduitScreenExtension; -import com.enderio.conduits.common.conduit.type.item.ItemConduitMenuData; -import com.enderio.conduits.common.init.ConduitLang; -import com.enderio.conduits.common.init.ConduitTypes; -import com.enderio.core.client.gui.widgets.ToggleIconButton; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import org.joml.Vector2i; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -public class NewItemConduitScreenExtension implements NewConduitScreenExtension { - - private static final ResourceLocation ICON_ROUND_ROBIN_ENABLED = EnderIO.loc("icon/round_robin_enabled"); - private static final ResourceLocation ICON_ROUND_ROBIN_DISABLED = EnderIO.loc("icon/round_robin_disabled"); - private static final ResourceLocation ICON_SELF_FEED_ENABLED = EnderIO.loc("icon/self_feed_enabled"); - private static final ResourceLocation ICON_SELF_FEED_DISABLED = EnderIO.loc("icon/self_feed_disabled"); - - @Override - public List createWidgets(Screen screen, ItemConduitMenuData menuData, CompoundTag clientDataTag, Vector2i widgetsStart) { - List widgets = new ArrayList<>(); - - widgets.add(ToggleIconButton.of( - widgetsStart.x() + 110, - widgetsStart.y() + 20, - 16, - 16, - ICON_ROUND_ROBIN_ENABLED, - ICON_ROUND_ROBIN_DISABLED, - ConduitLang.ROUND_ROBIN_ENABLED, - ConduitLang.ROUND_ROBIN_DISABLED, - menuData::isRoundRobin, - menuData::setIsRoundRobin)); - - widgets.add(ToggleIconButton.of( - widgetsStart.x() + 130, - widgetsStart.y() + 20, - 16, - 16, - ICON_SELF_FEED_ENABLED, - ICON_SELF_FEED_DISABLED, - ConduitLang.SELF_FEED_ENABLED, - ConduitLang.SELF_FEED_DISABLED, - menuData::isSelfFeed, - menuData::setIsSelfFeed)); - return widgets; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java index 4a32d2346d..633a6473fb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java @@ -7,9 +7,12 @@ import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ChannelResourceConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.api.menu.ConduitMenuComponent; +import com.enderio.conduits.api.menu.ConduitMenuType; import com.enderio.conduits.common.conduit.menu.NewConduitMenu; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; @@ -25,6 +28,8 @@ import net.minecraft.world.entity.player.Inventory; import net.neoforged.neoforge.network.PacketDistributor; +import java.util.function.Supplier; + public class NewConduitScreen extends EnderContainerScreen { public static final ResourceLocation TEXTURE = EnderIO.loc("textures/gui/conduit.png"); private static final int WIDTH = 206; @@ -111,6 +116,39 @@ protected void init() { // TODO: Conduit selection buttons } + // Example of conduit menu type thing. +// private ConduitMenuType EXAMPLE = ConduitMenuType.builder(ItemConduitConnectionConfig.TYPE) +// .layout(/* TODO */) // << Ignore, i was going to do the enable buttons here, but I think I'll just make those components too. +// .addComponent(new ConduitMenuComponent.ColorPicker<>(22, 7, ConduitLang.CONDUIT_CHANNEL, +// ItemConduitConnectionConfig::insertChannel, ItemConduitConnectionConfig::withInputChannel)) +// .addComponent(new ConduitMenuComponent.ColorPicker<>(22, 112, ConduitLang.CONDUIT_CHANNEL, +// ItemConduitConnectionConfig::extractChannel, ItemConduitConnectionConfig::withOutputChannel)) +// .addComponent(new ConduitMenuComponent.RedstoneControlPicker<>(22, 112, EIOLang.REDSTONE_MODE, +// ItemConduitConnectionConfig::redstoneControl, ItemConduitConnectionConfig::withRedstoneControl)) +// .build(); + + private void addComponents(ConduitMenuType menuType) { + Supplier config = () -> getConnectionConfig(menuType.connectionType()); + + for (var component : menuType.components()) { + int x = getGuiLeft() + component.x(); + int y = getGuiTop() + component.y(); + + if (component instanceof ConduitMenuComponent.Text text) { + // TODO + } else if (component instanceof ConduitMenuComponent.ToggleButton toggleButton) { + // TODO + } else if (component instanceof ConduitMenuComponent.ColorPicker colorPicker) { + addRenderableWidget(new DyeColorPickerWidget(x, y, + () -> colorPicker.getter().apply(config.get()), + color -> {}, // TODO: Send packet with component ID and value + colorPicker.title())); + } else if (component instanceof ConduitMenuComponent.RedstoneControlPicker redstoneControlPicker) { + // TODO + } + } + } + private BlockPos pos() { return menu.getBlockEntity().getBlockPos(); } @@ -123,24 +161,28 @@ private ConnectionConfig getConnectionConfig() { return menu.connectionConfig(); } - private ResourceConnectionConfig getIOConnectionConfig() { + private T getConnectionConfig(ConnectionConfigType configType) { + return menu.connectionConfig(configType); + } + + private IOConnectionConfig getIOConnectionConfig() { if (!menu.connectionConfigType().supportsIO()) { throw new IllegalStateException("Connection config type does not support IO"); } - if (!(getConnectionConfig() instanceof ResourceConnectionConfig resourceConnectionConfig)) { + if (!(getConnectionConfig() instanceof IOConnectionConfig ioConnectionConfig)) { throw new IllegalStateException("Connection config is not an IO connection config. Mismatch between connection type class and instance."); } - return resourceConnectionConfig; + return ioConnectionConfig; } - private ChannelResourceConnectionConfig getChannelledIOConnectionConfig() { + private ChanneledIOConnectionConfig getChannelledIOConnectionConfig() { if (!menu.connectionConfigType().supportsIOChannels()) { throw new IllegalStateException("Connection config type does not support IO"); } - if (!(getConnectionConfig() instanceof ChannelResourceConnectionConfig chanelledIOConnectionConfig)) { + if (!(getConnectionConfig() instanceof ChanneledIOConnectionConfig chanelledIOConnectionConfig)) { throw new IllegalStateException("Connection config is not an IO connection config. Mismatch between connection type class and instance."); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java index 14b924c943..0bd72689ef 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java @@ -4,13 +4,13 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.model.ConduitCoreModelModifier; +import com.enderio.conduits.api.model.ConduitModelModifier; import com.enderio.conduits.client.ConduitFacadeColor; import com.enderio.conduits.client.model.BoxTextureQuadTransformer; import com.enderio.conduits.client.model.ColorQuadTransformer; import com.enderio.conduits.client.model.ConduitTextureEmissiveQuadTransformer; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; -import com.enderio.conduits.client.model.conduit.modifier.ConduitCoreModelModifiers; +import com.enderio.conduits.client.model.conduit.modifier.ConduitModelModifiers; import com.enderio.conduits.common.Area; import com.enderio.conduits.common.conduit.OffsetHelper; import com.enderio.core.data.model.ModelHelper; @@ -110,10 +110,10 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction .process(modelOf(CONDUIT_CONNECTION).getQuads(state, preRotation, rand, extraData, renderType))); - ConduitCoreModelModifier conduitCoreModifier = ConduitCoreModelModifiers - .getModifier(conduit.value().type()); - if (conduitCoreModifier != null) { - quads.addAll(rotationTranslation.process(conduitCoreModifier.createConnectionQuads(conduit, + ConduitModelModifier conduitModelModifier = ConduitModelModifiers + .getModifier(conduit.value().type()); + if (conduitModelModifier != null) { + quads.addAll(rotationTranslation.process(conduitModelModifier.createConnectionQuads(conduit, clientData, side, direction, rand, renderType))); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java index bd9e85ae28..0dceb95114 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java @@ -2,13 +2,14 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.bundle.ConduitBundleReader; -import com.enderio.conduits.api.connection.ConduitConnectionType; -import com.enderio.conduits.api.network.node.NodeData; +import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.common.conduit.OffsetHelper; import java.util.HashMap; import java.util.List; import java.util.Map; + +import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; @@ -31,6 +32,7 @@ public class ConduitBundleRenderState { private BlockState facadeBlockstate; private boolean doesFacadeHideConduits; + @EnsureSide(EnsureSide.Side.CLIENT) public static ConduitBundleRenderState of(ConduitBundleReader bundle) { var renderState = new ConduitBundleRenderState(); @@ -54,9 +56,9 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { for (var side : Direction.values()) { HashMap>, ConduitConnectionRenderState> conduits = new HashMap<>(); for (var conduit : renderState.conduits) { - if (bundle.getConnectionType(side, conduit) == ConduitConnectionType.CONNECTED_BLOCK) { + if (bundle.getConnectionStatus(side, conduit) == ConnectionStatus.CONNECTED_BLOCK) { var connectionConfig = bundle.getConnectionConfig(side, conduit); - var connectionRenderState = ConduitConnectionRenderState.of(connectionConfig); + var connectionRenderState = ConduitConnectionRenderState.of(conduit, connectionConfig); conduits.put(conduit, connectionRenderState); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java index f3ef7a74c7..b6d66902e2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java @@ -1,9 +1,15 @@ package com.enderio.conduits.client.model.conduit.bundle; import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.api.model.ConduitModelModifier; +import com.enderio.conduits.client.model.conduit.modifier.ConduitModelModifiers; +import me.liliandev.ensure.ensures.EnsureSide; +import net.minecraft.core.Holder; import net.minecraft.world.item.DyeColor; public record ConduitConnectionRenderState( @@ -14,16 +20,29 @@ public record ConduitConnectionRenderState( RedstoneControl redstoneControl, DyeColor redstoneChannel ) { - public static ConduitConnectionRenderState of(ConnectionConfig connectionConfig) { + + @EnsureSide(EnsureSide.Side.CLIENT) + public static ConduitConnectionRenderState of(Holder> conduit, ConnectionConfig connectionConfig) { boolean canInput = false; boolean canOutput = false; DyeColor inputChannel = DyeColor.GREEN; DyeColor outputChannel = DyeColor.GREEN; - if (connectionConfig instanceof ResourceConnectionConfig resourceConnectionConfig) { - canInput = resourceConnectionConfig.canInsert(); - canOutput = resourceConnectionConfig.canExtract(); - inputChannel = resourceConnectionConfig.insertChannel(); - outputChannel = resourceConnectionConfig.extractChannel(); + if (connectionConfig instanceof IOConnectionConfig ioConnectionConfig) { + canInput = ioConnectionConfig.canInsert(); + canOutput = ioConnectionConfig.canExtract(); + + if (ioConnectionConfig instanceof ChanneledIOConnectionConfig channeledIOConnectionConfig) { + inputChannel = channeledIOConnectionConfig.insertChannel(); + outputChannel = channeledIOConnectionConfig.extractChannel(); + } else { + ConduitModelModifier conduitModelModifier = ConduitModelModifiers + .getModifier(conduit.value().type()); + + if (conduitModelModifier != null) { + inputChannel = conduitModelModifier.getDefaultArrowColor(); + outputChannel = conduitModelModifier.getDefaultArrowColor(); + } + } } RedstoneControl redstoneControl = RedstoneControl.ALWAYS_ACTIVE; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitCoreModelModifiers.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitModelModifiers.java similarity index 71% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitCoreModelModifiers.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitModelModifiers.java index 7e831c205f..3d53dd9b76 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitCoreModelModifiers.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitModelModifiers.java @@ -1,8 +1,8 @@ package com.enderio.conduits.client.model.conduit.modifier; import com.enderio.conduits.api.ConduitType; -import com.enderio.conduits.api.model.ConduitCoreModelModifier; -import com.enderio.conduits.api.model.RegisterConduitCoreModelModifiersEvent; +import com.enderio.conduits.api.model.ConduitModelModifier; +import com.enderio.conduits.api.model.RegisterConduitModelModifiersEvent; import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.client.resources.model.ModelResourceLocation; import net.neoforged.fml.ModLoader; @@ -13,12 +13,12 @@ import java.util.Set; import java.util.stream.Collectors; -public class ConduitCoreModelModifiers { - private static Map, ConduitCoreModelModifier> MODIFIERS; +public class ConduitModelModifiers { + private static Map, ConduitModelModifier> MODIFIERS; @EnsureSide(EnsureSide.Side.CLIENT) public static void init() { - var event = new RegisterConduitCoreModelModifiersEvent(); + var event = new RegisterConduitModelModifiersEvent(); ModLoader.postEvent(event); var factories = event.getModifiers(); @@ -28,7 +28,7 @@ public static void init() { @EnsureSide(EnsureSide.Side.CLIENT) @Nullable - public static ConduitCoreModelModifier getModifier(ConduitType type) { + public static ConduitModelModifier getModifier(ConduitType type) { return MODIFIERS.get(type); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/EnergyConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/EnergyConduitModelModifier.java new file mode 100644 index 0000000000..750a79f9b3 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/EnergyConduitModelModifier.java @@ -0,0 +1,11 @@ +package com.enderio.conduits.client.model.conduit.modifier; + +import com.enderio.conduits.api.model.ConduitModelModifier; +import net.minecraft.world.item.DyeColor; + +public class EnergyConduitModelModifier implements ConduitModelModifier { + @Override + public DyeColor getDefaultArrowColor() { + return DyeColor.RED; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitCoreModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java similarity index 90% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitCoreModelModifier.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java index 37b27ba2e0..848f3b14fa 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitCoreModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java @@ -2,12 +2,8 @@ import com.enderio.base.api.EnderIO; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.model.ConduitCoreModelModifier; -import com.enderio.conduits.api.network.node.NodeData; +import com.enderio.conduits.api.model.ConduitModelModifier; import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; -import com.enderio.conduits.common.conduit.type.fluid.FluidConduitData; -import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.client.RenderUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; @@ -31,7 +27,7 @@ import java.util.List; -public class FluidConduitCoreModelModifier implements ConduitCoreModelModifier { +public class FluidConduitModelModifier implements ConduitModelModifier { private static final ModelResourceLocation FLUID_MODEL = ModelResourceLocation.standalone(EnderIO.loc("block/extra/fluids")); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java index ce2541451e..34dfaf9fb7 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java @@ -326,7 +326,7 @@ public void connectTo(Level level, BlockPos pos, Direction direction, Holder> conduit) { for (int i = 0; i < conduits.size(); i++) { - if (conduit.value().canConnectTo(conduits.get(i))) { + if (conduit.value().canConnectToConduit(conduits.get(i))) { connections.get(direction).tryDisconnect(i); onChanged(); return true; @@ -342,7 +342,7 @@ public ConduitGraphObject getNodeForTypeExact(Holder> conduit) { public ConduitGraphObject getNodeFor(Holder> conduit) { for (var entry : conduitNodes.entrySet()) { - if (entry.getKey().value().canConnectTo(conduit)) { + if (entry.getKey().value().canConnectToConduit(conduit)) { return conduitNodes.get(entry.getKey()); } } @@ -375,7 +375,7 @@ private void removeNode(Level level, Holder> conduit, ConduitGraphObj public boolean hasType(Holder> conduitToFind) { for (var conduit : conduits) { - if (conduit.value().canConnectTo(conduitToFind)) { + if (conduit.value().canConnectToConduit(conduitToFind)) { return true; } } @@ -385,7 +385,7 @@ public boolean hasType(Holder> conduitToFind) { public int getConduitIndex(Holder> conduit) { for (int i = 0; i < conduits.size(); i++) { - if (conduits.get(i).value().canConnectTo(conduit)) { + if (conduits.get(i).value().canConnectToConduit(conduit)) { return i; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java index ce85977c66..dd43ccab4e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java @@ -260,7 +260,7 @@ public void updateConnections(Level level, BlockPos pos, @Nullable BlockPos from ConnectionState connectionState = bundle.getConnectionState(direction, conduit); if (connectionState instanceof DynamicConnectionState dyn) { - if (!conduit.value().canForceConnectTo(level, pos, direction)) { + if (!conduit.value().canForceConnectToBlock(level, pos, direction)) { // bundle.getNodeFor(conduit).clearState(direction); dropConnectionItems(dyn); bundle.setConnectionState(direction, conduit, StaticConnectionStates.DISCONNECTED); @@ -359,7 +359,7 @@ public AddConduitResult addType(Holder> conduit, Player player) { } if (action instanceof AddConduitResult.Upgrade upgrade - && !upgrade.replacedConduit().value().canConnectTo(conduit)) { + && !upgrade.replacedConduit().value().canConnectToConduit(conduit)) { removeNeighborConnections(upgrade.replacedConduit()); } @@ -409,8 +409,8 @@ public Optional> tryConnectTo(Direction dir, Ho } return Optional.of(adjacentBundle.getNodeFor(conduit)); - } else if (conduit.value().canConnectTo(level, getBlockPos(), dir) - || (forceConnect && conduit.value().canForceConnectTo(level, getBlockPos(), dir))) { + } else if (conduit.value().canConnectToBlock(level, getBlockPos(), dir) + || (forceConnect && conduit.value().canForceConnectToBlock(level, getBlockPos(), dir))) { if (bundle.getConnectionState(dir, conduit) instanceof DynamicConnectionState dyn && dyn.isConnection()) { // Already // connected onConnectionsUpdated(conduit); @@ -595,7 +595,7 @@ private boolean connectTo(Direction direction, Holder> conduit, Condu return false; } - if (!conduit.value().canConnectTo(bundle.getNodeFor(conduit), node)) { + if (!conduit.value().canConnectNodes(bundle.getNodeFor(conduit), node)) { return false; } @@ -609,7 +609,7 @@ private boolean connectTo(Direction direction, Holder> conduit, Condu private boolean doTypesMatch(Holder> conduitToMatch) { for (Holder> conduit : bundle.getConduits()) { - if (conduit.value().canConnectTo(conduitToMatch)) { + if (conduit.value().canConnectToConduit(conduitToMatch)) { return true; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java index d58332c490..b3a0d0410b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java @@ -6,7 +6,6 @@ import com.enderio.conduits.client.particle.ConduitBreakParticle; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.api.bundle.AddConduitResult; -import com.enderio.conduits.common.conduit.menu.NewConduitMenu; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitComponents; import java.util.Optional; @@ -14,19 +13,15 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; -import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java index 95e33a81f1..0b46871872 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java @@ -6,7 +6,7 @@ import com.enderio.conduits.api.bundle.ConduitInventory; import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.bundle.ConduitBundleAccessor; -import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.facade.FacadeType; import com.enderio.conduits.api.network.node.NodeData; @@ -307,7 +307,7 @@ public List>> getConduits() { @Override public boolean hasConduitByType(Holder> conduit) { - return conduits.stream().anyMatch(c -> c.value().canConnectTo(conduit)); + return conduits.stream().anyMatch(c -> c.value().canConnectToConduit(conduit)); } @Override @@ -463,7 +463,7 @@ public AddConduitResult addConduit(Holder> conduit, @Nullable Player } if (result instanceof AddConduitResult.Upgrade upgrade - && !upgrade.replacedConduit().value().canConnectTo(conduit)) { + && !upgrade.replacedConduit().value().canConnectToConduit(conduit)) { removeNeighborConnections(conduit); } @@ -604,15 +604,15 @@ private void setNode(Holder> conduit, ConduitGraphObject loadedNode) public List>> getConnectedConduits(Direction side) { return conduitConnections.entrySet() .stream() - .filter(e -> e.getValue().getType(side).isConnected()) + .filter(e -> e.getValue().getStatus(side).isConnected()) .map(Map.Entry::getKey) .sorted(Comparator.comparingInt(ConduitSorter::getSortIndex)) .toList(); } @Override - public ConduitConnectionType getConnectionType(Direction side, Holder> conduit) { - return conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new).getType(side); + public ConnectionStatus getConnectionStatus(Direction side, Holder> conduit) { + return conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new).getStatus(side); } @Override @@ -632,12 +632,12 @@ public void setConnectionConfig(Direction side, Holder> conduit, Conn // Intended for use by the menu, might need a better interface? @EnsureSide(EnsureSide.Side.SERVER) - public void setConnectionType(Direction side, Holder> conduit, ConduitConnectionType type) { + public void setConnectionStatus(Direction side, Holder> conduit, ConnectionStatus status) { if (!hasConduitStrict(conduit)) { throw new IllegalArgumentException("Conduit is not present in this bundle."); } - conduitConnections.get(conduit).setType(side, type); + conduitConnections.get(conduit).setStatus(side, status); bundleChanged(); } @@ -658,16 +658,16 @@ public boolean canConnectTo(Direction side, Holder> conduit, ConduitG return false; } - if (!conduit.value().canConnectTo(conduitNodes.get(conduit), otherNode)) { + if (!conduit.value().canConnectNodes(conduitNodes.get(conduit), otherNode)) { return false; } - return isForcedConnection || conduitConnections.get(conduit).getType(side) != ConduitConnectionType.DISABLED; + return isForcedConnection || conduitConnections.get(conduit).getStatus(side) != ConnectionStatus.DISABLED; } private boolean doTypesMatch(Holder> conduitToMatch) { for (Holder> conduit : conduits) { - if (conduit.value().canConnectTo(conduitToMatch)) { + if (conduit.value().canConnectToConduit(conduitToMatch)) { return true; } } @@ -686,9 +686,9 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boolean // Don't attempt a connection if we already have one, or we're disabled (and not // forcing a connection) - ConduitConnectionType currentConnectionType = conduitConnections.get(conduit).getType(side); - if (currentConnectionType.isConnected() - || (!isForcedConnection && currentConnectionType == ConduitConnectionType.DISABLED)) { + ConnectionStatus currentStatus = conduitConnections.get(conduit).getStatus(side); + if (currentStatus.isConnected() + || (!isForcedConnection && currentStatus == ConnectionStatus.DISABLED)) { return false; } @@ -715,8 +715,8 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boolean } return false; - } else if (conduit.value().canConnectTo(level, getBlockPos(), side) - || (isForcedConnection && conduit.value().canForceConnectTo(level, getBlockPos(), side))) { + } else if (conduit.value().canConnectToBlock(level, getBlockPos(), side) + || (isForcedConnection && conduit.value().canForceConnectToBlock(level, getBlockPos(), side))) { connectBlock(side, conduit); return true; } @@ -729,7 +729,7 @@ public void onConnectionsUpdated(Holder> conduit) { var node = getConduitNode(conduit); Set connectedSides = Arrays.stream(Direction.values()) - .filter(direction -> getConnectionType(direction, conduit).isConnected()) + .filter(direction -> getConnectionStatus(direction, conduit).isConnected()) .collect(Collectors.toSet()); conduit.value().onConnectionsUpdated(node, level, getBlockPos(), connectedSides); @@ -738,7 +738,7 @@ public void onConnectionsUpdated(Holder> conduit) { private void connectConduit(Direction side, Holder> conduit) { conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) - .setType(side, ConduitConnectionType.CONNECTED_CONDUIT); + .setStatus(side, ConnectionStatus.CONNECTED_CONDUIT); onConnectionsUpdated(conduit); setChanged(); level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); @@ -747,7 +747,7 @@ private void connectConduit(Direction side, Holder> conduit) { private void connectBlock(Direction side, Holder> conduit) { conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) - .setType(side, ConduitConnectionType.CONNECTED_BLOCK); + .setStatus(side, ConnectionStatus.CONNECTED_BLOCK); onConnectionsUpdated(conduit); setChanged(); level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); @@ -759,9 +759,9 @@ private void connectBlock(Direction side, Holder> conduit) { private void disconnect(Direction side, Holder> conduit) { boolean hasChanged = false; for (var c : conduits) { - if (c.value().canConnectTo(conduit)) { + if (c.value().canConnectToConduit(conduit)) { conduitConnections.computeIfAbsent(c, ConnectionContainer::new) - .setType(side, ConduitConnectionType.NONE); + .setStatus(side, ConnectionStatus.DISCONNECTED); onConnectionsUpdated(c); hasChanged = true; } @@ -797,12 +797,12 @@ public void updateConnections(Level level, BlockPos pos, @Nullable BlockPos from continue; } - var currentConnectionType = getConnectionType(side, conduit); + var currentStatus = getConnectionStatus(side, conduit); - if (currentConnectionType == ConduitConnectionType.NONE) { + if (currentStatus == ConnectionStatus.DISCONNECTED) { tryConnectTo(side, conduit, false); - } else if (currentConnectionType == ConduitConnectionType.CONNECTED_BLOCK) { - if (!conduit.value().canForceConnectTo(level, getBlockPos(), side)) { + } else if (currentStatus == ConnectionStatus.CONNECTED_BLOCK) { + if (!conduit.value().canForceConnectToBlock(level, getBlockPos(), side)) { disconnect(side, conduit); onConnectionsUpdated(conduit); } @@ -1059,7 +1059,7 @@ protected void saveAdditionalSynced(CompoundTag tag, HolderLookup.Provider regis for (Direction side : Direction.values()) { CompoundTag connectionTag = new CompoundTag(); connectionTag.putString("Side", side.getSerializedName()); - connectionTag.putString("Type", getConnectionType(side, conduit).getSerializedName()); + connectionTag.putString("Status", getConnectionStatus(side, conduit).getSerializedName()); var config = getConnectionConfig(side, conduit); if (!config.equals(config.type().getDefault())) { @@ -1112,10 +1112,10 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) for (int j = 0; j < connectionsList.size(); j++) { CompoundTag connectionTag = connectionsList.getCompound(j); Direction side = Direction.byName(connectionTag.getString("Side")); - ConduitConnectionType type = ConduitConnectionType.byName(connectionTag.getString("Type")); + ConnectionStatus status = ConnectionStatus.byName(connectionTag.getString("Status")); - if (side != null && type != null) { - connections.setType(side, type); + if (side != null && status != null) { + connections.setStatus(side, status); if (connectionTag.contains("Config")) { ConnectionConfig config = ConnectionConfig.GENERIC_CODEC.parse(registries.createSerializationContext(NbtOps.INSTANCE), connectionTag.get("Config")).getOrThrow(); @@ -1199,13 +1199,13 @@ private void loadFromLegacyBundle(LegacyConduitBundle bundle) { var state = legacySide.getConnectionState(conduitIndex); if (state == StaticConnectionStates.CONNECTED || state == StaticConnectionStates.CONNECTED_ACTIVE) { - connections.setType(side, ConduitConnectionType.CONNECTED_CONDUIT); + connections.setStatus(side, ConnectionStatus.CONNECTED_CONDUIT); } else if (state == StaticConnectionStates.DISCONNECTED) { - connections.setType(side, ConduitConnectionType.NONE); + connections.setStatus(side, ConnectionStatus.DISCONNECTED); } else if (state == StaticConnectionStates.DISABLED) { - connections.setType(side, ConduitConnectionType.DISABLED); + connections.setStatus(side, ConnectionStatus.DISABLED); } else if (state instanceof DynamicConnectionState dynamicState) { - connections.setType(side, ConduitConnectionType.CONNECTED_BLOCK); + connections.setStatus(side, ConnectionStatus.CONNECTED_BLOCK); connections.setConfig(side, conduit.value().convertConnection(dynamicState.isInsert(), dynamicState.isExtract(), dynamicState.insertChannel(), dynamicState.extractChannel(), dynamicState.control(), @@ -1232,39 +1232,39 @@ public void clearContent() { private class ConnectionContainer { private final Holder> conduit; - private final Map connectionTypes = new EnumMap<>(Direction.class); - private final Map connectionConfigs = new EnumMap<>(Direction.class); + private final Map statuses = new EnumMap<>(Direction.class); + private final Map configs = new EnumMap<>(Direction.class); public ConnectionContainer(Holder> conduit) { this.conduit = conduit; for (Direction dir : Direction.values()) { - connectionTypes.put(dir, ConduitConnectionType.NONE); + statuses.put(dir, ConnectionStatus.DISCONNECTED); } } public ConnectionContainer copyFor(Holder> conduit) { var copy = new ConnectionContainer(conduit); - copy.connectionTypes.putAll(connectionTypes); + copy.statuses.putAll(statuses); // Only copy connection config if compatible. if (this.conduit.value().connectionConfigType() == conduit.value().connectionConfigType()) { - copy.connectionConfigs.putAll(connectionConfigs); + copy.configs.putAll(configs); } return copy; } - public ConduitConnectionType getType(Direction side) { - return connectionTypes.getOrDefault(side, ConduitConnectionType.NONE); + public ConnectionStatus getStatus(Direction side) { + return statuses.getOrDefault(side, ConnectionStatus.DISCONNECTED); } - public void setType(Direction side, ConduitConnectionType type) { - connectionTypes.put(side, type); + public void setStatus(Direction side, ConnectionStatus status) { + statuses.put(side, status); - if (type == ConduitConnectionType.CONNECTED_BLOCK) { - if (connectionConfigs.containsKey(side)) { - var config = connectionConfigs.get(side); + if (status == ConnectionStatus.CONNECTED_BLOCK) { + if (configs.containsKey(side)) { + var config = configs.get(side); if (!config.isConnected()) { - connectionConfigs.put(side, config.reconnected()); + configs.put(side, config.reconnected()); } } } @@ -1272,25 +1272,25 @@ public void setType(Direction side, ConduitConnectionType type) { public ConnectionConfig getConfig(Direction side) { var defaultConfig = conduit.value().connectionConfigType().getDefault(); - var config = connectionConfigs.getOrDefault(side, defaultConfig); + var config = configs.getOrDefault(side, defaultConfig); // Ensure the connection type is correct. // If it isn't, revert to the default. if (config.type() != conduit.value().connectionConfigType()) { config = conduit.value().connectionConfigType().getDefault(); - connectionConfigs.put(side, config); - bundleChanged(); // TODO: is this right? + configs.put(side, config); + bundleChanged(); } return config; } public void setConfig(Direction side, ConnectionConfig config) { - connectionConfigs.put(side, config); + configs.put(side, config); } public boolean hasEndpoint(Direction side) { - return getType(side) == ConduitConnectionType.CONNECTED_BLOCK; + return getStatus(side) == ConnectionStatus.CONNECTED_BLOCK; } } @@ -1303,7 +1303,7 @@ public BlockPos pos() { @Override public boolean isConnectedTo(Direction side) { - return conduitBundle.getConnectionType(side, conduit) == ConduitConnectionType.CONNECTED_BLOCK; + return conduitBundle.getConnectionStatus(side, conduit) == ConnectionStatus.CONNECTED_BLOCK; } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java index 20e3539760..0bc2ab927a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java @@ -2,7 +2,7 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.bundle.ConduitBundleReader; -import com.enderio.conduits.api.connection.ConduitConnectionType; +import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.common.Area; import com.enderio.conduits.common.conduit.OffsetHelper; import java.util.*; @@ -14,7 +14,6 @@ import net.minecraft.core.Vec3i; import net.minecraft.util.Mth; import net.minecraft.world.level.block.Block; -import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.BooleanOp; @@ -121,7 +120,7 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder T connectionConfig(ConnectionConfigType type) { + var config = getBlockEntity().getConnectionConfig(side, selectedConduit); + if (config.type() == type) { + //noinspection unchecked + return (T) config; + } + + throw new IllegalStateException("Connection config type mismatch"); + } + public boolean isConnected() { - return getBlockEntity().getConnectionType(side, selectedConduit) == ConduitConnectionType.CONNECTED_BLOCK; + return getBlockEntity().getConnectionStatus(side, selectedConduit) == ConnectionStatus.CONNECTED_BLOCK; } public CompoundTag getClientDataTag() { @@ -94,35 +104,35 @@ public boolean clickMenuButton(Player player, int id) { switch (id) { case BUTTON_TOGGLE_0_ID: - if (currentConfig instanceof ResourceConnectionConfig ioConfig) { + if (currentConfig instanceof IOConnectionConfig ioConfig) { var newConfig = ioConfig.withInsert(!ioConfig.canInsert()); bundle.setConnectionConfig(side, selectedConduit, newConfig); if (newConfig.isConnected()) { - bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.CONNECTED_BLOCK); + bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.CONNECTED_BLOCK); } else { - bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.NONE); + bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.DISCONNECTED); } } else { // Non IO connections are controlled soley by the connection type. - var connectionType = bundle.getConnectionType(side, selectedConduit); - if (connectionType == ConduitConnectionType.CONNECTED_BLOCK) { - bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.NONE); + var connectionType = bundle.getConnectionStatus(side, selectedConduit); + if (connectionType == ConnectionStatus.CONNECTED_BLOCK) { + bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.DISCONNECTED); } else { - bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.CONNECTED_BLOCK); + bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.CONNECTED_BLOCK); } } return true; case BUTTON_TOGGLE_1_ID: - if (currentConfig instanceof ResourceConnectionConfig ioConfig) { + if (currentConfig instanceof IOConnectionConfig ioConfig) { var newConfig = ioConfig.withExtract(!ioConfig.canExtract()); bundle.setConnectionConfig(side, selectedConduit, newConfig); if (newConfig.isConnected()) { - bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.CONNECTED_BLOCK); + bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.CONNECTED_BLOCK); } else { - bundle.setConnectionType(side, selectedConduit, ConduitConnectionType.NONE); + bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.DISCONNECTED); } } return true; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index aadeed0a65..652be6b3f0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -5,7 +5,7 @@ import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.common.init.ConduitLang; @@ -27,6 +27,7 @@ import net.minecraft.world.level.Level; import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -84,6 +85,12 @@ public boolean canBeReplacedBy(Holder> otherConduit) { return compareTo(otherEnergyConduit) < 0; } + @Override + public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { + IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, conduitPos.relative(direction), direction.getOpposite()); + return capability != null; + } + @Override public @Nullable TCap proxyCapability(BlockCapability capability, ConduitNode node, Level level, BlockPos pos, @Nullable TContext context) { @@ -100,7 +107,7 @@ public boolean canBeReplacedBy(Holder> otherConduit) { return null; } - if (config instanceof ResourceConnectionConfig ioConfig && !ioConfig.canInsert()) { + if (config instanceof IOConnectionConfig ioConfig && !ioConfig.canInsert()) { return null; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java index f16858c77f..b8b0e0fd6d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java @@ -3,7 +3,7 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; @@ -15,7 +15,7 @@ public record EnergyConduitConnectionConfig( boolean canExtract, RedstoneControl redstoneControl, DyeColor redstoneChannel -) implements ResourceConnectionConfig, RedstoneControlledConnection { +) implements IOConnectionConfig, RedstoneControlledConnection { public static EnergyConduitConnectionConfig DEFAULT = new EnergyConduitConnectionConfig(true, true, RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); @@ -37,23 +37,12 @@ public ConnectionConfig reconnected() { } @Override - public DyeColor insertChannel() { - return DyeColor.RED; - } - - @Override - public DyeColor extractChannel() { - return DyeColor.RED; - } - - - @Override - public ResourceConnectionConfig withInsert(boolean canInsert) { + public IOConnectionConfig withInsert(boolean canInsert) { return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); } @Override - public ResourceConnectionConfig withExtract(boolean canExtract) { + public IOConnectionConfig withExtract(boolean canExtract) { return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java index b1362866c9..4a8b48d64c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java @@ -78,15 +78,4 @@ public void tickColoredGraph(ServerLevel level, EnergyConduit conduit, List extractList, List insertList) { return insertList.isEmpty(); } - - @Override - public boolean canConnectTo(Level level, BlockPos conduitPos, Direction direction) { - if (level.getBlockEntity(conduitPos.relative(direction)) instanceof ConduitBundleBlockEntity) { - return false; - } - - IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, - conduitPos.relative(direction), direction.getOpposite()); - return capability != null; - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index e949695bb6..e8ce87788a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -22,6 +22,8 @@ import java.util.Objects; import java.util.function.Consumer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; @@ -31,7 +33,10 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; import net.minecraft.world.level.material.Fluids; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; import org.jetbrains.annotations.NotNull; public record FluidConduit(ResourceLocation texture, Component description, int transferRatePerTick, @@ -83,7 +88,7 @@ public boolean canBeReplacedBy(Holder> otherConduit) { } @Override - public boolean canConnectTo(ConduitNode selfNode, ConduitNode otherNode) { + public boolean canConnectNodes(ConduitNode selfNode, ConduitNode otherNode) { // Ensure the networks are not locked to different fluids before connecting. var selfNetwork = selfNode.getNetwork(); var otherNetwork = otherNode.getNetwork(); @@ -104,6 +109,12 @@ public boolean canConnectTo(ConduitNode selfNode, ConduitNode otherNode) { return selfContext.lockedFluid() == otherContext.lockedFluid(); } + @Override + public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { + IFluidHandler capability = level.getCapability(Capabilities.FluidHandler.BLOCK, conduitPos.relative(direction), direction.getOpposite()); + return capability != null; + } + @Override public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { return resourceFilter instanceof FluidStackFilter; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java index a4726ba6ba..10f33f502d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java @@ -18,6 +18,7 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; @@ -25,6 +26,9 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -92,6 +96,12 @@ public boolean showDebugTooltip() { return true; } + @Override + public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { + IItemHandler capability = level.getCapability(Capabilities.ItemHandler.BLOCK, conduitPos.relative(direction), direction.getOpposite()); + return capability != null; + } + @Override public ConnectionConfigType connectionConfigType() { return ConduitTypes.ConnectionTypes.ITEM.get(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java index d7dd90c302..284c47b5bc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java @@ -2,9 +2,9 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ChannelResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.ResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.enderio.conduits.common.init.ConduitTypes; import com.mojang.serialization.Codec; @@ -22,7 +22,7 @@ public record ItemConduitConnectionConfig( boolean isRoundRobin, boolean isSelfFeed, int priority -) implements ChannelResourceConnectionConfig, RedstoneControlledConnection { +) implements ChanneledIOConnectionConfig, RedstoneControlledConnection { public static ItemConduitConnectionConfig DEFAULT = new ItemConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); @@ -50,27 +50,27 @@ public ConnectionConfig reconnected() { } @Override - public ResourceConnectionConfig withInsert(boolean canInsert) { + public IOConnectionConfig withInsert(boolean canInsert) { return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); } @Override - public ResourceConnectionConfig withExtract(boolean canExtract) { + public IOConnectionConfig withExtract(boolean canExtract) { return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); } @Override - public ChannelResourceConnectionConfig withInputChannel(DyeColor inputChannel) { + public ItemConduitConnectionConfig withInputChannel(DyeColor inputChannel) { return new ItemConduitConnectionConfig(canInsert, inputChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); } @Override - public ChannelResourceConnectionConfig withOutputChannel(DyeColor outputChannel) { + public ItemConduitConnectionConfig withOutputChannel(DyeColor outputChannel) { return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, outputChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); } @Override - public RedstoneControlledConnection withRedstoneControl(RedstoneControl redstoneControl) { + public ItemConduitConnectionConfig withRedstoneControl(RedstoneControl redstoneControl) { return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitMenuData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitMenuData.java deleted file mode 100644 index 3436abfcdc..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitMenuData.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.enderio.conduits.common.conduit.type.item; - -import com.enderio.conduits.api.menu.ConduitMenuData; -import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.core.common.network.menu.BoolSyncSlot; - -public class ItemConduitMenuData extends ConduitMenuData { - - private final BoolSyncSlot isRoundRobinSlot; - private final BoolSyncSlot isSelfFeedSlot; - - public ItemConduitMenuData(ConduitNode node, ConduitMenuAccess menu) { - super(node, menu); - - // TODO: add updatable sync slot. - isRoundRobinSlot = menu.addUpdatableSyncSlot( - BoolSyncSlot.readOnly(() -> connectionConfig().isRoundRobin()) - ); - - isSelfFeedSlot = menu.addUpdatableSyncSlot( - BoolSyncSlot.readOnly(() -> connectionConfig().isSelfFeed()) - ); - } - - public ItemConduitMenuData(ConduitMenuAccess menu) { - super(menu); - - isRoundRobinSlot = BoolSyncSlot.standalone(); - isSelfFeedSlot = BoolSyncSlot.standalone(); - } - - public ItemConduitConnectionConfig connectionConfig() { - return menu.getConnectionConfig(ItemConduitConnectionConfig.TYPE); - } - - public boolean isRoundRobin() { - return isRoundRobinSlot.get(); - } - - public void setIsRoundRobin(boolean isRoundRobin) { - isRoundRobinSlot.set(isRoundRobin); - menu.updateSlot(isRoundRobinSlot); - } - - public boolean isSelfFeed() { - return isSelfFeedSlot.get(); - } - - public void setIsSelfFeed(boolean isSelfFeed) { - isSelfFeedSlot.set(isSelfFeed); - menu.updateSlot(isSelfFeedSlot); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java index 13493f448e..eaa6154781 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java @@ -13,13 +13,18 @@ import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.redstone.RedstoneExtractFilter; import com.enderio.conduits.common.redstone.RedstoneInsertFilter; +import com.enderio.conduits.common.tag.ConduitTags; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -78,6 +83,21 @@ public ResourceLocation getTexture(@Nullable CompoundTag clientDataTag) { return texture(); } + @Override + public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { + BlockPos neighbor = conduitPos.relative(direction); + BlockState blockState = level.getBlockState(neighbor); + return blockState.is(ConduitTags.Blocks.REDSTONE_CONNECTABLE) + || blockState.canRedstoneConnectTo(level, neighbor, direction.getOpposite()); + } + + @Override + public boolean canForceConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { + BlockPos neighbor = conduitPos.relative(direction); + BlockState blockState = level.getBlockState(neighbor); + return !blockState.isAir(); + } + @Override public ConnectionConfigType connectionConfigType() { // return SimpleConnectionConfig.TYPE; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java index 7e52793d53..5227d204ff 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java @@ -23,21 +23,6 @@ public class RedstoneConduitTicker implements IOAwareConduitTicker activeColors = new EnumMap<>(DyeColor.class); - @Override - public boolean canConnectTo(Level level, BlockPos conduitPos, Direction direction) { - BlockPos neighbor = conduitPos.relative(direction); - BlockState blockState = level.getBlockState(neighbor); - return blockState.is(ConduitTags.Blocks.REDSTONE_CONNECTABLE) - || blockState.canRedstoneConnectTo(level, neighbor, direction); - } - - @Override - public boolean canForceConnectTo(Level level, BlockPos conduitPos, Direction direction) { - BlockPos neighbor = conduitPos.relative(direction); - BlockState blockState = level.getBlockState(neighbor); - return !blockState.isAir(); - } - @Override public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java index 265137b784..a09a324817 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java @@ -1,13 +1,11 @@ package com.enderio.conduits.common.init; import com.enderio.conduits.EnderIOConduits; -import com.enderio.conduits.client.gui.ConduitScreen; import com.enderio.conduits.client.gui.RedstoneCountFilterScreen; import com.enderio.conduits.client.gui.RedstoneDoubleChannelFilterScreen; import com.enderio.conduits.client.gui.RedstoneTimerFilterScreen; import com.enderio.conduits.client.gui.screen.NewConduitScreen; import com.enderio.conduits.common.conduit.menu.NewConduitMenu; -import com.enderio.conduits.common.menu.ConduitMenu; import com.enderio.conduits.common.menu.RedstoneCountFilterMenu; import com.enderio.conduits.common.menu.RedstoneDoubleChannelFilterMenu; import com.enderio.conduits.common.menu.RedstoneTimerFilterMenu; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java index e76c8329fe..7fbdedd20c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java @@ -3,7 +3,7 @@ import com.enderio.base.common.init.EIOCapabilities; import com.enderio.conduits.api.bundle.ConduitBundleAccessor; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ChannelResourceConnectionConfig; +import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import com.enderio.conduits.common.menu.ConduitMenu; @@ -86,7 +86,7 @@ public void handleCountFilter(CountFilterPacket packet, IPayloadContext context) public void handleSetConduitChannelPacket(C2SSetConduitChannelPacket packet, IPayloadContext context) { handleConduitConfigPacket(packet, context, (p, conduitBundle, currentConfig) -> { - if (currentConfig instanceof ChannelResourceConnectionConfig channelledConnectionConfig) { + if (currentConfig instanceof ChanneledIOConnectionConfig channelledConnectionConfig) { if (packet.channelSide() == C2SSetConduitChannelPacket.Side.INPUT) { conduitBundle.setConnectionConfig(p.side(), p.conduit(), channelledConnectionConfig.withInputChannel(p.channelColor())); From c5d1ea81ca4adb8283df493952625122becc415a Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Wed, 8 Jan 2025 16:13:55 +0000 Subject: [PATCH 09/27] chore: Strongly-typed connections in Conduit class and rewritten tickers --- .../enderio/modconduits/ConduitModule.java | 2 +- .../mods/appeng/AE2ConduitsModule.java | 6 +- .../modconduits/mods/appeng/MEConduit.java | 4 +- .../mods/mekanism/ChemicalConduit.java | 4 +- .../mods/mekanism/MekanismModule.java | 10 +- .../refinedstorage/RefinedStorageModule.java | 4 +- .../conduits/api/ColoredRedstoneProvider.java | 4 +- .../com/enderio/conduits/api/Conduit.java | 22 +-- .../com/enderio/conduits/api/ConduitApi.java | 8 +- .../com/enderio/conduits/api/ConduitType.java | 14 +- .../api/EnderIOConduitsRegistries.java | 2 +- .../conduits/api/bundle/AddConduitResult.java | 2 +- .../api/bundle/ConduitBundleAccessor.java | 12 +- .../api/bundle/ConduitBundleReader.java | 16 +- .../conduits/api/menu/ConduitMenuType.java | 4 +- .../api/model/ConduitModelModifier.java | 2 +- .../RegisterConduitModelModifiersEvent.java | 2 +- .../RegisterConduitScreenExtensionsEvent.java | 2 +- .../ticker/ChannelIOAwareConduitTicker.java | 149 ++++++++++++++++++ .../conduits/api/ticker/ConduitTicker.java | 3 +- .../api/ticker/IOAwareConduitTicker.java | 96 ++++++----- .../api/ticker/LoadedAwareConduitTicker.java | 2 +- .../conduits/client/gui/ConduitScreen.java | 14 +- .../client/gui/ConduitSelectionButton.java | 10 +- .../model/conduit/ConduitItemModel.java | 6 +- .../conduit/bundle/ConduitBundleModel.java | 14 +- .../bundle/ConduitBundleRenderState.java | 20 +-- .../bundle/ConduitConnectionRenderState.java | 2 +- .../modifier/FluidConduitModelModifier.java | 2 +- .../client/particle/ConduitBreakParticle.java | 2 +- .../common/conduit/ConduitA11yManager.java | 4 +- .../common/conduit/ConduitApiImpl.java | 6 +- .../common/conduit/ConduitBlockItem.java | 8 +- .../common/conduit/ConduitBundle.java | 52 +++--- .../common/conduit/ConduitSavedData.java | 35 ++-- .../conduits/common/conduit/ConduitShape.java | 12 +- .../common/conduit/ConduitSorter.java | 16 +- .../conduit/block/ConduitBundleBlock.java | 30 ++-- .../block/ConduitBundleBlockEntity.java | 64 ++++---- .../conduit/bundle/NewConduitBundleBlock.java | 12 +- .../bundle/NewConduitBundleBlockEntity.java | 102 ++++++------ .../bundle/NewConduitBundleInventory.java | 18 +-- .../conduit/bundle/NewConduitShape.java | 18 +-- .../connection/DynamicConnectionState.java | 2 +- .../conduit/graph/ConduitConnectionHost.java | 2 +- .../conduit/graph/ConduitGraphContext.java | 4 +- .../conduit/graph/ConduitGraphUtility.java | 6 +- .../common/conduit/menu/NewConduitMenu.java | 6 +- .../conduit/type/energy/EnergyConduit.java | 47 ++++-- .../type/energy/EnergyConduitStorage.java | 3 +- .../type/energy/EnergyConduitTicker.java | 48 ++++-- .../conduit/type/fluid/FluidConduit.java | 17 +- .../fluid/FluidConduitConnectionConfig.java | 81 ++++++++++ .../type/fluid/FluidConduitTicker.java | 85 ++++------ .../common/conduit/type/item/ItemConduit.java | 9 +- .../item/ItemConduitConnectionConfig.java | 2 +- .../conduit/type/item/ItemConduitTicker.java | 55 +++++-- .../type/redstone/RedstoneConduit.java | 12 +- .../RedstoneConduitConnectionConfig.java | 64 ++++++++ .../type/redstone/RedstoneConduitTicker.java | 45 +++--- .../common/init/ConduitComponents.java | 2 +- .../conduits/common/init/Conduits.java | 22 +-- .../cctweaked/EIOBundledRedstoneProvider.java | 2 +- .../jei/ConduitSubtypeInterpreter.java | 2 +- .../conduits/common/menu/ConduitMenu.java | 10 +- .../network/C2SSetConduitConnectionState.java | 2 +- .../network/C2SSetConduitExtendedData.java | 2 +- .../network/ConduitMenuSelectionPacket.java | 2 +- .../C2SConduitConnectionPacket.java | 2 +- .../C2SSetConduitChannelPacket.java | 2 +- .../C2SSetConduitRedstoneChannelPacket.java | 2 +- .../C2SSetConduitRedstoneControlPacket.java | 2 +- .../common/recipe/ConduitIngredient.java | 10 +- .../conduits/data/recipe/ConduitRecipes.java | 2 +- 74 files changed, 859 insertions(+), 510 deletions(-) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/ConduitModule.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/ConduitModule.java index 339c77797d..e3f34bda8a 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/ConduitModule.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/ConduitModule.java @@ -12,7 +12,7 @@ public interface ConduitModule { void register(IEventBus modEventBus); - void bootstrapConduits(BootstrapContext> context); + void bootstrapConduits(BootstrapContext> context); void buildConduitConditions(BiConsumer, ICondition> conditions); void buildRecipes(HolderLookup.Provider lookupProvider, RecipeOutput recipeOutput); } diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/AE2ConduitsModule.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/AE2ConduitsModule.java index 6cf3bbb424..a74172b8b8 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/AE2ConduitsModule.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/AE2ConduitsModule.java @@ -53,9 +53,9 @@ public class AE2ConduitsModule implements ConduitModule { .exposeCapability(AECapabilities.IN_WORLD_GRID_NODE_HOST) .build()); - public static ResourceKey> NORMAL = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> NORMAL = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("me")); - public static ResourceKey> DENSE = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> DENSE = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("dense_me")); public static final Supplier> DATA = CONDUIT_DATA_TYPES.register("me", @@ -97,7 +97,7 @@ private void registerFacadeCapability(RegisterCapabilitiesEvent event) { } @Override - public void bootstrapConduits(BootstrapContext> context) { + public void bootstrapConduits(BootstrapContext> context) { context.register(NORMAL, new MEConduit(EnderIO.loc("block/conduit/me"), LANG_ME_CONDUIT, false)); context.register(DENSE, new MEConduit(EnderIO.loc("block/conduit/dense_me"), LANG_DENSE_ME_CONDUIT, true)); } diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/MEConduit.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/MEConduit.java index 1dba554470..f527e0319e 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/MEConduit.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/appeng/MEConduit.java @@ -66,7 +66,7 @@ public boolean hasConnectionDelay() { } @Override - public boolean canConnectTo(Holder> other) { + public boolean canConnectTo(Holder> other) { return other.value().type() == type(); } @@ -110,7 +110,7 @@ private void initMainNode(Level level, ConduitInWorldGridNodeHost nodeHost) { throw new UnsupportedOperationException("mainNode is already initialized"); } - Holder> asHolder = level.registryAccess().registryOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT).wrapAsHolder(this); + Holder> asHolder = level.registryAccess().registryOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT).wrapAsHolder(this); mainNode = GridHelper.createManagedNode(nodeHost, GridNodeListener.INSTANCE) .setVisualRepresentation(ConduitBlockItem.getStackFor(asHolder, 1)) diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduit.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduit.java index dfaa859bbb..262865c3cc 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduit.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/ChemicalConduit.java @@ -58,7 +58,7 @@ public ConduitMenuData getMenuData() { } @Override - public boolean canBeInSameBundle(Holder> otherConduit) { + public boolean canBeInSameBundle(Holder> otherConduit) { if (otherConduit.value().type() != type()) { return true; } @@ -67,7 +67,7 @@ public boolean canBeInSameBundle(Holder> otherConduit) { } @Override - public boolean canBeReplacedBy(Holder> otherConduit) { + public boolean canBeReplacedBy(Holder> otherConduit) { if (otherConduit.value().type() != type()) { return false; } diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MekanismModule.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MekanismModule.java index af720f9b3d..23f8b83066 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MekanismModule.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/mekanism/MekanismModule.java @@ -106,13 +106,13 @@ public static class Item { } } - public static final ResourceKey> CHEMICAL = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static final ResourceKey> CHEMICAL = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("chemical")); - public static final ResourceKey> PRESSURIZED_CHEMICAL = ResourceKey + public static final ResourceKey> PRESSURIZED_CHEMICAL = ResourceKey .create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("pressurized_chemical")); - public static final ResourceKey> ENDER_CHEMICAL = ResourceKey + public static final ResourceKey> ENDER_CHEMICAL = ResourceKey .create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("ender_chemical")); - public static final ResourceKey> HEAT = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static final ResourceKey> HEAT = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("heat")); public static final Supplier> CHEMICAL_DATA_TYPE = CONDUIT_DATA_TYPES @@ -161,7 +161,7 @@ public void registerScreen(RegisterConduitScreenExtensionsEvent event) { } @Override - public void bootstrapConduits(BootstrapContext> context) { + public void bootstrapConduits(BootstrapContext> context) { context.register(HEAT, new HeatConduit(EnderIO.loc("block/conduit/heat"), LANG_HEAT_CONDUIT)); context.register(CHEMICAL, new ChemicalConduit(EnderIO.loc("block/conduit/chemical"), LANG_CHEMICAL_CONDUIT, 750, false)); diff --git a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RefinedStorageModule.java b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RefinedStorageModule.java index 066112c86f..6f7242b781 100644 --- a/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RefinedStorageModule.java +++ b/enderio-conduits-modded/src/main/java/com/enderio/modconduits/mods/refinedstorage/RefinedStorageModule.java @@ -45,7 +45,7 @@ public class RefinedStorageModule implements ConduitModule { RefinedStorageNeoForgeApiImpl.INSTANCE.getNetworkNodeContainerProviderCapability()) .build()); - public static ResourceKey> RS = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> RS = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("rs")); public static final Supplier> DATA = CONDUIT_DATA_TYPES.register("rs", @@ -65,7 +65,7 @@ public void register(IEventBus modEventBus) { } @Override - public void bootstrapConduits(BootstrapContext> context) { + public void bootstrapConduits(BootstrapContext> context) { context.register(RS, new RSConduit(EnderIO.loc("block/conduit/rs"), LANG_RS_CONDUIT)); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ColoredRedstoneProvider.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ColoredRedstoneProvider.java index 3563cd339f..8d051ad716 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ColoredRedstoneProvider.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ColoredRedstoneProvider.java @@ -1,10 +1,10 @@ package com.enderio.conduits.api; import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; @FunctionalInterface public interface ColoredRedstoneProvider { - boolean isRedstoneActive(ServerLevel serverLevel, BlockPos pos, DyeColor color); + boolean isRedstoneActive(Level level, BlockPos pos, DyeColor color); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index c2c59982b9..b6243210c6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -31,14 +31,14 @@ import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.Nullable; -public interface Conduit> extends Comparable, TooltipProvider { +public interface Conduit, TConnectionConfig extends ConnectionConfig> extends Comparable, TooltipProvider { - Codec> DIRECT_CODEC = EnderIOConduitsRegistries.CONDUIT_TYPE.byNameCodec() + Codec> DIRECT_CODEC = EnderIOConduitsRegistries.CONDUIT_TYPE.byNameCodec() .dispatch(Conduit::type, ConduitType::codec); - Codec>> CODEC = RegistryFixedCodec.create(EnderIOConduitsRegistries.Keys.CONDUIT); + Codec>> CODEC = RegistryFixedCodec.create(EnderIOConduitsRegistries.Keys.CONDUIT); - StreamCodec>> STREAM_CODEC = ByteBufCodecs + StreamCodec>> STREAM_CODEC = ByteBufCodecs .holderRegistry(EnderIOConduitsRegistries.Keys.CONDUIT); /** @@ -75,18 +75,18 @@ default int graphTickRate() { // region Conduit Checks - default boolean canBeInSameBundle(Holder> otherConduit) { + default boolean canBeInSameBundle(Holder> otherConduit) { return true; } - default boolean canBeReplacedBy(Holder> otherConduit) { + default boolean canBeReplacedBy(Holder> otherConduit) { return false; } /** * @return true if both types are compatible */ - default boolean canConnectToConduit(Holder> other) { + default boolean canConnectToConduit(Holder> other) { return this.equals(other.value()); } @@ -146,8 +146,8 @@ default void onConnectTo(ConduitNode selfNode, ConduitNode otherNode) { // endregion @Nullable - default TCapability proxyCapability(BlockCapability capability, - ConduitNode node, Level level, BlockPos pos, @Nullable TContext context) { + default TCapability proxyCapability(Level level, ColoredRedstoneProvider coloredRedstoneProvider, ConduitNode node, BlockCapability capability, + @Nullable TContext context) { return null; } @@ -156,7 +156,7 @@ default TCapability proxyCapability(BlockCapability connectionConfigType(); + ConnectionConfigType connectionConfigType(); /** * Convert old conduit connection data into the new connection config. @@ -165,7 +165,7 @@ default TCapability proxyCapability(BlockCapability> conduit) { + default ItemStack getStackForType(Holder> conduit) { return getStackForType(conduit, 1); } - ItemStack getStackForType(Holder> conduit, int count); + ItemStack getStackForType(Holder> conduit, int count); - Ingredient getIngredientForType(Holder> conduit); + Ingredient getIngredientForType(Holder> conduit); - int getConduitSortIndex(Holder> conduit); + int getConduitSortIndex(Holder> conduit); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java index 040d0ff724..22f4a981e9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java @@ -18,7 +18,7 @@ // TODO: Change this from an interface to a record + builder? // No point in having an interface imo. -public interface ConduitType> { +public interface ConduitType> { Codec> CODEC = Codec.lazyInitialized(EnderIOConduitsRegistries.CONDUIT_TYPE::byNameCodec); StreamCodec> STREAM_CODEC = StreamCodec.recursive( streamCodec -> ByteBufCodecs.registry(EnderIOConduitsRegistries.Keys.CONDUIT_TYPE) @@ -34,19 +34,19 @@ public interface ConduitType> { */ Set> exposedCapabilities(); - static > ConduitType of(MapCodec codec) { + static > ConduitType of(MapCodec codec) { return builder(codec).build(); } - static > Builder builder(MapCodec codec) { + static > Builder builder(MapCodec codec) { return new Builder<>(codec); } - static > ConduitType of(BiFunction factory) { + static > ConduitType of(BiFunction factory) { return builder(factory).build(); } - static > Builder builder(BiFunction factory) { + static > Builder builder(BiFunction factory) { return new Builder(RecordCodecBuilder.mapCodec( builder -> builder.group( ResourceLocation.CODEC.fieldOf("texture").forGetter(Conduit::texture), @@ -55,7 +55,7 @@ static > Builder builder(BiFunction> { + class Builder> { private final MapCodec codec; private final Set> exposedCapabilities; @@ -73,7 +73,7 @@ public ConduitType build() { return new SimpleType<>(codec, exposedCapabilities); } - record SimpleType>( + record SimpleType>( MapCodec codec, Set> exposedCapabilities ) implements ConduitType {} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java index bcbb4a9a11..f3c12587d3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java @@ -43,7 +43,7 @@ public static class Keys { /** * Conduit types are now a datapack registry. */ - public static final ResourceKey>> CONDUIT = createKey("conduit"); + public static final ResourceKey>> CONDUIT = createKey("conduit"); private static ResourceKey> createKey(String name) { return ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath("enderio", name)); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java index dee463a3fe..dc339f3df9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java @@ -6,7 +6,7 @@ @ApiStatus.Experimental public sealed interface AddConduitResult permits AddConduitResult.Upgrade, AddConduitResult.Blocked, AddConduitResult.Insert{ - record Upgrade(Holder> replacedConduit) implements AddConduitResult { + record Upgrade(Holder> replacedConduit) implements AddConduitResult { @Override public String toString() { return "Upgrade[" + replacedConduit.getRegisteredName() + "]"; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java index 29b284a06c..d3a9b8943c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java @@ -16,7 +16,7 @@ @ApiStatus.Experimental public interface ConduitBundleAccessor extends ConduitBundleReader { - boolean canAddConduit(Holder> conduit); + boolean canAddConduit(Holder> conduit); /** * Attempt to add a conduit to the bundle. @@ -24,19 +24,19 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { * @param player the player adding the conduit, or null if performed from another source. * @return the result of the add operation. */ - AddConduitResult addConduit(Holder> conduit, @Nullable Player player); + AddConduitResult addConduit(Holder> conduit, @Nullable Player player); /** * Remove a conduit from the bundle. * @throws IllegalArgumentException if this conduit is not present (in dev only). */ - void removeConduit(Holder> conduit, @Nullable Player player); + void removeConduit(Holder> conduit, @Nullable Player player); /** * @param conduit the conduit to get the inventory for. * @return the inventory for this conduit. */ - ConduitInventory getInventory(Holder> conduit); + ConduitInventory getInventory(Holder> conduit); // region Connections @@ -46,7 +46,7 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { * @param side * @param config */ - void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config); + void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config); /** * Attempt to connect this conduit something in the given direction. @@ -55,7 +55,7 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { * @param isForcedConnection whether this is a forced connection or automated connection. (Wrench) * @return whether a new connection was made. */ - boolean tryConnectTo(Direction side, Holder> conduit, boolean isForcedConnection); + boolean tryConnectTo(Direction side, Holder> conduit, boolean isForcedConnection); // endregion diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java index bcd379fc80..57350924b8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -26,34 +26,34 @@ public interface ConduitBundleReader { * @implNote Must be sorted according to {@link com.enderio.conduits.api.ConduitApi#getConduitSortIndex(Holder)} * @return a list of all conduits in the bundle. */ - List>> getConduits(); + List>> getConduits(); /** * @throws IllegalArgumentException if the conduit is not present. * @param conduit the conduit to get a node for. * @return the conduit node. */ - ConduitNode getConduitNode(Holder> conduit); + ConduitNode getConduitNode(Holder> conduit); /** * @param conduit the conduit to get data for. * @return the client data tag, or null if there is none or the conduit doesn't sync extra data. */ @Nullable - CompoundTag getConduitClientDataTag(Holder> conduit); + CompoundTag getConduitClientDataTag(Holder> conduit); /** * @implNote compare conduits using {@link Conduit#canConnectToConduit(Holder)} * @param conduit the conduit to check for * @return whether the bundle has this conduit, or another which is compatible. */ - boolean hasConduitByType(Holder> conduit); + boolean hasConduitByType(Holder> conduit); /** * @param conduit the conduit to check for * @return whether the bundle has this specific conduit. */ - boolean hasConduitStrict(Holder> conduit); + boolean hasConduitStrict(Holder> conduit); /** * @return whether the bundle has no conduits and no facade. @@ -72,7 +72,7 @@ public interface ConduitBundleReader { * @param side the side to check for. * @return a list of all conduits connected on this side. */ - List>> getConnectedConduits(Direction side); + List>> getConnectedConduits(Direction side); /** * @@ -80,14 +80,14 @@ public interface ConduitBundleReader { * @param conduit * @return */ - ConnectionStatus getConnectionStatus(Direction side, Holder> conduit); + ConnectionStatus getConnectionStatus(Direction side, Holder> conduit); /** * @param side * @param conduit * @return */ - ConnectionConfig getConnectionConfig(Direction side, Holder> conduit); + ConnectionConfig getConnectionConfig(Direction side, Holder> conduit); /** * An endpoint is a side which has a "connection plate" to another block, rather than to continued line of bundles. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java index a4a441827b..4b6b493ad7 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java @@ -32,11 +32,11 @@ public List> components() { return components; } - public static , TConnectionConfig extends ConnectionConfig> Builder builder(ConnectionConfigType connectionConfigType) { + public static , TConnectionConfig extends ConnectionConfig> Builder builder(ConnectionConfigType connectionConfigType) { return new Builder<>(connectionConfigType); } - public static class Builder, TConnectionConfig extends ConnectionConfig> { + public static class Builder, TConnectionConfig extends ConnectionConfig> { private final ConnectionConfigType connectionConfigType; @Nullable diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java index a501e45635..05c8b7896d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java @@ -26,7 +26,7 @@ default DyeColor getDefaultArrowColor() { /** * Create additional quads to be rendered at the point of conduit connection. */ - default List createConnectionQuads(Holder> conduit, @Nullable CompoundTag clientDataTag, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, + default List createConnectionQuads(Holder> conduit, @Nullable CompoundTag clientDataTag, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, @Nullable RenderType type) { return List.of(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java index 56e38e537f..2f00b8fa3b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java @@ -15,7 +15,7 @@ public interface ConduitCoreModelModifierFactory { private final Map, ConduitCoreModelModifierFactory> modifiers = new ConcurrentHashMap<>(); - public void register(ConduitType> type, ConduitCoreModelModifierFactory modifierFactory) { + public void register(ConduitType> type, ConduitCoreModelModifierFactory modifierFactory) { modifiers.put(type, modifierFactory); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java index ac58086bf1..01730d37bc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java @@ -15,7 +15,7 @@ public interface ConduitScreenExtensionFactory { private final Map, ConduitScreenExtensionFactory> extensions = new ConcurrentHashMap<>(); - public void register(ConduitType> conduitType, ConduitScreenExtensionFactory extensionFactory) { + public void register(ConduitType> conduitType, ConduitScreenExtensionFactory extensionFactory) { extensions.put(conduitType, extensionFactory); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java new file mode 100644 index 0000000000..50e9ee4a63 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java @@ -0,0 +1,149 @@ +package com.enderio.conduits.api.ticker; + +import com.enderio.base.api.filter.ResourceFilter; +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.ColoredRedstoneProvider; +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public abstract class ChannelIOAwareConduitTicker, U extends ChannelIOAwareConduitTicker.SimpleConnection> + implements ConduitTicker { + + @Override + public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + ListMultimap extracts = ArrayListMultimap.create(); + ListMultimap inserts = ArrayListMultimap.create(); + for (ConduitNode node : graph.getNodes()) { + // Ensure the node is loaded + if (!node.isLoaded()) { + continue; + } + + for (Direction side : Direction.values()) { + if (node.isConnectedTo(side)) { + var config = node.getConnectionConfig(side, conduit.connectionConfigType()); + + if (config.canExtract() && isActive(level, side, node, coloredRedstoneProvider)) { + var connection = createConnection(level, node, side); + if (connection != null) { + extracts.get(config.extractChannel()).add(connection); + } + } + + if (config.canInsert()) { + var connection = createConnection(level, node, side); + if (connection != null) { + inserts.get(config.extractChannel()).add(connection); + } + } + } + } + } + + for (DyeColor color : DyeColor.values()) { + List extractList = extracts.get(color); + List insertList = inserts.get(color); + if (shouldSkipColor(extractList, insertList)) { + continue; + } + + tickColoredGraph(level, conduit, insertList, extractList, color, graph, coloredRedstoneProvider); + } + } + + protected boolean shouldSkipColor(List extractList, List insertList) { + return extractList.isEmpty() || insertList.isEmpty(); + } + + @Nullable + protected abstract U createConnection(Level level, ConduitNode node, Direction side); + + protected abstract void tickColoredGraph( + ServerLevel level, + T conduit, + List inserts, + List extracts, + DyeColor color, + ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider); + + private boolean isActive(ServerLevel level, Direction side, ConduitNode node, ColoredRedstoneProvider coloredRedstoneProvider) { + var connectionConfig = node.getConnectionConfig(side); + if (!(connectionConfig instanceof RedstoneControlledConnection redstoneControlledConnection)) { + return true; + } + + if (redstoneControlledConnection.redstoneControl() == RedstoneControl.ALWAYS_ACTIVE) { + return true; + } + + if (redstoneControlledConnection.redstoneControl() == RedstoneControl.NEVER_ACTIVE) { + return false; + } + + boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), redstoneControlledConnection.redstoneChannel()); + if (!hasRedstone) { + for (Direction direction : Direction.values()) { + if (level.getSignal(node.getPos().relative(direction), direction) > 0) { + hasRedstone = true; + break; + } + } + } + + return redstoneControlledConnection.redstoneControl().isActive(hasRedstone); + } + + public static class SimpleConnection { + private final ConduitNode node; + private final Direction side; + + public SimpleConnection(ConduitNode node, Direction side) { + this.node = node; + this.side = side; + } + + public ConduitNode node() { + return node; + } + + public BlockPos pos() { + return node.getPos(); + } + + public Direction side() { + return side; + } + + public BlockPos neighborPos() { + return pos().relative(side); + } + + public Direction neighborSide() { + return side.getOpposite(); + } + + @Nullable + public ResourceFilter insertFilter() { + return node.getInsertFilter(side); + } + + @Nullable + public ResourceFilter extractFilter() { + return node.getExtractFilter(side); + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java index ce446fadbf..9b70ea6a73 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java @@ -8,8 +8,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; -public interface ConduitTicker> { - +public interface ConduitTicker> { void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java index fa1975862e..25a31f665e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java @@ -8,64 +8,70 @@ import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ListMultimap; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; -public interface IOAwareConduitTicker> extends LoadedAwareConduitTicker { +public abstract class IOAwareConduitTicker, TConnection extends IOAwareConduitTicker.SimpleConnection> implements ConduitTicker { @Override - default void tickGraph(ServerLevel level, TConduit conduit, List loadedNodes, ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider) { + public void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + List extracts = new ArrayList<>(); + List inserts = new ArrayList<>(); + for (ConduitNode node : graph.getNodes()) { + // Ensure the node is loaded + if (!node.isLoaded()) { + continue; + } - ListMultimap extracts = ArrayListMultimap.create(); - ListMultimap inserts = ArrayListMultimap.create(); - for (ConduitNode node : loadedNodes) { for (Direction side : Direction.values()) { if (node.isConnectedTo(side)) { - if (node.getConnectionConfig(side) instanceof IOConnectionConfig config) { - if (config.canExtract() && isActive(level, side, node, coloredRedstoneProvider)) { - extracts.get(config.extractChannel()).add(new Connection(side, node)); + var config = node.getConnectionConfig(side, conduit.connectionConfigType()); + if (config.canExtract() && isActive(level, side, node, coloredRedstoneProvider)) { + var connection = createConnection(level, node, side); + if (connection != null) { + extracts.add(connection); } + } - if (config.canInsert()) { - inserts.get(config.insertChannel()).add(new Connection(side, node)); + if (config.canInsert()) { + var connection = createConnection(level, node, side); + if (connection != null) { + inserts.add(connection); } } } } } - for (DyeColor color : DyeColor.values()) { - List extractList = extracts.get(color); - List insertList = inserts.get(color); - if (shouldSkipColor(extractList, insertList)) { - continue; - } - - tickColoredGraph(level, conduit, insertList, extractList, color, graph, coloredRedstoneProvider); + if (shouldSkip(extracts, inserts)) { + return; } + + tickGraph(level, conduit, inserts, extracts, graph, coloredRedstoneProvider); } - default boolean shouldSkipColor(List extractList, List insertList) { + protected boolean shouldSkip(List extractList, List insertList) { return extractList.isEmpty() || insertList.isEmpty(); } - void tickColoredGraph( + @Nullable + protected abstract TConnection createConnection(Level level, ConduitNode node, Direction side); + + protected abstract void tickGraph( ServerLevel level, TConduit conduit, - List inserts, - List extracts, - DyeColor color, + List inserts, + List extracts, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - default boolean isActive(ServerLevel level, Direction side, ConduitNode node, ColoredRedstoneProvider coloredRedstoneProvider) { + // TODO: This needs to be factored out... + private boolean isActive(ServerLevel level, Direction side, ConduitNode node, ColoredRedstoneProvider coloredRedstoneProvider) { var connectionConfig = node.getConnectionConfig(side); if (!(connectionConfig instanceof RedstoneControlledConnection redstoneControlledConnection)) { return true; @@ -82,7 +88,7 @@ default boolean isActive(ServerLevel level, Direction side, ConduitNode node, Co boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), redstoneControlledConnection.redstoneChannel()); if (!hasRedstone) { for (Direction direction : Direction.values()) { - if (level.getSignal(node.getPos().relative(direction), direction) > 0) { + if (level.getSignal(node.getPos().relative(direction), direction.getOpposite()) > 0) { hasRedstone = true; break; } @@ -92,17 +98,13 @@ default boolean isActive(ServerLevel level, Direction side, ConduitNode node, Co return redstoneControlledConnection.redstoneControl().isActive(hasRedstone); } - class Connection { - private final Direction direction; + public static class SimpleConnection { private final ConduitNode node; + private final Direction side; - public Connection(Direction direction, ConduitNode node) { - this.direction = direction; + public SimpleConnection(ConduitNode node, Direction side) { this.node = node; - } - - public Direction direction() { - return direction; + this.side = side; } public ConduitNode node() { @@ -113,18 +115,26 @@ public BlockPos pos() { return node.getPos(); } - public BlockPos move() { - return pos().relative(direction); + public Direction side() { + return side; } - @Nullable - public ResourceFilter extractFilter() { - return node.getExtractFilter(direction); + public BlockPos neighborPos() { + return pos().relative(side); + } + + public Direction neighborSide() { + return side.getOpposite(); } @Nullable public ResourceFilter insertFilter() { - return node.getInsertFilter(direction); + return node.getInsertFilter(side); + } + + @Nullable + public ResourceFilter extractFilter() { + return node.getExtractFilter(side); } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java index 43848edff2..7442394677 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java @@ -10,7 +10,7 @@ import java.util.List; -public interface LoadedAwareConduitTicker> extends ConduitTicker { +public interface LoadedAwareConduitTicker> extends ConduitTicker { @Override default void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java index ca89ab52a3..614d0944c4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java @@ -150,22 +150,22 @@ private void addConduitScreenExtensionWidgets() { } private void addConduitSelectionButtons() { - List>> validConnections = new ArrayList<>(); - for (Holder> type : getBundle().getConduits()) { + List>> validConnections = new ArrayList<>(); + for (Holder> type : getBundle().getConduits()) { if (getConnectionState(type) instanceof DynamicConnectionState) { validConnections.add(type); } } for (int i = 0; i < validConnections.size(); i++) { - Holder> connection = validConnections.get(i); + Holder> connection = validConnections.get(i); addRenderableWidget(new ConduitSelectionButton(getGuiLeft() + 206, getGuiTop() + 4 + 24 * i, connection, this::getConduit, this::setConduitType)); } } private void sendExtendedConduitUpdate() { - Holder> conduit = menu.getConduit(); + Holder> conduit = menu.getConduit(); ConduitGraphObject node = getBundle().getNodeFor(conduit); // PacketDistributor.sendToServer(new C2SSetConduitExtendedData(menu.getBlockEntity().getBlockPos(), @@ -183,7 +183,7 @@ private T getOnDynamic(Function map, T defaultVal return getConnectionState() instanceof DynamicConnectionState dyn ? map.apply(dyn) : defaultValue; } - public Holder> getConduit() { + public Holder> getConduit() { return menu.getConduit(); } @@ -191,7 +191,7 @@ public ConduitMenuData getMenuData() { return getConduit().value().getMenuData(); } - private void setConduitType(Holder> conduit) { + private void setConduitType(Holder> conduit) { menu.setConduit(conduit); rebuildWidgets(); } @@ -200,7 +200,7 @@ private ConnectionState getConnectionState() { return getConnectionState(menu.getConduit()); } - private ConnectionState getConnectionState(Holder> type) { + private ConnectionState getConnectionState(Holder> type) { return getBundle().getConnectionState(menu.getDirection(), type); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java index 95ad7e2f0f..64d010f171 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java @@ -15,11 +15,11 @@ import java.util.function.Supplier; public class ConduitSelectionButton extends AbstractButton { - private final Holder> conduit; - private final Supplier>> getter; - private final Consumer>> setter; + private final Holder> conduit; + private final Supplier>> getter; + private final Consumer>> setter; - public ConduitSelectionButton(int pX, int pY, Holder> conduit, Supplier>> getter, Consumer>> setter) { + public ConduitSelectionButton(int pX, int pY, Holder> conduit, Supplier>> getter, Consumer>> setter) { super(pX, pY, 21, 24, Component.empty()); this.conduit = conduit; this.getter = getter; @@ -62,7 +62,7 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa protected void updateWidgetNarration(NarrationElementOutput pNarrationElementOutput) { } - public Holder> getConduit() { + public Holder> getConduit() { return conduit; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModel.java index 77ee763d9b..38f1bb609e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModel.java @@ -42,17 +42,17 @@ public ItemOverrides getOverrides() { public static class ConduitItemOverrides extends ItemOverrides { - private final Map>, BakedModel> CACHE = new HashMap<>(); + private final Map>, BakedModel> CACHE = new HashMap<>(); @Nullable @Override public BakedModel resolve(BakedModel pModel, ItemStack pStack, @Nullable ClientLevel pLevel, @Nullable LivingEntity pEntity, int pSeed) { - Holder> conduit = pStack.get(ConduitComponents.CONDUIT); + Holder> conduit = pStack.get(ConduitComponents.CONDUIT); return CACHE.computeIfAbsent(conduit, t -> createBakedModel(t, pModel)); } - private BakedModel createBakedModel(@Nullable Holder> conduit, BakedModel model) { + private BakedModel createBakedModel(@Nullable Holder> conduit, BakedModel model) { ResourceLocation conduitTexture = MissingTextureAtlasSprite.getLocation(); if (conduit != null) { conduitTexture = conduit.value().texture(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java index 0bd72689ef..ddb483cafe 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java @@ -83,7 +83,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction } Direction.Axis axis = bundleState.mainAxis(); - Map>, List> offsets = new HashMap<>(); + Map>, List> offsets = new HashMap<>(); for (Direction direction : Direction.values()) { boolean isEnd = bundleState.isConnectionEndpoint(direction); @@ -97,7 +97,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction var connectedTypes = bundleState.getConnectedConduits(direction); for (int i = 0; i < connectedTypes.size(); i++) { - Holder> conduit = connectedTypes.get(i); + Holder> conduit = connectedTypes.get(i); CompoundTag clientData = bundleState.getConduitClientDataTag(conduit); Vec3i offset = OffsetHelper.translationFor(direction.getAxis(), @@ -155,8 +155,8 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction var allTypes = bundleState.conduits(); @Nullable Area box = null; - Map>, Integer> notRendered = new HashMap<>(); - List>> rendered = new ArrayList<>(); + Map>, Integer> notRendered = new HashMap<>(); + List>> rendered = new ArrayList<>(); for (int i = 0; i < allTypes.size(); i++) { var type = allTypes.get(i); @Nullable @@ -191,7 +191,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction box.makeContain(duplicatePosition); } } - for (Holder> toRender : rendered) { + for (Holder> toRender : rendered) { List offsetsForType = offsets.get(toRender); if (box == null || !box.contains(offsetsForType.getFirst())) { quads.addAll(new ConduitTextureEmissiveQuadTransformer(sprite(bundleState.getTexture(toRender)), 0) @@ -201,7 +201,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction } if (box != null) { - for (Map.Entry>, Integer> notRenderedEntry : notRendered.entrySet()) { + for (Map.Entry>, Integer> notRenderedEntry : notRendered.entrySet()) { Vec3i offset = OffsetHelper.translationFor(axis, OffsetHelper.offsetConduit(notRenderedEntry.getValue(), allTypes.size())); if (!box.contains(offset)) { @@ -217,7 +217,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction .andThen(QuadTransformers.applying(translateTransformation(box.getMin()))) .process(modelOf(BOX).getQuads(state, side, rand, extraData, renderType))); } else { - for (Map.Entry>, Integer> notRenderedEntry : notRendered.entrySet()) { + for (Map.Entry>, Integer> notRenderedEntry : notRendered.entrySet()) { quads.addAll(new ConduitTextureEmissiveQuadTransformer( sprite(bundleState.getTexture(notRenderedEntry.getKey())), 0).andThen( QuadTransformers.applying(translateTransformation(OffsetHelper.translationFor(axis, diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java index 0dceb95114..6b606529b2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java @@ -23,10 +23,10 @@ public class ConduitBundleRenderState { public static final ModelProperty PROPERTY = new ModelProperty<>(); private Direction.Axis mainAxis; - private List>> conduits; - private Map>, CompoundTag> conduitClientData; - private Map>>> conduitsByDirection; - private Map>, ConduitConnectionRenderState>> conduitConnections; + private List>> conduits; + private Map>, CompoundTag> conduitClientData; + private Map>>> conduitsByDirection; + private Map>, ConduitConnectionRenderState>> conduitConnections; private boolean hasFacade; private BlockState facadeBlockstate; @@ -54,7 +54,7 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { renderState.conduitConnections = new HashMap<>(); for (var side : Direction.values()) { - HashMap>, ConduitConnectionRenderState> conduits = new HashMap<>(); + HashMap>, ConduitConnectionRenderState> conduits = new HashMap<>(); for (var conduit : renderState.conduits) { if (bundle.getConnectionStatus(side, conduit) == ConnectionStatus.CONNECTED_BLOCK) { var connectionConfig = bundle.getConnectionConfig(side, conduit); @@ -78,16 +78,16 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { return renderState; } - public List>> conduits() { + public List>> conduits() { return conduits; } @Nullable - public CompoundTag getConduitClientDataTag(Holder> conduit) { + public CompoundTag getConduitClientDataTag(Holder> conduit) { return conduitClientData.get(conduit); } - public List>> getConnectedConduits(Direction side) { + public List>> getConnectedConduits(Direction side) { return conduitsByDirection.getOrDefault(side, List.of()); } @@ -95,7 +95,7 @@ public boolean isConnectionEndpoint(Direction side) { return !conduitConnections.get(side).isEmpty(); } - public ConduitConnectionRenderState getConnectionState(Direction side, Holder> conduit) { + public ConduitConnectionRenderState getConnectionState(Direction side, Holder> conduit) { return conduitConnections.get(side).get(conduit); } @@ -103,7 +103,7 @@ public Direction.Axis mainAxis() { return mainAxis; } - public ResourceLocation getTexture(Holder> conduit) { + public ResourceLocation getTexture(Holder> conduit) { return conduit.value().getTexture(getConduitClientDataTag(conduit)); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java index b6d66902e2..faba5eb713 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java @@ -22,7 +22,7 @@ public record ConduitConnectionRenderState( ) { @EnsureSide(EnsureSide.Side.CLIENT) - public static ConduitConnectionRenderState of(Holder> conduit, ConnectionConfig connectionConfig) { + public static ConduitConnectionRenderState of(Holder> conduit, ConnectionConfig connectionConfig) { boolean canInput = false; boolean canOutput = false; DyeColor inputChannel = DyeColor.GREEN; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java index 848f3b14fa..e233f7234a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java @@ -32,7 +32,7 @@ public class FluidConduitModelModifier implements ConduitModelModifier { private static final ModelResourceLocation FLUID_MODEL = ModelResourceLocation.standalone(EnderIO.loc("block/extra/fluids")); @Override - public List createConnectionQuads(Holder> conduit, @Nullable CompoundTag clientDataTag, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, + public List createConnectionQuads(Holder> conduit, @Nullable CompoundTag clientDataTag, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, @Nullable RenderType type) { if (!(conduit.value() instanceof FluidConduit fluidConduit && fluidConduit.isMultiFluid())) { return List.of(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java index ce816d49d8..d875cf3724 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java @@ -61,7 +61,7 @@ public int getLightColor(float partialTick) { return i == 0 && this.level.hasChunkAt(this.pos) ? LevelRenderer.getLightColor(this.level, this.pos) : i; } - public static void addDestroyEffects(BlockPos pos, Conduit conduit) { + public static void addDestroyEffects(BlockPos pos, Conduit conduit) { Level level = Minecraft.getInstance().level; ParticleEngine engine = Minecraft.getInstance().particleEngine; List boxes = ConduitShape.CONNECTION.toAabbs(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java index 9392d0fb5f..8b4a2942b5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java @@ -18,10 +18,10 @@ @EventBusSubscriber(/*value = Dist.CLIENT, */modid = EnderIOConduits.MODULE_MOD_ID, bus = EventBusSubscriber.Bus.GAME) public class ConduitA11yManager { - private static Holder> heldConduit; + private static Holder> heldConduit; @Nullable - public static Holder> getHeldConduit() { + public static Holder> getHeldConduit() { return heldConduit; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitApiImpl.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitApiImpl.java index 84a2f499a9..3d0fe35d8c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitApiImpl.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitApiImpl.java @@ -10,17 +10,17 @@ public class ConduitApiImpl implements ConduitApi { @Override - public ItemStack getStackForType(Holder> conduit, int count) { + public ItemStack getStackForType(Holder> conduit, int count) { return ConduitBlockItem.getStackFor(conduit, count); } @Override - public Ingredient getIngredientForType(Holder> conduit) { + public Ingredient getIngredientForType(Holder> conduit) { return ConduitIngredient.of(conduit); } @Override - public int getConduitSortIndex(Holder> conduit) { + public int getConduitSortIndex(Holder> conduit) { return ConduitSorter.getSortIndex(conduit); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBlockItem.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBlockItem.java index d0e60f21c4..cfd8057018 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBlockItem.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBlockItem.java @@ -37,7 +37,7 @@ public ConduitBlockItem(Block block, Properties properties) { super(block, properties); } - public static ItemStack getStackFor(Holder> conduit, int count) { + public static ItemStack getStackFor(Holder> conduit, int count) { var stack = new ItemStack(ConduitBlocks.CONDUIT.asItem(), count); stack.set(ConduitComponents.CONDUIT, conduit); return stack; @@ -45,7 +45,7 @@ public static ItemStack getStackFor(Holder> conduit, int count) { @Override public Component getName(ItemStack pStack) { - Holder> conduit = pStack.get(ConduitComponents.CONDUIT); + Holder> conduit = pStack.get(ConduitComponents.CONDUIT); if (conduit == null) { return super.getName(pStack); } @@ -83,7 +83,7 @@ public InteractionResult place(BlockPlaceContext context) { @Override public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { - Holder> conduit = stack.get(ConduitComponents.CONDUIT); + Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit != null) { conduit.value().addToTooltip(context, tooltipComponents::add, tooltipFlag); @@ -130,7 +130,7 @@ public static void addToCreativeTabs(BuildCreativeModeTabContentsEvent event) { } } - private static > int compareConduitTo(Conduit o1, Conduit o2) { + private static > int compareConduitTo(Conduit o1, Conduit o2) { return o1.compareTo((T) o2); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java index 34dfaf9fb7..5e844907c0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java @@ -60,10 +60,10 @@ public final class ConduitBundle { STREAM_CODEC); private final Map connections = new EnumMap<>(Direction.class); - private final List>> conduits = new ArrayList<>(); + private final List>> conduits = new ArrayList<>(); // fill back after world save - private final Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); + private final Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); private final BlockPos pos; private ItemStack facadeItem = ItemStack.EMPTY; @@ -80,9 +80,9 @@ public ConduitBundle(Runnable onChanged, BlockPos pos) { } // TODO: If we enable conversion from new to old, this will become public. - private ConduitBundle(BlockPos pos, List>> conduits, + private ConduitBundle(BlockPos pos, List>> conduits, Map connections, ItemStack facadeItem, - Map>, ConduitGraphObject> conduitNodes) { + Map>, ConduitGraphObject> conduitNodes) { this.pos = pos; this.conduits.addAll(conduits); @@ -105,7 +105,7 @@ public void onChanged() { /** * @return an action containing the conduit that is now not in this bundle */ - public AddConduitResult addConduit(Level level, Holder> conduit, Player player) { + public AddConduitResult addConduit(Level level, Holder> conduit, Player player) { if (conduits.size() == MAX_CONDUITS) { return new AddConduitResult.Blocked(); } @@ -118,7 +118,7 @@ public AddConduitResult addConduit(Level level, Holder> conduit, Play ConduitGraphObject node = new ConduitGraphObject(pos); // upgrade a conduit - Optional>> first = conduits.stream() + Optional>> first = conduits.stream() .filter(existingConduit -> existingConduit.value().canBeReplacedBy(conduit)) .findFirst(); if (first.isPresent()) { @@ -178,7 +178,7 @@ public AddConduitResult addConduit(Level level, Holder> conduit, Play } public void onLoad(Level level, BlockPos pos) { - for (Holder> conduit : conduits) { + for (Holder> conduit : conduits) { var node = getNodeFor(conduit); conduit.value().onCreated(node, level, pos, null); } @@ -188,7 +188,7 @@ public void onLoad(Level level, BlockPos pos) { * @return if this bundle is empty and the block has to be removed * @throws IllegalArgumentException if this conduit is not in the conduit bundle and we are in dev env */ - public boolean removeConduit(Level level, Holder> conduit) { + public boolean removeConduit(Level level, Holder> conduit) { int index = conduits.indexOf(conduit); if (index == -1) { if (!FMLLoader.isProduction()) { @@ -218,13 +218,13 @@ public boolean removeConduit(Level level, Holder> conduit) { // endregion - public List>> getConduits() { + public List>> getConduits() { return conduits; } // region Connections - public List>> getConnectedConduits(Direction direction) { + public List>> getConnectedConduits(Direction direction) { return connections.get(direction).getConnectedTypes(this); } @@ -234,11 +234,11 @@ public ConnectionState getConnectionState(Direction direction, int index) { return connections.get(direction).getConnectionState(index); } - public ConnectionState getConnectionState(Direction direction, Holder> conduit) { + public ConnectionState getConnectionState(Direction direction, Holder> conduit) { return connections.get(direction).getConnectionState(getConduitIndex(conduit)); } - public void setConnectionState(Direction direction, Holder> conduit, ConnectionState state) { + public void setConnectionState(Direction direction, Holder> conduit, ConnectionState state) { connections.get(direction).setConnectionState(getConduitIndex(conduit), state); onChanged(); } @@ -254,7 +254,7 @@ public void disableConduit(Direction direction, int index) { onChanged(); } - public void disableConduit(Direction direction, Holder> conduit) { + public void disableConduit(Direction direction, Holder> conduit) { disableConduit(direction, getConduitIndex(conduit)); } @@ -262,7 +262,7 @@ public ItemStack getConnectionItem(Direction direction, int conduitIndex, SlotTy return connections.get(direction).getItem(slotType, conduitIndex); } - public ItemStack getConnectionItem(Direction direction, Holder> conduit, SlotType slotType) { + public ItemStack getConnectionItem(Direction direction, Holder> conduit, SlotType slotType) { return getConnectionItem(direction, getConduitIndex(conduit), slotType); } @@ -271,7 +271,7 @@ public void setConnectionItem(Direction direction, int conduitIndex, SlotType sl onChanged(); } - public void setConnectionItem(Direction direction, Holder> conduit, SlotType slotType, + public void setConnectionItem(Direction direction, Holder> conduit, SlotType slotType, ItemStack itemStack) { setConnectionItem(direction, getConduitIndex(conduit), slotType, itemStack); } @@ -318,13 +318,13 @@ public void clearFacade() { // endregion - public void connectTo(Level level, BlockPos pos, Direction direction, Holder> conduit, boolean end) { + public void connectTo(Level level, BlockPos pos, Direction direction, Holder> conduit, boolean end) { connections.get(direction) .connectTo(level, pos, getNodeFor(conduit), direction, conduit, getConduitIndex(conduit), end); onChanged(); } - public boolean disconnectFrom(Direction direction, Holder> conduit) { + public boolean disconnectFrom(Direction direction, Holder> conduit) { for (int i = 0; i < conduits.size(); i++) { if (conduit.value().canConnectToConduit(conduits.get(i))) { connections.get(direction).tryDisconnect(i); @@ -336,11 +336,11 @@ public boolean disconnectFrom(Direction direction, Holder> conduit) { } @Nullable - public ConduitGraphObject getNodeForTypeExact(Holder> conduit) { + public ConduitGraphObject getNodeForTypeExact(Holder> conduit) { return conduitNodes.get(conduit); } - public ConduitGraphObject getNodeFor(Holder> conduit) { + public ConduitGraphObject getNodeFor(Holder> conduit) { for (var entry : conduitNodes.entrySet()) { if (entry.getKey().value().canConnectToConduit(conduit)) { return conduitNodes.get(entry.getKey()); @@ -350,7 +350,7 @@ public ConduitGraphObject getNodeFor(Holder> conduit) { throw new IllegalStateException("no node matching original conduit"); } - public void setNodeFor(Holder> conduit, ConduitGraphObject node) { + public void setNodeFor(Holder> conduit, ConduitGraphObject node) { conduitNodes.put(conduit, node); for (var direction : Direction.values()) { ConduitConnection connection = connections.get(direction); @@ -364,7 +364,7 @@ public void setNodeFor(Holder> conduit, ConduitGraphObject node) { } } - private void removeNode(Level level, Holder> conduit, ConduitGraphObject node) { + private void removeNode(Level level, Holder> conduit, ConduitGraphObject node) { conduit.value().onRemoved(node, level, pos); if (node.getGraph() != null) { node.getGraph().remove(node); @@ -373,7 +373,7 @@ private void removeNode(Level level, Holder> conduit, ConduitGraphObj conduitNodes.remove(conduit); } - public boolean hasType(Holder> conduitToFind) { + public boolean hasType(Holder> conduitToFind) { for (var conduit : conduits) { if (conduit.value().canConnectToConduit(conduitToFind)) { return true; @@ -383,7 +383,7 @@ public boolean hasType(Holder> conduitToFind) { return false; } - public int getConduitIndex(Holder> conduit) { + public int getConduitIndex(Holder> conduit) { for (int i = 0; i < conduits.size(); i++) { if (conduits.get(i).value().canConnectToConduit(conduit)) { return i; @@ -465,7 +465,7 @@ public void addType(int index) { } public void connectTo(Level level, BlockPos pos, ConduitGraphObject conduitGraphObject, Direction direction, - Holder> type, int typeIndex, boolean end) { + Holder> type, int typeIndex, boolean end) { if (end) { var state = DynamicConnectionState.defaultConnection(level, pos, direction, type); connectionStates[typeIndex] = state; @@ -506,8 +506,8 @@ public boolean isEnd() { return Arrays.stream(connectionStates).anyMatch(DynamicConnectionState.class::isInstance); } - public List>> getConnectedTypes(ConduitBundle bundle) { - List>> connected = new ArrayList<>(); + public List>> getConnectedTypes(ConduitBundle bundle) { + List>> connected = new ArrayList<>(); for (int i = 0; i < connectionStates.length; i++) { if (connectionStates[i].isConnection()) { connected.add(bundle.getConduits().get(i)); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java index ebfdecc4d8..ab27e2ce7f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java @@ -36,6 +36,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; import net.minecraft.world.level.saveddata.SavedData; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -46,10 +47,10 @@ @EventBusSubscriber(modid = EnderIOConduits.MODULE_MOD_ID) public class ConduitSavedData extends SavedData { - private final Map>, List>> networks = new HashMap<>(); + private final Map>, List>> networks = new HashMap<>(); // Used to find the ConduitGraphObject(s) of a conduit when it is loaded - private final Map>, Map>> deserializedNodes = new HashMap<>(); + private final Map>, Map>> deserializedNodes = new HashMap<>(); private static final Logger LOGGER = LogUtils.getLogger(); @@ -75,12 +76,12 @@ private ConduitSavedData(CompoundTag nbt, HolderLookup.Provider lookupProvider) ListTag graphsTag = nbt.getList(KEY_GRAPHS, Tag.TAG_COMPOUND); for (Tag tag : graphsTag) { CompoundTag typedGraphTag = (CompoundTag) tag; - ResourceKey> conduitKey = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + ResourceKey> conduitKey = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, ResourceLocation.parse(typedGraphTag.getString(KEY_TYPE))); var registry = lookupProvider.lookupOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); - Optional>> conduit = registry.get(conduitKey); + Optional>> conduit = registry.get(conduitKey); if (conduit.isPresent()) { ListTag graphsForTypeTag = typedGraphTag.getList(KEY_GRAPHS, Tag.TAG_COMPOUND); @@ -91,7 +92,7 @@ private ConduitSavedData(CompoundTag nbt, HolderLookup.Provider lookupProvider) } } - private void deserializeGraphs(HolderLookup.Provider lookupProvider, Holder> conduit, ListTag graphs) { + private void deserializeGraphs(HolderLookup.Provider lookupProvider, Holder> conduit, ListTag graphs) { for (Tag tag1 : graphs) { CompoundTag graphTag = (CompoundTag) tag1; @@ -163,7 +164,7 @@ private void deserializeGraphs(HolderLookup.Provider lookupProvider, Holder> type = entry.getKey(); + Holder> type = entry.getKey(); List> graphs = entry.getValue(); if (graphs.isEmpty() || !type.isBound()) { continue; @@ -248,7 +249,7 @@ private static CompoundTag serializeGraph(HolderLookup.Provider lookupProvider, // endregion - private void merge(Holder> conduit, GraphObject object, + private void merge(Holder> conduit, GraphObject object, List> connections) { var filteredConnections = connections.stream() .filter(pair -> (pair.getFirst() == object || pair.getSecond() == object)) @@ -269,7 +270,7 @@ private void merge(Holder> conduit, GraphObject } @Nullable - public ConduitGraphObject takeUnloadedNodeIdentifier(Holder> conduit, BlockPos pos) { + public ConduitGraphObject takeUnloadedNodeIdentifier(Holder> conduit, BlockPos pos) { ChunkPos chunkPos = new ChunkPos(pos); Map> typeMap = deserializedNodes.get(conduit); @@ -297,7 +298,7 @@ public ConduitGraphObject takeUnloadedNodeIdentifier(Holder> conduit, return node; } - public void putUnloadedNodeIdentifier(Holder> conduit, BlockPos pos, ConduitGraphObject node) { + public void putUnloadedNodeIdentifier(Holder> conduit, BlockPos pos, ConduitGraphObject node) { ChunkPos chunkPos = new ChunkPos(pos); Map> typeMap = deserializedNodes.computeIfAbsent(conduit, k -> new HashMap<>()); @@ -325,7 +326,7 @@ private void tick(ServerLevel serverLevel) { || graph.getObjects().iterator().next().getGraph() != graph); } - Registry> conduitRegistry = serverLevel.registryAccess() + Registry> conduitRegistry = serverLevel.registryAccess() .registryOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); for (var entry : networks.entrySet()) { @@ -339,7 +340,7 @@ private void tick(ServerLevel serverLevel) { } } - private > void tickConduitGraph(ServerLevel serverLevel, Holder> conduit, + private > void tickConduitGraph(ServerLevel serverLevel, Holder> conduit, int conduitId, ConduitTicker ticker, Graph graph) { int conduitTickRate = conduit.value().graphTickRate(); @@ -351,17 +352,17 @@ private > void tickConduitGraph(ServerLevel serverLevel, Ho } } - private static boolean isRedstoneActive(ServerLevel serverLevel, BlockPos pos, DyeColor color) { - if (!serverLevel.isLoaded(pos) || !serverLevel.shouldTickBlocksAt(pos)) { + public static boolean isRedstoneActive(Level level, BlockPos pos, DyeColor color) { + if (!level.isLoaded(pos) || !level.shouldTickBlocksAt(pos)) { return false; } - if (!(serverLevel.getBlockEntity(pos) instanceof ConduitBundleBlockEntity blockEntity)) { + if (!(level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity blockEntity)) { return false; } // TODO: Decouple from hard-coded REDSTONE conduit. - var registry = serverLevel.holderLookup(EnderIOConduitsRegistries.Keys.CONDUIT); + var registry = level.holderLookup(EnderIOConduitsRegistries.Keys.CONDUIT); var redstoneConduit = registry.get(Conduits.REDSTONE); if (redstoneConduit.isEmpty() || !blockEntity.getBundle().getConduits().contains(redstoneConduit.get())) { @@ -377,12 +378,12 @@ private static boolean isRedstoneActive(ServerLevel serverLevel, BlockPos pos, D return context != null && context.isActive(color); } - public static void addPotentialGraph(Holder> conduit, Graph graph, + public static void addPotentialGraph(Holder> conduit, Graph graph, ServerLevel level) { get(level).addPotentialGraph(conduit, graph); } - private void addPotentialGraph(Holder> conduit, Graph graph) { + private void addPotentialGraph(Holder> conduit, Graph graph) { if (!networks.computeIfAbsent(conduit, unused -> new ArrayList<>()).contains(graph)) { networks.get(conduit).add(graph); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitShape.java index a95e2b6da2..e8ba429238 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitShape.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitShape.java @@ -23,7 +23,7 @@ import java.util.Optional; public class ConduitShape { - private final Map>, VoxelShape> conduitShapes = new HashMap<>(); + private final Map>, VoxelShape> conduitShapes = new HashMap<>(); private final Map directionShapes = new HashMap<>(); private static final VoxelShape CONNECTOR = Block.box(2.5f, 2.5, 15f, 13.5f, 13.5f, 16f); public static final VoxelShape CONNECTION = Block.box(6.5f, 6.5f, 9.5, 9.5f, 9.5f, 16); @@ -37,7 +37,7 @@ public ConduitShape() { public void updateConduit(ConduitBundle bundle) { this.conduitShapes.clear(); this.directionShapes.clear(); - for (Holder> conduit : bundle.getConduits()) { + for (Holder> conduit : bundle.getConduits()) { updateShapeForConduit(bundle, conduit); } updateTotalShape(); @@ -48,7 +48,7 @@ public VoxelShape getShapeFromHit(BlockPos pos, HitResult result) { } @Nullable - public Holder> getConduit(BlockPos pos, HitResult result) { + public Holder> getConduit(BlockPos pos, HitResult result) { return getLookUpValue(conduitShapes, pos, result); } @@ -84,10 +84,10 @@ public VoxelShape getTotalShape() { return this.totalShape; } - private void updateShapeForConduit(ConduitBundle conduitBundle, Holder> conduit) { + private void updateShapeForConduit(ConduitBundle conduitBundle, Holder> conduit) { VoxelShape conduitShape = Shapes.empty(); Direction.Axis axis = OffsetHelper.findMainAxis(conduitBundle); - Map>, List> offsets = new HashMap<>(); + Map>, List> offsets = new HashMap<>(); for (Direction direction : Direction.values()) { VoxelShape directionShape = directionShapes.getOrDefault(direction, Shapes.empty()); if (conduitBundle.getConnectionState(direction, conduit) instanceof DynamicConnectionState) { @@ -110,7 +110,7 @@ private void updateShapeForConduit(ConduitBundle conduitBundle, Holder> notRendered = null; + @Nullable Holder> notRendered = null; int i = allConduits.indexOf(conduit); if (i == -1) { conduitShapes.put(conduit, Shapes.block()); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSorter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSorter.java index ee70b50b3f..ab2636df8b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSorter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSorter.java @@ -23,7 +23,7 @@ @SuppressWarnings("unused") @EventBusSubscriber(modid = EnderIOConduits.MODULE_MOD_ID, bus = EventBusSubscriber.Bus.GAME) public class ConduitSorter { - private static final List>> SORTED_CONDUITS = new ArrayList<>(); + private static final List>> SORTED_CONDUITS = new ArrayList<>(); @SubscribeEvent public static void serverSortTypes(ServerStartedEvent event) { @@ -37,7 +37,7 @@ public static void clientSortTypes(ClientPlayerNetworkEvent.LoggingIn event) { sortTypes(conduitRegistry); } - private static void sortTypes(Registry> registry) { + private static void sortTypes(Registry> registry) { SORTED_CONDUITS.clear(); // Group like types together. @@ -46,28 +46,28 @@ private static void sortTypes(Registry> registry) { .sorted(Comparator.comparing(i -> Objects.requireNonNull(EnderIOConduitsRegistries.CONDUIT_TYPE.getKey(i)).toString())) .toList(); - List>> sortedConduits = new ArrayList<>(); + List>> sortedConduits = new ArrayList<>(); for (ConduitType conduitType : conduitTypes) { sortedConduits.addAll(gatherConduitsForType(registry, conduitType)); } SORTED_CONDUITS.addAll(sortedConduits); } - private static > List>> gatherConduitsForType(Registry> registry, ConduitType conduitType) { + private static > List>> gatherConduitsForType(Registry> registry, ConduitType conduitType) { return registry.holders() .filter(i -> i.value().type() == conduitType) // Group by tier, then by name - .sorted(new Comparator>>() { + .sorted(new Comparator>>() { @Override - public int compare(Holder> o1, Holder> o2) { + public int compare(Holder> o1, Holder> o2) { return ((T)o1.value()).compareTo((T)o2.value()); } }.thenComparing(Holder::getRegisteredName)) - .map(i -> (Holder>)i) + .map(i -> (Holder>)i) .toList(); } - public static int getSortIndex(Holder> conduit) { + public static int getSortIndex(Holder> conduit) { return SORTED_CONDUITS.indexOf(conduit); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java index 02eee2420e..74a53ec989 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java @@ -218,7 +218,7 @@ private Optional addConduit(ConduitBundleBlockEntity bloc return Optional.empty(); } - Holder> conduit = stack.get(ConduitComponents.CONDUIT); + Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit == null) { return Optional.empty(); } @@ -261,7 +261,7 @@ private Optional addConduit(ConduitBundleBlockEntity bloc private Optional handleYeta(ConduitBundleBlockEntity blockEntity, Player player, ItemStack stack, BlockHitResult hit, boolean isClientSide) { if (stack.is(EIOTags.Items.WRENCH)) { - Holder> conduit = blockEntity.getShape().getConduit(hit.getBlockPos(), hit); + Holder> conduit = blockEntity.getShape().getConduit(hit.getBlockPos(), hit); Direction direction = blockEntity.getShape().getDirection(hit.getBlockPos(), hit); if (conduit == null) { return Optional.empty(); @@ -278,7 +278,7 @@ private Optional handleYeta(ConduitBundleBlockEntity bloc return Optional.empty(); } - private void internalHandleYeta(Holder> conduit, @Nullable Direction direction, + private void internalHandleYeta(Holder> conduit, @Nullable Direction direction, ConduitBundleBlockEntity blockEntity, BlockHitResult hit) { ConduitBundle bundle = blockEntity.getBundle(); @@ -328,7 +328,7 @@ public static void handleShiftYeta(PlayerInteractEvent.RightClickBlock event) { && event.getLevel().getBlockEntity(event.getPos()) instanceof ConduitBundleBlockEntity blockEntity && event.getEntity().isSteppingCarefully()) { - Holder> conduit = blockEntity.getShape().getConduit(event.getPos(), event.getHitVec()); + Holder> conduit = blockEntity.getShape().getConduit(event.getPos(), event.getHitVec()); if (conduit != null) { blockEntity.removeTypeAndDelete(event.getEntity(), conduit); event.setCanceled(true); @@ -393,7 +393,7 @@ private Optional handleScreen(ConduitBundleBlockEntity blockE } private Optional getOpenInformation(ConduitBundleBlockEntity blockEntity, BlockHitResult hit) { - Holder> conduit = blockEntity.getShape().getConduit(hit.getBlockPos(), hit); + Holder> conduit = blockEntity.getShape().getConduit(hit.getBlockPos(), hit); Direction direction = blockEntity.getShape().getDirection(hit.getBlockPos(), hit); if (direction != null && conduit != null) { @@ -422,7 +422,7 @@ private Optional getOpenInformation(ConduitBundleBlockEntity bl // fallback for (Direction potential : Direction.values()) { if (bundle.isConnectionEnd(potential)) { - for (Holder> potentialType : bundle.getConduits()) { + for (Holder> potentialType : bundle.getConduits()) { if (bundle.getConnectionState(potential, potentialType) instanceof DynamicConnectionState) { return Optional.of(new OpenInformation(potential, potentialType)); } @@ -435,7 +435,7 @@ private Optional getOpenInformation(ConduitBundleBlockEntity bl if (!(blockEntity.getLevel() .getBlockEntity( blockEntity.getBlockPos().relative(potential)) instanceof ConduitBundleBlockEntity)) { - for (Holder> potentialType : bundle.getConduits()) { + for (Holder> potentialType : bundle.getConduits()) { if (canBeValidConnection(blockEntity, potentialType, potential)) { return Optional.of(new OpenInformation(potential, potentialType)); } @@ -448,7 +448,7 @@ private Optional getOpenInformation(ConduitBundleBlockEntity bl // endregion - public static boolean canBeOrIsValidConnection(ConduitBundleBlockEntity blockEntity, Holder> conduit, + public static boolean canBeOrIsValidConnection(ConduitBundleBlockEntity blockEntity, Holder> conduit, Direction direction) { ConduitBundle bundle = blockEntity.getBundle(); @@ -456,7 +456,7 @@ public static boolean canBeOrIsValidConnection(ConduitBundleBlockEntity blockEnt || canBeValidConnection(blockEntity, conduit, direction); } - public static boolean canBeValidConnection(ConduitBundleBlockEntity blockEntity, Holder> conduit, + public static boolean canBeValidConnection(ConduitBundleBlockEntity blockEntity, Holder> conduit, Direction direction) { ConduitBundle bundle = blockEntity.getBundle(); ConnectionState connectionState = bundle.getConnectionState(direction, conduit); @@ -490,7 +490,7 @@ public ItemStack getCloneItemStack(BlockState state, HitResult target, LevelRead return facade.get().asItem().getDefaultInstance(); } - Holder> conduit = blockEntity.getShape().getConduit(pos, target); + Holder> conduit = blockEntity.getShape().getConduit(pos, target); if (conduit == null) { if (blockEntity.getBundle().getConduits().isEmpty()) { return ItemStack.EMPTY; @@ -521,7 +521,7 @@ public BlockEntityTicker getTicker(Level level, Block @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - Holder> conduit = stack.get(ConduitComponents.CONDUIT); + Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit == null) { return; } @@ -562,7 +562,7 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, level.getLightEngine().checkBlock(pos); } } else { - Holder> conduit = blockEntity.getShape() + Holder> conduit = blockEntity.getShape() .getConduit(((BlockHitResult) hit).getBlockPos(), hit); if (conduit == null) { if (!blockEntity.getBundle().getConduits().isEmpty()) { @@ -601,7 +601,7 @@ public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos } if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundleBlockEntity && conduitBundleBlockEntity.getLevel() != null) { - Holder> redstoneConduit = conduitBundleBlockEntity.getLevel().holderOrThrow(Conduits.REDSTONE); + Holder> redstoneConduit = conduitBundleBlockEntity.getLevel().holderOrThrow(Conduits.REDSTONE); ConduitBundle conduitBundle = conduitBundleBlockEntity.getBundle(); return conduitBundle.getConduits().contains(redstoneConduit) && @@ -616,7 +616,7 @@ public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos public int getSignal(BlockState pBlockState, BlockGetter level, BlockPos pos, Direction direction) { if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundleBlockEntity && conduitBundleBlockEntity.getLevel() != null) { // TODO: Need to decouple this from the holder registry. Probably need to find conduits by their "type" instead. - Holder> redstoneConduit = conduitBundleBlockEntity.getLevel().holderOrThrow(Conduits.REDSTONE); + Holder> redstoneConduit = conduitBundleBlockEntity.getLevel().holderOrThrow(Conduits.REDSTONE); ConduitBundle conduitBundle = conduitBundleBlockEntity.getBundle(); if (!conduitBundle.getConduits().contains(redstoneConduit)) { @@ -716,7 +716,7 @@ public boolean supportsExternalFaceHiding(BlockState state) { return true; } - private record OpenInformation(Direction direction, Holder> conduit) { + private record OpenInformation(Direction direction, Holder> conduit) { } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java index dd43ccab4e..68def5fe43 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java @@ -87,7 +87,7 @@ public class ConduitBundleBlockEntity extends EnderBlockEntity { private UpdateState checkConnection = UpdateState.NONE; - private final Map>, ConduitGraphObject> lazyNodes = new HashMap<>(); + private final Map>, ConduitGraphObject> lazyNodes = new HashMap<>(); private ListTag lazyNodeNBT = new ListTag(); private ConduitItemHandler conduitItemHandler = new ConduitItemHandler(); @@ -131,7 +131,7 @@ public void updateClient() { * Handle a connection state update from the client. */ @EnsureSide(EnsureSide.Side.SERVER) - public void handleConnectionStateUpdate(Direction direction, Holder> conduit, + public void handleConnectionStateUpdate(Direction direction, Holder> conduit, DynamicConnectionState connectionState) { // Sanity check, the client shouldn't do this, but just to make sure there's no // confusion. @@ -151,7 +151,7 @@ public void handleConnectionStateUpdate(Direction direction, Holder> } @EnsureSide(EnsureSide.Side.SERVER) - public void handleConduitDataUpdate(Holder> conduit, ConduitDataContainer clientDataContainer) { + public void handleConduitDataUpdate(Holder> conduit, ConduitDataContainer clientDataContainer) { var node = getBundle().getNodeFor(conduit); // node.handleClientChanges(clientDataContainer); } @@ -170,7 +170,7 @@ public void onLoad() { sync(); bundle.onLoad(level, getBlockPos()); for (var entry : lazyNodes.entrySet()) { - Holder> conduit = entry.getKey(); + Holder> conduit = entry.getKey(); ConduitGraphObject node = entry.getValue(); loadNode(serverLevel, conduit, node); } @@ -182,7 +182,7 @@ public void onLoad() { } } - private void loadNode(ServerLevel serverLevel, Holder> conduit, ConduitGraphObject node) { + private void loadNode(ServerLevel serverLevel, Holder> conduit, ConduitGraphObject node) { Graph graph = Objects.requireNonNull(node.getGraph()); @@ -219,7 +219,7 @@ public void onChunkUnloaded() { } } - private void onChunkUnloaded(ConduitSavedData savedData, Holder> conduit) { + private void onChunkUnloaded(ConduitSavedData savedData, Holder> conduit) { var node = bundle.getNodeFor(conduit); conduit.value().onRemoved(node, level, getBlockPos()); savedData.putUnloadedNodeIdentifier(conduit, this.worldPosition, node); @@ -252,7 +252,7 @@ public void everyTick() { public void updateConnections(Level level, BlockPos pos, @Nullable BlockPos fromPos, boolean shouldActivate) { for (Direction direction : Direction.values()) { if (fromPos == null || !(level.getBlockEntity(fromPos) instanceof ConduitBundleBlockEntity)) { - for (Holder> conduit : bundle.getConduits()) { + for (Holder> conduit : bundle.getConduits()) { if (shouldActivate && conduit.value().hasConnectionDelay()) { checkConnection = checkConnection.activate(); continue; @@ -283,7 +283,7 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider lookupProvi tag.put(ConduitNBTKeys.CONDUIT_BUNDLE, bundle.save(lookupProvider)); ListTag listTag = new ListTag(); - for (Holder> conduit : bundle.getConduits()) { + for (Holder> conduit : bundle.getConduits()) { // var data = bundle.getNodeFor(conduit).conduitDataContainer(); // listTag.add(data.save(lookupProvider)); } @@ -330,11 +330,11 @@ public ModelData getModelData() { return ModelData.builder().with(BUNDLE_MODEL_PROPERTY, clientBundle).build(); } - public boolean hasType(Holder> conduit) { + public boolean hasType(Holder> conduit) { return bundle.hasType(conduit); } - public AddConduitResult addType(Holder> conduit, Player player) { + public AddConduitResult addType(Holder> conduit, Player player) { AddConduitResult action = bundle.addConduit(level, conduit, player); // something has changed @@ -372,7 +372,7 @@ public AddConduitResult addType(Holder> conduit, Player player) { return action; } - public Optional> tryConnectTo(Direction dir, Holder> conduit, + public Optional> tryConnectTo(Direction dir, Holder> conduit, boolean forceMerge, boolean shouldMergeGraph, boolean forceConnect) { if (level.getBlockEntity(getBlockPos().relative(dir)) instanceof ConduitBundleBlockEntity neighborBlockEntity && neighborBlockEntity.connectTo(dir.getOpposite(), conduit, bundle.getNodeFor(conduit), forceMerge)) { @@ -425,7 +425,7 @@ public Optional> tryConnectTo(Direction dir, Ho return Optional.empty(); } - public void onConnectionsUpdated(Holder> conduit) { + public void onConnectionsUpdated(Holder> conduit) { if (level != null && !level.isClientSide) { var node = getBundle().getNodeFor(conduit); @@ -441,7 +441,7 @@ public void onConnectionsUpdated(Holder> conduit) { /** * sets block to air if this is the last conduit */ - public void removeTypeAndDelete(Player player, Holder> conduit) { + public void removeTypeAndDelete(Player player, Holder> conduit) { if (removeType(conduit, !player.getAbilities().instabuild)) { level.setBlock(getBlockPos(), getBlockState().getFluidState().createLegacyBlock(), level.isClientSide ? Block.UPDATE_ALL_IMMEDIATE : Block.UPDATE_ALL); @@ -454,7 +454,7 @@ public void removeTypeAndDelete(Player player, Holder> conduit) { * @param shouldDrop Whether the conduit item should drop for this conduit. * @return Whether the block should now be completely removed. */ - public boolean removeType(Holder> conduit, boolean shouldDrop) { + public boolean removeType(Holder> conduit, boolean shouldDrop) { if (shouldDrop && !level.isClientSide()) { dropItem(ConduitBlockItem.getStackFor(conduit, 1)); for (Direction dir : Direction.values()) { @@ -520,7 +520,7 @@ private void dropItem(ItemStack stack) { * Removes connections to neigbouring bundles to the given conduit. * @param conduit The conduit in this conduit that should be disconnected from other conduits. */ - public void removeNeighborConnections(Holder> conduit) { + public void removeNeighborConnections(Holder> conduit) { for (Direction dir : Direction.values()) { if (level.getBlockEntity( getBlockPos().relative(dir)) instanceof ConduitBundleBlockEntity neighborBlockEntity) { @@ -552,7 +552,7 @@ private void loadFromSavedData() { ConduitSavedData savedData = ConduitSavedData.get(serverLevel); for (int i = 0; i < bundle.getConduits().size(); i++) { - Holder> type = bundle.getConduits().get(i); + Holder> type = bundle.getConduits().get(i); loadConduitFromSavedData(savedData, type, i); } @@ -560,7 +560,7 @@ private void loadFromSavedData() { } @UseOnly(LogicalSide.SERVER) - private void loadConduitFromSavedData(ConduitSavedData savedData, Holder> conduit, int typeIndex) { + private void loadConduitFromSavedData(ConduitSavedData savedData, Holder> conduit, int typeIndex) { if (level == null) { return; } @@ -590,7 +590,7 @@ private void loadConduitFromSavedData(ConduitSavedData savedData, Holder> conduit, ConduitNode node, boolean forceMerge) { + private boolean connectTo(Direction direction, Holder> conduit, ConduitNode node, boolean forceMerge) { if (!doTypesMatch(conduit)) { return false; } @@ -607,8 +607,8 @@ private boolean connectTo(Direction direction, Holder> conduit, Condu return false; } - private boolean doTypesMatch(Holder> conduitToMatch) { - for (Holder> conduit : bundle.getConduits()) { + private boolean doTypesMatch(Holder> conduitToMatch) { + for (Holder> conduit : bundle.getConduits()) { if (conduit.value().canConnectToConduit(conduitToMatch)) { return true; } @@ -617,32 +617,32 @@ private boolean doTypesMatch(Holder> conduitToMatch) { return false; } - private void connect(Direction direction, Holder> conduit) { + private void connect(Direction direction, Holder> conduit) { bundle.connectTo(level, worldPosition, direction, conduit, false); updateClient(); } - private void connectEnd(Direction direction, Holder> conduit) { + private void connectEnd(Direction direction, Holder> conduit) { bundle.connectTo(level, worldPosition, direction, conduit, true); updateClient(); } - private void disconnect(Direction direction, Holder> conduit) { + private void disconnect(Direction direction, Holder> conduit) { if (bundle.disconnectFrom(direction, conduit)) { updateClient(); } } - public MenuProvider menuProvider(Direction direction, Holder> conduit) { + public MenuProvider menuProvider(Direction direction, Holder> conduit) { return new ConduitMenuProvider(direction, conduit); } private class ConduitMenuProvider implements MenuProvider { private final Direction direction; - private final Holder> conduit; + private final Holder> conduit; - private ConduitMenuProvider(Direction direction, Holder> conduit) { + private ConduitMenuProvider(Direction direction, Holder> conduit) { this.direction = direction; this.conduit = conduit; } @@ -662,7 +662,7 @@ public AbstractContainerMenu createMenu(int pContainerId, Inventory pInventory, public static ICapabilityProvider createConduitCap( BlockCapability cap) { return (be, context) -> { - for (Holder> conduit : be.bundle.getConduits()) { + for (Holder> conduit : be.bundle.getConduits()) { var proxiedCap = getProxiedCapability(cap, be, conduit, context); if (proxiedCap != null) { return proxiedCap; @@ -675,7 +675,7 @@ public static ICapabilityProvider TCap getProxiedCapability(BlockCapability capability, - ConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { + ConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { if (blockEntity.level == null) { return null; @@ -688,7 +688,7 @@ private static TCap getProxiedCapability(BlockCapability> conduit = bundle.getConduits().get(data.conduitIndex()); + Holder> conduit = bundle.getConduits().get(data.conduitIndex()); ConduitMenuData conduitData = conduit.value().getMenuData(); if ((data.slotType() == SlotType.FILTER_EXTRACT && conduitData.hasFilterExtract()) || (data.slotType() == SlotType.FILTER_INSERT && conduitData.hasFilterInsert()) @@ -813,7 +813,7 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) { return false; } - Holder> conduit = bundle.getConduits().get(slotData.conduitIndex()); + Holder> conduit = bundle.getConduits().get(slotData.conduitIndex()); switch (slotData.slotType()) { case FILTER_EXTRACT: @@ -842,7 +842,7 @@ public void setStackInSlot(int slot, @NotNull ItemStack stack) { return; } - Holder> conduit = bundle.getConduits().get(data.conduitIndex()); + Holder> conduit = bundle.getConduits().get(data.conduitIndex()); ConduitMenuData menuData = conduit.value().getMenuData(); if ((data.slotType() == SlotType.FILTER_EXTRACT && menuData.hasFilterExtract()) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java index b3a0d0410b..9b8b27b541 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java @@ -204,7 +204,7 @@ public ItemStack getCloneItemStack(BlockState state, HitResult target, LevelRead return blockEntity.getFacadeBlock().asItem().getDefaultInstance(); } - Holder> conduit = blockEntity.getShape().getConduit(pos, target); + Holder> conduit = blockEntity.getShape().getConduit(pos, target); if (conduit == null) { if (blockEntity.getConduits().isEmpty()) { return ItemStack.EMPTY; @@ -232,10 +232,14 @@ protected boolean canBeReplaced(BlockState state, BlockPlaceContext useContext) @Override protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { conduit.updateConnections(level, pos, neighborPos, true); } + // Invalidate caps in case of redstone update or something else. + level.invalidateCapabilities(pos); + super.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston); } @@ -283,7 +287,7 @@ public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable L } if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { - Holder> conduit = stack.get(ConduitComponents.CONDUIT); + Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit != null) { conduitBundle.addConduit(conduit, player); } else { @@ -331,7 +335,7 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, } } else { // TODO: accessibility feature flag - Holder> conduit = null; + Holder> conduit = null; // if (true) { // // If the player is holding a conduit and this flag is enabled, they purposely want to break the held conduit. // conduit = ConduitA11yManager.getHeldConduit(); @@ -441,7 +445,7 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos pos, Player player, NewConduitBundleBlockEntity conduitBundle) { // Get the conduit from the item - Holder> conduit = stack.get(ConduitComponents.CONDUIT); + Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit == null) { return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java index 0b46871872..4e71306ad1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java @@ -83,22 +83,22 @@ public final class NewConduitBundleBlockEntity extends EnderBlockEntity implemen private ItemStack facadeProvider = ItemStack.EMPTY; - private List>> conduits = new ArrayList<>(); + private List>> conduits = new ArrayList<>(); - private Map>, ConnectionContainer> conduitConnections = new HashMap<>(); + private Map>, ConnectionContainer> conduitConnections = new HashMap<>(); private final NewConduitBundleInventory inventory; // Map of all conduit nodes for this bundle. - private final Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); + private final Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); // Used to recover missing nodes when loading the bundle. - private final Map>, ConduitGraphObject> lazyNodes = new HashMap<>(); + private final Map>, ConduitGraphObject> lazyNodes = new HashMap<>(); private ListTag lazyNodeNBT = null; - private Map>, NodeData> lazyNodeData = null; + private Map>, NodeData> lazyNodeData = null; // The client has no nodes, so we hold the data like this. - private final Map>, CompoundTag> clientConduitDataTags = new HashMap<>(); + private final Map>, CompoundTag> clientConduitDataTags = new HashMap<>(); private final NewConduitShape shape = new NewConduitShape(); @@ -155,7 +155,7 @@ public void onLoad() { // Attempt to make connections for recovered nodes. for (var entry : lazyNodes.entrySet()) { - Holder> conduit = entry.getKey(); + Holder> conduit = entry.getKey(); ConduitGraphObject node = entry.getValue(); Graph graph = Objects.requireNonNull(node.getGraph()); @@ -218,7 +218,7 @@ public ModelData getModelData() { // TODO - public boolean canBeOrIsConnection(Direction side, Holder> conduit) { + public boolean canBeOrIsConnection(Direction side, Holder> conduit) { if (level == null) { return false; } @@ -238,16 +238,16 @@ public boolean canBeOrIsConnection(Direction side, Holder> conduit) { return true; } - public MenuProvider getMenuProvider(Direction side, Holder> conduit) { + public MenuProvider getMenuProvider(Direction side, Holder> conduit) { return new ConduitMenuProvider(side, conduit); } private class ConduitMenuProvider implements MenuProvider { private final Direction side; - private final Holder> conduit; + private final Holder> conduit; - private ConduitMenuProvider(Direction side, Holder> conduit) { + private ConduitMenuProvider(Direction side, Holder> conduit) { this.side = side; this.conduit = conduit; } @@ -270,7 +270,7 @@ public Component getDisplayName() { public static ICapabilityProvider createCapabilityProvider( BlockCapability cap) { return (be, context) -> { - for (Holder> conduit : be.getConduits()) { + for (Holder> conduit : be.getConduits()) { var proxiedCap = getProxiedCapability(cap, be, conduit, context); if (proxiedCap != null) { return proxiedCap; @@ -283,7 +283,7 @@ public static ICapabilityProvider TCap getProxiedCapability(BlockCapability capability, - NewConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { + NewConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { if (blockEntity.level == null) { return null; @@ -294,24 +294,24 @@ private static TCap getProxiedCapability(BlockCapability>> getConduits() { + public List>> getConduits() { return List.copyOf(conduits); } @Override - public boolean hasConduitByType(Holder> conduit) { + public boolean hasConduitByType(Holder> conduit) { return conduits.stream().anyMatch(c -> c.value().canConnectToConduit(conduit)); } @Override - public boolean hasConduitStrict(Holder> conduit) { + public boolean hasConduitStrict(Holder> conduit) { return conduits.contains(conduit); } @@ -330,7 +330,7 @@ public boolean isFull() { * @param possibleReplacement the conduit that may replace another. * @return the conduit that can be replaced, or empty if none can be replaced. */ - private Optional>> findReplacementCandidate(Holder> possibleReplacement) { + private Optional>> findReplacementCandidate(Holder> possibleReplacement) { return conduits.stream() .filter(existingConduit -> existingConduit.value().canBeReplacedBy(possibleReplacement)) .findFirst(); @@ -340,12 +340,12 @@ private Optional>> findReplacementCandidate(Holder> * @param conduit the conduit to check for. * @return whether the provided conduit is compatible with the other conduits in the bundle. */ - private boolean isConduitCompatibleWithExisting(Holder> conduit) { + private boolean isConduitCompatibleWithExisting(Holder> conduit) { return conduits.stream().allMatch(existingConduit -> existingConduit.value().canBeInSameBundle(conduit)); } @Override - public boolean canAddConduit(Holder> conduit) { + public boolean canAddConduit(Holder> conduit) { if (level == null) { return false; } @@ -366,7 +366,7 @@ public boolean canAddConduit(Holder> conduit) { } @Override - public AddConduitResult addConduit(Holder> conduit, @Nullable Player player) { + public AddConduitResult addConduit(Holder> conduit, @Nullable Player player) { if (level == null || !(level instanceof ServerLevel serverLevel)) { return new AddConduitResult.Blocked(); } @@ -472,7 +472,7 @@ public AddConduitResult addConduit(Holder> conduit, @Nullable Player } @Override - public void removeConduit(Holder> conduit, @Nullable Player player) { + public void removeConduit(Holder> conduit, @Nullable Player player) { if (level == null) { return; } @@ -527,7 +527,7 @@ public void removeConduit(Holder> conduit, @Nullable Player player) { * Removes connections to neigbouring bundles to the given conduit. * @param conduit The conduit in this conduit that should be disconnected from other conduits. */ - public void removeNeighborConnections(Holder> conduit) { + public void removeNeighborConnections(Holder> conduit) { for (Direction dir : Direction.values()) { if (level.getBlockEntity( getBlockPos().relative(dir)) instanceof NewConduitBundleBlockEntity neighborBlockEntity) { @@ -557,7 +557,7 @@ private void dropItem(ItemStack stack) { } @Override - public ConduitInventory getInventory(Holder> conduit) { + public ConduitInventory getInventory(Holder> conduit) { if (!hasConduitStrict(conduit)) { throw new IllegalStateException("Conduit not found in bundle."); } @@ -566,7 +566,7 @@ public ConduitInventory getInventory(Holder> conduit) { } @EnsureSide(EnsureSide.Side.SERVER) - public ConduitGraphObject getConduitNode(Holder> conduit) { + public ConduitGraphObject getConduitNode(Holder> conduit) { if (!hasConduitByType(conduit)) { throw new IllegalStateException("Conduit not found in bundle."); } @@ -576,7 +576,7 @@ public ConduitGraphObject getConduitNode(Holder> conduit) { @Override @Nullable - public CompoundTag getConduitClientDataTag(Holder> conduit) { + public CompoundTag getConduitClientDataTag(Holder> conduit) { if (!conduit.value().hasClientDataTag()) { return null; } @@ -589,7 +589,7 @@ public CompoundTag getConduitClientDataTag(Holder> conduit) { } @EnsureSide(EnsureSide.Side.SERVER) - private void setNode(Holder> conduit, ConduitGraphObject loadedNode) { + private void setNode(Holder> conduit, ConduitGraphObject loadedNode) { conduitNodes.put(conduit, loadedNode); // Attach to the node to provide connection data and inventory. @@ -601,7 +601,7 @@ private void setNode(Holder> conduit, ConduitGraphObject loadedNode) // region Connections @Override - public List>> getConnectedConduits(Direction side) { + public List>> getConnectedConduits(Direction side) { return conduitConnections.entrySet() .stream() .filter(e -> e.getValue().getStatus(side).isConnected()) @@ -611,17 +611,17 @@ public List>> getConnectedConduits(Direction side) { } @Override - public ConnectionStatus getConnectionStatus(Direction side, Holder> conduit) { + public ConnectionStatus getConnectionStatus(Direction side, Holder> conduit) { return conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new).getStatus(side); } @Override - public ConnectionConfig getConnectionConfig(Direction side, Holder> conduit) { + public ConnectionConfig getConnectionConfig(Direction side, Holder> conduit) { return conduitConnections.get(conduit).getConfig(side); } @Override - public void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config) { + public void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config) { if (config.type() != conduit.value().connectionConfigType()) { throw new IllegalArgumentException("Connection config is not the right type for this conduit."); } @@ -632,7 +632,7 @@ public void setConnectionConfig(Direction side, Holder> conduit, Conn // Intended for use by the menu, might need a better interface? @EnsureSide(EnsureSide.Side.SERVER) - public void setConnectionStatus(Direction side, Holder> conduit, ConnectionStatus status) { + public void setConnectionStatus(Direction side, Holder> conduit, ConnectionStatus status) { if (!hasConduitStrict(conduit)) { throw new IllegalArgumentException("Conduit is not present in this bundle."); } @@ -648,7 +648,7 @@ public boolean isEndpoint(Direction side) { // TODO: This needs a better name or to handle blocks as well as conduits before // it can be exposed via the interface. - public boolean canConnectTo(Direction side, Holder> conduit, ConduitGraphObject otherNode, + public boolean canConnectTo(Direction side, Holder> conduit, ConduitGraphObject otherNode, boolean isForcedConnection) { if (level == null) { return false; @@ -665,8 +665,8 @@ public boolean canConnectTo(Direction side, Holder> conduit, ConduitG return isForcedConnection || conduitConnections.get(conduit).getStatus(side) != ConnectionStatus.DISABLED; } - private boolean doTypesMatch(Holder> conduitToMatch) { - for (Holder> conduit : conduits) { + private boolean doTypesMatch(Holder> conduitToMatch) { + for (Holder> conduit : conduits) { if (conduit.value().canConnectToConduit(conduitToMatch)) { return true; } @@ -675,7 +675,7 @@ private boolean doTypesMatch(Holder> conduitToMatch) { return false; } - public boolean tryConnectTo(Direction side, Holder> conduit, boolean isForcedConnection) { + public boolean tryConnectTo(Direction side, Holder> conduit, boolean isForcedConnection) { if (level == null) { return false; } @@ -724,7 +724,7 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boolean return false; } - public void onConnectionsUpdated(Holder> conduit) { + public void onConnectionsUpdated(Holder> conduit) { if (level != null && !level.isClientSide) { var node = getConduitNode(conduit); @@ -736,7 +736,7 @@ public void onConnectionsUpdated(Holder> conduit) { } } - private void connectConduit(Direction side, Holder> conduit) { + private void connectConduit(Direction side, Holder> conduit) { conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) .setStatus(side, ConnectionStatus.CONNECTED_CONDUIT); onConnectionsUpdated(conduit); @@ -745,7 +745,7 @@ private void connectConduit(Direction side, Holder> conduit) { updateShape(); } - private void connectBlock(Direction side, Holder> conduit) { + private void connectBlock(Direction side, Holder> conduit) { conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) .setStatus(side, ConnectionStatus.CONNECTED_BLOCK); onConnectionsUpdated(conduit); @@ -756,7 +756,7 @@ private void connectBlock(Direction side, Holder> conduit) { // TODO: poorly named, we're disconnecting from another conduit on the given // side. - private void disconnect(Direction side, Holder> conduit) { + private void disconnect(Direction side, Holder> conduit) { boolean hasChanged = false; for (var c : conduits) { if (c.value().canConnectToConduit(conduit)) { @@ -774,7 +774,7 @@ private void disconnect(Direction side, Holder> conduit) { } } - private void dropConnectionItems(Direction side, Holder> conduit) { + private void dropConnectionItems(Direction side, Holder> conduit) { for (SlotType slotType : SlotType.values()) { ItemStack stack = inventory.getStackInSlot(conduit, side, slotType); if (!stack.isEmpty()) { @@ -918,7 +918,7 @@ private void loadFromSavedData() { ConduitSavedData savedData = ConduitSavedData.get(serverLevel); for (int i = 0; i < conduits.size(); i++) { - Holder> type = conduits.get(i); + Holder> type = conduits.get(i); loadConduitFromSavedData(savedData, type, i); } @@ -927,7 +927,7 @@ private void loadFromSavedData() { } @EnsureSide(EnsureSide.Side.SERVER) - private void loadConduitFromSavedData(ConduitSavedData savedData, Holder> conduit, int typeIndex) { + private void loadConduitFromSavedData(ConduitSavedData savedData, Holder> conduit, int typeIndex) { if (level == null || !(level instanceof ServerLevel serverLevel)) { return; } @@ -1026,7 +1026,7 @@ protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) // NEW: Save node data in case of need for recovery ListTag nodeData = new ListTag(); - for (Holder> conduit : conduits) { + for (Holder> conduit : conduits) { var data = conduitNodes.get(conduit).getNodeData(); if (data != null) { @@ -1106,7 +1106,7 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) for (int i = 0; i < conduitConnectionsList.size(); i++) { ListTag connectionsList = conduitConnectionsList.getList(i); - Holder> conduit = conduits.get(i); + Holder> conduit = conduits.get(i); ConnectionContainer connections = new ConnectionContainer(conduit); for (int j = 0; j < connectionsList.size(); j++) { @@ -1231,18 +1231,18 @@ public void clearContent() { // endregion private class ConnectionContainer { - private final Holder> conduit; + private final Holder> conduit; private final Map statuses = new EnumMap<>(Direction.class); private final Map configs = new EnumMap<>(Direction.class); - public ConnectionContainer(Holder> conduit) { + public ConnectionContainer(Holder> conduit) { this.conduit = conduit; for (Direction dir : Direction.values()) { statuses.put(dir, ConnectionStatus.DISCONNECTED); } } - public ConnectionContainer copyFor(Holder> conduit) { + public ConnectionContainer copyFor(Holder> conduit) { var copy = new ConnectionContainer(conduit); copy.statuses.putAll(statuses); @@ -1294,7 +1294,7 @@ public boolean hasEndpoint(Direction side) { } } - private record ConnectionHost(NewConduitBundleBlockEntity conduitBundle, Holder> conduit) implements ConduitConnectionHost { + private record ConnectionHost(NewConduitBundleBlockEntity conduitBundle, Holder> conduit) implements ConduitConnectionHost { @Override public BlockPos pos() { @@ -1335,9 +1335,9 @@ public boolean isLoaded() { // Matches the same data format as the original conduit bundle. // Enables us to convert between the new and old formats easily. @SuppressWarnings("removal") - private record LegacyConduitBundle(BlockPos pos, List>> conduits, + private record LegacyConduitBundle(BlockPos pos, List>> conduits, Map connections, ItemStack facadeItem, - Map>, ConduitGraphObject> conduitNodes) { + Map>, ConduitGraphObject> conduitNodes) { public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( BlockPos.CODEC.fieldOf("pos").forGetter(i -> i.pos), diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java index 44e17f0056..d9488fc4e8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java @@ -33,7 +33,7 @@ public class NewConduitBundleInventory implements IItemHandlerModifiable, INBTSe private final ConduitBundleReader conduitBundle; - private Map>, Map>> conduitSlots = new HashMap<>(); + private Map>, Map>> conduitSlots = new HashMap<>(); public NewConduitBundleInventory(ConduitBundleReader conduitBundle) { this.conduitBundle = conduitBundle; @@ -42,11 +42,11 @@ public NewConduitBundleInventory(ConduitBundleReader conduitBundle) { protected void onChanged() { } - public ConduitInventory getInventoryFor(Holder> conduit) { + public ConduitInventory getInventoryFor(Holder> conduit) { return new InventoryReference(this, conduit); } - public void removeConduit(Holder> conduit) { + public void removeConduit(Holder> conduit) { conduitSlots.remove(conduit); } @@ -70,11 +70,11 @@ public ItemStack getStackInSlot(int slot) { slotData.slotType()); } - public ItemStack getStackInSlot(Holder> conduit, Direction side, SlotType slotType) { + public ItemStack getStackInSlot(Holder> conduit, Direction side, SlotType slotType) { return getStackInSlot(conduit, side, slotType.ordinal()); } - public ItemStack getStackInSlot(Holder> conduit, Direction side, int slot) { + public ItemStack getStackInSlot(Holder> conduit, Direction side, int slot) { if (!conduitBundle.hasConduitStrict(conduit)) { throw new IllegalArgumentException("Conduit not found in bundle"); } @@ -90,7 +90,7 @@ public ItemStack getStackInSlot(Holder> conduit, Direction side, int return slots.get(slot); } - public void setStackInSlot(Holder> conduit, Direction side, int slot, ItemStack stack) { + public void setStackInSlot(Holder> conduit, Direction side, int slot, ItemStack stack) { if (!conduitBundle.hasConduitStrict(conduit)) { throw new IllegalArgumentException("Conduit not found in bundle"); } @@ -106,7 +106,7 @@ public void setStackInSlot(Holder> conduit, Direction side, int slot, onChanged(); } - public void setStackInSlot(Holder> conduit, Direction side, SlotType slotType, ItemStack stack) { + public void setStackInSlot(Holder> conduit, Direction side, SlotType slotType, ItemStack stack) { setStackInSlot(conduit, side, slotType.ordinal(), stack); } @@ -151,7 +151,7 @@ public boolean isItemValid(int slot, ItemStack stack) { return false; } - Holder> conduit = conduitBundle.getConduits().get(slotData.conduitIndex()); + Holder> conduit = conduitBundle.getConduits().get(slotData.conduitIndex()); switch (slotData.slotType()) { case FILTER_EXTRACT: @@ -189,7 +189,7 @@ public void deserializeNBT(HolderLookup.Provider registries, CompoundTag tag) { } } - private record InventoryReference(NewConduitBundleInventory inventory, Holder> conduit) + private record InventoryReference(NewConduitBundleInventory inventory, Holder> conduit) implements ConduitInventory { @Override public ItemStack getStackInSlot(Direction side, SlotType slotType) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java index 0bc2ab927a..baff96a53c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java @@ -23,10 +23,10 @@ public class NewConduitShape { - private final Map>>, VoxelShape> conduitConnections = new HashMap<>(); - private final Map>, VoxelShape> conduitShapes = new HashMap<>(); + private final Map>>, VoxelShape> conduitConnections = new HashMap<>(); + private final Map>, VoxelShape> conduitShapes = new HashMap<>(); - private final Map>, List> individualShapes = new HashMap<>(); + private final Map>, List> individualShapes = new HashMap<>(); private static final VoxelShape CONNECTOR = Block.box(2.5f, 2.5, 15f, 13.5f, 13.5f, 16f); public static final VoxelShape CONNECTION = Block.box(6.5f, 6.5f, 9.5, 9.5f, 9.5f, 16); @@ -41,7 +41,7 @@ public void updateConduit(ConduitBundleReader bundle) { this.conduitShapes.clear(); this.conduitConnections.clear(); this.individualShapes.clear(); - for (Holder> conduit : bundle.getConduits()) { + for (Holder> conduit : bundle.getConduits()) { updateShapeForConduit(bundle, conduit); } updateTotalShape(); @@ -72,12 +72,12 @@ public VoxelShape getShapeFromHit(BlockPos pos, HitResult result) { } @Nullable - public Holder> getConduit(BlockPos pos, HitResult result) { + public Holder> getConduit(BlockPos pos, HitResult result) { return getLookUpValue(conduitShapes, pos, result); } @Nullable - public Pair>> getConnectionFromHit(BlockPos pos, HitResult hit) { + public Pair>> getConnectionFromHit(BlockPos pos, HitResult hit) { return getLookUpValue(conduitConnections, pos, hit); } @@ -109,12 +109,12 @@ public VoxelShape getTotalShape() { return this.totalShape; } - private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder> conduit) { + private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder> conduit) { List individualShapeList = individualShapes.computeIfAbsent(conduit, ignored -> new ArrayList<>()); VoxelShape conduitShape = Shapes.empty(); Direction.Axis axis = OffsetHelper.findMainAxis(conduitBundle); - Map>, List> offsets = new HashMap<>(); + Map>, List> offsets = new HashMap<>(); for (Direction direction : Direction.values()) { // Only create and save connection shape if it's a block connection, as that's what the lookup is for. VoxelShape conduitConnectionShape = null; @@ -153,7 +153,7 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder> notRendered = null; + Holder> notRendered = null; int i = allConduits.indexOf(conduit); if (i == -1) { conduitShapes.put(conduit, Shapes.block()); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java index 0b3e694c0b..e7f4e0748c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java @@ -50,7 +50,7 @@ public record DynamicConnectionState(boolean isInsert, DyeColor insertChannel, b DynamicConnectionState::new); public static DynamicConnectionState defaultConnection(Level level, BlockPos pos, Direction direction, - Holder> type) { + Holder> type) { // Conduit.ConduitConnectionData defaultConnection = // type.value().getDefaultConnection(level, pos, direction); // return new DynamicConnectionState(defaultConnection.isInsert(), diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitConnectionHost.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitConnectionHost.java index 28205d1dfb..511ad073f7 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitConnectionHost.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitConnectionHost.java @@ -9,7 +9,7 @@ // TODO: Did the interface for now but honestly maybe this should just be an object because its not API public. public interface ConduitConnectionHost { - Holder> conduit(); + Holder> conduit(); BlockPos pos(); boolean isConnectedTo(Direction side); ConnectionConfig getConnectionConfig(Direction side); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java index 75a538624c..46b9a4e5e8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java @@ -121,14 +121,14 @@ public static ConduitGraphContext createNetworkContext() { return new ConduitGraphContext(); } - public static ConduitGraphContext loadNetworkContext(Holder> conduit, + public static ConduitGraphContext loadNetworkContext(Holder> conduit, HolderLookup.Provider lookupProvider, CompoundTag contextTag) { ConduitNetworkContext context = loadNetworkContext(conduit.value(), lookupProvider, contextTag); return new ConduitGraphContext(context); } @Nullable - private static ConduitNetworkContext loadNetworkContext(Conduit conduit, HolderLookup.Provider lookupProvider, + private static ConduitNetworkContext loadNetworkContext(Conduit conduit, HolderLookup.Provider lookupProvider, CompoundTag contextTag) { ResourceLocation serializerKey = ResourceLocation.parse(contextTag.getString("Type")); ConduitNetworkContextType contextType = Objects.requireNonNull( diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java index 933b52e866..345ec31b1c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphUtility.java @@ -10,19 +10,19 @@ public class ConduitGraphUtility { - public static void integrate(Holder> conduit, GraphObject graphObject, + public static void integrate(Holder> conduit, GraphObject graphObject, List> neighbours) { Graph.integrate(graphObject, neighbours, Graph::new, g -> ConduitGraphContext.createNetworkContext()); } - public static void integrateWithLoad(Holder> conduit, GraphObject graphObject, + public static void integrateWithLoad(Holder> conduit, GraphObject graphObject, List> neighbours, HolderLookup.Provider lookupProvider, CompoundTag contextTag) { Graph.integrate(graphObject, neighbours, Graph::new, g -> ConduitGraphContext.loadNetworkContext(conduit, lookupProvider, contextTag)); } - public static void connect(Holder> conduit, GraphObject graphObject, + public static void connect(Holder> conduit, GraphObject graphObject, GraphObject neighbour) { Graph.connect(graphObject, neighbour, Graph::new, g -> ConduitGraphContext.createNetworkContext()); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java index 866cbf316f..54d11f554b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java @@ -28,9 +28,9 @@ public class NewConduitMenu extends BaseBlockEntityMenu> selectedConduit; // TODO: Sync with sync slot instead of using initial menu open? + private Holder> selectedConduit; // TODO: Sync with sync slot instead of using initial menu open? - public NewConduitMenu(int containerId, Inventory playerInventory, NewConduitBundleBlockEntity blockEntity, Direction side, Holder> selectedConduit) { + public NewConduitMenu(int containerId, Inventory playerInventory, NewConduitBundleBlockEntity blockEntity, Direction side, Holder> selectedConduit) { super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory, blockEntity); this.side = side; @@ -56,7 +56,7 @@ public Direction getSide() { return side; } - public Holder> getSelectedConduit() { + public Holder> getSelectedConduit() { return selectedConduit; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index 652be6b3f0..f8f63e1503 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -1,11 +1,10 @@ package com.enderio.conduits.common.conduit.type.energy; import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.common.init.ConduitLang; @@ -34,7 +33,7 @@ // TODO: Redstone control isn't working properly - the cap needs to refuse input to the node if the connection being fed into is blocked by a redstone signal. public record EnergyConduit(ResourceLocation texture, Component description, int transferRatePerTick) - implements Conduit { + implements Conduit { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(builder -> builder .group(ResourceLocation.CODEC.fieldOf("texture").forGetter(Conduit::texture), @@ -72,12 +71,12 @@ public ConduitMenuData getMenuData() { } @Override - public boolean canBeInSameBundle(Holder> otherConduit) { + public boolean canBeInSameBundle(Holder> otherConduit) { return !(otherConduit.value() instanceof EnergyConduit); } @Override - public boolean canBeReplacedBy(Holder> otherConduit) { + public boolean canBeReplacedBy(Holder> otherConduit) { if (!(otherConduit.value() instanceof EnergyConduit otherEnergyConduit)) { return false; } @@ -92,28 +91,46 @@ public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction dir } @Override - public @Nullable TCap proxyCapability(BlockCapability capability, ConduitNode node, - Level level, BlockPos pos, @Nullable TContext context) { + public @Nullable TCap proxyCapability(Level level, ColoredRedstoneProvider coloredRedstoneProvider, ConduitNode node, BlockCapability capability, + @Nullable TContext context) { if (Capabilities.EnergyStorage.BLOCK == capability && (context == null || context instanceof Direction)) { + boolean isMutable = true; + if (context != null) { + Direction side = (Direction)context; + // No connection, no cap. - if (!node.isConnectedTo((Direction) context)) { + if (!node.isConnectedTo(side)) { return null; } - var config = node.getConnectionConfig((Direction) context); - if (!config.isConnected()) { + var config = node.getConnectionConfig(side, connectionConfigType()); + if (!config.isConnected() || !config.canExtract()) { return null; } - if (config instanceof IOConnectionConfig ioConfig && !ioConfig.canInsert()) { - return null; + if (config.redstoneControl() == RedstoneControl.NEVER_ACTIVE) { + isMutable = false; + } else if (config.redstoneControl() != RedstoneControl.ALWAYS_ACTIVE) { + boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), config.redstoneChannel()); + if (!hasRedstone) { + for (Direction direction : Direction.values()) { + if (level.getSignal(node.getPos().relative(direction), direction.getOpposite()) > 0) { + hasRedstone = true; + break; + } + } + } + + if (!hasRedstone) { + isMutable = false; + } } } // noinspection unchecked - return (TCap) new EnergyConduitStorage(transferRatePerTick(), node); + return (TCap) new EnergyConduitStorage(isMutable, transferRatePerTick(), node); } return null; @@ -125,12 +142,12 @@ public void onRemoved(ConduitNode node, Level level, BlockPos pos) { } @Override - public ConnectionConfigType connectionConfigType() { + public ConnectionConfigType connectionConfigType() { return ConduitTypes.ConnectionTypes.ENERGY.get(); } @Override - public ConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, + public EnergyConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { return new EnergyConduitConnectionConfig(isInsert, isExtract, redstoneControl, redstoneChannel); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java index 04d4f0c6ff..0e3a8ddb30 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java @@ -5,6 +5,7 @@ import net.neoforged.neoforge.energy.IEnergyStorage; public record EnergyConduitStorage( + boolean isMutable, int transferRate, ConduitNode node ) implements IEnergyStorage { @@ -70,6 +71,6 @@ public boolean canExtract() { // This means we don't have to worry about checking if we can extract at this point. @Override public boolean canReceive() { - return node.getNetwork() != null; + return node.getNetwork() != null && isMutable; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java index 4a8b48d64c..ef0183c9e4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java @@ -2,28 +2,28 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.IOAwareConduitTicker; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; -import com.enderio.conduits.common.init.Conduits; -import java.util.ArrayList; -import java.util.List; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.Level; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.energy.IEnergyStorage; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; -public class EnergyConduitTicker implements IOAwareConduitTicker { +public class EnergyConduitTicker extends IOAwareConduitTicker { public EnergyConduitTicker() { } + // TODO: Need a way to prevent the extracts list from being built as it is unused. + @Override - public void tickColoredGraph(ServerLevel level, EnergyConduit conduit, List inserts, - List extracts, DyeColor color, ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider) { + protected void tickGraph(ServerLevel level, EnergyConduit conduit, List inserts, List extracts, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider) { // Adjust for tick rate. Always flow up so we are at minimum meeting the // required rate. @@ -40,8 +40,7 @@ public void tickColoredGraph(ServerLevel level, EnergyConduit conduit, List storagesForInsert = new ArrayList<>(); for (var insert : inserts) { - IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, insert.move(), - insert.direction().getOpposite()); + IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, insert.neighborPos(), insert.neighborSide()); if (capability != null) { storagesForInsert.add(capability); } @@ -75,7 +74,30 @@ public void tickColoredGraph(ServerLevel level, EnergyConduit conduit, List extractList, List insertList) { + protected boolean shouldSkip(List extractList, List insertList) { return insertList.isEmpty(); } + + @Override + protected @Nullable EnergyConduitTicker.Connection createConnection(Level level, ConduitNode node, Direction side) { + IEnergyStorage energyStorage = level.getCapability(Capabilities.EnergyStorage.BLOCK, node.getPos().relative(side), side.getOpposite()); + if (energyStorage != null) { + return new Connection(node, side, energyStorage); + } + + return null; + } + + protected static class Connection extends IOAwareConduitTicker.SimpleConnection { + private final IEnergyStorage energyStorage; + + public Connection(ConduitNode node, Direction side, IEnergyStorage energyStorage) { + super(node, side); + this.energyStorage = energyStorage; + } + + public IEnergyStorage energyStorage() { + return energyStorage; + } + } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index e8ce87788a..1a407a1431 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -40,7 +40,7 @@ import org.jetbrains.annotations.NotNull; public record FluidConduit(ResourceLocation texture, Component description, int transferRatePerTick, - boolean isMultiFluid) implements Conduit { + boolean isMultiFluid) implements Conduit { public static final MapCodec CODEC = RecordCodecBuilder .mapCodec( @@ -74,12 +74,12 @@ public ConduitMenuData getMenuData() { } @Override - public boolean canBeInSameBundle(Holder> otherConduit) { + public boolean canBeInSameBundle(Holder> otherConduit) { return !(otherConduit.value() instanceof FluidConduit); } @Override - public boolean canBeReplacedBy(Holder> otherConduit) { + public boolean canBeReplacedBy(Holder> otherConduit) { if (!(otherConduit.value() instanceof FluidConduit otherFluidConduit)) { return false; } @@ -121,17 +121,14 @@ public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) } @Override - public ConnectionConfigType connectionConfigType() { -// return SimpleRedstoneControlledConnectionConfig.TYPE; - return null; + public ConnectionConfigType connectionConfigType() { + return FluidConduitConnectionConfig.TYPE; } @Override - public ConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, + public FluidConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { -// return new SimpleRedstoneControlledConnectionConfig(ConduitConnectionMode.of(isInsert, isExtract), inputChannel, outputChannel, -// redstoneControl, redstoneChannel); - return null; + return new FluidConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel, redstoneControl, redstoneChannel); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java new file mode 100644 index 0000000000..2c024f6844 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java @@ -0,0 +1,81 @@ +package com.enderio.conduits.common.conduit.type.fluid; + +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.common.init.ConduitTypes; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.item.DyeColor; + +public record FluidConduitConnectionConfig( + boolean canInsert, + DyeColor insertChannel, + boolean canExtract, + DyeColor extractChannel, + RedstoneControl redstoneControl, + DyeColor redstoneChannel +) implements ChanneledIOConnectionConfig, RedstoneControlledConnection { + + public static FluidConduitConnectionConfig DEFAULT = new FluidConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.GREEN, + RedstoneControl.NEVER_ACTIVE, DyeColor.RED); + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group( + Codec.BOOL.fieldOf("can_insert").forGetter(FluidConduitConnectionConfig::canInsert), + DyeColor.CODEC.fieldOf("insert_channel").forGetter(FluidConduitConnectionConfig::insertChannel), + Codec.BOOL.fieldOf("can_extract").forGetter(FluidConduitConnectionConfig::canExtract), + DyeColor.CODEC.fieldOf("extract_channel").forGetter(FluidConduitConnectionConfig::extractChannel), + RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(FluidConduitConnectionConfig::redstoneControl), + DyeColor.CODEC.fieldOf("redstone_channel").forGetter(FluidConduitConnectionConfig::redstoneChannel) + ).apply(instance, FluidConduitConnectionConfig::new) + ); + + public static ConnectionConfigType TYPE = new ConnectionConfigType<>( + FluidConduitConnectionConfig.class, CODEC, () -> DEFAULT); + + @Override + public ConnectionConfig reconnected() { + return new FluidConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.insertChannel, DEFAULT.canExtract, DEFAULT.extractChannel, redstoneControl, + redstoneChannel); + } + + @Override + public IOConnectionConfig withInsert(boolean canInsert) { + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + } + + @Override + public IOConnectionConfig withExtract(boolean canExtract) { + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + } + + @Override + public FluidConduitConnectionConfig withInputChannel(DyeColor inputChannel) { + return new FluidConduitConnectionConfig(canInsert, inputChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + } + + @Override + public FluidConduitConnectionConfig withOutputChannel(DyeColor outputChannel) { + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, outputChannel, redstoneControl, redstoneChannel); + } + + @Override + public FluidConduitConnectionConfig withRedstoneControl(RedstoneControl redstoneControl) { + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + } + + @Override + public RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel) { + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + } + + @Override + public ConnectionConfigType type() { + return TYPE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java index a19368d048..e622f952d3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java @@ -4,31 +4,31 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.ticker.CapabilityAwareConduitTicker; -import com.enderio.conduits.common.init.ConduitTypes; +import com.enderio.conduits.api.ticker.ChannelIOAwareConduitTicker; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; import net.minecraft.world.level.material.FlowingFluid; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; -import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.fluids.FluidUtil; import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import org.jetbrains.annotations.Nullable; import java.util.List; -public class FluidConduitTicker extends CapabilityAwareConduitTicker { +public class FluidConduitTicker extends ChannelIOAwareConduitTicker { - private int getScaledFluidRate(FluidConduit conduit, CapabilityConnection extractingConnection) { + private int getScaledFluidRate(FluidConduit conduit) { // Adjust for tick rate. Always flow up so we are at minimum meeting the required rate. - int rate = (int)Math.ceil(conduit.transferRatePerTick() * (20.0 / conduit.graphTickRate())); - return rate; + return (int)Math.ceil(conduit.transferRatePerTick() * (20.0 / conduit.graphTickRate())); } - private int doFluidTransfer(FluidStack fluid, CapabilityConnection extract, List inserts) { - FluidStack extractedFluid = extract.capability().drain(fluid, IFluidHandler.FluidAction.SIMULATE); + private int doFluidTransfer(FluidStack fluid, Connection extract, List inserts) { + FluidStack extractedFluid = extract.fluidHandler().drain(fluid, IFluidHandler.FluidAction.SIMULATE); if (extractedFluid.isEmpty()) { return fluid.getAmount(); @@ -40,14 +40,14 @@ private int doFluidTransfer(FluidStack fluid, CapabilityConnection extract, List } } - for (CapabilityConnection insert : inserts) { + for (Connection insert : inserts) { if (insert.insertFilter() instanceof FluidStackFilter fluidStackFilter) { if (!fluidStackFilter.test(extractedFluid)) { continue; } } - FluidStack transferredFluid = FluidUtil.tryFluidTransfer(insert.capability(), extract.capability(), fluid, true); + FluidStack transferredFluid = FluidUtil.tryFluidTransfer(insert.fluidHandler(), extract.fluidHandler(), fluid, true); if (!transferredFluid.isEmpty()) { fluid.shrink(transferredFluid.getAmount()); @@ -62,46 +62,14 @@ private int doFluidTransfer(FluidStack fluid, CapabilityConnection extract, List } @Override - public void tickGraph( - ServerLevel level, - FluidConduit conduit, - List loadedNodes, - ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider) { - -// boolean shouldReset = false; -// for (var loadedNode : loadedNodes) { -// FluidConduitData fluidExtendedData = loadedNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); -// if (fluidExtendedData.shouldReset()) { -// shouldReset = true; -// fluidExtendedData.setShouldReset(false); -// } -// } -// -// if (shouldReset) { -// for (var loadedNode : loadedNodes) { -// FluidConduitData fluidExtendedData = loadedNode.getOrCreateData(ConduitTypes.Data.FLUID.get()); -// fluidExtendedData.setLockedFluid(Fluids.EMPTY); -// } -// } - super.tickGraph(level, conduit, loadedNodes, graph, coloredRedstoneProvider); - } - - @Override - protected void tickCapabilityGraph( - ServerLevel level, - FluidConduit conduit, - List inserts, - List extracts, - ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider) { + protected void tickColoredGraph(ServerLevel level, FluidConduit conduit, List inserts, List extracts, DyeColor color, + ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + final int fluidRate = getScaledFluidRate(conduit); var context = graph.getOrCreateContext(FluidConduitNetworkContext.TYPE); - for (CapabilityConnection extract : extracts) { - IFluidHandler extractHandler = extract.capability(); - - final int fluidRate = getScaledFluidRate(conduit, extract); + for (Connection extract : extracts) { + IFluidHandler extractHandler = extract.fluidHandler(); if (!context.lockedFluid().isSame(Fluids.EMPTY)) { doFluidTransfer(new FluidStack(context.lockedFluid(), fluidRate), extract, inserts); @@ -131,7 +99,24 @@ protected void tickCapabilityGraph( } @Override - protected BlockCapability getCapability() { - return Capabilities.FluidHandler.BLOCK; + protected @Nullable FluidConduitTicker.Connection createConnection(Level level, ConduitNode node, Direction side) { + IFluidHandler fluidHandler = level.getCapability(Capabilities.FluidHandler.BLOCK, node.getPos().relative(side), side.getOpposite()); + if (fluidHandler != null) { + return new Connection(node, side, fluidHandler); + } + return null; + } + + protected static class Connection extends SimpleConnection { + private final IFluidHandler fluidHandler; + + public Connection(ConduitNode node, Direction side, IFluidHandler fluidHandler) { + super(node, side); + this.fluidHandler = fluidHandler; + } + + public IFluidHandler fluidHandler() { + return fluidHandler; + } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java index 10f33f502d..1c073681e4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java @@ -38,7 +38,7 @@ public record ItemConduit( Component description, int transferRatePerCycle, int graphTickRate -) implements Conduit { +) implements Conduit { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( builder -> builder @@ -103,15 +103,14 @@ public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction dir } @Override - public ConnectionConfigType connectionConfigType() { + public ConnectionConfigType connectionConfigType() { return ConduitTypes.ConnectionTypes.ITEM.get(); } - // TODO: Move conversions into the connection config type. + // TODO: Move conversions into the connection config type? @Override - public ConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, + public ItemConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { - return new ItemConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel, redstoneControl, redstoneChannel, false, false, 0); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java index 284c47b5bc..f1072fc32d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java @@ -93,6 +93,6 @@ public ItemConduitConnectionConfig withPriority(int priority) { @Override public ConnectionConfigType type() { - return ConduitTypes.ConnectionTypes.ITEM.get(); + return TYPE; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java index 9de47cdadc..22486a43eb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java @@ -3,30 +3,32 @@ import com.enderio.base.api.filter.ItemStackFilter; import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; -import com.enderio.conduits.api.ticker.CapabilityAwareConduitTicker; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.enderio.conduits.api.ticker.ChannelIOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitTypes; import java.util.List; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.capabilities.BlockCapability; +import net.minecraft.world.level.Level; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.ItemHandlerHelper; +import org.jetbrains.annotations.Nullable; -public class ItemConduitTicker extends CapabilityAwareConduitTicker { +public class ItemConduitTicker extends ChannelIOAwareConduitTicker { @Override - protected void tickCapabilityGraph(ServerLevel level, ItemConduit conduit, List inserts, - List extracts, ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider) { + protected void tickColoredGraph(ServerLevel level, ItemConduit conduit, List inserts, List extracts, DyeColor color, + ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { - toNextExtract: for (CapabilityConnection extract : extracts) { + toNextExtract: for (Connection extract : extracts) { ItemConduitNodeData nodeData = extract.node().getOrCreateNodeData(ConduitTypes.NodeData.ITEM.get()); - IItemHandler extractHandler = extract.capability(); + IItemHandler extractHandler = extract.itemHandler(); int extracted = 0; int speed = conduit.transferRatePerCycle(); @@ -43,11 +45,11 @@ protected void tickCapabilityGraph(ServerLevel level, ItemConduit conduit, List< } } - var connectionConfig = extract.node().getConnectionConfig(extract.direction(), ConduitTypes.ConnectionTypes.ITEM.get()); + var connectionConfig = extract.node().getConnectionConfig(extract.side(), ConduitTypes.ConnectionTypes.ITEM.get()); int startingIndex = 0; if (connectionConfig.isRoundRobin()) { - startingIndex = nodeData.getIndex(extract.direction()); + startingIndex = nodeData.getIndex(extract.side()); if (inserts.size() <= startingIndex) { startingIndex = 0; } @@ -55,10 +57,10 @@ protected void tickCapabilityGraph(ServerLevel level, ItemConduit conduit, List< for (int j = startingIndex; j < startingIndex + inserts.size(); j++) { int insertIndex = j % inserts.size(); - CapabilityConnection insert = inserts.get(insertIndex); + Connection insert = inserts.get(insertIndex); - if (!connectionConfig.isSelfFeed() && extract.direction() == insert.direction() - && extract.pos() == insert.pos()) { + if (!connectionConfig.isSelfFeed() && extract.side() == insert.side() + && extract.node().getPos().equals(insert.node().getPos())) { continue; } @@ -68,7 +70,7 @@ protected void tickCapabilityGraph(ServerLevel level, ItemConduit conduit, List< } } - ItemStack notInserted = ItemHandlerHelper.insertItem(insert.capability(), extractedItem, false); + ItemStack notInserted = ItemHandlerHelper.insertItem(insert.itemHandler, extractedItem, false); int successfullyInserted = extractedItem.getCount() - notInserted.getCount(); if (successfullyInserted > 0) { @@ -76,7 +78,7 @@ protected void tickCapabilityGraph(ServerLevel level, ItemConduit conduit, List< extractHandler.extractItem(i, successfullyInserted, false); if (extracted >= speed || isEmpty(extractHandler, i + 1)) { if (connectionConfig.isRoundRobin()) { - nodeData.setIndex(extract.direction(), insertIndex + 1); + nodeData.setIndex(extract.side(), insertIndex + 1); } continue toNextExtract; } else { @@ -99,7 +101,26 @@ private boolean isEmpty(IItemHandler itemHandler, int afterIndex) { } @Override - protected BlockCapability getCapability() { - return Capabilities.ItemHandler.BLOCK; + @Nullable + protected Connection createConnection(Level level, ConduitNode node, Direction side) { + IItemHandler itemHandler = level.getCapability(Capabilities.ItemHandler.BLOCK, node.getPos().relative(side), side.getOpposite()); + if (itemHandler != null) { + return new Connection(node, side, itemHandler); + } + + return null; + } + + protected static class Connection extends SimpleConnection { + private final IItemHandler itemHandler; + + public Connection(ConduitNode node, Direction side, IItemHandler itemHandler) { + super(node, side); + this.itemHandler = itemHandler; + } + + public IItemHandler itemHandler() { + return itemHandler; + } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java index eaa6154781..83abeae697 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java @@ -32,7 +32,7 @@ public record RedstoneConduit( ResourceLocation texture, ResourceLocation activeTexture, Component description -) implements Conduit { +) implements Conduit { public static MapCodec CODEC = RecordCodecBuilder.mapCodec( builder -> builder.group( @@ -99,16 +99,14 @@ public boolean canForceConnectToBlock(Level level, BlockPos conduitPos, Directio } @Override - public ConnectionConfigType connectionConfigType() { -// return SimpleConnectionConfig.TYPE; - return null; + public ConnectionConfigType connectionConfigType() { + return RedstoneConduitConnectionConfig.TYPE; } @Override - public ConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, + public RedstoneConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { -// return new SimpleConnectionConfig(ConduitConnectionMode.of(isInsert, isExtract), inputChannel, outputChannel); - return null; + return new RedstoneConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java new file mode 100644 index 0000000000..d1ee3d15c4 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java @@ -0,0 +1,64 @@ +package com.enderio.conduits.common.conduit.type.redstone; + +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.item.DyeColor; + +public record RedstoneConduitConnectionConfig( + boolean canInsert, + DyeColor insertChannel, + boolean canExtract, + DyeColor extractChannel +) implements ChanneledIOConnectionConfig { + + public static RedstoneConduitConnectionConfig DEFAULT = new RedstoneConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.RED); + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group( + Codec.BOOL.fieldOf("can_insert").forGetter(RedstoneConduitConnectionConfig::canInsert), + DyeColor.CODEC.fieldOf("insert_channel").forGetter(RedstoneConduitConnectionConfig::insertChannel), + Codec.BOOL.fieldOf("can_extract").forGetter(RedstoneConduitConnectionConfig::canExtract), + DyeColor.CODEC.fieldOf("extract_channel").forGetter(RedstoneConduitConnectionConfig::extractChannel) + ).apply(instance, RedstoneConduitConnectionConfig::new) + ); + + public static ConnectionConfigType TYPE = new ConnectionConfigType<>( + RedstoneConduitConnectionConfig.class, CODEC, () -> DEFAULT); + + @Override + public ConnectionConfig reconnected() { + return new RedstoneConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.insertChannel, DEFAULT.canExtract, DEFAULT.extractChannel); + } + + @Override + public IOConnectionConfig withInsert(boolean canInsert) { + return new RedstoneConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel); + } + + @Override + public IOConnectionConfig withExtract(boolean canExtract) { + return new RedstoneConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel); + } + + @Override + public RedstoneConduitConnectionConfig withInputChannel(DyeColor inputChannel) { + return new RedstoneConduitConnectionConfig(canInsert, inputChannel, canExtract, extractChannel); + } + + @Override + public RedstoneConduitConnectionConfig withOutputChannel(DyeColor outputChannel) { + return new RedstoneConduitConnectionConfig(canInsert, insertChannel, canExtract, outputChannel); + } + + @Override + public ConnectionConfigType type() { + return TYPE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java index 5227d204ff..9cd35f3630 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java @@ -3,23 +3,21 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.ticker.IOAwareConduitTicker; +import com.enderio.conduits.api.ticker.ChannelIOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitBlocks; -import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.redstone.RedstoneExtractFilter; -import com.enderio.conduits.common.tag.ConduitTags; -import java.util.Collection; + import java.util.EnumMap; import java.util.List; import java.util.Map; -import net.minecraft.core.BlockPos; + import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; -public class RedstoneConduitTicker implements IOAwareConduitTicker { +public class RedstoneConduitTicker extends ChannelIOAwareConduitTicker { private final Map activeColors = new EnumMap<>(DyeColor.class); @@ -27,37 +25,34 @@ public class RedstoneConduitTicker implements IOAwareConduitTicker nodes = graph.getNodes(); - - RedstoneConduitNetworkContext context = graph.getOrCreateContext(RedstoneConduitNetworkContext.TYPE); + var context = graph.getOrCreateContext(RedstoneConduitNetworkContext.TYPE); boolean isActiveBeforeTick = context.isActive(); context.clear(); activeColors.clear(); - tickGraph(level, conduit, nodes.stream().filter(ConduitNode::isLoaded).toList(), - graph, coloredRedstoneProvider); + super.tickGraph(level, conduit, graph, coloredRedstoneProvider); // If active changed, nodes need to be synced. if (context.isActive() != isActiveBeforeTick) { - for (var node : nodes) { + for (var node : graph.getNodes()) { node.markDirty(); } } } @Override - public void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List inserts, - List extracts, DyeColor color, ConduitNetwork graph, + public void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List inserts, + List extracts, DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { RedstoneConduitNetworkContext networkContext = graph.getOrCreateContext(RedstoneConduitNetworkContext.TYPE); - for (Connection extract : extracts) { + for (SimpleConnection extract : extracts) { int signal; if (extract.extractFilter() instanceof RedstoneExtractFilter filter) { - signal = filter.getInputSignal(level, extract.move(), extract.direction()); + signal = filter.getInputSignal(level, extract.neighborPos(), extract.neighborSide()); } else { - signal = level.getSignal(extract.move(), extract.direction()); + signal = level.getSignal(extract.neighborPos(), extract.neighborSide()); } if (signal > 0) { @@ -65,13 +60,19 @@ public void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List extractList, List insertList) { - return extractList.isEmpty() && insertList.isEmpty(); // Only skip if no one uses the channel + protected @Nullable ChannelIOAwareConduitTicker.SimpleConnection createConnection(Level level, ConduitNode node, Direction side) { + return new SimpleConnection(node, side); + } + + @Override + protected boolean shouldSkipColor(List extractList, List insertList) { + // Skip if the channel is completely un-utilised. + return extractList.isEmpty() && insertList.isEmpty(); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitComponents.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitComponents.java index 5696d976da..fb547f00bf 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitComponents.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitComponents.java @@ -21,7 +21,7 @@ public class ConduitComponents { private static final DeferredRegister.DataComponents DATA_COMPONENT_TYPES = DeferredRegister .createDataComponents(EnderIO.NAMESPACE); - public static final DeferredHolder, DataComponentType>>> CONDUIT = DATA_COMPONENT_TYPES + public static final DeferredHolder, DataComponentType>>> CONDUIT = DATA_COMPONENT_TYPES .registerComponentType("conduit", builder -> builder.persistent(Conduit.CODEC).networkSynchronized(Conduit.STREAM_CODEC)); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java index 4344e76aa1..85b586a238 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java @@ -17,28 +17,28 @@ public class Conduits { - public static ResourceKey> ENERGY = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> ENERGY = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("energy")); - public static ResourceKey> ENHANCED_ENERGY = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> ENHANCED_ENERGY = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("enhanced_energy")); - public static ResourceKey> ENDER_ENERGY = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> ENDER_ENERGY = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("ender_energy")); - public static ResourceKey> REDSTONE = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> REDSTONE = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("redstone")); - public static ResourceKey> FLUID = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> FLUID = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("fluid")); - public static ResourceKey> PRESSURIZED_FLUID = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> PRESSURIZED_FLUID = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("pressurized_fluid")); - public static ResourceKey> ENDER_FLUID = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> ENDER_FLUID = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("ender_fluid")); - public static ResourceKey> ITEM = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> ITEM = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("item")); - public static ResourceKey> ENHANCED_ITEM = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> ENHANCED_ITEM = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("enhanced_item")); - public static ResourceKey> ENDER_ITEM = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, + public static ResourceKey> ENDER_ITEM = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("ender_item")); - public static void bootstrap(BootstrapContext> context) { + public static void bootstrap(BootstrapContext> context) { // TODO: These rates are still up for change, but will refine through testing. context.register(ENERGY, new EnergyConduit(EnderIO.loc("block/conduit/energy"), ConduitLang.ENERGY_CONDUIT, 1_000)); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java index a5d535aa4d..7ad3e73cf5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java @@ -23,7 +23,7 @@ public class EIOBundledRedstoneProvider implements BundledRedstoneProvider { public int getBundledRedstoneOutput(Level world, BlockPos pos, Direction side) { BlockEntity be = world.getBlockEntity(pos); - Holder> redstoneConduit = world.holderOrThrow(Conduits.REDSTONE); + Holder> redstoneConduit = world.holderOrThrow(Conduits.REDSTONE); // if (be instanceof ConduitBundleBlockEntity conduit) { // ConnectionState connectionState = conduit.getBundle().getConnectionState(side, redstoneConduit); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/jei/ConduitSubtypeInterpreter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/jei/ConduitSubtypeInterpreter.java index 55d53bfa61..c56961d4b4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/jei/ConduitSubtypeInterpreter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/jei/ConduitSubtypeInterpreter.java @@ -10,7 +10,7 @@ public class ConduitSubtypeInterpreter implements IIngredientSubtypeInterpreter { @Override public String apply(ItemStack ingredient, UidContext context) { - Holder> conduit = ingredient.get(ConduitComponents.CONDUIT); + Holder> conduit = ingredient.get(ConduitComponents.CONDUIT); if (conduit != null) { return conduit.getRegisteredName(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java index 9614a87001..10f7bb3683 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java @@ -24,10 +24,10 @@ public class ConduitMenu extends LegacyBaseBlockEntityMenu { private Direction direction; - private Holder> conduit; + private Holder> conduit; public ConduitMenu(@Nullable ConduitBundleBlockEntity blockEntity, Inventory inventory, int pContainerId, - Direction direction, Holder> conduit) { + Direction direction, Holder> conduit) { super(ConduitMenus.CONDUIT_MENU.get(), pContainerId, blockEntity, inventory); this.direction = direction; @@ -90,7 +90,7 @@ private boolean clientValid() { public static ConduitMenu factory(int pContainerId, Inventory inventory, RegistryFriendlyByteBuf buf) { BlockEntity entity = inventory.player.level().getBlockEntity(buf.readBlockPos()); Direction direction = buf.readEnum(Direction.class); - Holder> type = Conduit.STREAM_CODEC.decode(buf); + Holder> type = Conduit.STREAM_CODEC.decode(buf); if (entity instanceof ConduitBundleBlockEntity castBlockEntity) { return new ConduitMenu(castBlockEntity, inventory, pContainerId, direction, type); } @@ -99,11 +99,11 @@ public static ConduitMenu factory(int pContainerId, Inventory inventory, Registr return new ConduitMenu(null, inventory, pContainerId, direction, type); } - public Holder> getConduit() { + public Holder> getConduit() { return conduit; } - public void setConduit(Holder> conduit) { + public void setConduit(Holder> conduit) { this.conduit = conduit; if (getBlockEntity().hasLevel() && getBlockEntity().getLevel().isClientSide()) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitConnectionState.java index 2f60362d8c..8312e44556 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitConnectionState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitConnectionState.java @@ -13,7 +13,7 @@ public record C2SSetConduitConnectionState( BlockPos pos, Direction direction, - Holder> conduit, + Holder> conduit, DynamicConnectionState connectionState ) implements CustomPacketPayload { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java index 82e5e82660..7cee664c8f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java @@ -9,7 +9,7 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public record C2SSetConduitExtendedData(BlockPos pos, Holder> conduit, +public record C2SSetConduitExtendedData(BlockPos pos, Holder> conduit, ConduitDataContainer conduitDataContainer) implements CustomPacketPayload { public static final Type TYPE = new Type<>(EnderIO.loc("c2s_conduit_extended_data")); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitMenuSelectionPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitMenuSelectionPacket.java index 4f3a4feeb1..fe3cd703b5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitMenuSelectionPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitMenuSelectionPacket.java @@ -10,7 +10,7 @@ import net.minecraft.network.protocol.common.custom.CustomPacketPayload; public record ConduitMenuSelectionPacket( - Holder> conduit + Holder> conduit ) implements CustomPacketPayload { public static final Type TYPE = new Type<>(EnderIO.loc("conduit_menu_selection")); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java index a01d6cea82..cf856bbcf2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java @@ -8,5 +8,5 @@ public interface C2SConduitConnectionPacket { BlockPos pos(); Direction side(); - Holder> conduit(); + Holder> conduit(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java index d91efa2a96..0a03154745 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java @@ -15,7 +15,7 @@ public record C2SSetConduitChannelPacket( BlockPos pos, Direction side, - Holder> conduit, + Holder> conduit, Side channelSide, DyeColor channelColor ) implements C2SConduitConnectionPacket, CustomPacketPayload { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java index 99bfa579f2..116c6af8df 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java @@ -13,7 +13,7 @@ public record C2SSetConduitRedstoneChannelPacket( BlockPos pos, Direction side, - Holder> conduit, + Holder> conduit, DyeColor redstoneChannel ) implements C2SConduitConnectionPacket, CustomPacketPayload { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java index 4778cde0de..dd4e68990b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java @@ -14,7 +14,7 @@ public record C2SSetConduitRedstoneControlPacket( BlockPos pos, Direction side, - Holder> conduit, + Holder> conduit, RedstoneControl redstoneControl ) implements C2SConduitConnectionPacket, CustomPacketPayload { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/recipe/ConduitIngredient.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/recipe/ConduitIngredient.java index 2562f5b2dd..c42275ab7c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/recipe/ConduitIngredient.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/recipe/ConduitIngredient.java @@ -20,17 +20,17 @@ public class ConduitIngredient implements ICustomIngredient { builder -> builder.group(Conduit.CODEC.fieldOf("conduit_type").forGetter(ConduitIngredient::conduit)) .apply(builder, ConduitIngredient::new)); - private final Holder> conduit; + private final Holder> conduit; - private ConduitIngredient(Holder> conduit) { + private ConduitIngredient(Holder> conduit) { this.conduit = conduit; } - public static Ingredient of(Holder> conduit) { + public static Ingredient of(Holder> conduit) { return new ConduitIngredient(conduit).toVanilla(); } - public Holder> conduit() { + public Holder> conduit() { return conduit; } @@ -44,7 +44,7 @@ public boolean test(ItemStack stack) { return false; } - Holder> conduit = stack.get(ConduitComponents.CONDUIT); + Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit == null) { return false; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java b/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java index 5d724de684..49f8922ceb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java @@ -42,7 +42,7 @@ public ConduitRecipes(PackOutput packOutput, CompletableFuture> conduitRegistry = lookupProvider.lookupOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); + HolderGetter> conduitRegistry = lookupProvider.lookupOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); var itemConduit = conduitRegistry.getOrThrow(Conduits.ITEM); var fluidConduit = conduitRegistry.getOrThrow(Conduits.FLUID); From 2ed61d11cd2467a09a818a50a53a1b483dbbe820 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:58:31 +0000 Subject: [PATCH 10/27] chore: lots of work around menus and wrenches. Remove old conduit classes --- .../base/api/misc/RedstoneControl.java | 14 +- .../base/common/blockentity/Wrenchable.java | 4 +- .../base/common/item/tool/YetaWrenchItem.java | 4 - .../com/enderio/conduits/api/Conduit.java | 9 + .../api/ConduitRedstoneSignalAware.java | 14 + .../connection/config/ConnectionConfig.java | 8 + .../config/ConnectionConfigType.java | 16 +- .../config/NewIOConnectionConfig.java | 47 + .../RedstoneControlledConnection.java | 5 + .../api/menu/ConduitMenuDataAccess.java | 15 + .../api/model/ConduitModelModifier.java | 6 + .../api/network/node/ConduitNode.java | 8 + .../api/screen/ConduitScreenHelper.java | 44 + .../api/screen/ConduitScreenType.java | 21 + .../ticker/ChannelIOAwareConduitTicker.java | 37 +- .../api/ticker/NewIOAwareConduitTicker.java | 139 +++ .../conduits/client/ConduitClientSetup.java | 4 + .../conduits/client/ConduitFacadeColor.java | 19 +- .../client/ConduitFacadeRendering.java | 167 ++-- .../client/ConduitHighlightEvent.java | 31 +- .../conduits/client/gui/ConduitScreen.java | 237 ----- .../client/gui/ConduitSelectionButton.java | 5 +- .../client/gui/screen/NewConduitScreen.java | 192 +++- .../gui/screen/types/ConduitScreenTypes.java | 29 + .../screen/types/ItemConduitScreenType.java | 51 + .../conduit/bundle/ConduitBundleModel.java | 28 + .../bundle/ConduitBundleRenderState.java | 28 +- .../bundle/ConduitConnectionRenderState.java | 13 + .../RedstoneConduitModelModifier.java | 28 + .../client/particle/ConduitBreakParticle.java | 4 +- .../common/conduit/ConduitBundle.java | 555 ----------- .../common/conduit/ConduitSavedData.java | 11 +- .../conduits/common/conduit/ConduitShape.java | 188 ---- .../conduits/common/conduit/OffsetHelper.java | 17 - .../conduit/block/ConduitBundleBlock.java | 726 -------------- .../block/ConduitBundleBlockEntity.java | 902 ------------------ .../common/conduit/block/package-info.java | 4 - .../conduit/bundle/NewConduitBundleBlock.java | 110 ++- .../bundle/NewConduitBundleBlockEntity.java | 206 +++- .../conduit/bundle/NewConduitShape.java | 13 +- .../conduit/graph/ConduitConnectionHost.java | 4 + .../conduit/graph/ConduitGraphObject.java | 12 + .../common/conduit/menu/NewConduitMenu.java | 89 +- .../conduit/type/energy/EnergyConduit.java | 1 + .../energy/EnergyConduitConnectionConfig.java | 17 +- .../conduit/type/fluid/FluidConduit.java | 1 + .../fluid/FluidConduitConnectionConfig.java | 21 +- .../common/conduit/type/item/ItemConduit.java | 5 +- .../item/ItemConduitConnectionConfig.java | 121 ++- .../conduit/type/item/ItemConduitTicker.java | 18 +- .../type/redstone/RedstoneConduit.java | 1 + .../RedstoneConduitConnectionConfig.java | 19 +- .../RedstoneConduitNetworkContext.java | 8 +- .../type/redstone/RedstoneConduitTicker.java | 1 + .../conduits/common/init/ConduitTypes.java | 8 + .../conduits/common/menu/ConduitMenu.java | 134 --- .../conduits/common/menu/ConduitSlot.java | 116 +-- .../network/ConduitClientPayloadHandler.java | 4 + .../network/ConduitCommonPayloadHandler.java | 24 + .../common/network/ConduitNetwork.java | 11 +- .../network/ConduitServerPayloadHandler.java | 28 +- .../SetConduitConnectionConfigPacket.java | 29 + .../common/block/LegacyMachineBlock.java | 7 - .../base/LegacyMachineBlockEntity.java | 8 +- .../base/block/WrenchableBlockHandler.java | 3 +- .../base/blockentity/MachineBlockEntity.java | 8 +- 66 files changed, 1504 insertions(+), 3153 deletions(-) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitRedstoneSignalAware.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/NewIOConnectionConfig.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuDataAccess.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/RedstoneConduitModelModifier.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitShape.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/package-info.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/SetConduitConnectionConfigPacket.java diff --git a/enderio-base/src/main/java/com/enderio/base/api/misc/RedstoneControl.java b/enderio-base/src/main/java/com/enderio/base/api/misc/RedstoneControl.java index a73fde85ee..5dcd4ce81c 100644 --- a/enderio-base/src/main/java/com/enderio/base/api/misc/RedstoneControl.java +++ b/enderio-base/src/main/java/com/enderio/base/api/misc/RedstoneControl.java @@ -14,8 +14,10 @@ public enum RedstoneControl implements StringRepresentable { - ALWAYS_ACTIVE(0, "always_active", bool -> true), ACTIVE_WITH_SIGNAL(1, "active_with_signal", bool -> bool), - ACTIVE_WITHOUT_SIGNAL(2, "active_without_signal", bool -> !bool), NEVER_ACTIVE(3, "never_active", bool -> false); + ALWAYS_ACTIVE(0, "always_active", bool -> true, false), + ACTIVE_WITH_SIGNAL(1, "active_with_signal", bool -> bool, true), + ACTIVE_WITHOUT_SIGNAL(2, "active_without_signal", bool -> !bool, true), + NEVER_ACTIVE(3, "never_active", bool -> false, false); public static final Codec CODEC = StringRepresentable.fromEnum(RedstoneControl::values); public static final IntFunction BY_ID = ByIdMap.continuous(key -> key.id, values(), @@ -25,17 +27,23 @@ public enum RedstoneControl implements StringRepresentable { private final int id; private final String name; private final UnaryOperator isActive; + private final boolean isRedstoneSensitive; - RedstoneControl(int id, String name, UnaryOperator isActive) { + RedstoneControl(int id, String name, UnaryOperator isActive, boolean isRedstoneSensitive) { this.id = id; this.name = name; this.isActive = isActive; + this.isRedstoneSensitive = isRedstoneSensitive; } public boolean isActive(boolean hasRedstone) { return isActive.apply(hasRedstone); } + public boolean isRedstoneSensitive() { + return isRedstoneSensitive; + } + @Override public String getSerializedName() { return name; diff --git a/enderio-base/src/main/java/com/enderio/base/common/blockentity/Wrenchable.java b/enderio-base/src/main/java/com/enderio/base/common/blockentity/Wrenchable.java index 5265905d9d..54b83288ba 100644 --- a/enderio-base/src/main/java/com/enderio/base/common/blockentity/Wrenchable.java +++ b/enderio-base/src/main/java/com/enderio/base/common/blockentity/Wrenchable.java @@ -4,6 +4,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.UseOnContext; import net.neoforged.fml.LogicalSide; import org.jetbrains.annotations.Nullable; @@ -13,6 +14,5 @@ * An interface that block entities may implement in order to implement special behaviours(other than to rotate the block) when right-clicked with the Yeta wrench. */ public interface Wrenchable { - @UseOnly(LogicalSide.SERVER) - ItemInteractionResult onWrenched(@Nullable Player player, @Nullable Direction side); + ItemInteractionResult onWrenched(UseOnContext context); } diff --git a/enderio-base/src/main/java/com/enderio/base/common/item/tool/YetaWrenchItem.java b/enderio-base/src/main/java/com/enderio/base/common/item/tool/YetaWrenchItem.java index cab46ece92..7671451b25 100644 --- a/enderio-base/src/main/java/com/enderio/base/common/item/tool/YetaWrenchItem.java +++ b/enderio-base/src/main/java/com/enderio/base/common/item/tool/YetaWrenchItem.java @@ -29,10 +29,6 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext pContext) Level level = pContext.getLevel(); BlockPos pos = pContext.getClickedPos(); - if (!level.isClientSide && level.getBlockEntity(pos) instanceof Wrenchable wrenchable) { - return wrenchable.onWrenched(pContext.getPlayer(), pContext.getClickedFace()).result(); - } - // Check for side config capability SideConfig sideConfig = level.getCapability(EIOCapabilities.SideConfig.BLOCK, pos, pContext.getClickedFace()); if (sideConfig != null) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index b6243210c6..9341501824 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -2,6 +2,7 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; @@ -71,6 +72,14 @@ default int graphTickRate() { */ ConduitTicker getTicker(); + /** + * @implNote if a conduit has a menu, you must also register a {@link com.enderio.conduits.api.screen.ConduitScreenType} for it. + * @return whether this conduit has a menu. + */ +// boolean hasMenu(); + + // TODO: Custom menu data factory? + ConduitMenuData getMenuData(); // region Conduit Checks diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitRedstoneSignalAware.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitRedstoneSignalAware.java new file mode 100644 index 0000000000..d4da0ef318 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitRedstoneSignalAware.java @@ -0,0 +1,14 @@ +package com.enderio.conduits.api; + +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.Nullable; + +@FunctionalInterface +public interface ConduitRedstoneSignalAware { + /** + * Whether the block has a redstone signal. + * @param signalColor if set, will also check for a signal in the attached redstone conduit network. + * @return whether there is a redstone signal to this block. + */ + boolean hasRedstoneSignal(@Nullable DyeColor signalColor); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java index 8053f26036..3fdc0396d5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java @@ -2,7 +2,11 @@ import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.mojang.serialization.Codec; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.ApiStatus; @@ -16,6 +20,10 @@ public interface ConnectionConfig { Codec GENERIC_CODEC = EnderIOConduitsRegistries.CONDUIT_CONNECTION_CONFIG_TYPE.byNameCodec() .dispatch(ConnectionConfig::type, ConnectionConfigType::codec); + StreamCodec STREAM_CODEC = ByteBufCodecs + .registry(EnderIOConduitsRegistries.Keys.CONDUIT_CONNECTION_CONFIG_TYPE) + .dispatch(ConnectionConfig::type, ConnectionConfigType::streamCodec); + /** * @return whether the conduit should still be connected with this configuration. */ diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java index 1324a59643..61b0e63f5f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java @@ -4,26 +4,32 @@ import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.mojang.serialization.MapCodec; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import java.util.function.Supplier; -public record ConnectionConfigType(Class clazz, MapCodec codec, Supplier defaultSupplier) { - public ConnectionConfigType { - - } - +public record ConnectionConfigType( + Class clazz, + MapCodec codec, + StreamCodec streamCodec, + Supplier defaultSupplier +) { public T getDefault() { return defaultSupplier.get(); } + @Deprecated public boolean supportsIO() { return IOConnectionConfig.class.isAssignableFrom(clazz); } + @Deprecated public boolean supportsIOChannels() { return ChanneledIOConnectionConfig.class.isAssignableFrom(clazz); } + @Deprecated public boolean supportsRedstoneControl() { return RedstoneControlledConnection.class.isAssignableFrom(clazz); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/NewIOConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/NewIOConnectionConfig.java new file mode 100644 index 0000000000..49112ad2f6 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/NewIOConnectionConfig.java @@ -0,0 +1,47 @@ +package com.enderio.conduits.api.connection.config; + +import com.enderio.conduits.api.ConduitRedstoneSignalAware; +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public interface NewIOConnectionConfig extends ConnectionConfig { + /** + * @return whether the connection is sending resources to the connected block + */ + boolean isSend(); + + /** + * @return whether the connection is receiving resources from the connected block + */ + boolean isReceive(); + + /** + * These colors are used for send separation in the ticker. + * If no channel separation is required, always return the same colour for any connection. + * In this scenario, this is now simply the color of the arrow on the model. + * @return the send color channel. + */ + DyeColor sendColor(); + + /** + * These colors are used for send separation in the ticker. + * If no channel separation is required, always return the same colour for any connection. + * In this scenario, this is now simply the color of the arrow on the model. + * @return the receive color channel. + */ + DyeColor receiveColor(); + + default boolean canSend(ConduitRedstoneSignalAware signalAware) { + return isSend(); + } + + default boolean canReceive(ConduitRedstoneSignalAware signalAware) { + return isReceive(); + } + + @Override + default boolean isConnected() { + return isSend() || isReceive(); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java index 0c060fd57f..d4363eadaf 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java @@ -2,9 +2,14 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.connection.config.ConnectionConfig; +import net.minecraft.core.Direction; import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.ApiStatus; +/** + * Used to represent a connection that can be controlled by redstone. + * This will cause {@link com.enderio.conduits.api.network.node.ConduitNode#isActive(Direction)} to return false when the redstone condition is not met. + */ @ApiStatus.Experimental public interface RedstoneControlledConnection extends ConnectionConfig { RedstoneControl redstoneControl(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuDataAccess.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuDataAccess.java new file mode 100644 index 0000000000..75c593149f --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuDataAccess.java @@ -0,0 +1,15 @@ +package com.enderio.conduits.api.menu; + +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import net.minecraft.nbt.CompoundTag; +import org.jetbrains.annotations.ApiStatus; + +import java.util.function.Function; + +@ApiStatus.Experimental +public interface ConduitMenuDataAccess { + T getConnectionConfig(); + void updateConnectionConfig(Function configModifier); + + CompoundTag getClientDataTag(); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java index 05c8b7896d..e2d86e6f3f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java @@ -1,6 +1,7 @@ package com.enderio.conduits.api.model; import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.bundle.ConduitBundleReader; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.ModelResourceLocation; @@ -19,10 +20,15 @@ public interface ConduitModelModifier { * Used when the connection config does not support coloured connections. * @return the colour to render arrows if not specified by the connection config. */ + @Deprecated(forRemoval = true) default DyeColor getDefaultArrowColor() { return DyeColor.GREEN; } + default boolean shouldShowFakeConnection(ConduitBundleReader reader, Direction side) { + return false; + } + /** * Create additional quads to be rendered at the point of conduit connection. */ diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java index 83c2ca02a0..db8365737f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java @@ -5,6 +5,7 @@ import com.enderio.conduits.api.network.ConduitNetwork; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.Nullable; public interface ConduitNode extends NodeDataAccessor, ConnectionConfigAccessor { @@ -30,6 +31,13 @@ public interface ConduitNode extends NodeDataAccessor, ConnectionConfigAccessor */ boolean isLoaded(); + /** + * Check whether there is a redstone signal to this node's bundle. + * @param channelColor + * @return + */ + boolean hasRedstoneSignal(@Nullable DyeColor channelColor); + /** * Mark the node as dirty, causing the owning bundle to save and sync. */ diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java new file mode 100644 index 0000000000..c0cc61157c --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java @@ -0,0 +1,44 @@ +package com.enderio.conduits.api.screen; + +import com.enderio.base.api.misc.RedstoneControl; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Renderable; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +@ApiStatus.Experimental +public interface ConduitScreenHelper { + + // Positions + int getAreaLeft(); + int getAreaTop(); + int getUsableWidth(); + int getUsableHeight(); + + // Built-in widget support + AbstractWidget addCheckbox(int x, int y, Supplier getter, Consumer setter); + + AbstractWidget addColorPicker(int x, int y, Component title, Supplier getter, Consumer setter); + + AbstractWidget addRedstoneControlPicker(int x, int y, Component title, Supplier getter, Consumer setter); + + // TODO: Create icon button + + // TODO: Create custom picker? + + // Dynamic UI utilities + void addPreRenderAction(Runnable runnable); + + // Custom widget support + + W addRenderableWidget(W widget); + W addRenderableOnly(W renderable); + W addWidget(W listener); + void removeWidget(GuiEventListener listener); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java new file mode 100644 index 0000000000..de88e85cad --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java @@ -0,0 +1,21 @@ +package com.enderio.conduits.api.screen; + +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.menu.ConduitMenuDataAccess; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public abstract class ConduitScreenType { + + // TODO: Other built-in behaviours like this. + // Could also create IOConduitScreenType with automated helpers for adding the toggles. + private boolean renderSideSeparator = false; + + public abstract void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess); + + // TODO: Wrapper over guiGraphics? Means less breaks in the API? + public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java index 50e9ee4a63..f36e7a0367 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java @@ -19,6 +19,14 @@ import java.util.List; +/** + * A channel IO-aware ticker. + * + * This will check {@link ConduitNode#isActive(Direction)} for extraction connections to ensure it has a redstone signal. + * + * @param The conduit type + * @param The type of connection for the ticker implementation + */ public abstract class ChannelIOAwareConduitTicker, U extends ChannelIOAwareConduitTicker.SimpleConnection> implements ConduitTicker { @@ -36,7 +44,7 @@ public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, Colore if (node.isConnectedTo(side)) { var config = node.getConnectionConfig(side, conduit.connectionConfigType()); - if (config.canExtract() && isActive(level, side, node, coloredRedstoneProvider)) { + if (config.canExtract()) { var connection = createConnection(level, node, side); if (connection != null) { extracts.get(config.extractChannel()).add(connection); @@ -80,33 +88,6 @@ protected abstract void tickColoredGraph( ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - private boolean isActive(ServerLevel level, Direction side, ConduitNode node, ColoredRedstoneProvider coloredRedstoneProvider) { - var connectionConfig = node.getConnectionConfig(side); - if (!(connectionConfig instanceof RedstoneControlledConnection redstoneControlledConnection)) { - return true; - } - - if (redstoneControlledConnection.redstoneControl() == RedstoneControl.ALWAYS_ACTIVE) { - return true; - } - - if (redstoneControlledConnection.redstoneControl() == RedstoneControl.NEVER_ACTIVE) { - return false; - } - - boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), redstoneControlledConnection.redstoneChannel()); - if (!hasRedstone) { - for (Direction direction : Direction.values()) { - if (level.getSignal(node.getPos().relative(direction), direction) > 0) { - hasRedstone = true; - break; - } - } - } - - return redstoneControlledConnection.redstoneControl().isActive(hasRedstone); - } - public static class SimpleConnection { private final ConduitNode node; private final Direction side; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java new file mode 100644 index 0000000000..dbe31b940d --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java @@ -0,0 +1,139 @@ +package com.enderio.conduits.api.ticker; + +import com.enderio.base.api.filter.ResourceFilter; +import com.enderio.conduits.api.ColoredRedstoneProvider; +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; +import com.enderio.conduits.api.network.ConduitNetwork; +import com.enderio.conduits.api.network.node.ConduitNode; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * A channel IO-aware ticker. + * + * This will check {@link ConduitNode#isActive(Direction)} for extraction connections to ensure it has a redstone signal. + * + * @param The conduit type + * @param The type of connection for the ticker implementation + */ +public abstract class NewIOAwareConduitTicker, U extends NewIOConnectionConfig, V extends NewIOAwareConduitTicker.SimpleConnection> + implements ConduitTicker { + + @Override + public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + ListMultimap senders = ArrayListMultimap.create(); + ListMultimap receivers = ArrayListMultimap.create(); + + for (ConduitNode node : graph.getNodes()) { + // Ensure the node is loaded + if (!node.isLoaded()) { + continue; + } + + for (Direction side : Direction.values()) { + if (node.isConnectedTo(side)) { + var config = node.getConnectionConfig(side, conduit.connectionConfigType()); + + if (config.canSend(node::hasRedstoneSignal)) { + var connection = createConnection(level, node, side); + if (connection != null) { + senders.get(config.sendColor()).add(connection); + } + } + + if (config.canReceive(node::hasRedstoneSignal)) { + var connection = createConnection(level, node, side); + if (connection != null) { + receivers.get(config.receiveColor()).add(connection); + } + } + } + } + } + + for (DyeColor color : DyeColor.values()) { + List colorSenders = senders.get(color); + List colorReceivers = receivers.get(color); + if (shouldSkipColor(colorSenders, colorReceivers)) { + continue; + } + + tickColoredGraph(level, conduit, colorSenders, colorReceivers, color, graph, coloredRedstoneProvider); + } + } + + protected boolean shouldSkipColor(List senders, List receivers) { + return senders.isEmpty() || receivers.isEmpty(); + } + + protected void preProcessReceivers(List receivers) { + // Could implement a pre-sort here. + } + + @Nullable + protected abstract V createConnection(Level level, ConduitNode node, Direction side); + + protected abstract void tickColoredGraph( + ServerLevel level, + T conduit, + List inserts, + List extracts, + DyeColor color, + ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider); + + public static class SimpleConnection { + private final ConduitNode node; + private final Direction side; + private final T config; + + public SimpleConnection(ConduitNode node, Direction side, T config) { + this.node = node; + this.side = side; + this.config = config; + } + + public ConduitNode node() { + return node; + } + + public BlockPos pos() { + return node.getPos(); + } + + public Direction side() { + return side; + } + + public T config() { + return config; + } + + public BlockPos neighborPos() { + return pos().relative(side); + } + + public Direction neighborSide() { + return side.getOpposite(); + } + + @Nullable + public ResourceFilter insertFilter() { + return node.getInsertFilter(side); + } + + @Nullable + public ResourceFilter extractFilter() { + return node.getExtractFilter(side); + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java index 982792f1de..c60a6f3988 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java @@ -7,12 +7,14 @@ import com.enderio.conduits.client.gui.conduit.ConduitScreenExtensions; import com.enderio.conduits.client.gui.conduit.FluidConduitScreenExtension; import com.enderio.conduits.client.gui.conduit.ItemConduitScreenExtension; +import com.enderio.conduits.client.gui.screen.types.ConduitScreenTypes; import com.enderio.conduits.client.model.conduit.ConduitItemModelLoader; import com.enderio.conduits.client.model.conduit.facades.FacadeItemGeometry; import com.enderio.conduits.client.model.conduit.modifier.ConduitModelModifiers; import com.enderio.conduits.client.model.conduit.modifier.EnergyConduitModelModifier; import com.enderio.conduits.client.model.conduit.modifier.FluidConduitModelModifier; import com.enderio.conduits.client.model.conduit.bundle.ConduitBundleGeometry; +import com.enderio.conduits.client.model.conduit.modifier.RedstoneConduitModelModifier; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.init.ConduitTypes; import java.util.ArrayList; @@ -51,12 +53,14 @@ private ConduitClientSetup() { @SubscribeEvent public static void clientSetup(FMLClientSetupEvent event) { ConduitScreenExtensions.init(); + ConduitScreenTypes.init(); } @SubscribeEvent public static void registerConduitCoreModelModifiers(RegisterConduitModelModifiersEvent event) { event.register(ConduitTypes.FLUID.get(), FluidConduitModelModifier::new); event.register(ConduitTypes.ENERGY.get(), EnergyConduitModelModifier::new); + event.register(ConduitTypes.REDSTONE.get(), RedstoneConduitModelModifier::new); } @SubscribeEvent diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java index cb5dd95400..0ac5c4bd8e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java @@ -2,8 +2,9 @@ import com.enderio.base.common.init.EIODataComponents; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import java.util.Optional; + +import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -25,16 +26,18 @@ public int getColor(BlockState state, @Nullable BlockAndTintGetter level, @Nulla tintIndex = unmoveTintIndex(tintIndex); if (level != null && pos != null) { BlockEntity entity = level.getBlockEntity(pos); - if (entity instanceof ConduitBundleBlockEntity conduitBundleBlock) { + if (entity instanceof NewConduitBundleBlockEntity conduitBundleBlock) { - Optional facade = conduitBundleBlock.getBundle().facade(); + if (conduitBundleBlock.hasFacade()) { + var facade = conduitBundleBlock.getFacadeBlock(); - if (facade.isPresent() && FacadeHelper.areFacadesVisible()) { - int color = Minecraft.getInstance() + if (FacadeHelper.areFacadesVisible()) { + int color = Minecraft.getInstance() .getBlockColors() - .getColor(facade.get().defaultBlockState(), level, pos, tintIndex); - if (color != -1) { - return color; + .getColor(facade.defaultBlockState(), level, pos, tintIndex); + if (color != -1) { + return color; + } } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeRendering.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeRendering.java index 1c54c968cc..c1a9cb5986 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeRendering.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeRendering.java @@ -1,84 +1,83 @@ -package com.enderio.conduits.client; - -import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlock; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; -import com.mojang.blaze3d.vertex.VertexConsumer; -import java.util.Map; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.util.FastColor; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderLevelStageEvent; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.client.model.pipeline.VertexConsumerWrapper; - -@EventBusSubscriber(bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) -public class ConduitFacadeRendering { - - @SubscribeEvent - static void renderFacade(RenderLevelStageEvent event) { - if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS || FacadeHelper.areFacadesVisible()) { - return; - } - for (Map.Entry entry : ConduitBundleBlockEntity.FACADES.entrySet()) { - ClientLevel level = Minecraft.getInstance().level; - if (!level.isLoaded(entry.getKey())) { - return; - } - if (level.getBlockState(entry.getKey()).getBlock() instanceof ConduitBundleBlock) { - if (entry.getValue() == null) { - continue; - } - - var baseConsumer = Minecraft.getInstance() - .renderBuffers() - .bufferSource() - .getBuffer(Sheets.translucentCullBlockSheet()); - var wrappedConsumer = new VertexConsumerWrapper(baseConsumer) { - @Override - public VertexConsumer setColor(int r, int g, int b, int a) { - super.setColor(r, g, b, 85); - return this; - } - }; - - var cameraPos = event.getCamera().getPosition(); - event.getPoseStack().pushPose(); - event.getPoseStack() - .translate(entry.getKey().getX() - cameraPos.x, entry.getKey().getY() - cameraPos.y, - entry.getKey().getZ() - cameraPos.z); - - var model = Minecraft.getInstance() - .getModelManager() - .getBlockModelShaper() - .getBlockModel(entry.getValue()); - int color = Minecraft.getInstance().getBlockColors().getColor(entry.getValue(), level, entry.getKey()); - for (var renderType : model.getRenderTypes(entry.getValue(), RandomSource.create(), ModelData.EMPTY)) { - Minecraft.getInstance() - .getBlockRenderer() - .getModelRenderer() - .renderModel(event.getPoseStack().last(), wrappedConsumer, entry.getValue(), model, - FastColor.ARGB32.red(color) / 255.0F, FastColor.ARGB32.green(color) / 255.0F, - FastColor.ARGB32.blue(color) / 255.0F, - LightTexture.pack(level.getBrightness(LightLayer.BLOCK, entry.getKey()), - level.getBrightness(LightLayer.SKY, entry.getKey())), - OverlayTexture.NO_OVERLAY, - model.getModelData(level, entry.getKey(), entry.getValue(), ModelData.EMPTY), - renderType); - } - Minecraft.getInstance().renderBuffers().bufferSource().endBatch(Sheets.translucentCullBlockSheet()); - event.getPoseStack().popPose(); - } - } - } -} +//package com.enderio.conduits.client; +// +//import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; +//import com.mojang.blaze3d.vertex.VertexConsumer; +//import java.util.Map; +//import net.minecraft.client.Minecraft; +//import net.minecraft.client.multiplayer.ClientLevel; +//import net.minecraft.client.renderer.LightTexture; +//import net.minecraft.client.renderer.Sheets; +//import net.minecraft.client.renderer.texture.OverlayTexture; +//import net.minecraft.core.BlockPos; +//import net.minecraft.util.FastColor; +//import net.minecraft.util.RandomSource; +//import net.minecraft.world.level.LightLayer; +//import net.minecraft.world.level.block.state.BlockState; +//import net.neoforged.api.distmarker.Dist; +//import net.neoforged.bus.api.SubscribeEvent; +//import net.neoforged.fml.common.EventBusSubscriber; +//import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +//import net.neoforged.neoforge.client.model.data.ModelData; +//import net.neoforged.neoforge.client.model.pipeline.VertexConsumerWrapper; +// +//@EventBusSubscriber(bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) +//public class ConduitFacadeRendering { +// +// @SubscribeEvent +// static void renderFacade(RenderLevelStageEvent event) { +// if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS || FacadeHelper.areFacadesVisible()) { +// return; +// } +// +// for (Map.Entry entry : ConduitBundleBlockEntity.FACADES.entrySet()) { +// ClientLevel level = Minecraft.getInstance().level; +// if (!level.isLoaded(entry.getKey())) { +// return; +// } +// if (level.getBlockState(entry.getKey()).getBlock() instanceof ConduitBundleBlock) { +// if (entry.getValue() == null) { +// continue; +// } +// +// var baseConsumer = Minecraft.getInstance() +// .renderBuffers() +// .bufferSource() +// .getBuffer(Sheets.translucentCullBlockSheet()); +// var wrappedConsumer = new VertexConsumerWrapper(baseConsumer) { +// @Override +// public VertexConsumer setColor(int r, int g, int b, int a) { +// super.setColor(r, g, b, 85); +// return this; +// } +// }; +// +// var cameraPos = event.getCamera().getPosition(); +// event.getPoseStack().pushPose(); +// event.getPoseStack() +// .translate(entry.getKey().getX() - cameraPos.x, entry.getKey().getY() - cameraPos.y, +// entry.getKey().getZ() - cameraPos.z); +// +// var model = Minecraft.getInstance() +// .getModelManager() +// .getBlockModelShaper() +// .getBlockModel(entry.getValue()); +// int color = Minecraft.getInstance().getBlockColors().getColor(entry.getValue(), level, entry.getKey()); +// for (var renderType : model.getRenderTypes(entry.getValue(), RandomSource.create(), ModelData.EMPTY)) { +// Minecraft.getInstance() +// .getBlockRenderer() +// .getModelRenderer() +// .renderModel(event.getPoseStack().last(), wrappedConsumer, entry.getValue(), model, +// FastColor.ARGB32.red(color) / 255.0F, FastColor.ARGB32.green(color) / 255.0F, +// FastColor.ARGB32.blue(color) / 255.0F, +// LightTexture.pack(level.getBrightness(LightLayer.BLOCK, entry.getKey()), +// level.getBrightness(LightLayer.SKY, entry.getKey())), +// OverlayTexture.NO_OVERLAY, +// model.getModelData(level, entry.getKey(), entry.getValue(), ModelData.EMPTY), +// renderType); +// } +// Minecraft.getInstance().renderBuffers().bufferSource().endBatch(Sheets.translucentCullBlockSheet()); +// event.getPoseStack().popPose(); +// } +// } +// } +//} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitHighlightEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitHighlightEvent.java index 010e327146..d9bac83658 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitHighlightEvent.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitHighlightEvent.java @@ -2,7 +2,6 @@ import com.enderio.conduits.EnderIOConduits; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; @@ -24,20 +23,20 @@ public static void highlight(RenderHighlightEvent.Block event) { return; } - if (minecraft.level - .getBlockEntity(event.getTarget().getBlockPos()) instanceof ConduitBundleBlockEntity conduit) { - // Use standard block highlights for facades. - if (conduit.getBundle().hasFacade() && FacadeHelper.areFacadesVisible()) { - return; - } - - event.setCanceled(true); - BlockPos pos = event.getTarget().getBlockPos(); - Vec3 camPos = event.getCamera().getPosition(); - LevelRenderer.renderShape(event.getPoseStack(), event.getMultiBufferSource().getBuffer(RenderType.lines()), - conduit.getShape().getShapeFromHit(event.getTarget().getBlockPos(), event.getTarget()), - (double) pos.getX() - camPos.x, (double) pos.getY() - camPos.y, (double) pos.getZ() - camPos.z, - 0.0F, 0.0F, 0.0F, 0.4F); - } +// if (minecraft.level +// .getBlockEntity(event.getTarget().getBlockPos()) instanceof ConduitBundleBlockEntity conduit) { +// // Use standard block highlights for facades. +// if (conduit.getBundle().hasFacade() && FacadeHelper.areFacadesVisible()) { +// return; +// } +// +// event.setCanceled(true); +// BlockPos pos = event.getTarget().getBlockPos(); +// Vec3 camPos = event.getCamera().getPosition(); +// LevelRenderer.renderShape(event.getPoseStack(), event.getMultiBufferSource().getBuffer(RenderType.lines()), +// conduit.getShape().getShapeFromHit(event.getTarget().getBlockPos(), event.getTarget()), +// (double) pos.getX() - camPos.x, (double) pos.getY() - camPos.y, (double) pos.getZ() - camPos.z, +// 0.0F, 0.0F, 0.0F, 0.4F); +// } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java deleted file mode 100644 index 614d0944c4..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitScreen.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.enderio.conduits.client.gui; - -import com.enderio.base.api.EnderIO; -import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.base.client.gui.widget.DyeColorPickerWidget; -import com.enderio.base.client.gui.widget.RedstoneControlPickerWidget; -import com.enderio.base.common.lang.EIOLang; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.network.node.legacy.ConduitData; -import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; -import com.enderio.conduits.api.network.node.legacy.ConduitDataType; -import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.bundle.SlotType; -import com.enderio.conduits.api.screen.ConduitScreenExtension; -import com.enderio.conduits.client.gui.conduit.ConduitScreenExtensions; -import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.connection.ConnectionState; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; -import com.enderio.conduits.common.init.ConduitLang; -import com.enderio.conduits.common.menu.ConduitMenu; -import com.enderio.conduits.common.network.C2SSetConduitConnectionState; -import com.enderio.conduits.common.network.C2SSetConduitExtendedData; -import com.enderio.core.client.gui.screen.EnderContainerScreen; -import com.enderio.core.client.gui.widgets.ToggleIconButton; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.core.Holder; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.item.DyeColor; -import net.neoforged.neoforge.network.PacketDistributor; -import org.jetbrains.annotations.Nullable; -import org.joml.Vector2i; - -public class ConduitScreen extends EnderContainerScreen { - - public static final ResourceLocation TEXTURE = EnderIO.loc("textures/gui/conduit.png"); - private static final int WIDTH = 206; - private static final int HEIGHT = 195; - - private final ClientConduitDataAccessor conduitDataAccessor = new ClientConduitDataAccessor(); - - public ConduitScreen(ConduitMenu pMenu, Inventory pPlayerInventory, Component title) { - super(pMenu, pPlayerInventory, title); - - this.imageWidth = WIDTH; - this.imageHeight = HEIGHT; - } - - @Override - public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) { - // close and don't render if someone removed the conduit we are looking at or - // similar - if (!menu.stillValid(minecraft.player)) { - minecraft.player.closeContainer(); - } else { - super.render(guiGraphics, mouseX, mouseY, partialTicks); - } - } - - @Override - protected void renderBg(GuiGraphics guiGraphics, float partialTicks, int mouseX, int mouseY) { - guiGraphics.blit(TEXTURE, getGuiLeft(), getGuiTop(), 0, 0, imageWidth, imageHeight); - - ConduitMenuData data = getMenuData(); - guiGraphics.pose().pushPose(); - guiGraphics.pose().translate(getGuiLeft(), getGuiTop(), 0); - - if (data.showBarSeparator()) { - guiGraphics.blit(TEXTURE, 102, 7, 255, 0, 1, 97); - } - - for (SlotType type : SlotType.values()) { - if (type.isAvailableFor(data)) { - guiGraphics.blit(TEXTURE, type.getX() - 1, type.getY() - 1, 206, 0, 18, 18); - } - } - - guiGraphics.pose().popPose(); - } - - @Override - protected void renderLabels(GuiGraphics guiGraphics, int pMouseX, int pMouseY) { - ConduitMenuData data = getMenuData(); - - guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INSERT, 22 + 16 + 2, 7 + 4, 4210752, false); - - if (data.showBothEnable()) { - guiGraphics.drawString(this.font, ConduitLang.CONDUIT_EXTRACT, 112 + 16 + 2, 7 + 4, 4210752, false); - } - - super.renderLabels(guiGraphics, pMouseX, pMouseY); - } - - @Override - protected void init() { - super.init(); - ConduitMenuData data = getMenuData(); - Vector2i pos = new Vector2i(22, 7).add(getGuiLeft(), getGuiTop()); - - addRenderableWidget( - ToggleIconButton.createCheckbox(pos.x(), pos.y(), () -> getOnDynamic(dyn -> dyn.isInsert(), false), - bool -> actOnDynamic(dyn -> dyn.withEnabled(false, bool)))); - - if (data.showBothEnable()) { - addRenderableWidget(ToggleIconButton.createCheckbox(pos.x() + 90, pos.y(), - () -> getOnDynamic(dyn -> dyn.isExtract(), false), - bool -> actOnDynamic(dyn -> dyn.withEnabled(true, bool)))); - } - - if (data.showColorInsert()) { - addRenderableWidget(new DyeColorPickerWidget(pos.x(), pos.y() + 20, - () -> getOnDynamic(dyn -> dyn.insertChannel(), DyeColor.GREEN), - color -> actOnDynamic(dyn -> dyn.withColor(false, color)), ConduitLang.CONDUIT_CHANNEL)); - } - - if (data.showColorExtract()) { - addRenderableWidget(new DyeColorPickerWidget(pos.x() + 90, pos.y() + 20, - () -> getOnDynamic(dyn -> dyn.extractChannel(), DyeColor.GREEN), - color -> actOnDynamic(dyn -> dyn.withColor(true, color)), ConduitLang.CONDUIT_CHANNEL)); - } - - if (data.showRedstoneExtract()) { - addRenderableWidget(new RedstoneControlPickerWidget(pos.x() + 90, pos.y() + 40, - () -> getOnDynamic(dyn -> dyn.control(), RedstoneControl.ACTIVE_WITH_SIGNAL), - mode -> actOnDynamic(dyn -> dyn.withRedstoneMode(mode)), EIOLang.REDSTONE_MODE)); - - addRenderableWidget(new DyeColorPickerWidget(pos.x() + 90 + 20, pos.y() + 40, - () -> getOnDynamic(dyn -> dyn.redstoneChannel(), DyeColor.GREEN), - color -> actOnDynamic(dyn -> dyn.withRedstoneChannel(color)), ConduitLang.REDSTONE_CHANNEL)); - } - - addConduitScreenExtensionWidgets(); - addConduitSelectionButtons(); - } - - private void addConduitScreenExtensionWidgets() { - ConduitScreenExtension conduitScreenExtension = ConduitScreenExtensions.get(menu.getConduit().value().type()); - - if (conduitScreenExtension != null) { - conduitScreenExtension - .createWidgets(this, conduitDataAccessor, this::sendExtendedConduitUpdate, menu::getDirection, - new Vector2i(22, 7).add(getGuiLeft(), getGuiTop())) - .forEach(this::addRenderableWidget); - } - } - - private void addConduitSelectionButtons() { - List>> validConnections = new ArrayList<>(); - for (Holder> type : getBundle().getConduits()) { - if (getConnectionState(type) instanceof DynamicConnectionState) { - validConnections.add(type); - } - } - - for (int i = 0; i < validConnections.size(); i++) { - Holder> connection = validConnections.get(i); - addRenderableWidget(new ConduitSelectionButton(getGuiLeft() + 206, getGuiTop() + 4 + 24 * i, connection, - this::getConduit, this::setConduitType)); - } - } - - private void sendExtendedConduitUpdate() { - Holder> conduit = menu.getConduit(); - ConduitGraphObject node = getBundle().getNodeFor(conduit); - -// PacketDistributor.sendToServer(new C2SSetConduitExtendedData(menu.getBlockEntity().getBlockPos(), -// menu.getConduit(), node.conduitDataContainer())); - } - - private void actOnDynamic(Function map) { - if (getConnectionState() instanceof DynamicConnectionState dyn) { - PacketDistributor.sendToServer(new C2SSetConduitConnectionState(getMenu().getBlockEntity().getBlockPos(), - getMenu().getDirection(), getMenu().getConduit(), map.apply(dyn))); - } - } - - private T getOnDynamic(Function map, T defaultValue) { - return getConnectionState() instanceof DynamicConnectionState dyn ? map.apply(dyn) : defaultValue; - } - - public Holder> getConduit() { - return menu.getConduit(); - } - - public ConduitMenuData getMenuData() { - return getConduit().value().getMenuData(); - } - - private void setConduitType(Holder> conduit) { - menu.setConduit(conduit); - rebuildWidgets(); - } - - private ConnectionState getConnectionState() { - return getConnectionState(menu.getConduit()); - } - - private ConnectionState getConnectionState(Holder> type) { - return getBundle().getConnectionState(menu.getDirection(), type); - } - - private ConduitBundle getBundle() { - return menu.getBlockEntity().getBundle(); - } - - /** - * This is a simple passthrough to the current conduit node's data. - * This results in a much nicer API than that of the alternative approach of a conduit data accessor supplier. - */ - private class ClientConduitDataAccessor implements ConduitDataAccessor { - - private ConduitDataAccessor getCurrentDataAccessor() { -// return getBundle().getNodeFor(menu.getConduit()); - return null; - } - - @Override - public boolean hasData(ConduitDataType type) { - return getCurrentDataAccessor().hasData(type); - } - - @Override - public > @Nullable T getData(ConduitDataType type) { - return getCurrentDataAccessor().getData(type); - } - - @Override - public > T getOrCreateData(ConduitDataType type) { - return getCurrentDataAccessor().getOrCreateData(type); - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java index 64d010f171..843084d163 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java @@ -1,6 +1,7 @@ package com.enderio.conduits.client.gui; import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.client.gui.screen.NewConduitScreen; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractButton; @@ -41,9 +42,9 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.enableDepthTest(); - guiGraphics.blit(ConduitScreen.TEXTURE, getX(), getY(), 227, 0, this.width, this.height); + guiGraphics.blit(NewConduitScreen.TEXTURE, getX(), getY(), 227, 0, this.width, this.height); if (getter.get() == conduit) { - guiGraphics.blit(ConduitScreen.TEXTURE, getX() - 3, getY(), 224, 0, 3, this.height); + guiGraphics.blit(NewConduitScreen.TEXTURE, getX() - 3, getY(), 224, 0, 3, this.height); } ResourceLocation iconLocation = MissingTextureAtlasSprite.getLocation(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java index 633a6473fb..4a7ea422c6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java @@ -5,6 +5,7 @@ import com.enderio.base.client.gui.widget.DyeColorPickerWidget; import com.enderio.base.client.gui.widget.RedstoneControlPickerWidget; import com.enderio.base.common.lang.EIOLang; +import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; @@ -12,22 +13,36 @@ import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.enderio.conduits.api.menu.ConduitMenuComponent; +import com.enderio.conduits.api.menu.ConduitMenuDataAccess; import com.enderio.conduits.api.menu.ConduitMenuType; +import com.enderio.conduits.api.screen.ConduitScreenHelper; +import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.client.gui.screen.types.ConduitScreenTypes; import com.enderio.conduits.common.conduit.menu.NewConduitMenu; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; +import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; import com.enderio.core.client.gui.screen.EnderContainerScreen; import com.enderio.core.client.gui.widgets.ToggleIconButton; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Renderable; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.DyeColor; import net.neoforged.neoforge.network.PacketDistributor; +import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; import java.util.function.Supplier; public class NewConduitScreen extends EnderContainerScreen { @@ -35,17 +50,32 @@ public class NewConduitScreen extends EnderContainerScreen { private static final int WIDTH = 206; private static final int HEIGHT = 195; + private final ScreenHelper screenHelper = new ScreenHelper(); + + private final ConduitScreenTypeContainer screenTypeContainer; + + private final List preRenderActions = new ArrayList<>(); + public NewConduitScreen(NewConduitMenu pMenu, Inventory pPlayerInventory, Component pTitle) { super(pMenu, pPlayerInventory, pTitle); // this.shouldRenderLabels = true; this.imageWidth = WIDTH; this.imageHeight = HEIGHT; + + // Get the screen type for this conduit, if available. + this.screenTypeContainer = new ConduitScreenTypeContainer<>(menu.getSelectedConduit().value()); } @Override protected void init() { super.init(); + preRenderActions.clear(); + + if (screenTypeContainer.hasScreenType()) { + screenTypeContainer.addWidgets(screenHelper); + return; + } // Left column int leftX = getGuiLeft() + 22; @@ -116,6 +146,12 @@ protected void init() { // TODO: Conduit selection buttons } + @Override + public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + preRenderActions.forEach(Runnable::run); + super.render(guiGraphics, mouseX, mouseY, partialTick); + } + // Example of conduit menu type thing. // private ConduitMenuType EXAMPLE = ConduitMenuType.builder(ItemConduitConnectionConfig.TYPE) // .layout(/* TODO */) // << Ignore, i was going to do the enable buttons here, but I think I'll just make those components too. @@ -124,7 +160,7 @@ protected void init() { // .addComponent(new ConduitMenuComponent.ColorPicker<>(22, 112, ConduitLang.CONDUIT_CHANNEL, // ItemConduitConnectionConfig::extractChannel, ItemConduitConnectionConfig::withOutputChannel)) // .addComponent(new ConduitMenuComponent.RedstoneControlPicker<>(22, 112, EIOLang.REDSTONE_MODE, -// ItemConduitConnectionConfig::redstoneControl, ItemConduitConnectionConfig::withRedstoneControl)) +// ItemConduitConnectionConfig::receiveRedstoneControl, ItemConduitConnectionConfig::withRedstoneControl)) // .build(); private void addComponents(ConduitMenuType menuType) { @@ -221,15 +257,153 @@ protected void renderBg(GuiGraphics guiGraphics, float v, int i, int i1) { protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { super.renderLabels(guiGraphics, mouseX, mouseY); - if (menu.connectionConfigType().supportsIO()) { - // TODO: Test for a signal type -or- adopt input/output as the standard. - guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INSERT, 22 + 16 + 2, 7 + 4, 4210752, false); - guiGraphics.drawString(this.font, ConduitLang.CONDUIT_EXTRACT, 112 + 16 + 2, 7 + 4, 4210752, false); - -// guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INPUT, 22 + 16 + 2, 7 + 4, 4210752, false); -// guiGraphics.drawString(this.font, ConduitLang.CONDUIT_OUTPUT, 112 + 16 + 2, 7 + 4, 4210752, false); + if (screenTypeContainer.hasScreenType()) { + screenTypeContainer.renderLabels(guiGraphics, mouseX, mouseY); } else { - guiGraphics.drawString(this.font, ConduitLang.CONDUIT_ENABLED, 22 + 16 + 2, 7 + 4, 4210752, false); + if (menu.connectionConfigType().supportsIO()) { + // TODO: Test for a signal type -or- adopt input/output as the standard. + guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INSERT, 22 + 16 + 2, 7 + 4, 4210752, false); + guiGraphics.drawString(this.font, ConduitLang.CONDUIT_EXTRACT, 112 + 16 + 2, 7 + 4, 4210752, false); + + // guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INPUT, 22 + 16 + 2, 7 + 4, 4210752, false); + // guiGraphics.drawString(this.font, ConduitLang.CONDUIT_OUTPUT, 112 + 16 + 2, 7 + 4, 4210752, false); + } else { + guiGraphics.drawString(this.font, ConduitLang.CONDUIT_ENABLED, 22 + 16 + 2, 7 + 4, 4210752, false); + } + } + } + +// private , U extends ConnectionConfig> ConduitScreenHelper createHelper() { +// +// } + + // Due to the generics, the menu data access and screen type need to be contained here. + private class ConduitScreenTypeContainer { + private final ConduitMenuDataAccess dataAccess; + + @Nullable + private final ConduitScreenType screenType; + + public ConduitScreenTypeContainer(Conduit conduit) { + this.dataAccess = createDataAccess(conduit); + this.screenType = ConduitScreenTypes.get(conduit.type()); + } + + public boolean hasScreenType() { + return screenType != null; + } + + public void addWidgets(ScreenHelper screenHelper) { + if (screenType != null) { + screenType.createWidgets(screenHelper, dataAccess); + } + } + + public void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { + if (screenType != null) { + screenType.renderLabels(guiGraphics, font, mouseX, mouseY); + } + } + + private , U extends ConnectionConfig> ConduitMenuDataAccess createDataAccess(Conduit conduit) { + return new ConduitMenuDataAccess<>() { + @Override + public U getConnectionConfig() { + return menu.connectionConfig(conduit.connectionConfigType()); + } + + @Override + public void updateConnectionConfig(java.util.function.Function configModifier) { + var newConfig = configModifier.apply(menu.connectionConfig(conduit.connectionConfigType())); + + PacketDistributor.sendToServer(new SetConduitConnectionConfigPacket(menu.containerId, newConfig)); + + // Update on the client so UI is immediately in sync + menu.setConnectionConfig(newConfig); + } + + @Override + public CompoundTag getClientDataTag() { + return menu.getClientDataTag(); + } + }; + } + } + + private class ScreenHelper implements ConduitScreenHelper { + + @Override + public int getAreaLeft() { + return getGuiLeft() + 22; + } + + @Override + public int getAreaTop() { + return getGuiTop() + 7; + } + + @Override + public int getUsableWidth() { + // TODO + return 0; + } + + @Override + public int getUsableHeight() { + // TODO + return 0; + } + + // TODO: would be cool to make these relative? + + @Override + public AbstractWidget addCheckbox(int x, int y, Supplier getter, Consumer setter) { + var widget = ToggleIconButton.createCheckbox(getAreaLeft() + x, getAreaTop() + y, getter, setter); + addRenderableWidget(widget); + return widget; + } + + @Override + public AbstractWidget addColorPicker(int x, int y, Component title, Supplier getter, Consumer setter) { + var widget = new DyeColorPickerWidget(getAreaLeft() + x, getAreaTop() + y, getter, setter, title); + addRenderableWidget(widget); + return widget; + } + + @Override + public AbstractWidget addRedstoneControlPicker(int x, int y, Component title, Supplier getter, Consumer setter) { + var widget = new RedstoneControlPickerWidget(getAreaLeft() + x, getAreaTop() + y, getter, setter, title); + addRenderableWidget(widget); + return widget; + } + + // Dynamic UI utilities + + @Override + public void addPreRenderAction(Runnable runnable) { + preRenderActions.add(runnable); + } + + // Custom widgets + + @Override + public W addWidget(W listener) { + return NewConduitScreen.this.addWidget(listener); + } + + @Override + public W addRenderableOnly(W renderable) { + return NewConduitScreen.this.addRenderableOnly(renderable); + } + + @Override + public W addRenderableWidget(W widget) { + return NewConduitScreen.this.addRenderableWidget(widget); + } + + @Override + public void removeWidget(GuiEventListener listener) { + NewConduitScreen.this.removeWidget(listener); } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java new file mode 100644 index 0000000000..d8aa8de18c --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java @@ -0,0 +1,29 @@ +package com.enderio.conduits.client.gui.screen.types; + +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.ConduitType; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.common.init.ConduitTypes; +import me.liliandev.ensure.ensures.EnsureSide; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public class ConduitScreenTypes { + private static Map, ConduitScreenType> SCREEN_TYPES; + + @EnsureSide(EnsureSide.Side.CLIENT) + public static void init() { + SCREEN_TYPES = Map.of( + ConduitTypes.ITEM.get(), new ItemConduitScreenType() + ); + } + + @EnsureSide(EnsureSide.Side.CLIENT) + @Nullable + public static , U extends ConnectionConfig> ConduitScreenType get(ConduitType conduitType) { + //noinspection unchecked + return (ConduitScreenType) SCREEN_TYPES.get(conduitType); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java new file mode 100644 index 0000000000..756c7c582d --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java @@ -0,0 +1,51 @@ +package com.enderio.conduits.client.gui.screen.types; + +import com.enderio.base.common.lang.EIOLang; +import com.enderio.conduits.api.menu.ConduitMenuDataAccess; +import com.enderio.conduits.api.screen.ConduitScreenHelper; +import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig; +import com.enderio.conduits.common.init.ConduitLang; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; + +public class ItemConduitScreenType extends ConduitScreenType { + + @Override + public void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess) { + // Add insert/extract checkboxes. + screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isSend(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); + + screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isReceive(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + + screen.addColorPicker(0, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + + screen.addColorPicker(90, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().receiveColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + + var redstoneChannelWidget = screen.addColorPicker(90 + 20, 40, ConduitLang.REDSTONE_CHANNEL, () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); + + // Only show the redstone widget when redstone control is sensitive to signals. + screen.addPreRenderAction( + () -> redstoneChannelWidget.visible = dataAccess.getConnectionConfig().receiveRedstoneControl().isRedstoneSensitive()); + + screen.addRedstoneControlPicker(90, 40, EIOLang.REDSTONE_MODE, () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); + + // TODO: Show redstone signal indicators (somehow) + + // TODO: Item-specific buttons + } + + @Override + public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, font, mouseX, mouseY); + + guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, 22 + 16 + 2, 7 + 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 22 + 90 + 16 + 2, 7 + 4, 4210752, false); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java index ddb483cafe..35b9c1c1ea 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java @@ -31,9 +31,11 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.SingleThreadedRandomSource; +import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.client.ChunkRenderTypeSet; import net.neoforged.neoforge.client.model.IDynamicBakedModel; import net.neoforged.neoforge.client.model.IQuadTransformer; @@ -140,12 +142,34 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction color.process(model.getQuads(state, preRotation, rand, extraData, renderType))); } + // TODO: Need support for dual-color redstone control. if (connectionState.redstoneControl() == RedstoneControl.ACTIVE_WITH_SIGNAL || connectionState.redstoneControl() == RedstoneControl.ACTIVE_WITHOUT_SIGNAL) { quads.addAll(rotationTranslation .andThen(new ColorQuadTransformer(null, connectionState.redstoneChannel())) .process(modelOf(CONDUIT_IO_REDSTONE).getQuads(state, preRotation, rand, extraData, renderType))); + + // TODO: Use this to render two redstone signal colours? +// // Shrink the size +// var scale = new Vector3f(1, 0.5f, 1); +// +// // move into position +// var transformation = new Transformation(new Vector3f(0, 4 / 32f, 0), null, scale, null); +// var transformation1 = new Transformation(new Vector3f(0, 5 / 32f, 0), null, scale, null); +// +// quads.addAll(QuadTransformers.applying(transformation) +// .andThen(rotationTranslation) +// .andThen(new ColorQuadTransformer(null, connectionState.redstoneChannel())) +// .process(modelOf(CONDUIT_IO_REDSTONE).getQuads(state, preRotation, rand, +// extraData, renderType))); +// +// quads.addAll(QuadTransformers.applying(transformation1) +// .andThen(rotationTranslation) +//// .andThen(QuadTransformers.applying(translateTransformation(normal.mul(-1 / 16f)))) +// .andThen(new ColorQuadTransformer(null, DyeColor.GREEN)) +// .process(modelOf(CONDUIT_IO_REDSTONE).getQuads(state, preRotation, rand, +// extraData, renderType))); } } } @@ -270,6 +294,10 @@ private static Transformation translateTransformation(Vec3i offset) { return new Transformation(scale(offset, 3 / 16f), null, null, null); } + private static Transformation translateTransformation(Vector3f offset) { + return new Transformation(offset, null, null, null); + } + private static Vector3f scale(Vec3i vector, float scaler) { return new Vector3f(vector.getX() * scaler, vector.getY() * scaler, vector.getZ() * scaler); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java index 6b606529b2..85026598b3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java @@ -3,12 +3,17 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.connection.ConnectionStatus; +import com.enderio.conduits.api.model.ConduitModelModifier; +import com.enderio.conduits.client.model.conduit.modifier.ConduitModelModifiers; import com.enderio.conduits.common.conduit.OffsetHelper; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import com.google.common.collect.HashMultimap; +import com.mojang.datafixers.util.Pair; import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -47,9 +52,26 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { } } + HashMultimap>> fakeConnections = HashMultimap.create(); + for (var conduit : renderState.conduits) { + for (var side : Direction.values()) { + ConduitModelModifier conduitModelModifier = ConduitModelModifiers + .getModifier(conduit.value().type()); + + if (conduitModelModifier != null && conduitModelModifier.shouldShowFakeConnection(bundle, side)) { + fakeConnections.put(side, conduit); + } + } + } + renderState.conduitsByDirection = new HashMap<>(); for (var side : Direction.values()) { - renderState.conduitsByDirection.put(side, bundle.getConnectedConduits(side)); + var connected = new ArrayList<>(bundle.getConnectedConduits(side)); + if (fakeConnections.containsKey(side)) { + connected.addAll(fakeConnections.get(side)); + } + + renderState.conduitsByDirection.put(side, connected); } renderState.conduitConnections = new HashMap<>(); @@ -60,6 +82,10 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { var connectionConfig = bundle.getConnectionConfig(side, conduit); var connectionRenderState = ConduitConnectionRenderState.of(conduit, connectionConfig); conduits.put(conduit, connectionRenderState); + } else if (fakeConnections.containsKey(side)) { + if (fakeConnections.get(side).contains(conduit)) { + conduits.put(conduit, ConduitConnectionRenderState.fake()); + } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java index faba5eb713..f34d5b6474 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java @@ -3,6 +3,7 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; @@ -21,6 +22,10 @@ public record ConduitConnectionRenderState( DyeColor redstoneChannel ) { + public static ConduitConnectionRenderState fake() { + return new ConduitConnectionRenderState(false, DyeColor.GREEN, false, DyeColor.GREEN, RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); + } + @EnsureSide(EnsureSide.Side.CLIENT) public static ConduitConnectionRenderState of(Holder> conduit, ConnectionConfig connectionConfig) { boolean canInput = false; @@ -43,6 +48,14 @@ public static ConduitConnectionRenderState of(Holder> conduit, Con outputChannel = conduitModelModifier.getDefaultArrowColor(); } } + } else if (connectionConfig instanceof NewIOConnectionConfig ioConnectionConfig) { + // TODO: Tidy the language here. + canInput = ioConnectionConfig.isSend(); + canOutput = ioConnectionConfig.isReceive(); + inputChannel = ioConnectionConfig.receiveColor(); + outputChannel = ioConnectionConfig.sendColor(); + + // TODO: Need support for the new redstone control system. } RedstoneControl redstoneControl = RedstoneControl.ALWAYS_ACTIVE; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/RedstoneConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/RedstoneConduitModelModifier.java new file mode 100644 index 0000000000..63969b00c5 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/RedstoneConduitModelModifier.java @@ -0,0 +1,28 @@ +package com.enderio.conduits.client.model.conduit.modifier; + +import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.bundle.ConduitBundleReader; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.api.model.ConduitModelModifier; +import net.minecraft.core.Direction; + +public class RedstoneConduitModelModifier implements ConduitModelModifier { + @Override + public boolean shouldShowFakeConnection(ConduitBundleReader reader, Direction side) { + if (!reader.isEndpoint(side)) { + return false; + } + + // Find a conduit that might be using our signal. + for (var conduit : reader.getConnectedConduits(side)) { + var config = reader.getConnectionConfig(side, conduit); + + if (config instanceof RedstoneControlledConnection redstoneControlledConnection) { + return redstoneControlledConnection.redstoneControl() != RedstoneControl.ALWAYS_ACTIVE && + redstoneControlledConnection.redstoneControl() != RedstoneControl.NEVER_ACTIVE; + } + } + + return false; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java index d875cf3724..dfaa25cc1e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java @@ -1,7 +1,7 @@ package com.enderio.conduits.client.particle; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.conduit.ConduitShape; +import com.enderio.conduits.common.conduit.bundle.NewConduitShape; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleEngine; @@ -64,7 +64,7 @@ public int getLightColor(float partialTick) { public static void addDestroyEffects(BlockPos pos, Conduit conduit) { Level level = Minecraft.getInstance().level; ParticleEngine engine = Minecraft.getInstance().particleEngine; - List boxes = ConduitShape.CONNECTION.toAabbs(); + List boxes = NewConduitShape.CONNECTION.toAabbs(); double countMult = 1D / boxes.size(); boxes.forEach(aabb -> { double sizeX = Math.min(1D, aabb.maxX - aabb.minX); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java deleted file mode 100644 index 5e844907c0..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitBundle.java +++ /dev/null @@ -1,555 +0,0 @@ -package com.enderio.conduits.common.conduit; - -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitCapabilities; -import com.enderio.conduits.api.bundle.AddConduitResult; -import com.enderio.conduits.api.bundle.SlotType; -import com.enderio.conduits.api.facade.FacadeType; -import com.enderio.conduits.common.conduit.connection.ConnectionState; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; -import com.enderio.core.common.network.NetworkDataSlot; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import me.liliandev.ensure.ensures.EnsureSide; -import net.minecraft.Util; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.core.HolderLookup; -import net.minecraft.nbt.NbtOps; -import net.minecraft.nbt.Tag; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.util.thread.EffectiveSide; -import org.jetbrains.annotations.Nullable; - -public final class ConduitBundle { - - // Do not change this value unless you fix the OffsetHelper - public static final int MAX_CONDUITS = 9; - - public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - BlockPos.CODEC.fieldOf("pos").forGetter(i -> i.pos), - Conduit.CODEC.listOf().fieldOf("conduits").forGetter(i -> i.conduits), - Codec.unboundedMap(Direction.CODEC, ConduitConnection.CODEC) - .fieldOf("connections") - .forGetter(i -> i.connections), - ItemStack.OPTIONAL_CODEC.optionalFieldOf("facade", ItemStack.EMPTY).forGetter(i -> i.facadeItem), - Codec.unboundedMap(Conduit.CODEC, ConduitGraphObject.CODEC).fieldOf("nodes").forGetter(i -> i.conduitNodes)) - .apply(instance, ConduitBundle::new)); - - public static StreamCodec STREAM_CODEC = null; - - public static NetworkDataSlot.CodecType DATA_SLOT_TYPE = new NetworkDataSlot.CodecType<>(CODEC, - STREAM_CODEC); - - private final Map connections = new EnumMap<>(Direction.class); - private final List>> conduits = new ArrayList<>(); - - // fill back after world save - private final Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); - private final BlockPos pos; - - private ItemStack facadeItem = ItemStack.EMPTY; - - @Nullable - private Runnable onChangedRunnable; - - public ConduitBundle(Runnable onChanged, BlockPos pos) { - this.onChangedRunnable = onChanged; - for (Direction value : Direction.values()) { - connections.put(value, new ConduitConnection()); - } - this.pos = pos; - } - - // TODO: If we enable conversion from new to old, this will become public. - private ConduitBundle(BlockPos pos, List>> conduits, - Map connections, ItemStack facadeItem, - Map>, ConduitGraphObject> conduitNodes) { - - this.pos = pos; - this.conduits.addAll(conduits); - this.connections.putAll(connections); - this.conduitNodes.putAll(conduitNodes); - this.facadeItem = facadeItem; - } - - // TODO: I kind of want to get rid of this. - public void setOnChangedRunnable(Runnable onChangedRunnable) { - this.onChangedRunnable = onChangedRunnable; - } - - public void onChanged() { - if (onChangedRunnable != null) { - onChangedRunnable.run(); - } - } - - /** - * @return an action containing the conduit that is now not in this bundle - */ - public AddConduitResult addConduit(Level level, Holder> conduit, Player player) { - if (conduits.size() == MAX_CONDUITS) { - return new AddConduitResult.Blocked(); - } - - if (conduits.contains(conduit)) { - return new AddConduitResult.Blocked(); - } - - // New node - ConduitGraphObject node = new ConduitGraphObject(pos); - - // upgrade a conduit - Optional>> first = conduits.stream() - .filter(existingConduit -> existingConduit.value().canBeReplacedBy(conduit)) - .findFirst(); - if (first.isPresent()) { - int index = conduits.indexOf(first.get()); - conduits.set(index, conduit); - - ConduitGraphObject prevNode = conduitNodes.remove(first.get()); - - if (prevNode != null) { - node = new ConduitGraphObject(pos, prevNode.getNodeData()); // new node with old data - conduit.value().onRemoved(prevNode, level, pos); - if (!level.isClientSide() && prevNode.getGraph() != null) { - prevNode.getGraph().remove(prevNode); - } - } - - conduitNodes.put(conduit, node); - conduit.value().onCreated(node, level, pos, player); - onChanged(); - - return new AddConduitResult.Upgrade(first.get()); - } - - // some conduit says no (like higher energy conduit) - if (conduits.stream() - .anyMatch(existingConduit -> !existingConduit.value().canBeInSameBundle(conduit) - || !conduit.value().canBeInSameBundle(existingConduit))) { - return new AddConduitResult.Blocked(); - } - - // sort the list, so order is consistent - int id = ConduitSorter.getSortIndex(conduit); - var addBefore = conduits.stream().filter(existing -> ConduitSorter.getSortIndex(existing) > id).findFirst(); - if (addBefore.isPresent()) { - var value = conduits.indexOf(addBefore.get()); - conduits.add(value, conduit); - conduitNodes.put(conduit, node); - - conduit.value().onCreated(node, level, pos, player); - - for (Direction direction : Direction.values()) { - connections.get(direction).addType(value); - } - } else { - conduits.add(conduit); - conduitNodes.put(conduit, node); - if (conduits.size() != 1) { - // NeoForge contains a patch that calls onLoad after the conduit has been placed - // if it's the first one, so onCreated would be called twice. it's easier to - // detect here - conduit.value().onCreated(node, level, pos, player); - } - } - - onChanged(); - return new AddConduitResult.Insert(); - } - - public void onLoad(Level level, BlockPos pos) { - for (Holder> conduit : conduits) { - var node = getNodeFor(conduit); - conduit.value().onCreated(node, level, pos, null); - } - } - - /** - * @return if this bundle is empty and the block has to be removed - * @throws IllegalArgumentException if this conduit is not in the conduit bundle and we are in dev env - */ - public boolean removeConduit(Level level, Holder> conduit) { - int index = conduits.indexOf(conduit); - if (index == -1) { - if (!FMLLoader.isProduction()) { - throw new IllegalArgumentException( - "Conduit: " + conduit.getRegisteredName() + " is not present in conduit bundle " - + Arrays.toString(conduits.stream().map(Holder::getRegisteredName).toArray())); - } - - return conduits.isEmpty(); - } - - for (Direction direction : Direction.values()) { - connections.get(direction).removeType(index); - } - - if (EffectiveSide.get().isServer()) { - var node = getNodeForTypeExact(conduit); - if (node != null) { - removeNode(level, conduit, node); - } - } - - conduits.remove(index); - onChanged(); - return conduits.isEmpty(); - } - - // endregion - - public List>> getConduits() { - return conduits; - } - - // region Connections - - public List>> getConnectedConduits(Direction direction) { - return connections.get(direction).getConnectedTypes(this); - } - - // Not a fan of this. - @Deprecated(forRemoval = true) - public ConnectionState getConnectionState(Direction direction, int index) { - return connections.get(direction).getConnectionState(index); - } - - public ConnectionState getConnectionState(Direction direction, Holder> conduit) { - return connections.get(direction).getConnectionState(getConduitIndex(conduit)); - } - - public void setConnectionState(Direction direction, Holder> conduit, ConnectionState state) { - connections.get(direction).setConnectionState(getConduitIndex(conduit), state); - onChanged(); - } - - public boolean isConnectionEnd(Direction direction) { - return connections.get(direction).isEnd(); - } - - // Not a fan of this. - @Deprecated(forRemoval = true) - public void disableConduit(Direction direction, int index) { - connections.get(direction).disableType(index); - onChanged(); - } - - public void disableConduit(Direction direction, Holder> conduit) { - disableConduit(direction, getConduitIndex(conduit)); - } - - public ItemStack getConnectionItem(Direction direction, int conduitIndex, SlotType slotType) { - return connections.get(direction).getItem(slotType, conduitIndex); - } - - public ItemStack getConnectionItem(Direction direction, Holder> conduit, SlotType slotType) { - return getConnectionItem(direction, getConduitIndex(conduit), slotType); - } - - public void setConnectionItem(Direction direction, int conduitIndex, SlotType slotType, ItemStack itemStack) { - connections.get(direction).setItem(slotType, conduitIndex, itemStack); - onChanged(); - } - - public void setConnectionItem(Direction direction, Holder> conduit, SlotType slotType, - ItemStack itemStack) { - setConnectionItem(direction, getConduitIndex(conduit), slotType, itemStack); - } - - // endregion - - // region Facades - - public boolean hasFacade() { - return !facadeItem.isEmpty() && facadeItem.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER) != null; - } - - public ItemStack facadeItem() { - return facadeItem.copy(); - } - - public Optional facade() { - if (!hasFacade()) { - return Optional.empty(); - } - - return Optional.of( - Objects.requireNonNull(facadeItem.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER)).block()); - } - - public Optional facadeType() { - if (!hasFacade()) { - return Optional.empty(); - } - - return Optional.of( - Objects.requireNonNull(facadeItem.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER)).type()); - } - - public void facade(ItemStack facadeItem) { - this.facadeItem = facadeItem.copyWithCount(1); - onChanged(); - } - - public void clearFacade() { - facadeItem = ItemStack.EMPTY; - onChanged(); - } - - // endregion - - public void connectTo(Level level, BlockPos pos, Direction direction, Holder> conduit, boolean end) { - connections.get(direction) - .connectTo(level, pos, getNodeFor(conduit), direction, conduit, getConduitIndex(conduit), end); - onChanged(); - } - - public boolean disconnectFrom(Direction direction, Holder> conduit) { - for (int i = 0; i < conduits.size(); i++) { - if (conduit.value().canConnectToConduit(conduits.get(i))) { - connections.get(direction).tryDisconnect(i); - onChanged(); - return true; - } - } - return false; - } - - @Nullable - public ConduitGraphObject getNodeForTypeExact(Holder> conduit) { - return conduitNodes.get(conduit); - } - - public ConduitGraphObject getNodeFor(Holder> conduit) { - for (var entry : conduitNodes.entrySet()) { - if (entry.getKey().value().canConnectToConduit(conduit)) { - return conduitNodes.get(entry.getKey()); - } - } - - throw new IllegalStateException("no node matching original conduit"); - } - - public void setNodeFor(Holder> conduit, ConduitGraphObject node) { - conduitNodes.put(conduit, node); - for (var direction : Direction.values()) { - ConduitConnection connection = connections.get(direction); - int index = conduits.indexOf(conduit); - if (index >= 0) { - var state = connection.getConnectionState(index); - if (state instanceof DynamicConnectionState dynamicState) { -// node.pushState(direction, dynamicState); - } - } - } - } - - private void removeNode(Level level, Holder> conduit, ConduitGraphObject node) { - conduit.value().onRemoved(node, level, pos); - if (node.getGraph() != null) { - node.getGraph().remove(node); - } - - conduitNodes.remove(conduit); - } - - public boolean hasType(Holder> conduitToFind) { - for (var conduit : conduits) { - if (conduit.value().canConnectToConduit(conduitToFind)) { - return true; - } - } - - return false; - } - - public int getConduitIndex(Holder> conduit) { - for (int i = 0; i < conduits.size(); i++) { - if (conduits.get(i).value().canConnectToConduit(conduit)) { - return i; - } - } - throw new IllegalStateException("no matching conduit in bundle"); - } - - @Override - public int hashCode() { - int hash = Objects.hash(connections, conduits, facadeItem); - - // Manually hash the map, using hashContents instead of hashCode to avoid - // breaking the graph. - for (var entry : conduitNodes.entrySet()) { - hash = 31 * hash + entry.getKey().hashCode(); - } - - return hash; - } - - public Tag save(HolderLookup.Provider lookupProvider) { - return CODEC.encodeStart(lookupProvider.createSerializationContext(NbtOps.INSTANCE), this).getOrThrow(); - } - - public static ConduitBundle parse(HolderLookup.Provider lookupProvider, Tag tag) { - return CODEC.decode(lookupProvider.createSerializationContext(NbtOps.INSTANCE), tag).getOrThrow().getFirst(); - } - - @EnsureSide(EnsureSide.Side.CLIENT) - public ConduitBundle deepCopy() { - var bundle = new ConduitBundle(() -> { - }, pos); - bundle.conduits.addAll(conduits); - connections.forEach((dir, connection) -> bundle.connections.put(dir, connection.deepCopy())); -// conduitNodes.forEach((conduit, node) -> bundle.setNodeFor(conduit, node.deepCopy())); - bundle.facadeItem = facadeItem.copy(); - return bundle; - } - - // TODO: Clean this up - public static final class ConduitConnection { - - public static Codec CODEC = ConnectionState.CODEC.listOf(0, MAX_CONDUITS) - .xmap(ConduitConnection::new, i -> Arrays.stream(i.connectionStates).toList()); - - public static StreamCodec STREAM_CODEC = ConnectionState.STREAM_CODEC - .apply(ByteBufCodecs.list()) - .map(ConduitConnection::new, i -> Arrays.stream(i.connectionStates).toList()); - - private final ConnectionState[] connectionStates = Util.make(() -> { - var states = new ConnectionState[MAX_CONDUITS]; - Arrays.fill(states, StaticConnectionStates.DISCONNECTED); - return states; - }); - - public ConduitConnection() { - } - - private ConduitConnection(List connectionStates) { - if (connectionStates.size() > MAX_CONDUITS) { - throw new IllegalArgumentException( - "Cannot store more than " + MAX_CONDUITS + " conduit types per bundle."); - } - - for (var i = 0; i < connectionStates.size(); i++) { - this.connectionStates[i] = connectionStates.get(i); - } - } - - /** - * shift all behind that one to the back and set that index to null - */ - public void addType(int index) { - for (int i = MAX_CONDUITS - 1; i > index; i--) { - connectionStates[i] = connectionStates[i - 1]; - } - connectionStates[index] = StaticConnectionStates.DISCONNECTED; - } - - public void connectTo(Level level, BlockPos pos, ConduitGraphObject conduitGraphObject, Direction direction, - Holder> type, int typeIndex, boolean end) { - if (end) { - var state = DynamicConnectionState.defaultConnection(level, pos, direction, type); - connectionStates[typeIndex] = state; -// conduitGraphObject.pushState(direction, state); - } else { - connectionStates[typeIndex] = StaticConnectionStates.CONNECTED; - } - } - - public void tryDisconnect(int typeIndex) { - if (connectionStates[typeIndex] != StaticConnectionStates.DISABLED) { - connectionStates[typeIndex] = StaticConnectionStates.DISCONNECTED; - } - } - - // TODO: Come back and review use of the term "Type" here. - - /** - * remove entry and shift all behind one to the front - */ - public void removeType(int index) { - connectionStates[index] = StaticConnectionStates.DISCONNECTED; - for (int i = index + 1; i < MAX_CONDUITS; i++) { - connectionStates[i - 1] = connectionStates[i]; - } - connectionStates[MAX_CONDUITS - 1] = StaticConnectionStates.DISCONNECTED; - } - - public void disconnectType(int index) { - connectionStates[index] = StaticConnectionStates.DISCONNECTED; - } - - public void disableType(int index) { - connectionStates[index] = StaticConnectionStates.DISABLED; - } - - public boolean isEnd() { - return Arrays.stream(connectionStates).anyMatch(DynamicConnectionState.class::isInstance); - } - - public List>> getConnectedTypes(ConduitBundle bundle) { - List>> connected = new ArrayList<>(); - for (int i = 0; i < connectionStates.length; i++) { - if (connectionStates[i].isConnection()) { - connected.add(bundle.getConduits().get(i)); - } - } - - return connected; - } - - public ConduitConnection deepCopy() { - ConduitConnection connection = new ConduitConnection(); - // connection states are not mutable (enum/record), so reference is fine - System.arraycopy(connectionStates, 0, connection.connectionStates, 0, MAX_CONDUITS); - return connection; - } - - public ConnectionState getConnectionState(int index) { - return connectionStates[index]; - } - - public void setConnectionState(int i, ConnectionState state) { - connectionStates[i] = state; - } - - public ItemStack getItem(SlotType type, int conduitIndex) { - if (connectionStates[conduitIndex] instanceof DynamicConnectionState dynamicConnectionState) { - return dynamicConnectionState.getItem(type); - } - - return ItemStack.EMPTY; - } - - public void setItem(SlotType type, int conduitIndex, ItemStack stack) { - if (connectionStates[conduitIndex] instanceof DynamicConnectionState dynamicConnectionState) { - connectionStates[conduitIndex] = dynamicConnectionState.withItem(type, stack); - } - } - - @Override - public int hashCode() { - // return i++; - return Objects.hash((Object[]) connectionStates); - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java index ab27e2ce7f..5915a1e592 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java @@ -4,13 +4,12 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.ticker.ConduitTicker; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; import com.enderio.conduits.common.conduit.graph.WrappedConduitNetwork; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; -import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.init.Conduits; import com.mojang.datafixers.util.Pair; import com.mojang.logging.LogUtils; @@ -357,19 +356,19 @@ public static boolean isRedstoneActive(Level level, BlockPos pos, DyeColor color return false; } - if (!(level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity blockEntity)) { + if (!(level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle)) { return false; } - // TODO: Decouple from hard-coded REDSTONE conduit. + // TODO: Decouple from hard-coded REDSTONE conduit like we have for the block. var registry = level.holderLookup(EnderIOConduitsRegistries.Keys.CONDUIT); var redstoneConduit = registry.get(Conduits.REDSTONE); - if (redstoneConduit.isEmpty() || !blockEntity.getBundle().getConduits().contains(redstoneConduit.get())) { + if (redstoneConduit.isEmpty() || !conduitBundle.getConduits().contains(redstoneConduit.get())) { return false; } - var node = blockEntity.getBundle().getNodeFor(redstoneConduit.get()); + var node = conduitBundle.getConduitNode(redstoneConduit.get()); if (node.getNetwork() == null) { return false; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitShape.java deleted file mode 100644 index e8ba429238..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitShape.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.enderio.conduits.common.conduit; - -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.Area; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.core.Vec3i; -import net.minecraft.util.Mth; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.BooleanOp; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -public class ConduitShape { - private final Map>, VoxelShape> conduitShapes = new HashMap<>(); - private final Map directionShapes = new HashMap<>(); - private static final VoxelShape CONNECTOR = Block.box(2.5f, 2.5, 15f, 13.5f, 13.5f, 16f); - public static final VoxelShape CONNECTION = Block.box(6.5f, 6.5f, 9.5, 9.5f, 9.5f, 16); - private static final VoxelShape CORE = Block.box(6.5f, 6.5f, 6.5f, 9.5f, 9.5f, 9.5f); - private VoxelShape totalShape = CORE; - - public ConduitShape() { - - } - - public void updateConduit(ConduitBundle bundle) { - this.conduitShapes.clear(); - this.directionShapes.clear(); - for (Holder> conduit : bundle.getConduits()) { - updateShapeForConduit(bundle, conduit); - } - updateTotalShape(); - } - - public VoxelShape getShapeFromHit(BlockPos pos, HitResult result) { - return Optional.ofNullable(this.conduitShapes.get(getConduit(pos, result))).orElse(Shapes.empty()); - } - - @Nullable - public Holder> getConduit(BlockPos pos, HitResult result) { - return getLookUpValue(conduitShapes, pos, result); - } - - @Nullable - public Direction getDirection(BlockPos pos, HitResult result) { - return getLookUpValue(directionShapes, pos, result); - } - - @Nullable - private T getLookUpValue(Map shapes, BlockPos pos, HitResult result) { - for (Map.Entry entry : shapes.entrySet()) { - Vec3 vec3 = result.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); - Optional point = entry.getValue().closestPointTo(vec3); - if (point.isEmpty()) { - continue; - } - - if (point.get().closerThan(vec3, Mth.EPSILON)) { // can't be 0 due to double - return entry.getKey(); - } - } - - return null; - } - - private void updateTotalShape() { - this.totalShape = Shapes.empty(); - this.conduitShapes.values().forEach(s -> this.totalShape = Shapes.joinUnoptimized(this.totalShape, s, BooleanOp.OR)); - totalShape.optimize(); - } - - public VoxelShape getTotalShape() { - return this.totalShape; - } - - private void updateShapeForConduit(ConduitBundle conduitBundle, Holder> conduit) { - VoxelShape conduitShape = Shapes.empty(); - Direction.Axis axis = OffsetHelper.findMainAxis(conduitBundle); - Map>, List> offsets = new HashMap<>(); - for (Direction direction : Direction.values()) { - VoxelShape directionShape = directionShapes.getOrDefault(direction, Shapes.empty()); - if (conduitBundle.getConnectionState(direction, conduit) instanceof DynamicConnectionState) { - VoxelShape connectorShape = rotateVoxelShape(CONNECTOR, direction); - directionShape = Shapes.joinUnoptimized(directionShape, connectorShape, BooleanOp.OR); - conduitShape = Shapes.joinUnoptimized(conduitShape, connectorShape, BooleanOp.OR); - } - var connectedTypes = conduitBundle.getConnectedConduits(direction); - if (connectedTypes.contains(conduit)) { - Vec3i offset = OffsetHelper.translationFor(direction.getAxis(), - OffsetHelper.offsetConduit(connectedTypes.indexOf(conduit), connectedTypes.size())); - offsets.computeIfAbsent(conduit, ignored -> new ArrayList<>()).add(offset); - VoxelShape connectionShape = rotateVoxelShape(CONNECTION, direction).move(offset.getX() * 3f / 16f, offset.getY() * 3f / 16f, - offset.getZ() * 3f / 16f); - directionShape = Shapes.joinUnoptimized(directionShape, connectionShape, BooleanOp.OR); - conduitShape = Shapes.joinUnoptimized(conduitShape, connectionShape, BooleanOp.OR); - } - directionShapes.put(direction, directionShape.optimize()); - } - - var allConduits = conduitBundle.getConduits(); - @Nullable Area box = null; - @Nullable Holder> notRendered = null; - int i = allConduits.indexOf(conduit); - if (i == -1) { - conduitShapes.put(conduit, Shapes.block()); - return; - } - - var type = allConduits.get(i); - @Nullable List offsetsForConduit = offsets.get(type); - if (offsetsForConduit != null) { - //all are pointing to the same xyz reference meaning that we can draw the core - if (offsetsForConduit.stream().distinct().count() != 1) { - box = new Area(offsetsForConduit.toArray(new Vec3i[0])); - } - } else { - notRendered = type; - } - - if (offsetsForConduit != null && (box == null || !box.contains(offsetsForConduit.get(0)))) { - conduitShape = Shapes.joinUnoptimized(conduitShape, - CORE.move(offsetsForConduit.get(0).getX() * 3f / 16f, offsetsForConduit.get(0).getY() * 3f / 16f, offsetsForConduit.get(0).getZ() * 3f / 16f), - BooleanOp.OR); - } - - if (box != null) { - if (notRendered != null) { - Vec3i offset = OffsetHelper.translationFor(axis, OffsetHelper.offsetConduit(i, allConduits.size())); - if (!box.contains(offset)) { - conduitShape = Shapes.joinUnoptimized(conduitShape, CORE.move(offset.getX() * 3f / 16f, offset.getY() * 3f / 16f, offset.getZ() * 3f / 16f), - BooleanOp.OR); - } - } - - conduitShape = Shapes.joinUnoptimized(conduitShape, CORE.move(box.getMin().getX() * 3f / 16f, box.getMin().getY() * 3f / 16f, box.getMin().getZ() * 3f / 16f), - BooleanOp.OR); - } else { - if (notRendered != null) { - Vec3i offset = OffsetHelper.translationFor(axis, OffsetHelper.offsetConduit(i, allConduits.size())); - conduitShape = Shapes.joinUnoptimized(conduitShape, CORE.move(offset.getX() * 3f / 16f, offset.getY() * 3f / 16f, offset.getZ() * 3f / 16f), BooleanOp.OR); - } - } - - conduitShapes.put(conduit, conduitShape.optimize()); - } - - /** - * Rotates a VoxelShape around the center to the specified Direction, Origin is SOUTH - * - * @param toRotate - * @param direction - * @return the rotated VoxelShape - */ - public static VoxelShape rotateVoxelShape(VoxelShape toRotate, Direction direction) { - VoxelShape[] buffer = new VoxelShape[] { toRotate, Shapes.empty() }; - if (direction.get2DDataValue() == -1) { - if (direction == Direction.DOWN) { - buffer[0].forAllBoxes( - (minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(minX, 1 - maxZ, minY, maxX, 1 - minZ, maxY))); - } else { - buffer[0].forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(minX, minZ, minY, maxX, maxZ, maxY))); - } - - return buffer[1]; - } - - for (int i = 0; i < (direction.get2DDataValue()) % 4; i++) { - buffer[0].forAllBoxes( - (minX, minY, minZ, maxX, maxY, maxZ) -> buffer[1] = Shapes.or(buffer[1], Shapes.box(1 - maxZ, minY, minX, 1 - minZ, maxY, maxX))); - buffer[0] = buffer[1]; - buffer[1] = Shapes.empty(); - } - - return buffer[0]; - } - -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/OffsetHelper.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/OffsetHelper.java index 0707176056..e1d83900d2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/OffsetHelper.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/OffsetHelper.java @@ -113,23 +113,6 @@ public static Vec3i translationFor(Direction.Axis axis, Vector2i offset) { }; } - @Deprecated - public static Direction.Axis findMainAxis(ConduitBundle bundle) { - List connectedDirs = new ArrayList<>(); - for (Direction dir : Direction.values()) { - if (!bundle.getConnectedConduits(dir).isEmpty()) { - connectedDirs.add(dir); - } - } - - if (connectedDirs.isEmpty()) { - return Direction.Axis.Z; - } - - // get Last as MainAxis, because those are the horizontal ones - return connectedDirs.get(connectedDirs.size() - 1).getAxis(); - } - public static Direction.Axis findMainAxis(ConduitBundleReader bundle) { List connectedDirs = new ArrayList<>(); for (Direction dir : Direction.values()) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java deleted file mode 100644 index 74a53ec989..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlock.java +++ /dev/null @@ -1,726 +0,0 @@ -package com.enderio.conduits.common.conduit.block; - -import com.enderio.base.common.init.EIOCapabilities; -import com.enderio.base.common.tag.EIOTags; -import com.enderio.conduits.EnderIOConduits; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitCapabilities; -import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; -import com.enderio.conduits.common.conduit.ConduitBlockItem; -import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.ConduitSavedData; -import com.enderio.conduits.api.bundle.AddConduitResult; -import com.enderio.conduits.common.conduit.connection.ConnectionState; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; -import com.enderio.conduits.common.init.ConduitBlockEntities; -import com.enderio.conduits.common.init.ConduitComponents; -import com.enderio.conduits.common.init.Conduits; -import com.enderio.conduits.common.redstone.RedstoneInsertFilter; - -import java.util.Optional; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.ItemInteractionResult; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.ClipContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.level.material.PushReaction; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; -import org.jetbrains.annotations.Nullable; - -@EventBusSubscriber(modid = EnderIOConduits.MODULE_MOD_ID) -public class ConduitBundleBlock extends Block implements EntityBlock, SimpleWaterloggedBlock { - - public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; - - public ConduitBundleBlock(Properties properties) { - super(properties); - registerDefaultState(getStateDefinition().any().setValue(WATERLOGGED, false)); - } - - @Nullable - @Override - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return ConduitBlockEntities.CONDUIT.create(pos, state); - } - - @Override - public PushReaction getPistonPushReaction(BlockState pState) { - return PushReaction.BLOCK; - } - - @Override - public boolean canBeReplaced(BlockState pState, Fluid pFluid) { - return false; - } - - // region Water-logging - - @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - return defaultBlockState().setValue(WATERLOGGED, - context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(WATERLOGGED); - } - - @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, - BlockPos currentPos, BlockPos neighborPos) { - if (state.getValue(WATERLOGGED)) { - level.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(level)); - } - - if (level.getBlockEntity(currentPos) instanceof ConduitBundleBlockEntity conduit) { - conduit.updateShape(); - } - - return super.updateShape(state, direction, neighborState, level, currentPos, neighborPos); - } - - @Override - public FluidState getFluidState(BlockState state) { - return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); - } - - // endregion - - @Override - public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, - boolean isMoving) { - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduit) { - conduit.updateConnections(level, pos, fromPos, true); - } - - super.neighborChanged(state, level, pos, block, fromPos, isMoving); - } - - @Override - public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return getBundleShape(level, pos, true); - } - - @Override - protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, - CollisionContext context) { - return getBundleShape(level, pos, false); - } - - private VoxelShape getBundleShape(BlockGetter level, BlockPos pos, boolean canHideFacade) { - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduit) { - if (conduit.getBundle().hasFacade() && (!canHideFacade || FacadeHelper.areFacadesVisible())) { - return Shapes.block(); - } - - // Ensure if a bundle is bugged with 0 conduits that it can be broken. - if (!conduit.getBundle().getConduits().isEmpty()) { - return conduit.getShape().getTotalShape(); - } - } - - return Shapes.block(); - } - - @Override - protected VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return super.getVisualShape(state, level, pos, context); - } - - // region Block Interaction - - @Override - protected ItemInteractionResult useItemOn(ItemStack itemStack, BlockState state, Level level, BlockPos pos, - Player player, InteractionHand interactionHand, BlockHitResult hit) { - - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity blockEntity) { - var interactionResult = addConduit(blockEntity, player, itemStack, level.isClientSide()); - if (interactionResult.isPresent()) { - return interactionResult.get(); - } - - interactionResult = handleYeta(blockEntity, player, itemStack, hit, level.isClientSide()); - if (interactionResult.isPresent()) { - return interactionResult.get(); - } - - interactionResult = handleFacade(blockEntity, player, itemStack, hit, level.isClientSide()); - if (interactionResult.isPresent()) { - return interactionResult.get(); - } - } - - return super.useItemOn(itemStack, state, level, pos, player, interactionHand, hit); - } - - @Override - protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, - BlockHitResult hit) { - BlockEntity be = level.getBlockEntity(pos); - if (be instanceof ConduitBundleBlockEntity conduit) { - Optional interactionResult = handleScreen(conduit, player, hit, level.isClientSide()); - - if (interactionResult.isPresent()) { - return interactionResult.get(); - } - } - - return super.useWithoutItem(state, level, pos, player, hit); - } - - private Optional addConduit(ConduitBundleBlockEntity blockEntity, Player player, - ItemStack stack, boolean isClientSide) { - if (!(stack.getItem() instanceof ConduitBlockItem)) { - return Optional.empty(); - } - - Holder> conduit = stack.get(ConduitComponents.CONDUIT); - if (conduit == null) { - return Optional.empty(); - } - - AddConduitResult action = blockEntity.addType(conduit, player); - - ItemInteractionResult result; - - if (action instanceof AddConduitResult.Upgrade upgradeAction) { - if (!player.getAbilities().instabuild) { - stack.shrink(1); - player.getInventory() - .placeItemBackInInventory(ConduitBlockItem.getStackFor(upgradeAction.replacedConduit(), 1)); - } - result = ItemInteractionResult.sidedSuccess(isClientSide); - } else if (action instanceof AddConduitResult.Insert) { - if (!player.getAbilities().instabuild) { - stack.shrink(1); - } - - result = ItemInteractionResult.sidedSuccess(isClientSide); - } else { - result = ItemInteractionResult.FAIL; - } - - if (result != ItemInteractionResult.FAIL) { - Level level = blockEntity.getLevel(); - BlockPos blockpos = blockEntity.getBlockPos(); - - BlockState blockState = level.getBlockState(blockpos); - SoundType soundtype = blockState.getSoundType(level, blockpos, player); - level.playSound(player, blockpos, soundtype.getPlaceSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - level.gameEvent(GameEvent.BLOCK_PLACE, blockpos, GameEvent.Context.of(player, blockState)); - } - - return Optional.of(result); - } - - private Optional handleYeta(ConduitBundleBlockEntity blockEntity, Player player, - ItemStack stack, BlockHitResult hit, boolean isClientSide) { - if (stack.is(EIOTags.Items.WRENCH)) { - Holder> conduit = blockEntity.getShape().getConduit(hit.getBlockPos(), hit); - Direction direction = blockEntity.getShape().getDirection(hit.getBlockPos(), hit); - if (conduit == null) { - return Optional.empty(); - } - - if (isClientSide) { - return Optional.of(ItemInteractionResult.sidedSuccess(isClientSide)); - } - - internalHandleYeta(conduit, direction, blockEntity, hit); - return Optional.of(ItemInteractionResult.sidedSuccess(isClientSide)); - } - - return Optional.empty(); - } - - private void internalHandleYeta(Holder> conduit, @Nullable Direction direction, - ConduitBundleBlockEntity blockEntity, BlockHitResult hit) { - ConduitBundle bundle = blockEntity.getBundle(); - - if (direction != null) { - ConnectionState connectionState = bundle.getConnectionState(direction, conduit); - - if (connectionState instanceof DynamicConnectionState dyn) { -// bundle.getNodeFor(conduit).clearState(direction); - blockEntity.dropConnectionItems(dyn); - bundle.setConnectionState(direction, conduit, StaticConnectionStates.DISABLED); - blockEntity.updateShape(); - blockEntity.onConnectionsUpdated(conduit); - } else { - bundle.setConnectionState(direction, conduit, StaticConnectionStates.DISABLED); - blockEntity.updateShape(); - blockEntity.onConnectionsUpdated(conduit); - - if (blockEntity.getLevel() - .getBlockEntity(blockEntity.getBlockPos() - .relative(direction)) instanceof ConduitBundleBlockEntity other) { - Direction oppositeDirection = direction.getOpposite(); - - bundle.setConnectionState(oppositeDirection, conduit, StaticConnectionStates.DISABLED); - other.updateShape(); - other.onConnectionsUpdated(conduit); - ConduitGraphObject thisNode = bundle.getNodeFor(conduit); - ConduitGraphObject otherNode = other.getBundle().getNodeFor(conduit); - thisNode.getGraph().removeSingleEdge(thisNode, otherNode); - thisNode.getGraph().removeSingleEdge(otherNode, thisNode); - ConduitSavedData.addPotentialGraph(conduit, thisNode.getGraph(), - (ServerLevel) blockEntity.getLevel()); - ConduitSavedData.addPotentialGraph(conduit, otherNode.getGraph(), (ServerLevel) other.getLevel()); - } - } - } else { - ConnectionState connectionState = bundle.getConnectionState(hit.getDirection(), conduit); - - if (!connectionState.isConnection()) { - blockEntity.tryConnectTo(hit.getDirection(), conduit, true, true, true); - } - } - } - - @SubscribeEvent - public static void handleShiftYeta(PlayerInteractEvent.RightClickBlock event) { - if (event.getItemStack().is(EIOTags.Items.WRENCH) - && event.getLevel().getBlockEntity(event.getPos()) instanceof ConduitBundleBlockEntity blockEntity - && event.getEntity().isSteppingCarefully()) { - - Holder> conduit = blockEntity.getShape().getConduit(event.getPos(), event.getHitVec()); - if (conduit != null) { - blockEntity.removeTypeAndDelete(event.getEntity(), conduit); - event.setCanceled(true); - } - } - } - - private Optional handleFacade(ConduitBundleBlockEntity blockEntity, Player player, - ItemStack stack, BlockHitResult hit, boolean isClientSide) { - var facade = stack.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); - if (facade == null || !facade.isValid()) { - return Optional.empty(); - } - - if (blockEntity.getBundle().hasFacade()) { - return Optional.of(ItemInteractionResult.FAIL); - } - - Level level = blockEntity.getLevel(); - BlockPos blockpos = blockEntity.getBlockPos(); - - int lightLevelBefore = level.getLightEmission(blockpos); - - blockEntity.getBundle().facade(stack); - if (!player.getAbilities().instabuild) { - stack.shrink(1); - } - - BlockState blockState = level.getBlockState(blockpos); - - SoundType soundtype = blockState.getSoundType(level, blockpos, player); - level.playSound(player, blockpos, soundtype.getPlaceSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - level.gameEvent(GameEvent.BLOCK_PLACE, blockpos, GameEvent.Context.of(player, blockState)); - - // Handle light update - if (lightLevelBefore != level.getLightEmission(blockpos)) { - level.getLightEngine().checkBlock(blockpos); - } - - return Optional.of(ItemInteractionResult.sidedSuccess(isClientSide)); - } - - private Optional handleScreen(ConduitBundleBlockEntity blockEntity, Player player, - BlockHitResult hit, boolean isClientSide) { - Optional openInformation = getOpenInformation(blockEntity, hit); - if (openInformation.isPresent()) { - if (player instanceof ServerPlayer serverPlayer) { - serverPlayer.openMenu( - blockEntity.menuProvider(openInformation.get().direction(), openInformation.get().conduit()), - buf -> { - buf.writeBlockPos(blockEntity.getBlockPos()); - buf.writeEnum(openInformation.get().direction()); - Conduit.STREAM_CODEC.encode(buf, openInformation.get().conduit()); - }); - } - - return Optional.of(InteractionResult.sidedSuccess(isClientSide)); - } - - return Optional.empty(); - } - - private Optional getOpenInformation(ConduitBundleBlockEntity blockEntity, BlockHitResult hit) { - Holder> conduit = blockEntity.getShape().getConduit(hit.getBlockPos(), hit); - Direction direction = blockEntity.getShape().getDirection(hit.getBlockPos(), hit); - - if (direction != null && conduit != null) { - if (canBeOrIsValidConnection(blockEntity, conduit, direction)) { - return Optional.of(new OpenInformation(direction, conduit)); - } - } - - if (conduit != null) { - direction = hit.getDirection(); - if (canBeValidConnection(blockEntity, conduit, direction)) { - return Optional.of(new OpenInformation(direction, conduit)); - } - } - - if (conduit != null) { - for (Direction potential : Direction.values()) { - if (canBeValidConnection(blockEntity, conduit, potential)) { - return Optional.of(new OpenInformation(potential, conduit)); - } - } - } - - ConduitBundle bundle = blockEntity.getBundle(); - - // fallback - for (Direction potential : Direction.values()) { - if (bundle.isConnectionEnd(potential)) { - for (Holder> potentialType : bundle.getConduits()) { - if (bundle.getConnectionState(potential, potentialType) instanceof DynamicConnectionState) { - return Optional.of(new OpenInformation(potential, potentialType)); - } - } - throw new IllegalStateException("couldn't find connection even though it should be present"); - } - } - - for (Direction potential : Direction.values()) { - if (!(blockEntity.getLevel() - .getBlockEntity( - blockEntity.getBlockPos().relative(potential)) instanceof ConduitBundleBlockEntity)) { - for (Holder> potentialType : bundle.getConduits()) { - if (canBeValidConnection(blockEntity, potentialType, potential)) { - return Optional.of(new OpenInformation(potential, potentialType)); - } - } - } - } - - return Optional.empty(); - } - - // endregion - - public static boolean canBeOrIsValidConnection(ConduitBundleBlockEntity blockEntity, Holder> conduit, - Direction direction) { - ConduitBundle bundle = blockEntity.getBundle(); - - return bundle.getConnectionState(direction, conduit) instanceof DynamicConnectionState - || canBeValidConnection(blockEntity, conduit, direction); - } - - public static boolean canBeValidConnection(ConduitBundleBlockEntity blockEntity, Holder> conduit, - Direction direction) { - ConduitBundle bundle = blockEntity.getBundle(); - ConnectionState connectionState = bundle.getConnectionState(direction, conduit); - return connectionState instanceof StaticConnectionStates state && state == StaticConnectionStates.DISABLED - && !(blockEntity.getLevel() - .getBlockEntity( - blockEntity.getBlockPos().relative(direction)) instanceof ConduitBundleBlockEntity); - } - - @Override - public ItemStack getCloneItemStack(BlockState state, HitResult target, LevelReader level, BlockPos pos, - Player player) { - if (level instanceof Level realLevel - && state.getOptionalValue(BlockStateProperties.WATERLOGGED).orElse(false)) { - var hitResult = Item.getPlayerPOVHitResult(realLevel, player, ClipContext.Fluid.NONE); - if (hitResult.getType() == HitResult.Type.MISS) { - return Items.AIR.getDefaultInstance(); - } - - if (hitResult.getBlockPos().equals(pos)) { - target = hitResult; - } else { - return level.getBlockState(hitResult.getBlockPos()) - .getCloneItemStack(hitResult, level, hitResult.getBlockPos(), player); - } - } - - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity blockEntity) { - Optional facade = blockEntity.getBundle().facade(); - if (facade.isPresent() && FacadeHelper.areFacadesVisible()) { - return facade.get().asItem().getDefaultInstance(); - } - - Holder> conduit = blockEntity.getShape().getConduit(pos, target); - if (conduit == null) { - if (blockEntity.getBundle().getConduits().isEmpty()) { - return ItemStack.EMPTY; - } - - conduit = blockEntity.getBundle().getConduits().getFirst(); - } - - return ConduitBlockItem.getStackFor(conduit, 1); - } - - return super.getCloneItemStack(state, target, level, pos, player); - } - - @Nullable - @Override - public BlockEntityTicker getTicker(Level level, BlockState state, - BlockEntityType blockEntityType) { - return (level1, pos, state1, blockEntity) -> { - if (blockEntity instanceof ConduitBundleBlockEntity conduitBundleBlockEntity) { - conduitBundleBlockEntity.everyTick(); - } - }; - } - - // region Place and destroy logic - - @Override - public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, - ItemStack stack) { - Holder> conduit = stack.get(ConduitComponents.CONDUIT); - if (conduit == null) { - return; - } - - if (!(placer instanceof Player player)) { - return; - } - - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity blockEntity) { - blockEntity.addType(conduit, player); - if (level.isClientSide()) { - blockEntity.updateClient(); - } - } - } - - @Override - public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, - FluidState fluid) { - HitResult hit = player.pick(player.blockInteractionRange() + 5, 1, false); - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity blockEntity) { - - if (blockEntity.getBundle().hasFacade() && FacadeHelper.areFacadesVisible()) { - SoundType soundtype = state.getSoundType(level, pos, player); - level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - - if (!player.getAbilities().instabuild) { - blockEntity.dropFacadeItem(); - } - - int lightLevelBefore = level.getLightEmission(pos); - - blockEntity.getBundle().clearFacade(); - - // Handle light update - if (lightLevelBefore != level.getLightEmission(pos)) { - level.getLightEngine().checkBlock(pos); - } - } else { - Holder> conduit = blockEntity.getShape() - .getConduit(((BlockHitResult) hit).getBlockPos(), hit); - if (conduit == null) { - if (!blockEntity.getBundle().getConduits().isEmpty()) { - level.playSound(player, pos, SoundEvents.GENERIC_SMALL_FALL, SoundSource.BLOCKS, 1F, 1F); - return false; - } - return true; - } - - SoundType soundtype = state.getSoundType(level, pos, player); - level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - - if (blockEntity.removeType(conduit, !player.getAbilities().instabuild)) { - return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); - } - } - - level.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(player, state)); - return false; - } - - // No block entity, get rid of it immediately - return true; - } - - // endregion - - // region Redstone - - //@formatter:off - @Override - public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos pos, @Nullable Direction direction) { - if (direction == null) { - return false; - } - - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundleBlockEntity && conduitBundleBlockEntity.getLevel() != null) { - Holder> redstoneConduit = conduitBundleBlockEntity.getLevel().holderOrThrow(Conduits.REDSTONE); - ConduitBundle conduitBundle = conduitBundleBlockEntity.getBundle(); - - return conduitBundle.getConduits().contains(redstoneConduit) && - conduitBundle.getConnectionState(direction.getOpposite(), redstoneConduit) instanceof DynamicConnectionState; - } - - return false; - } - - @SuppressWarnings("deprecation") - @Override - public int getSignal(BlockState pBlockState, BlockGetter level, BlockPos pos, Direction direction) { - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundleBlockEntity && conduitBundleBlockEntity.getLevel() != null) { - // TODO: Need to decouple this from the holder registry. Probably need to find conduits by their "type" instead. - Holder> redstoneConduit = conduitBundleBlockEntity.getLevel().holderOrThrow(Conduits.REDSTONE); - ConduitBundle conduitBundle = conduitBundleBlockEntity.getBundle(); - - if (!conduitBundle.getConduits().contains(redstoneConduit)) { - return 0; - } - - if (!(conduitBundle.getConnectionState(direction.getOpposite(), redstoneConduit) instanceof DynamicConnectionState dyn)) { - return 0; - } - - if (!dyn.isInsert()) { - return 0; - } - -// if (!conduitBundle.getNodeFor(redstoneConduit).hasData(ConduitTypes.Data.REDSTONE.get())) { -// return 0; -// } - -// RedstoneConduitData data = conduitBundle.getNodeFor(redstoneConduit).getData(ConduitTypes.Data.REDSTONE.get()); -// return getSignalOutput(dyn, Objects.requireNonNull(data)); - return 0; - } - - return 0; - } - - // TODO: Redstone conduit strong signals. - @Override - protected int getDirectSignal(BlockState pState, BlockGetter pLevel, BlockPos pPos, Direction pDirection) { - return super.getDirectSignal(pState, pLevel, pPos, pDirection); - } - - //@formatter:on - - private int getSignalOutput(DynamicConnectionState connectionState, RedstoneConduitData data) { - if (connectionState.filterInsert() - .getCapability(EIOCapabilities.Filter.ITEM) instanceof RedstoneInsertFilter filter) { - return filter.getOutputSignal(data, connectionState.insertChannel()); - } - return data.getSignal(connectionState.insertChannel()); - } - - // endregion - - private Optional getFacadeBlock(BlockGetter level, BlockPos pos) { - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduit) { - return conduit.getBundle().facade(); - } - - return Optional.empty(); - } - - @Override - public BlockState getAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, - @Nullable BlockState queryState, @Nullable BlockPos queryPos) { - - Optional facade = getFacadeBlock(level, pos); - if (facade.isPresent()) { - return facade.get().defaultBlockState(); - } - - return super.getAppearance(state, level, pos, side, queryState, queryPos); - } - - @Override - public int getLightEmission(BlockState state, BlockGetter level, BlockPos pos) { - Optional facade = getFacadeBlock(level, pos); - if (facade.isPresent()) { - return facade.get().getLightEmission(facade.get().defaultBlockState(), level, pos); - } - - return super.getLightEmission(state, level, pos); - } - - @Override - public float getFriction(BlockState state, LevelReader level, BlockPos pos, @Nullable Entity entity) { - Optional facade = getFacadeBlock(level, pos); - if (facade.isPresent()) { - return facade.get().getFriction(facade.get().defaultBlockState(), level, pos, entity); - } - - return super.getFriction(state, level, pos, entity); - } - - @Override - public SoundType getSoundType(BlockState state, LevelReader level, BlockPos pos, @Nullable Entity entity) { - Optional facade = getFacadeBlock(level, pos); - if (facade.isPresent()) { - return facade.get().getSoundType(facade.get().defaultBlockState(), level, pos, entity); - } - - return super.getSoundType(state, level, pos, entity); - } - - @Override - public boolean supportsExternalFaceHiding(BlockState state) { - return true; - } - - private record OpenInformation(Direction direction, Holder> conduit) { - } - - @Override - protected void spawnDestroyParticles(Level level, Player player, BlockPos pos, BlockState state) { - - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java deleted file mode 100644 index 68def5fe43..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/ConduitBundleBlockEntity.java +++ /dev/null @@ -1,902 +0,0 @@ -package com.enderio.conduits.common.conduit.block; - -import com.enderio.base.api.UseOnly; -import com.enderio.base.api.filter.ResourceFilter; -import com.enderio.base.common.init.EIOCapabilities; -import com.enderio.conduits.ConduitNBTKeys; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.bundle.SlotType; -import com.enderio.conduits.client.particle.ConduitBreakParticle; -import com.enderio.conduits.common.conduit.ConduitBlockItem; -import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.ConduitSavedData; -import com.enderio.conduits.common.conduit.ConduitShape; -import com.enderio.conduits.api.bundle.AddConduitResult; -import com.enderio.conduits.common.conduit.SlotData; -import com.enderio.conduits.common.conduit.connection.ConnectionState; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; -import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; -import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; -import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; -import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; -import com.enderio.conduits.common.init.ConduitBlockEntities; -import com.enderio.conduits.common.menu.ConduitMenu; -import com.enderio.core.common.blockentity.EnderBlockEntity; -import dev.gigaherz.graph3.Graph; -import dev.gigaherz.graph3.GraphObject; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; -import me.liliandev.ensure.ensures.EnsureSide; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.core.HolderLookup; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.fml.LogicalSide; -import net.neoforged.neoforge.capabilities.BlockCapability; -import net.neoforged.neoforge.capabilities.ICapabilityProvider; -import net.neoforged.neoforge.client.ChunkRenderTypeSet; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.client.model.data.ModelProperty; -import net.neoforged.neoforge.common.util.INBTSerializable; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.IItemHandlerModifiable; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class ConduitBundleBlockEntity extends EnderBlockEntity { - - public static final ModelProperty BUNDLE_MODEL_PROPERTY = new ModelProperty<>(); - public static final ModelProperty FACADE_MODEL_DATA = new ModelProperty<>(); - public static final ModelProperty FACADE_RENDERTYPE = new ModelProperty<>(); - public static final String CONDUIT_INV_KEY = "ConduitInv"; - - @UseOnly(LogicalSide.CLIENT) - public static final Map FACADES = new HashMap<>(); - - private final ConduitShape shape = new ConduitShape(); - - private ConduitBundle bundle; - @UseOnly(LogicalSide.CLIENT) - private ConduitBundle clientBundle; - - private UpdateState checkConnection = UpdateState.NONE; - - private final Map>, ConduitGraphObject> lazyNodes = new HashMap<>(); - private ListTag lazyNodeNBT = new ListTag(); - private ConduitItemHandler conduitItemHandler = new ConduitItemHandler(); - - public ConduitBundleBlockEntity(BlockPos worldPosition, BlockState blockState) { - super(ConduitBlockEntities.CONDUIT.get(), worldPosition, blockState); - bundle = new ConduitBundle(this::scheduleTick, worldPosition); - - addDataSlot(ConduitBundle.DATA_SLOT_TYPE.create(this::getBundle, b -> bundle = b)); - addAfterSyncRunnable(this::updateClient); - } - - public ConduitBundle getBundle() { - return bundle; - } - - public ConduitShape getShape() { - return shape; - } - - public void updateShape() { - shape.updateConduit(bundle); - } - - public void updateClient() { - if (level != null && level.isClientSide) { - clientBundle = bundle.deepCopy(); - updateShape(); - requestModelDataUpdate(); - level.setBlocksDirty(getBlockPos(), Blocks.AIR.defaultBlockState(), getBlockState()); - if (bundle.hasFacade()) { - FACADES.put(worldPosition, bundle.facade().get().defaultBlockState()); - } else { - FACADES.remove(worldPosition); - } - } - } - - // region Network Sync - - /** - * Handle a connection state update from the client. - */ - @EnsureSide(EnsureSide.Side.SERVER) - public void handleConnectionStateUpdate(Direction direction, Holder> conduit, - DynamicConnectionState connectionState) { - // Sanity check, the client shouldn't do this, but just to make sure there's no - // confusion. - if (bundle.getConnectionState(direction, conduit) instanceof DynamicConnectionState) { - bundle.setConnectionState(direction, conduit, connectionState); - - // Update node IO state. - var node = bundle.getNodeFor(conduit); -// node.pushState(direction, connectionState); - - // Proxied capabilities are likely to have changed. - level.invalidateCapabilities(worldPosition); - } - - updateClient(); - onConnectionsUpdated(conduit); - } - - @EnsureSide(EnsureSide.Side.SERVER) - public void handleConduitDataUpdate(Holder> conduit, ConduitDataContainer clientDataContainer) { - var node = getBundle().getNodeFor(conduit); -// node.handleClientChanges(clientDataContainer); - } - - // endregion - - private void scheduleTick() { - setChanged(); - } - - @Override - public void onLoad() { - updateShape(); - - if (level instanceof ServerLevel serverLevel) { - sync(); - bundle.onLoad(level, getBlockPos()); - for (var entry : lazyNodes.entrySet()) { - Holder> conduit = entry.getKey(); - ConduitGraphObject node = entry.getValue(); - loadNode(serverLevel, conduit, node); - } - } - - // Now that the BE is loaded, update the blocklight. - if (bundle.hasFacade()) { - level.getLightEngine().checkBlock(worldPosition); - } - } - - private void loadNode(ServerLevel serverLevel, Holder> conduit, ConduitGraphObject node) { - - Graph graph = Objects.requireNonNull(node.getGraph()); - - for (Direction dir : Direction.values()) { - tryConnectTo(dir, conduit, false, false, false) - .ifPresent(otherNode -> ConduitGraphUtility.connect(conduit, node, otherNode)); - } - - for (GraphObject object : node.getGraph().getObjects()) { - if (object instanceof ConduitGraphObject otherNode) { - conduit.value().onConnectTo(node, otherNode); - } - } - - ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel); - } - - public boolean stillValid(Player pPlayer) { - if (level == null || level.getBlockEntity(this.worldPosition) != this) { - return false; - } - - return pPlayer.canInteractWithBlock(this.worldPosition, 1.5); - } - - @Override - public void onChunkUnloaded() { - super.onChunkUnloaded(); - if (level instanceof ServerLevel serverLevel) { - ConduitSavedData savedData = ConduitSavedData.get(serverLevel); - bundle.getConduits().forEach(type -> onChunkUnloaded(savedData, type)); - } else { - FACADES.remove(worldPosition); - } - } - - private void onChunkUnloaded(ConduitSavedData savedData, Holder> conduit) { - var node = bundle.getNodeFor(conduit); - conduit.value().onRemoved(node, level, getBlockPos()); - savedData.putUnloadedNodeIdentifier(conduit, this.worldPosition, node); - } - - @Override - public void setRemoved() { - super.setRemoved(); - if (level != null && level.isClientSide) { - FACADES.remove(worldPosition); - } - } - - public void everyTick() { - if (level == null) { - return; - } - - if (!level.isClientSide) { - serverTick(); - checkConnection = checkConnection.next(); - if (checkConnection.isInitialized()) { - updateConnections(level, worldPosition, null, false); - } - } else { - clientTick(); - } - } - - public void updateConnections(Level level, BlockPos pos, @Nullable BlockPos fromPos, boolean shouldActivate) { - for (Direction direction : Direction.values()) { - if (fromPos == null || !(level.getBlockEntity(fromPos) instanceof ConduitBundleBlockEntity)) { - for (Holder> conduit : bundle.getConduits()) { - if (shouldActivate && conduit.value().hasConnectionDelay()) { - checkConnection = checkConnection.activate(); - continue; - } - - ConnectionState connectionState = bundle.getConnectionState(direction, conduit); - if (connectionState instanceof DynamicConnectionState dyn) { - if (!conduit.value().canForceConnectToBlock(level, pos, direction)) { -// bundle.getNodeFor(conduit).clearState(direction); - dropConnectionItems(dyn); - bundle.setConnectionState(direction, conduit, StaticConnectionStates.DISCONNECTED); - updateShape(); - onConnectionsUpdated(conduit); - } - } else if (connectionState == StaticConnectionStates.DISCONNECTED) { - tryConnectTo(direction, conduit, true, true, false); - } - } - } - } - - updateShape(); - } - - @Override - protected void saveAdditional(CompoundTag tag, HolderLookup.Provider lookupProvider) { - super.saveAdditional(tag, lookupProvider); - tag.put(ConduitNBTKeys.CONDUIT_BUNDLE, bundle.save(lookupProvider)); - - ListTag listTag = new ListTag(); - for (Holder> conduit : bundle.getConduits()) { -// var data = bundle.getNodeFor(conduit).conduitDataContainer(); -// listTag.add(data.save(lookupProvider)); - } - - tag.put(ConduitNBTKeys.CONDUIT_EXTRA_DATA, listTag); - tag.put(CONDUIT_INV_KEY, conduitItemHandler.serializeNBT(lookupProvider)); - } - - @Override - public void loadAdditional(CompoundTag tag, HolderLookup.Provider lookupProvider) { - super.loadAdditional(tag, lookupProvider); - - // loadAdditional is now called by the sync system - // ideally we'll need presence checks to find bundle issues, but for now we're - // making this safe. - - if (tag.contains(ConduitNBTKeys.CONDUIT_BUNDLE)) { - bundle = ConduitBundle.parse(lookupProvider, tag.getCompound(ConduitNBTKeys.CONDUIT_BUNDLE)); - bundle.setOnChangedRunnable(this::scheduleTick); - } - - if (tag.contains(ConduitNBTKeys.CONDUIT_EXTRA_DATA)) { - lazyNodeNBT = tag.getList(ConduitNBTKeys.CONDUIT_EXTRA_DATA, Tag.TAG_COMPOUND); - } - - if (tag.contains(CONDUIT_INV_KEY)) { - conduitItemHandler.deserializeNBT(lookupProvider, tag.getCompound(CONDUIT_INV_KEY)); - } - } - - @Override - public void setLevel(Level pLevel) { - super.setLevel(pLevel); - - if (level.isClientSide()) { - clientBundle = bundle.deepCopy(); - } else { - loadFromSavedData(); - } - } - - @Override - public ModelData getModelData() { - return ModelData.builder().with(BUNDLE_MODEL_PROPERTY, clientBundle).build(); - } - - public boolean hasType(Holder> conduit) { - return bundle.hasType(conduit); - } - - public AddConduitResult addType(Holder> conduit, Player player) { - AddConduitResult action = bundle.addConduit(level, conduit, player); - - // something has changed - if (action.hasChanged()) { - List> nodes = new ArrayList<>(); - for (Direction dir : Direction.values()) { - tryConnectTo(dir, conduit, false, false, false).ifPresent(nodes::add); - } - - if (level instanceof ServerLevel serverLevel) { - ConduitGraphObject thisNode = Objects.requireNonNull(bundle.getNodeForTypeExact(conduit), - "no node found in conduit"); - ConduitGraphUtility.integrate(conduit, thisNode, nodes); - - for (GraphObject object : thisNode.getGraph().getObjects()) { - if (object instanceof ConduitGraphObject node) { - conduit.value().onConnectTo(thisNode, node); - } - } - - ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(thisNode.getGraph()), serverLevel); - } - - if (action instanceof AddConduitResult.Upgrade upgrade - && !upgrade.replacedConduit().value().canConnectToConduit(conduit)) { - removeNeighborConnections(upgrade.replacedConduit()); - } - - // Update neighbors - level.updateNeighborsAt(getBlockPos(), getBlockState().getBlock()); - - updateShape(); - } - - return action; - } - - public Optional> tryConnectTo(Direction dir, Holder> conduit, - boolean forceMerge, boolean shouldMergeGraph, boolean forceConnect) { - if (level.getBlockEntity(getBlockPos().relative(dir)) instanceof ConduitBundleBlockEntity neighborBlockEntity - && neighborBlockEntity.connectTo(dir.getOpposite(), conduit, bundle.getNodeFor(conduit), forceMerge)) { - - connect(dir, conduit); - onConnectionsUpdated(conduit); - neighborBlockEntity.onConnectionsUpdated(conduit); - - ConduitBundle adjacentBundle = neighborBlockEntity.getBundle(); - - ConduitGraphObject firstNode = adjacentBundle.getNodeFor(conduit); - ConduitGraphObject secondNode = bundle.getNodeFor(conduit); - - conduit.value().onConnectTo(firstNode, secondNode); - - if (firstNode.getNetwork() != null) { - for (var node : firstNode.getNetwork().getNodes()) { - if (node != firstNode) { - conduit.value().onConnectTo(firstNode, node); - } - } - } - - if (secondNode.getNetwork() != null && firstNode.getNetwork() != secondNode.getNetwork()) { - for (var node : secondNode.getNetwork().getNodes()) { - if (node != secondNode) { - conduit.value().onConnectTo(secondNode, node); - } - } - } - - if (shouldMergeGraph) { - ConduitGraphUtility.connect(conduit, bundle.getNodeFor(conduit), adjacentBundle.getNodeFor(conduit)); - } - - return Optional.of(adjacentBundle.getNodeFor(conduit)); - } else if (conduit.value().canConnectToBlock(level, getBlockPos(), dir) - || (forceConnect && conduit.value().canForceConnectToBlock(level, getBlockPos(), dir))) { - if (bundle.getConnectionState(dir, conduit) instanceof DynamicConnectionState dyn && dyn.isConnection()) { // Already - // connected - onConnectionsUpdated(conduit); - return Optional.empty(); - } - connectEnd(dir, conduit); - onConnectionsUpdated(conduit); - } else { - this.disconnect(dir, conduit); - } - - return Optional.empty(); - } - - public void onConnectionsUpdated(Holder> conduit) { - if (level != null && !level.isClientSide) { - var node = getBundle().getNodeFor(conduit); - - Set connectedSides = Arrays.stream(Direction.values()) - .filter(direction -> bundle.getConnectionState(direction, - conduit) != StaticConnectionStates.DISABLED) - .collect(Collectors.toSet()); - - conduit.value().onConnectionsUpdated(node, level, getBlockPos(), connectedSides); - } - } - - /** - * sets block to air if this is the last conduit - */ - public void removeTypeAndDelete(Player player, Holder> conduit) { - if (removeType(conduit, !player.getAbilities().instabuild)) { - level.setBlock(getBlockPos(), getBlockState().getFluidState().createLegacyBlock(), - level.isClientSide ? Block.UPDATE_ALL_IMMEDIATE : Block.UPDATE_ALL); - } - } - - /** - * Remove a conduit from the bundle. - * @param conduit The conduit to remove. - * @param shouldDrop Whether the conduit item should drop for this conduit. - * @return Whether the block should now be completely removed. - */ - public boolean removeType(Holder> conduit, boolean shouldDrop) { - if (shouldDrop && !level.isClientSide()) { - dropItem(ConduitBlockItem.getStackFor(conduit, 1)); - for (Direction dir : Direction.values()) { - if (bundle.getConnectionState(dir, conduit) instanceof DynamicConnectionState dyn) { - dropConnectionItems(dyn); - } - } - } - - boolean shouldRemove = bundle.removeConduit(level, conduit); - removeNeighborConnections(conduit); - updateShape(); - - if (level.isClientSide) { - ConduitBreakParticle.addDestroyEffects(getBlockPos(), conduit.value()); - } - - if (bundle.hasFacade() && shouldRemove) { - dropFacadeItem(); - } - - return shouldRemove; - } - - public void updateEmptyDynConnection() { - for (Direction dir : Direction.values()) { - for (int i = 0; i < ConduitBundle.MAX_CONDUITS; i++) { - if (bundle.getConnectionState(dir, i) instanceof DynamicConnectionState dynState - && dynState.isEmpty()) { - dropConnectionItems(dynState); - bundle.disableConduit(dir, i); - } - } - } - } - - public void dropConnectionItems(DynamicConnectionState dyn) { - for (SlotType slotType : SlotType.values()) { - ItemStack item = dyn.getItem(slotType); - if (!item.isEmpty()) { - dropItem(item); - } - } - } - - public void dropFacadeItem() { - if (!bundle.hasFacade()) { - throw new IllegalStateException("Cannot drop facade item because no facade has been set"); - } - - dropItem(bundle.facadeItem()); - } - - /** - * Drop an item on the ground by this block. - */ - private void dropItem(ItemStack stack) { - level.addFreshEntity( - new ItemEntity(level, getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), stack)); - } - - /** - * Removes connections to neigbouring bundles to the given conduit. - * @param conduit The conduit in this conduit that should be disconnected from other conduits. - */ - public void removeNeighborConnections(Holder> conduit) { - for (Direction dir : Direction.values()) { - if (level.getBlockEntity( - getBlockPos().relative(dir)) instanceof ConduitBundleBlockEntity neighborBlockEntity) { - neighborBlockEntity.disconnect(dir.getOpposite(), conduit); - } - } - - if (level instanceof ServerLevel serverLevel) { - for (Direction dir : Direction.values()) { - BlockEntity blockEntity = level.getBlockEntity(getBlockPos().relative(dir)); - if (blockEntity instanceof ConduitBundleBlockEntity neighborBlockEntity - && neighborBlockEntity.hasType(conduit)) { - Optional.of(neighborBlockEntity.bundle.getNodeFor(conduit)) - .map(ConduitGraphObject::getGraph) - .filter(Objects::nonNull) - .ifPresent(graph -> ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel)); - } - } - } - } - - // region Serialization - - @UseOnly(LogicalSide.SERVER) - private void loadFromSavedData() { - if (!(level instanceof ServerLevel serverLevel)) { - return; - } - - ConduitSavedData savedData = ConduitSavedData.get(serverLevel); - for (int i = 0; i < bundle.getConduits().size(); i++) { - Holder> type = bundle.getConduits().get(i); - loadConduitFromSavedData(savedData, type, i); - } - - lazyNodeNBT.clear(); - } - - @UseOnly(LogicalSide.SERVER) - private void loadConduitFromSavedData(ConduitSavedData savedData, Holder> conduit, int typeIndex) { - if (level == null) { - return; - } - - ConduitGraphObject node = savedData.takeUnloadedNodeIdentifier(conduit, this.worldPosition); - if (node == null && bundle.getNodeForTypeExact(conduit) == null) { - ConduitDataContainer dataContainer = null; -// if (typeIndex < lazyNodeNBT.size()) { -// dataContainer = ConduitDataContainer.parse(level.registryAccess(), lazyNodeNBT.getCompound(typeIndex)); -// } - - node = new ConduitGraphObject(worldPosition, dataContainer); - ConduitGraphUtility.integrate(conduit, node, List.of()); - bundle.setNodeFor(conduit, node); - lazyNodes.put(conduit, node); - } else if (node != null) { - bundle.setNodeFor(conduit, node); - } - } - - // endregion - - /** - * @param direction the Direction to connect to - * @param conduit the conduit to be connected - * @param node the other node to check if those can connect - * @param forceMerge if disabledstate should be ignored - * @return true if a connection happens - */ - private boolean connectTo(Direction direction, Holder> conduit, ConduitNode node, boolean forceMerge) { - if (!doTypesMatch(conduit)) { - return false; - } - - if (!conduit.value().canConnectNodes(bundle.getNodeFor(conduit), node)) { - return false; - } - - if (forceMerge || bundle.getConnectionState(direction, conduit) != StaticConnectionStates.DISABLED) { - connect(direction, conduit); - return true; - } - - return false; - } - - private boolean doTypesMatch(Holder> conduitToMatch) { - for (Holder> conduit : bundle.getConduits()) { - if (conduit.value().canConnectToConduit(conduitToMatch)) { - return true; - } - } - - return false; - } - - private void connect(Direction direction, Holder> conduit) { - bundle.connectTo(level, worldPosition, direction, conduit, false); - updateClient(); - } - - private void connectEnd(Direction direction, Holder> conduit) { - bundle.connectTo(level, worldPosition, direction, conduit, true); - updateClient(); - } - - private void disconnect(Direction direction, Holder> conduit) { - if (bundle.disconnectFrom(direction, conduit)) { - updateClient(); - } - } - - public MenuProvider menuProvider(Direction direction, Holder> conduit) { - return new ConduitMenuProvider(direction, conduit); - } - - private class ConduitMenuProvider implements MenuProvider { - - private final Direction direction; - private final Holder> conduit; - - private ConduitMenuProvider(Direction direction, Holder> conduit) { - this.direction = direction; - this.conduit = conduit; - } - - @Override - public Component getDisplayName() { - return getBlockState().getBlock().getName(); - } - - @Nullable - @Override - public AbstractContainerMenu createMenu(int pContainerId, Inventory pInventory, Player pPlayer) { - return new ConduitMenu(ConduitBundleBlockEntity.this, pInventory, pContainerId, direction, conduit); - } - } - - public static ICapabilityProvider createConduitCap( - BlockCapability cap) { - return (be, context) -> { - for (Holder> conduit : be.bundle.getConduits()) { - var proxiedCap = getProxiedCapability(cap, be, conduit, context); - if (proxiedCap != null) { - return proxiedCap; - } - } - - return null; - }; - } - - @Nullable - private static TCap getProxiedCapability(BlockCapability capability, - ConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { - - if (blockEntity.level == null) { - return null; - } - - ConduitGraphObject node = blockEntity.bundle.getNodeFor(conduit); - - // Node must be attached to its network - if (node.getNetwork() == null) { - return null; - } - - return conduit.value().proxyCapability(blockEntity.level, ConduitSavedData::isRedstoneActive, node, capability, context); - } - - public IItemHandler getConduitItemHandler() { - return conduitItemHandler; - } - - private class ConduitItemHandler implements IItemHandlerModifiable, INBTSerializable { - - @Override - public int getSlots() { - return 3 * ConduitBundle.MAX_CONDUITS * 6; - } - - @Override - public ItemStack getStackInSlot(int slot) { - if (slot >= getSlots()) { - return ItemStack.EMPTY; - } - - SlotData data = SlotData.of(slot); - if (data.conduitIndex() >= bundle.getConduits().size()) { - return ItemStack.EMPTY; - } - - ConnectionState connectionState = bundle.getConnectionState(data.direction(), data.conduitIndex()); - if (!(connectionState instanceof DynamicConnectionState dynamicConnectionState)) { - return ItemStack.EMPTY; - } - - Holder> conduit = bundle.getConduits().get(data.conduitIndex()); - ConduitMenuData conduitData = conduit.value().getMenuData(); - if ((data.slotType() == SlotType.FILTER_EXTRACT && conduitData.hasFilterExtract()) - || (data.slotType() == SlotType.FILTER_INSERT && conduitData.hasFilterInsert()) - || (data.slotType() == SlotType.UPGRADE_EXTRACT && conduitData.hasUpgrade())) { - return dynamicConnectionState.getItem(data.slotType()); - } - - return ItemStack.EMPTY; - } - - @Override - public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { - // see ItemStackHandler - if (stack.isEmpty()) { - return ItemStack.EMPTY; - } - - if (!isItemValid(slot, stack)) { - return stack; - } - - ItemStack existing = getStackInSlot(slot); - - int limit = Math.min(getSlotLimit(slot), stack.getMaxStackSize()); - - if (!existing.isEmpty()) { - if (!ItemStack.isSameItemSameComponents(stack, existing)) { - return stack; - } - - limit -= existing.getCount(); - } - - if (limit <= 0) { - return stack; - } - - boolean reachedLimit = stack.getCount() > limit; - - if (!simulate) { - if (existing.isEmpty()) { - setStackInSlot(slot, reachedLimit ? stack.copyWithCount(limit) : stack); - } else { - existing.grow(reachedLimit ? limit : stack.getCount()); - } - } - return reachedLimit ? stack.copyWithCount(stack.getCount() - limit) : ItemStack.EMPTY; - } - - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { - if (amount == 0) { - return ItemStack.EMPTY; - } - - ItemStack existing = getStackInSlot(slot); - - if (existing.isEmpty()) { - return ItemStack.EMPTY; - } - - int toExtract = Math.min(amount, existing.getMaxStackSize()); - - if (existing.getCount() <= toExtract) { - if (!simulate) { - setStackInSlot(slot, ItemStack.EMPTY); - return existing; - } else { - return existing.copy(); - } - } else { - if (!simulate) { - setStackInSlot(slot, existing.copyWithCount(existing.getCount() - toExtract)); - } - return existing.copyWithCount(toExtract); - } - } - - @Override - public int getSlotLimit(int slot) { - return 1; - } - - @Override - public boolean isItemValid(int slot, @NotNull ItemStack stack) { - if (slot >= getSlots()) { - return false; - } - - SlotData slotData = SlotData.of(slot); - if (slotData.conduitIndex() >= bundle.getConduits().size()) { - return false; - } - - Holder> conduit = bundle.getConduits().get(slotData.conduitIndex()); - - switch (slotData.slotType()) { - case FILTER_EXTRACT: - case FILTER_INSERT: - ResourceFilter resourceFilter = stack.getCapability(EIOCapabilities.Filter.ITEM); - if (resourceFilter == null) { - return false; - } - - return conduit.value().canApplyFilter(slotData.slotType(), resourceFilter); - case UPGRADE_EXTRACT: - // Upgrades have been removed - default: - return false; - } - } - - @Override - public void setStackInSlot(int slot, @NotNull ItemStack stack) { - if (slot >= getSlots()) { - return; - } - - SlotData data = SlotData.of(slot); - if (data.conduitIndex() >= bundle.getConduits().size()) { - return; - } - - Holder> conduit = bundle.getConduits().get(data.conduitIndex()); - ConduitMenuData menuData = conduit.value().getMenuData(); - - if ((data.slotType() == SlotType.FILTER_EXTRACT && menuData.hasFilterExtract()) - || (data.slotType() == SlotType.FILTER_INSERT && menuData.hasFilterInsert()) - || (data.slotType() == SlotType.UPGRADE_EXTRACT && menuData.hasUpgrade())) { - bundle.setConnectionItem(data.direction(), data.conduitIndex(), data.slotType(), stack); - if (bundle.getConnectionState(data.direction(), - conduit) instanceof DynamicConnectionState dynamicConnectionState) { - ConduitGraphObject node = bundle.getNodeForTypeExact(conduit); - if (node != null) { -// node.pushState(data.direction(), dynamicConnectionState); - } - } - } - } - - @Override - public CompoundTag serializeNBT(HolderLookup.Provider lookupProvider) { - CompoundTag tag = new CompoundTag(); - ListTag list = new ListTag(); - for (int i = 0; i < getSlots(); i++) { - ItemStack stack = getStackInSlot(i); - list.add(i, stack.saveOptional(lookupProvider)); - } - tag.put(CONDUIT_INV_KEY, list); - return tag; - } - - @Override - public void deserializeNBT(HolderLookup.Provider lookupProvider, CompoundTag nbt) { - ListTag list = nbt.getList(CONDUIT_INV_KEY, Tag.TAG_COMPOUND); - for (int i = 0; i < list.size(); i++) { - setStackInSlot(i, ItemStack.parseOptional(lookupProvider, list.getCompound(i))); - } - } - } - - public enum UpdateState { - NONE, NEXT_NEXT, NEXT, INITIALIZED; - - public boolean isInitialized() { - return this == INITIALIZED; - } - - public UpdateState next() { - return switch (this) { - case NONE, INITIALIZED -> NONE; - case NEXT_NEXT -> NEXT; - case NEXT -> INITIALIZED; - }; - } - - public UpdateState activate() { - return NEXT_NEXT; - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/package-info.java deleted file mode 100644 index 392d8ccb0b..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/block/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault - -package com.enderio.conduits.common.conduit.block; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java index 9b8b27b541..6b1fd6965f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java @@ -2,14 +2,20 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitCapabilities; +import com.enderio.conduits.api.connection.ConnectionStatus; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; import com.enderio.conduits.client.particle.ConduitBreakParticle; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.api.bundle.AddConduitResult; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitComponents; import java.util.Optional; +import com.enderio.conduits.common.init.ConduitTypes; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -91,6 +97,7 @@ public NewConduitBundleBlock(Properties properties) { @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + // TODO: Revert these changes for showing individual parts here. do it in ConduitHighlightEvent! if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { if (conduit.hasFacade() && FacadeHelper.areFacadesVisible()) { return Shapes.block(); @@ -234,11 +241,14 @@ protected void neighborChanged(BlockState state, Level level, BlockPos pos, Bloc BlockPos neighborPos, boolean movedByPiston) { if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { + conduit.updateNeighborRedstone(); conduit.updateConnections(level, pos, neighborPos, true); - } - // Invalidate caps in case of redstone update or something else. - level.invalidateCapabilities(pos); + // Invalidate caps in case of redstone update or something else. + level.invalidateCapabilities(pos); + + // TODO: If redstone conduit, trigger a neighbour update for connections. + } super.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston); } @@ -400,17 +410,20 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP // TODO: The connection shouldn't include the plate.. if we hit the plate open the first conduit? var conduitConnection = conduitBundle.getShape().getConnectionFromHit(pos, hitResult); - if (conduitConnection != null && conduitBundle.isEndpoint(conduitConnection.getFirst())) { - if (player instanceof ServerPlayer serverPlayer) { - serverPlayer.openMenu(conduitBundle.getMenuProvider(conduitConnection.getFirst(), conduitConnection.getSecond()), - buf -> { - buf.writeBlockPos(pos); - buf.writeEnum(conduitConnection.getFirst()); - Conduit.STREAM_CODEC.encode(buf, conduitConnection.getSecond()); - }); - } + if (conduitConnection != null) { + if (conduitBundle.getConnectionStatus(conduitConnection.getFirst(), conduitConnection.getSecond()) == ConnectionStatus.CONNECTED_BLOCK) { + if (player instanceof ServerPlayer serverPlayer) { + serverPlayer.openMenu(conduitBundle.getMenuProvider(conduitConnection.getFirst(), conduitConnection.getSecond()), + buf -> { + buf.writeBlockPos(pos); + buf.writeEnum(conduitConnection.getFirst()); + Conduit.STREAM_CODEC.encode(buf, conduitConnection.getSecond()); + ConnectionConfig.STREAM_CODEC.encode(buf, conduitBundle.getConnectionConfig(conduitConnection.getFirst(), conduitConnection.getSecond())); + }); + } - return InteractionResult.sidedSuccess(level.isClientSide()); + return InteractionResult.sidedSuccess(level.isClientSide()); + } } } @@ -535,20 +548,83 @@ public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos } if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { - // TODO + // Get the redstone conduit + var redstoneConduit = conduitBundle.getConduitByType(ConduitTypes.REDSTONE.get()); + if (redstoneConduit == null) { + return false; + } + + var status = conduitBundle.getConnectionStatus(direction, redstoneConduit); + if (status != ConnectionStatus.CONNECTED_BLOCK) { + return false; + } + + if (!(conduitBundle.getConnectionConfig(direction, redstoneConduit) instanceof RedstoneConduitConnectionConfig config)) { + return false; + } + + return config.canInsert(); } - return super.canConnectRedstone(state, level, pos, direction); + return false; } @Override protected int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { - return super.getSignal(state, level, pos, direction); + return getNetworkSignal(level, pos, direction, false); } @Override protected int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { - return super.getDirectSignal(state, level, pos, direction); + return getNetworkSignal(level, pos, direction, true); + } + + private int getNetworkSignal(BlockGetter level, BlockPos pos, Direction direction, boolean isDirectSignal) { + if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + // TODO: Do we need to have signals on client side? If so we need to put this into the client NBT. + if (conduitBundle.getLevel().isClientSide()) { + return 0; + } + + // Get the redstone conduit + var redstoneConduit = conduitBundle.getConduitByType(ConduitTypes.REDSTONE.get()); + if (redstoneConduit == null) { + return 0; + } + + var status = conduitBundle.getConnectionStatus(direction.getOpposite(), redstoneConduit); + if (status != ConnectionStatus.CONNECTED_BLOCK) { + return 0; + } + + if (!(conduitBundle.getConnectionConfig(direction.getOpposite(), redstoneConduit) instanceof RedstoneConduitConnectionConfig config)) { + return 0; + } + + if (!config.canInsert()) { + return 0; + } + + // TODO: Check for strong signal in config. + if (isDirectSignal) { + return 0; + } + + var node = conduitBundle.getConduitNode(redstoneConduit); + var network = node.getNetwork(); + if (network == null) { + return 0; + } + + var context = network.getContext(RedstoneConduitNetworkContext.TYPE); + if (context == null) { + return 0; + } + + return context.getSignal(config.insertChannel()); + } + + return 0; } // endregion diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java index 4e71306ad1..0f8f3db259 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java @@ -1,8 +1,10 @@ package com.enderio.conduits.common.conduit.bundle; +import com.enderio.base.common.blockentity.Wrenchable; import com.enderio.conduits.ConduitNBTKeys; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitCapabilities; +import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.bundle.ConduitInventory; import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.bundle.ConduitBundleAccessor; @@ -15,7 +17,6 @@ import com.enderio.conduits.common.conduit.ConduitSavedData; import com.enderio.conduits.common.conduit.ConduitSorter; import com.enderio.conduits.api.bundle.AddConduitResult; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; import com.enderio.conduits.common.conduit.connection.ConnectionState; import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; @@ -26,6 +27,7 @@ import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; import com.enderio.conduits.common.conduit.menu.NewConduitMenu; import com.enderio.conduits.common.init.ConduitBlockEntities; +import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.blockentity.EnderBlockEntity; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -59,12 +61,16 @@ import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Clearable; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -74,10 +80,9 @@ import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.ICapabilityProvider; import net.neoforged.neoforge.client.model.data.ModelData; -import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.Nullable; -public final class NewConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor, Clearable { +public final class NewConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor, Clearable, Wrenchable, NewConduitMenu.ConnectionAccessor { public static final int MAX_CONDUITS = 9; @@ -105,7 +110,7 @@ public final class NewConduitBundleBlockEntity extends EnderBlockEntity implemen private boolean hasDirtyNodes = false; // Deferred connection check - private ConduitBundleBlockEntity.UpdateState checkConnection = ConduitBundleBlockEntity.UpdateState.NONE; + private UpdateState checkConnection = UpdateState.NONE; public NewConduitBundleBlockEntity(BlockPos worldPosition, BlockState blockState) { super(ConduitBlockEntities.CONDUIT.get(), worldPosition, blockState); @@ -128,7 +133,7 @@ public void serverTick() { updateConnections(level, getBlockPos(), null, false); } - if (this.level.getGameTime() % 5 == 0) { +// if (this.level.getGameTime() % 5 == 0) { if (hasDirtyNodes) { // This is for sending updates to clients when the nodes are dirty // as such we only fire a block update @@ -137,7 +142,7 @@ public void serverTick() { setChanged(); hasDirtyNodes = false; } - } +// } } } @@ -146,6 +151,7 @@ public void onLoad() { super.onLoad(); updateShape(); + updateNeighborRedstone(); if (level instanceof ServerLevel serverLevel) { // Fire on-created events @@ -216,8 +222,6 @@ public ModelData getModelData() { // region Menu - // TODO - public boolean canBeOrIsConnection(Direction side, Holder> conduit) { if (level == null) { return false; @@ -242,6 +246,74 @@ public MenuProvider getMenuProvider(Direction side, Holder> condui return new ConduitMenuProvider(side, conduit); } + @Override + public ItemInteractionResult onWrenched(UseOnContext context) { + if (level == null) { + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } + + // Get hit conduit + var side = context.getClickedFace(); + var conduit = shape.getConduit(context.getClickedPos(), context.getHitResult()); + if (conduit == null) { + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } + + var player = context.getPlayer(); + if (player != null && player.isSteppingCarefully()) { + removeConduit(conduit, player); + if (isEmpty()) { + level.setBlock(getBlockPos(), getBlockState().getFluidState().createLegacyBlock(), + level.isClientSide ? Block.UPDATE_ALL_IMMEDIATE : Block.UPDATE_ALL); + } + + return ItemInteractionResult.sidedSuccess(level.isClientSide()); + } + + // Get connection + var conduitConnection = shape.getConnectionFromHit(context.getClickedPos(), context.getHitResult()); + if (conduitConnection != null) { + + // Disable the connection + setConnectionStatus(conduitConnection.getFirst(), conduitConnection.getSecond(), ConnectionStatus.DISABLED); + onConnectionsUpdated(conduitConnection.getSecond()); + + // If we were connected to another bundle, we need to sever the graph + if (level.getBlockEntity(getBlockPos().relative(conduitConnection.getFirst())) instanceof NewConduitBundleBlockEntity neighborBundle) { + neighborBundle.setConnectionStatus(conduitConnection.getFirst().getOpposite(), conduitConnection.getSecond(), ConnectionStatus.DISABLED); + neighborBundle.onConnectionsUpdated(conduitConnection.getSecond()); + + if (level instanceof ServerLevel serverLevel) { + ConduitGraphObject thisNode = getConduitNode(conduitConnection.getSecond()); + ConduitGraphObject otherNode = neighborBundle.getConduitNode(conduitConnection.getSecond()); + + if (thisNode.getGraph() != null && otherNode.getGraph() != null) { + if (thisNode.getGraph() == otherNode.getGraph()) { + thisNode.getGraph().removeSingleEdge(thisNode, otherNode); + thisNode.getGraph().removeSingleEdge(otherNode, thisNode); + } + + ConduitSavedData.addPotentialGraph(conduitConnection.getSecond(), thisNode.getGraph(), serverLevel); + ConduitSavedData.addPotentialGraph(conduitConnection.getSecond(), otherNode.getGraph(), serverLevel); + } else { + // TODO: Warn, this is a bad place to be. + } + } + } + + return ItemInteractionResult.sidedSuccess(level.isClientSide()); + } + + // Attempt to make a new forced connection + var status = getConnectionStatus(side, conduit); + if (!status.isConnected()) { + tryConnectTo(side, conduit, true); + return ItemInteractionResult.sidedSuccess(level.isClientSide()); + } + + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } + private class ConduitMenuProvider implements MenuProvider { private final Direction side; @@ -265,6 +337,49 @@ public Component getDisplayName() { // endregion + // region Redstone Cache + + private boolean hasRedstoneSignal; + + public void updateNeighborRedstone() { + if (level == null) { + hasRedstoneSignal = false; + } else { + hasRedstoneSignal = level.hasNeighborSignal(getBlockPos()); + } + } + + private boolean hasRedstoneSignal(@Nullable DyeColor signalColor) { + if (hasRedstoneSignal) { + return true; + } + + // If we have no signal color, do not attempt to query a redstone conduit + if (signalColor == null) { + return false; + } + + var redstoneConduit = getConduitByType(ConduitTypes.REDSTONE.get()); + if (redstoneConduit == null) { + return false; + } + + var conduitNode = getConduitNode(redstoneConduit); + var network = conduitNode.getNetwork(); + if (network == null) { + return false; + } + + var context = network.getContext(ConduitTypes.ContextTypes.REDSTONE.get()); + if (context == null) { + return false; + } + + return context.isActive(signalColor); + } + + // endregion + // region Capability Proxies public static ICapabilityProvider createCapabilityProvider( @@ -310,6 +425,11 @@ public boolean hasConduitByType(Holder> conduit) { return conduits.stream().anyMatch(c -> c.value().canConnectToConduit(conduit)); } + @Nullable + public Holder> getConduitByType(ConduitType conduitType) { + return conduits.stream().filter(c -> c.value().type() == conduitType).findFirst().orElse(null); + } + @Override public boolean hasConduitStrict(Holder> conduit) { return conduits.contains(conduit); @@ -362,6 +482,11 @@ public boolean canAddConduit(Holder> conduit) { return true; } + // If there are no replacement opportunities, we cannot have a conduit of this type. + if (hasConduitByType(conduit)) { + return false; + } + return isConduitCompatibleWithExisting(conduit); } @@ -409,6 +534,11 @@ public AddConduitResult addConduit(Holder> conduit, @Nullable Play result = new AddConduitResult.Upgrade(replacementCandidate.get()); } else { + // If there are no replacement opportunities, we cannot have a conduit of this type. + if (hasConduitByType(conduit)) { + return new AddConduitResult.Blocked(); + } + // Ensure there are no incompatible conduits. if (!isConduitCompatibleWithExisting(conduit)) { return new AddConduitResult.Blocked(); @@ -529,22 +659,27 @@ public void removeConduit(Holder> conduit, @Nullable Player player */ public void removeNeighborConnections(Holder> conduit) { for (Direction dir : Direction.values()) { - if (level.getBlockEntity( - getBlockPos().relative(dir)) instanceof NewConduitBundleBlockEntity neighborBlockEntity) { - neighborBlockEntity.disconnect(dir.getOpposite(), conduit); - } + removeNeighborConnection(dir, conduit); } + } + + private void removeNeighborConnection(Direction side, Holder> conduit) { + if (level == null) { + return; + } + + if (!(level.getBlockEntity(getBlockPos().relative(side)) instanceof NewConduitBundleBlockEntity neighborBundle)) { + return; + } + + neighborBundle.disconnect(side.getOpposite(), conduit); if (level instanceof ServerLevel serverLevel) { - for (Direction dir : Direction.values()) { - BlockEntity blockEntity = level.getBlockEntity(getBlockPos().relative(dir)); - if (blockEntity instanceof NewConduitBundleBlockEntity neighborBlockEntity - && neighborBlockEntity.hasConduitByType(conduit)) { - Optional.of(neighborBlockEntity.getConduitNode(conduit)) - .map(ConduitGraphObject::getGraph) - .filter(Objects::nonNull) - .ifPresent(graph -> ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel)); - } + if (neighborBundle.hasConduitByType(conduit)) { + Optional.of(neighborBundle.getConduitNode(conduit)) + .map(ConduitGraphObject::getGraph) + .filter(Objects::nonNull) + .ifPresent(graph -> ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel)); } } } @@ -630,8 +765,6 @@ public void setConnectionConfig(Direction side, Holder> conduit, C bundleChanged(); } - // Intended for use by the menu, might need a better interface? - @EnsureSide(EnsureSide.Side.SERVER) public void setConnectionStatus(Direction side, Holder> conduit, ConnectionStatus status) { if (!hasConduitStrict(conduit)) { throw new IllegalArgumentException("Conduit is not present in this bundle."); @@ -1313,7 +1446,7 @@ public ConnectionConfig getConnectionConfig(Direction side) { @Override public void setConnectionConfig(Direction side, ConnectionConfig connectionConfig) { - throw new NotImplementedException(); + conduitBundle.setConnectionConfig(side, conduit, connectionConfig); } @Override @@ -1330,6 +1463,31 @@ public void onNodeDirty() { public boolean isLoaded() { return conduitBundle.level != null && conduitBundle.level.isLoaded(pos()) && conduitBundle.level.shouldTickBlocksAt(pos()); } + + @Override + public boolean hasRedstoneSignal(@Nullable DyeColor signalColor) { + return conduitBundle.hasRedstoneSignal(signalColor); + } + } + + public enum UpdateState { + NONE, NEXT_NEXT, NEXT, INITIALIZED; + + public boolean isInitialized() { + return this == INITIALIZED; + } + + public UpdateState next() { + return switch (this) { + case NONE, INITIALIZED -> NONE; + case NEXT_NEXT -> NEXT; + case NEXT -> INITIALIZED; + }; + } + + public UpdateState activate() { + return NEXT_NEXT; + } } // Matches the same data format as the original conduit bundle. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java index baff96a53c..a69ad08ca8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java @@ -116,14 +116,13 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder>, List> offsets = new HashMap<>(); for (Direction direction : Direction.values()) { - // Only create and save connection shape if it's a block connection, as that's what the lookup is for. - VoxelShape conduitConnectionShape = null; + VoxelShape conduitConnectionShape = Shapes.empty(); // TODO: Lift the connector plate out of updateShapeForConduit? if (conduitBundle.getConnectionStatus(direction, conduit) == ConnectionStatus.CONNECTED_BLOCK) { VoxelShape connectorShape = rotateVoxelShape(CONNECTOR, direction); conduitShape = Shapes.joinUnoptimized(conduitShape, connectorShape, BooleanOp.OR); - conduitConnectionShape = connectorShape; + conduitConnectionShape = Shapes.joinUnoptimized(connectorShape, connectorShape, BooleanOp.OR); individualShapeList.add(connectorShape); } @@ -137,16 +136,12 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder(direction, conduit), conduitConnectionShape); - } + conduitConnections.put(new Pair<>(direction, conduit), conduitConnectionShape.optimize()); } var allConduits = conduitBundle.getConduits(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitConnectionHost.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitConnectionHost.java index 511ad073f7..092ee496e7 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitConnectionHost.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitConnectionHost.java @@ -6,6 +6,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.Nullable; // TODO: Did the interface for now but honestly maybe this should just be an object because its not API public. public interface ConduitConnectionHost { @@ -17,4 +19,6 @@ public interface ConduitConnectionHost { ConduitInventory inventory(); void onNodeDirty(); boolean isLoaded(); + + boolean hasRedstoneSignal(@Nullable DyeColor signalColor); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java index ddd65a55bc..092e3e8ddd 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java @@ -1,9 +1,11 @@ package com.enderio.conduits.common.conduit.graph; import com.enderio.base.api.filter.ResourceFilter; +import com.enderio.base.api.misc.RedstoneControl; import com.enderio.base.common.init.EIOCapabilities; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.enderio.conduits.api.network.node.NodeData; import com.enderio.conduits.api.network.node.NodeDataType; import com.enderio.conduits.api.network.ConduitNetwork; @@ -20,6 +22,7 @@ import net.minecraft.core.HolderLookup; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; +import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.Nullable; public class ConduitGraphObject implements GraphObject, ConduitNode { @@ -251,6 +254,15 @@ public boolean isLoaded() { return connectionHost.isLoaded(); } + @Override + public boolean hasRedstoneSignal(@Nullable DyeColor signalColor) { + if (!isLoaded()) { + throw new IllegalStateException("Unable to query redstone signals when the node is not loaded."); + } + + return connectionHost.hasRedstoneSignal(signalColor); + } + @Override public void markDirty() { if (connectionHost != null) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java index 54d11f554b..d4e27de59f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java @@ -1,23 +1,33 @@ package com.enderio.conduits.common.conduit.menu; +import com.enderio.base.api.UseOnly; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitMenus; +import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; import com.enderio.core.common.menu.BaseBlockEntityMenu; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.neoforged.fml.LogicalSide; +import net.neoforged.neoforge.network.PacketDistributor; +// TODO: Make this not connect to the block entity at all, that way when the screen desyncs, the client world isn't desynced too. +// This means server menu should get/set connections direct from the BE but the client should have a standalone config store. +// Need to work out what this means for the client sync tag - it might need to be synced separately to the client from this GUI too. +// Possibly create an NBT sync slot and then use it for that? public class NewConduitMenu extends BaseBlockEntityMenu { public static final int BUTTON_TOGGLE_0_ID = 0; @@ -30,11 +40,18 @@ public class NewConduitMenu extends BaseBlockEntityMenu> selectedConduit; // TODO: Sync with sync slot instead of using initial menu open? + private final ConnectionAccessor connectionAccessor; + + @UseOnly(LogicalSide.SERVER) + private ConnectionConfig remoteConnectionConfig; + public NewConduitMenu(int containerId, Inventory playerInventory, NewConduitBundleBlockEntity blockEntity, Direction side, Holder> selectedConduit) { super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory, blockEntity); this.side = side; this.selectedConduit = selectedConduit; + this.connectionAccessor = blockEntity; + this.remoteConnectionConfig = connectionAccessor.getConnectionConfig(side, selectedConduit); // TODO: Add conduit slots. @@ -46,6 +63,7 @@ public NewConduitMenu(int containerId, Inventory playerInventory, RegistryFriend side = buf.readEnum(Direction.class); selectedConduit = Conduit.STREAM_CODEC.decode(buf); + this.connectionAccessor = new ClientConnectionAccessor(ConnectionConfig.STREAM_CODEC.decode(buf)); // TODO: Add conduit slots. @@ -60,20 +78,16 @@ public Direction getSide() { return selectedConduit; } - private ConduitNode conduitNode() { - return getBlockEntity().getConduitNode(selectedConduit); - } - public ConnectionConfigType connectionConfigType() { return selectedConduit.value().connectionConfigType(); } public ConnectionConfig connectionConfig() { - return getBlockEntity().getConnectionConfig(side, selectedConduit); + return connectionAccessor.getConnectionConfig(side, selectedConduit); } public T connectionConfig(ConnectionConfigType type) { - var config = getBlockEntity().getConnectionConfig(side, selectedConduit); + var config = connectionConfig(); if (config.type() == type) { //noinspection unchecked return (T) config; @@ -82,19 +96,29 @@ public T connectionConfig(ConnectionConfigType t throw new IllegalStateException("Connection config type mismatch"); } + public void setConnectionConfig(ConnectionConfig config) { + connectionAccessor.setConnectionConfig(side, selectedConduit, config); + + // TODO. +// if (newConfig.isConnected()) { +// bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.CONNECTED_BLOCK); +// } else { +// bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.DISABLED); +// } + } + public boolean isConnected() { return getBlockEntity().getConnectionStatus(side, selectedConduit) == ConnectionStatus.CONNECTED_BLOCK; } public CompoundTag getClientDataTag() { + // TODO: Sync in this menu too return getBlockEntity().getConduitClientDataTag(selectedConduit); } @Override public boolean stillValid(Player player) { - // TODO: canBeOrIsValidConnection. - return super.stillValid(player) && getBlockEntity().hasConduitStrict(selectedConduit) && - getBlockEntity().canBeOrIsConnection(side, selectedConduit); + return super.stillValid(player) && connectionAccessor.canBeOrIsConnection(side, selectedConduit); } @Override @@ -154,8 +178,53 @@ public boolean clickMenuButton(Player player, int id) { return super.clickMenuButton(player, id); } + // TODO @Override public ItemStack quickMoveStack(Player player, int i) { - return null; + return ItemStack.EMPTY; + } + + @Override + public void broadcastChanges() { + super.broadcastChanges(); + + if (getPlayerInventory().player instanceof ServerPlayer serverPlayer) { + if (!connectionConfig().equals(remoteConnectionConfig)) { + PacketDistributor.sendToPlayer(serverPlayer, new SetConduitConnectionConfigPacket(containerId, connectionConfig())); + this.remoteConnectionConfig = connectionConfig(); + } + } + } + + public interface ConnectionAccessor { + // TODO: Conduit menu list. + + ConnectionConfig getConnectionConfig(Direction side, Holder> conduit); + void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config); + boolean canBeOrIsConnection(Direction side, Holder> conduit); + } + + private static class ClientConnectionAccessor implements ConnectionAccessor { + + private ConnectionConfig connectionConfig; + + public ClientConnectionAccessor(ConnectionConfig connectionConfig) { + this.connectionConfig = connectionConfig; + } + + @Override + public ConnectionConfig getConnectionConfig(Direction side, Holder> conduit) { + return connectionConfig; + } + + @Override + public void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config) { + connectionConfig = config; + } + + @Override + public boolean canBeOrIsConnection(Direction side, Holder> conduit) { + return true; + } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index f8f63e1503..54f84a4a97 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -4,6 +4,7 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; +import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitType; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java index b8b0e0fd6d..cca3d30a06 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java @@ -8,6 +8,9 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; public record EnergyConduitConnectionConfig( @@ -28,8 +31,20 @@ public record EnergyConduitConnectionConfig( ).apply(instance, EnergyConduitConnectionConfig::new) ); + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.BOOL, + EnergyConduitConnectionConfig::canInsert, + ByteBufCodecs.BOOL, + EnergyConduitConnectionConfig::canExtract, + RedstoneControl.STREAM_CODEC, + EnergyConduitConnectionConfig::redstoneControl, + DyeColor.STREAM_CODEC, + EnergyConduitConnectionConfig::redstoneChannel, + EnergyConduitConnectionConfig::new + ); + public static final ConnectionConfigType TYPE = - new ConnectionConfigType<>(EnergyConduitConnectionConfig.class, CODEC, () -> DEFAULT); + new ConnectionConfigType<>(EnergyConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index 1a407a1431..9af7318a59 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -5,6 +5,7 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; +import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.menu.ConduitMenuExtension; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java index 2c024f6844..5c55c46924 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java @@ -10,6 +10,9 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; public record FluidConduitConnectionConfig( @@ -35,8 +38,24 @@ public record FluidConduitConnectionConfig( ).apply(instance, FluidConduitConnectionConfig::new) ); + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.BOOL, + FluidConduitConnectionConfig::canInsert, + DyeColor.STREAM_CODEC, + FluidConduitConnectionConfig::insertChannel, + ByteBufCodecs.BOOL, + FluidConduitConnectionConfig::canExtract, + DyeColor.STREAM_CODEC, + FluidConduitConnectionConfig::extractChannel, + RedstoneControl.STREAM_CODEC, + FluidConduitConnectionConfig::redstoneControl, + DyeColor.STREAM_CODEC, + FluidConduitConnectionConfig::redstoneChannel, + FluidConduitConnectionConfig::new + ); + public static ConnectionConfigType TYPE = new ConnectionConfigType<>( - FluidConduitConnectionConfig.class, CODEC, () -> DEFAULT); + FluidConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java index 1c073681e4..082d6cab4e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java @@ -6,6 +6,7 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitType; +import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; @@ -129,8 +130,8 @@ public void copyLegacyData(ConduitNode node, ConduitDataAccessor legacyDataAcces var currentConfig = node.getConnectionConfig(side, ItemConduitConnectionConfig.TYPE); node.setConnectionConfig(side, currentConfig - .withRoundRobin(oldSideConfig.isRoundRobin) - .withSelfFeed(oldSideConfig.isSelfFeed) + .withIsRoundRobin(oldSideConfig.isRoundRobin) + .withIsSelfFeed(oldSideConfig.isSelfFeed) .withPriority(oldSideConfig.priority)); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java index f1072fc32d..c277364731 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java @@ -1,94 +1,135 @@ package com.enderio.conduits.common.conduit.type.item; import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.base.api.network.MassiveStreamCodec; +import com.enderio.conduits.api.ConduitRedstoneSignalAware; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; +import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; -import com.enderio.conduits.common.init.ConduitTypes; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; public record ItemConduitConnectionConfig( - boolean canInsert, - DyeColor insertChannel, - boolean canExtract, - DyeColor extractChannel, - RedstoneControl redstoneControl, - DyeColor redstoneChannel, + boolean isSend, + DyeColor sendColor, + boolean isReceive, + DyeColor receiveColor, + RedstoneControl receiveRedstoneControl, + DyeColor receiveRedstoneChannel, boolean isRoundRobin, boolean isSelfFeed, int priority -) implements ChanneledIOConnectionConfig, RedstoneControlledConnection { +) implements NewIOConnectionConfig { public static ItemConduitConnectionConfig DEFAULT = new ItemConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); public static MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( - Codec.BOOL.fieldOf("can_insert").forGetter(ItemConduitConnectionConfig::canInsert), - DyeColor.CODEC.fieldOf("insert_channel").forGetter(ItemConduitConnectionConfig::insertChannel), - Codec.BOOL.fieldOf("can_extract").forGetter(ItemConduitConnectionConfig::canExtract), - DyeColor.CODEC.fieldOf("extract_channel").forGetter(ItemConduitConnectionConfig::extractChannel), - RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(ItemConduitConnectionConfig::redstoneControl), - DyeColor.CODEC.fieldOf("redstone_channel").forGetter(ItemConduitConnectionConfig::redstoneChannel), + Codec.BOOL.fieldOf("is_send").forGetter(ItemConduitConnectionConfig::isSend), + DyeColor.CODEC.fieldOf("send_color").forGetter(ItemConduitConnectionConfig::sendColor), + Codec.BOOL.fieldOf("is_receive").forGetter(ItemConduitConnectionConfig::isReceive), + DyeColor.CODEC.fieldOf("receive_color").forGetter(ItemConduitConnectionConfig::receiveColor), + RedstoneControl.CODEC.fieldOf("receive_redstone_control").forGetter(ItemConduitConnectionConfig::receiveRedstoneControl), + DyeColor.CODEC.fieldOf("receive_redstone_channel").forGetter(ItemConduitConnectionConfig::receiveRedstoneChannel), Codec.BOOL.fieldOf("is_round_robin").forGetter(ItemConduitConnectionConfig::isRoundRobin), Codec.BOOL.fieldOf("is_self_feed").forGetter(ItemConduitConnectionConfig::isSelfFeed), Codec.INT.fieldOf("priority").forGetter(ItemConduitConnectionConfig::priority) ).apply(instance, ItemConduitConnectionConfig::new) ); - public static ConnectionConfigType TYPE = new ConnectionConfigType<>(ItemConduitConnectionConfig.class, CODEC, () -> DEFAULT); + public static StreamCodec STREAM_CODEC = MassiveStreamCodec.composite( + ByteBufCodecs.BOOL, + ItemConduitConnectionConfig::isSend, + DyeColor.STREAM_CODEC, + ItemConduitConnectionConfig::sendColor, + ByteBufCodecs.BOOL, + ItemConduitConnectionConfig::isReceive, + DyeColor.STREAM_CODEC, + ItemConduitConnectionConfig::receiveColor, + RedstoneControl.STREAM_CODEC, + ItemConduitConnectionConfig::receiveRedstoneControl, + DyeColor.STREAM_CODEC, + ItemConduitConnectionConfig::receiveRedstoneChannel, + ByteBufCodecs.BOOL, + ItemConduitConnectionConfig::isRoundRobin, + ByteBufCodecs.BOOL, + ItemConduitConnectionConfig::isSelfFeed, + ByteBufCodecs.INT, + ItemConduitConnectionConfig::priority, + ItemConduitConnectionConfig::new + ); + + public static ConnectionConfigType TYPE = + new ConnectionConfigType<>(ItemConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override - public ConnectionConfig reconnected() { - return new ItemConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.insertChannel, DEFAULT.canExtract, DEFAULT.extractChannel, redstoneControl, - redstoneChannel, isRoundRobin, isSelfFeed, priority); + public boolean canSend(ConduitRedstoneSignalAware signalAware) { + // TODO: sendRedstoneControl + return isSend(); } @Override - public IOConnectionConfig withInsert(boolean canInsert) { - return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + public boolean canReceive(ConduitRedstoneSignalAware signalAware) { + if (!isReceive()) { + return false; + } + + if (receiveRedstoneControl.isRedstoneSensitive()) { + return receiveRedstoneControl.isActive(signalAware.hasRedstoneSignal(receiveRedstoneChannel)); + } else { + return true; + } } @Override - public IOConnectionConfig withExtract(boolean canExtract) { - return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + public ConnectionConfig reconnected() { + return new ItemConduitConnectionConfig(DEFAULT.isSend, DEFAULT.sendColor, DEFAULT.isReceive, DEFAULT.receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } - @Override - public ItemConduitConnectionConfig withInputChannel(DyeColor inputChannel) { - return new ItemConduitConnectionConfig(canInsert, inputChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + // Generate with methods for each field + public ItemConduitConnectionConfig withIsSend(boolean isSend) { + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } - @Override - public ItemConduitConnectionConfig withOutputChannel(DyeColor outputChannel) { - return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, outputChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + public ItemConduitConnectionConfig withSendColor(DyeColor sendColor) { + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } - @Override - public ItemConduitConnectionConfig withRedstoneControl(RedstoneControl redstoneControl) { - return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + public ItemConduitConnectionConfig withIsReceive(boolean isReceive) { + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } - @Override - public RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel) { - return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + public ItemConduitConnectionConfig withReceiveColor(DyeColor receiveColor) { + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + public ItemConduitConnectionConfig withReceiveRedstoneControl(RedstoneControl receiveRedstoneControl) { + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + public ItemConduitConnectionConfig withReceiveRedstoneChannel(DyeColor receiveRedstoneChannel) { + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } - public ItemConduitConnectionConfig withRoundRobin(boolean isRoundRobin) { - return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + public ItemConduitConnectionConfig withIsRoundRobin(boolean isRoundRobin) { + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } - public ItemConduitConnectionConfig withSelfFeed(boolean isSelfFeed) { - return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + public ItemConduitConnectionConfig withIsSelfFeed(boolean isSelfFeed) { + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } public ItemConduitConnectionConfig withPriority(int priority) { - return new ItemConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java index 22486a43eb..72f1a33cb3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java @@ -5,8 +5,11 @@ import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.ChannelIOAwareConduitTicker; +import com.enderio.conduits.api.ticker.NewIOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitTypes; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import net.minecraft.core.Direction; @@ -19,7 +22,7 @@ import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.Nullable; -public class ItemConduitTicker extends ChannelIOAwareConduitTicker { +public class ItemConduitTicker extends NewIOAwareConduitTicker { @Override protected void tickColoredGraph(ServerLevel level, ItemConduit conduit, List inserts, List extracts, DyeColor color, @@ -100,22 +103,27 @@ private boolean isEmpty(IItemHandler itemHandler, int afterIndex) { return true; } + @Override + protected void preProcessReceivers(List receivers) { + receivers.sort(Comparator.comparingInt((Connection n) -> n.config().priority()).reversed()); + } + @Override @Nullable protected Connection createConnection(Level level, ConduitNode node, Direction side) { IItemHandler itemHandler = level.getCapability(Capabilities.ItemHandler.BLOCK, node.getPos().relative(side), side.getOpposite()); if (itemHandler != null) { - return new Connection(node, side, itemHandler); + return new Connection(node, side, node.getConnectionConfig(side, ItemConduitConnectionConfig.TYPE), itemHandler); } return null; } - protected static class Connection extends SimpleConnection { + protected static class Connection extends SimpleConnection { private final IItemHandler itemHandler; - public Connection(ConduitNode node, Direction side, IItemHandler itemHandler) { - super(node, side); + public Connection(ConduitNode node, Direction side, ItemConduitConnectionConfig config, IItemHandler itemHandler) { + super(node, side, config); this.itemHandler = itemHandler; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java index 83abeae697..6c69d83ac2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java @@ -3,6 +3,7 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.menu.ConduitMenuExtension; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java index d1ee3d15c4..f1efb854ba 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java @@ -1,14 +1,15 @@ package com.enderio.conduits.common.conduit.type.redstone; -import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; public record RedstoneConduitConnectionConfig( @@ -29,8 +30,20 @@ public record RedstoneConduitConnectionConfig( ).apply(instance, RedstoneConduitConnectionConfig::new) ); + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.BOOL, + RedstoneConduitConnectionConfig::canInsert, + DyeColor.STREAM_CODEC, + RedstoneConduitConnectionConfig::insertChannel, + ByteBufCodecs.BOOL, + RedstoneConduitConnectionConfig::canExtract, + DyeColor.STREAM_CODEC, + RedstoneConduitConnectionConfig::extractChannel, + RedstoneConduitConnectionConfig::new + ); + public static ConnectionConfigType TYPE = new ConnectionConfigType<>( - RedstoneConduitConnectionConfig.class, CODEC, () -> DEFAULT); + RedstoneConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java index 02968e0704..c5296a3e7f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java @@ -49,14 +49,14 @@ public void setSignal(DyeColor color, int signal) { @Override public RedstoneConduitNetworkContext mergeWith(RedstoneConduitNetworkContext other) { - // Merge the two maps - return null; + // Ticker will be responsible for updating it. + return copy(); } @Override public RedstoneConduitNetworkContext copy() { - // Ticker will handle any changes to this, so we don't have to worry about it - return new RedstoneConduitNetworkContext(isActive, new HashMap<>(channelSignals)); + // Ticker will be responsible for updating it. + return new RedstoneConduitNetworkContext(false, new HashMap<>()); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java index 9cd35f3630..61cfb86005 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java @@ -60,6 +60,7 @@ public void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List> ENERGY = CONNECTION_TYPES.register("energy", () -> EnergyConduitConnectionConfig.TYPE); + + public static final Supplier> REDSTONE = CONNECTION_TYPES.register("redstone", + () -> RedstoneConduitConnectionConfig.TYPE); + + public static final Supplier> FLUID = CONNECTION_TYPES.register("fluid", + () -> FluidConduitConnectionConfig.TYPE); } public static class NodeData { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java deleted file mode 100644 index 10f7bb3683..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitMenu.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.enderio.conduits.common.menu; - -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.bundle.SlotType; -import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlock; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; -import com.enderio.conduits.common.init.ConduitMenus; -import com.enderio.conduits.common.network.ConduitMenuSelectionPacket; -import com.enderio.core.common.menu.LegacyBaseBlockEntityMenu; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.network.PacketDistributor; -import org.apache.logging.log4j.LogManager; -import org.jetbrains.annotations.Nullable; - -public class ConduitMenu extends LegacyBaseBlockEntityMenu { - private Direction direction; - private Holder> conduit; - - public ConduitMenu(@Nullable ConduitBundleBlockEntity blockEntity, Inventory inventory, int pContainerId, - Direction direction, Holder> conduit) { - super(ConduitMenus.CONDUIT_MENU.get(), pContainerId, blockEntity, inventory); - - this.direction = direction; - this.conduit = conduit; - if (blockEntity != null) { - IItemHandler conduitItemHandler = blockEntity.getConduitItemHandler(); - for (Direction forDirection : Direction.values()) { - for (int i = 0; i < ConduitBundle.MAX_CONDUITS; i++) { - for (SlotType slotType : SlotType.values()) { - addSlot(new ConduitSlot(blockEntity.getBundle(), conduitItemHandler, () -> this.direction, - forDirection, () -> blockEntity.getBundle().getConduits().indexOf(this.conduit), i, - slotType)); - } - } - } - } - - addPlayerInventorySlots(23, 113); - } - - @Override - public ItemStack quickMoveStack(Player pPlayer, int pIndex) { - ItemStack resultItemStack = ItemStack.EMPTY; - Slot slot = this.slots.get(pIndex); - if (slot.hasItem()) { - ItemStack itemInSlot = slot.getItem(); - resultItemStack = itemInSlot.copy(); - if (pIndex < this.slots.size() - PLAYER_INVENTORY_SIZE) { - if (!this.moveItemStackTo(itemInSlot, this.slots.size() - PLAYER_INVENTORY_SIZE, this.slots.size(), - true)) { - return ItemStack.EMPTY; - } - } else if (!this.moveItemStackTo(itemInSlot, 0, this.slots.size() - PLAYER_INVENTORY_SIZE, false)) { - return ItemStack.EMPTY; - } - - if (itemInSlot.isEmpty()) { - slot.setByPlayer(ItemStack.EMPTY); - } else { - slot.setChanged(); - } - } - - return resultItemStack; - } - - @Override - public boolean stillValid(Player player) { - return getBlockEntity() != null && getBlockEntity().stillValid(player) - // usually called serverside only, but I want to have a clientcheck for type, to - // close the screen clientside immediatly - && (player instanceof ServerPlayer || clientValid()); - } - - private boolean clientValid() { - return getBlockEntity().getBundle().getConduits().contains(conduit) - && ConduitBundleBlock.canBeOrIsValidConnection(getBlockEntity(), conduit, direction); - } - - public static ConduitMenu factory(int pContainerId, Inventory inventory, RegistryFriendlyByteBuf buf) { - BlockEntity entity = inventory.player.level().getBlockEntity(buf.readBlockPos()); - Direction direction = buf.readEnum(Direction.class); - Holder> type = Conduit.STREAM_CODEC.decode(buf); - if (entity instanceof ConduitBundleBlockEntity castBlockEntity) { - return new ConduitMenu(castBlockEntity, inventory, pContainerId, direction, type); - } - - LogManager.getLogger().warn("couldn't find BlockEntity"); - return new ConduitMenu(null, inventory, pContainerId, direction, type); - } - - public Holder> getConduit() { - return conduit; - } - - public void setConduit(Holder> conduit) { - this.conduit = conduit; - - if (getBlockEntity().hasLevel() && getBlockEntity().getLevel().isClientSide()) { - PacketDistributor.sendToServer(new ConduitMenuSelectionPacket(this.conduit)); - } - } - - public Direction getDirection() { - return direction; - } - - public void setDirection(Direction direction) { - this.direction = direction; - } - - @Override - public void removed(Player player) { - super.removed(player); - if (getBlockEntity() != null && player instanceof ServerPlayer serverPlayer - && serverPlayer.serverLevel() - .players() - .stream() - .filter(p -> p != player) - .noneMatch(p -> p.containerMenu instanceof ConduitMenu)) { - getBlockEntity().updateEmptyDynConnection(); - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitSlot.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitSlot.java index ca139bf9b7..c0134e7d63 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitSlot.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/menu/ConduitSlot.java @@ -1,58 +1,58 @@ -package com.enderio.conduits.common.menu; - -import com.enderio.conduits.api.bundle.SlotType; -import com.enderio.conduits.common.conduit.ConduitBundle; -import com.enderio.conduits.common.conduit.SlotData; -import net.minecraft.core.Direction; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.SlotItemHandler; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Supplier; - -public class ConduitSlot extends SlotItemHandler { - - private final Supplier visibleDirection; - private final Supplier visibleType; - - private final Direction visibleForDirection; - private final int visibleForType; - private final SlotType slotType; - private final ConduitBundle bundle; - - public ConduitSlot(ConduitBundle bundle, IItemHandler itemHandler, Supplier visibleDirection, Direction visibleForDirection, Supplier visibleType, int visibleForType, SlotType slotType) { - super(itemHandler, new SlotData(visibleForDirection, visibleForType, slotType).slotIndex(), slotType.getX(), slotType.getY()); - this.visibleDirection = visibleDirection; - this.visibleType = visibleType; - this.visibleForDirection = visibleForDirection; - this.visibleForType = visibleForType; - this.slotType = slotType; - this.bundle = bundle; - } - - @Override - public boolean mayPlace(ItemStack stack) { - return isActive() && super.mayPlace(stack); - } - - @Override - public boolean mayPickup(Player playerIn) { - return isActive() && super.mayPickup(playerIn); - } - - @Override - @NotNull - public ItemStack remove(int amount) { - return isActive() ? super.remove(amount) : ItemStack.EMPTY; - } - - @Override - public boolean isActive() { - return visibleDirection.get() == visibleForDirection - && visibleType.get() == visibleForType - && bundle.getConduits().size() > visibleForType - && slotType.isAvailableFor(bundle.getConduits().get(visibleForType).value().getMenuData()); - } -} +//package com.enderio.conduits.common.menu; +// +//import com.enderio.conduits.api.bundle.SlotType; +//import com.enderio.conduits.common.conduit.ConduitBundle; +//import com.enderio.conduits.common.conduit.SlotData; +//import net.minecraft.core.Direction; +//import net.minecraft.world.entity.player.Player; +//import net.minecraft.world.item.ItemStack; +//import net.neoforged.neoforge.items.IItemHandler; +//import net.neoforged.neoforge.items.SlotItemHandler; +//import org.jetbrains.annotations.NotNull; +// +//import java.util.function.Supplier; +// +//public class ConduitSlot extends SlotItemHandler { +// +// private final Supplier visibleDirection; +// private final Supplier visibleType; +// +// private final Direction visibleForDirection; +// private final int visibleForType; +// private final SlotType slotType; +// private final ConduitBundle bundle; +// +// public ConduitSlot(ConduitBundle bundle, IItemHandler itemHandler, Supplier visibleDirection, Direction visibleForDirection, Supplier visibleType, int visibleForType, SlotType slotType) { +// super(itemHandler, new SlotData(visibleForDirection, visibleForType, slotType).slotIndex(), slotType.getX(), slotType.getY()); +// this.visibleDirection = visibleDirection; +// this.visibleType = visibleType; +// this.visibleForDirection = visibleForDirection; +// this.visibleForType = visibleForType; +// this.slotType = slotType; +// this.bundle = bundle; +// } +// +// @Override +// public boolean mayPlace(ItemStack stack) { +// return isActive() && super.mayPlace(stack); +// } +// +// @Override +// public boolean mayPickup(Player playerIn) { +// return isActive() && super.mayPickup(playerIn); +// } +// +// @Override +// @NotNull +// public ItemStack remove(int amount) { +// return isActive() ? super.remove(amount) : ItemStack.EMPTY; +// } +// +// @Override +// public boolean isActive() { +// return visibleDirection.get() == visibleForDirection +// && visibleType.get() == visibleForType +// && bundle.getConduits().size() > visibleForType +// && slotType.isAvailableFor(bundle.getConduits().get(visibleForType).value().getMenuData()); +// } +//} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java index 40d3866930..ed89ad67a2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java @@ -1,5 +1,9 @@ package com.enderio.conduits.common.network; +import com.enderio.conduits.common.conduit.menu.NewConduitMenu; +import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; +import net.neoforged.neoforge.network.handling.IPayloadContext; + public class ConduitClientPayloadHandler { private static final ConduitClientPayloadHandler INSTANCE = new ConduitClientPayloadHandler(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java new file mode 100644 index 0000000000..f6c9e63ab5 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java @@ -0,0 +1,24 @@ +package com.enderio.conduits.common.network; + +import com.enderio.conduits.common.conduit.menu.NewConduitMenu; +import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +public class ConduitCommonPayloadHandler { + private static final ConduitCommonPayloadHandler INSTANCE = new ConduitCommonPayloadHandler(); + + public void handle(SetConduitConnectionConfigPacket packet, IPayloadContext context) { + // TODO: This is the same handler for client & server, maybe we need a common payload handler? + context.enqueueWork(() -> { + if (packet.containerId() == context.player().containerMenu.containerId) { + if (context.player().containerMenu instanceof NewConduitMenu menu) { + menu.setConnectionConfig(packet.connectionConfig()); + } + } + }); + } + + public static ConduitCommonPayloadHandler getInstance() { + return INSTANCE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java index 24cfbf0209..dedf00acd4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java @@ -4,7 +4,9 @@ import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; +import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; import com.enderio.core.EnderCore; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; @@ -20,12 +22,6 @@ public static void register(final RegisterPayloadHandlersEvent event) { .registrar(EnderCore.MOD_ID) .versioned(PROTOCOL_VERSION); - registrar.playToServer(C2SSetConduitConnectionState.TYPE, C2SSetConduitConnectionState.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleConduitConnectionState); - - registrar.playToServer(C2SSetConduitExtendedData.TYPE, C2SSetConduitExtendedData.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleConduitExtendedData); - registrar.playToServer(ConduitMenuSelectionPacket.TYPE, ConduitMenuSelectionPacket.STREAM_CODEC, ConduitServerPayloadHandler.getInstance()::handleConduitMenuSelection); @@ -46,6 +42,9 @@ public static void register(final RegisterPayloadHandlersEvent event) { registrar.playToServer(C2SSetConduitRedstoneChannelPacket.TYPE, C2SSetConduitRedstoneChannelPacket.STREAM_CODEC, ConduitServerPayloadHandler.getInstance()::handleSetConduitRedstoneChannelPacket); + + registrar.playBidirectional(SetConduitConnectionConfigPacket.TYPE, SetConduitConnectionConfigPacket.STREAM_CODEC, + ConduitCommonPayloadHandler.getInstance()::handle); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java index 7fbdedd20c..d25c7b9851 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java @@ -5,8 +5,6 @@ import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; -import com.enderio.conduits.common.menu.ConduitMenu; import com.enderio.conduits.common.network.connections.C2SConduitConnectionPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; @@ -26,31 +24,11 @@ public static ConduitServerPayloadHandler getInstance() { return INSTANCE; } - public void handleConduitConnectionState(final C2SSetConduitConnectionState packet, final IPayloadContext context) { - context.enqueueWork(() -> { - var level = context.player().level(); - BlockEntity be = level.getBlockEntity(packet.pos()); - if (be instanceof ConduitBundleBlockEntity conduitBundleBlockEntity) { - conduitBundleBlockEntity.handleConnectionStateUpdate(packet.direction(), packet.conduit(), packet.connectionState()); - } - }); - } - - public void handleConduitExtendedData(final C2SSetConduitExtendedData packet, final IPayloadContext context) { - context.enqueueWork(() -> { - var level = context.player().level(); - BlockEntity be = level.getBlockEntity(packet.pos()); - if (be instanceof ConduitBundleBlockEntity conduitBundleBlockEntity) { - conduitBundleBlockEntity.handleConduitDataUpdate(packet.conduit(), packet.conduitDataContainer()); - } - }); - } - public void handleConduitMenuSelection(final ConduitMenuSelectionPacket packet, final IPayloadContext context) { context.enqueueWork(() -> { - if (context.player().containerMenu instanceof ConduitMenu menu) { - menu.setConduit(packet.conduit()); - } +// if (context.player().containerMenu instanceof ConduitMenu menu) { +// menu.setConduit(packet.conduit()); +// } }); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/SetConduitConnectionConfigPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/SetConduitConnectionConfigPacket.java new file mode 100644 index 0000000000..02c6f4f5f5 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/SetConduitConnectionConfigPacket.java @@ -0,0 +1,29 @@ +package com.enderio.conduits.common.network.connections; + +import com.enderio.base.api.EnderIO; +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +public record SetConduitConnectionConfigPacket( + int containerId, + ConnectionConfig connectionConfig +) implements CustomPacketPayload { + + public static Type TYPE = new Type<>(EnderIO.loc("client_set_conduit_conection_config")); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.INT, + SetConduitConnectionConfigPacket::containerId, + ConnectionConfig.STREAM_CODEC, + SetConduitConnectionConfigPacket::connectionConfig, + SetConduitConnectionConfigPacket::new + ); + + @Override + public Type type() { + return TYPE; + } +} diff --git a/enderio-machines/src/main/java/com/enderio/machines/common/block/LegacyMachineBlock.java b/enderio-machines/src/main/java/com/enderio/machines/common/block/LegacyMachineBlock.java index 5fbe4452f5..b3e0450f3e 100644 --- a/enderio-machines/src/main/java/com/enderio/machines/common/block/LegacyMachineBlock.java +++ b/enderio-machines/src/main/java/com/enderio/machines/common/block/LegacyMachineBlock.java @@ -108,13 +108,6 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } - if (!level.isClientSide && stack.is(EIOTags.Items.WRENCH)) { - var res = machineBlockEntity.onWrenched(player, hit.getDirection()); - if (res != ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION) { - return res; - } - } - var result = machineBlockEntity.onBlockEntityUsed(state, level, pos, player, interactionHand, hit); if (result != ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION) { return result; diff --git a/enderio-machines/src/main/java/com/enderio/machines/common/blockentity/base/LegacyMachineBlockEntity.java b/enderio-machines/src/main/java/com/enderio/machines/common/blockentity/base/LegacyMachineBlockEntity.java index 68e0c6353a..04365434cb 100644 --- a/enderio-machines/src/main/java/com/enderio/machines/common/blockentity/base/LegacyMachineBlockEntity.java +++ b/enderio-machines/src/main/java/com/enderio/machines/common/blockentity/base/LegacyMachineBlockEntity.java @@ -38,6 +38,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.ItemContainerContents; +import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; @@ -535,7 +536,8 @@ public boolean stillValid(Player pPlayer) { @EnsureSide(EnsureSide.Side.CLIENT) @Override - public ItemInteractionResult onWrenched(@Nullable Player player, @Nullable Direction side) { + public ItemInteractionResult onWrenched(UseOnContext context) { + var player = context.getPlayer(); if (player == null || level == null) { return ItemInteractionResult.SUCCESS; } @@ -561,8 +563,8 @@ public ItemInteractionResult onWrenched(@Nullable Player player, @Nullable Direc } else { // Cycle side config if (level.isClientSide()) { - if (side != null && isIOConfigMutable()) { - cycleIOMode(side); + if (isIOConfigMutable()) { + cycleIOMode(context.getClickedFace()); } } } diff --git a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/WrenchableBlockHandler.java b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/WrenchableBlockHandler.java index fe3e4223d7..ad6a950afb 100644 --- a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/WrenchableBlockHandler.java +++ b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/WrenchableBlockHandler.java @@ -19,8 +19,7 @@ public static void onItemUse(UseItemOnBlockEvent event) { } if (level.getBlockEntity(event.getPos()) instanceof Wrenchable blockEntity) { - var direction = event.getUseOnContext().getHitResult().getDirection(); - var result = blockEntity.onWrenched(event.getPlayer(), direction); + var result = blockEntity.onWrenched(event.getUseOnContext()); if (result != ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION) { event.cancelWithResult(result); } diff --git a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/blockentity/MachineBlockEntity.java b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/blockentity/MachineBlockEntity.java index ba47aed073..c077b9699a 100644 --- a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/blockentity/MachineBlockEntity.java +++ b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/blockentity/MachineBlockEntity.java @@ -41,6 +41,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.ItemContainerContents; +import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -462,7 +463,8 @@ protected boolean isRedstoneBlocked() { // region Wrenchable Implementation @Override - public ItemInteractionResult onWrenched(@Nullable Player player, @Nullable Direction side) { + public ItemInteractionResult onWrenched(UseOnContext context) { + var player = context.getPlayer(); if (player == null || level == null) { return ItemInteractionResult.SUCCESS; } @@ -490,8 +492,8 @@ public ItemInteractionResult onWrenched(@Nullable Player player, @Nullable Direc return ItemInteractionResult.sidedSuccess(level.isClientSide()); } else { if (level.isClientSide()) { - if (side != null && isIOConfigMutable()) { - PacketDistributor.sendToServer(new CycleIOConfigPacket(worldPosition, side)); + if (isIOConfigMutable()) { + PacketDistributor.sendToServer(new CycleIOConfigPacket(worldPosition, context.getClickedFace())); } } From 256a18543eb5160443a4c1cf72c4f78dba52bd6f Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sat, 11 Jan 2025 00:57:17 +0000 Subject: [PATCH 11/27] feat: more item conduit UI and add redstone conduit strong signals --- .../resources/assets/enderio/lang/en_us.json | 2 + .../api/ConduitRedstoneSignalAware.java | 4 ++ .../api/bundle/ConduitBundleReader.java | 8 +++ .../api/screen/ConduitScreenHelper.java | 4 ++ .../api/ticker/NewIOAwareConduitTicker.java | 4 +- .../conduits/client/ConduitFacadeColor.java | 6 +- .../client/gui/screen/NewConduitScreen.java | 13 ++++ .../gui/screen/types/ConduitScreenTypes.java | 3 +- .../screen/types/ItemConduitScreenType.java | 27 +++++-- .../types/RedstoneConduitScreenType.java | 45 ++++++++++++ .../bundle/ConduitConnectionRenderState.java | 4 +- .../client/particle/ConduitBreakParticle.java | 4 +- .../common/conduit/ConduitSavedData.java | 4 +- ...ndleBlock.java => ConduitBundleBlock.java} | 55 +++++++-------- ...ity.java => ConduitBundleBlockEntity.java} | 70 ++++++++++++------- ...ntory.java => ConduitBundleInventory.java} | 8 +-- ...NewConduitShape.java => ConduitShape.java} | 4 +- .../common/conduit/menu/NewConduitMenu.java | 10 ++- .../conduit/type/item/ItemConduitTicker.java | 12 ++-- .../type/redstone/RedstoneConduit.java | 2 +- .../RedstoneConduitConnectionConfig.java | 61 ++++++++-------- .../RedstoneConduitNetworkContext.java | 16 ++++- .../type/redstone/RedstoneConduitTicker.java | 47 ++++++++----- .../common/init/ConduitBlockEntities.java | 8 +-- .../conduits/common/init/ConduitBlocks.java | 6 +- .../conduits/common/init/ConduitLang.java | 6 ++ .../cctweaked/EIOBundledRedstoneProvider.java | 64 ++++++++++------- 27 files changed, 322 insertions(+), 175 deletions(-) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/{NewConduitBundleBlock.java => ConduitBundleBlock.java} (92%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/{NewConduitBundleBlockEntity.java => ConduitBundleBlockEntity.java} (95%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/{NewConduitBundleInventory.java => ConduitBundleInventory.java} (94%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/{NewConduitShape.java => ConduitShape.java} (99%) diff --git a/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json b/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json index f14899813a..32bd0c5dd1 100644 --- a/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json +++ b/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json @@ -5,6 +5,8 @@ "gui.enderio.conduit.input": "Input", "gui.enderio.conduit.insert": "Insert", "gui.enderio.conduit.output": "Output", + "gui.enderio.conduit.redstone.signal_color": "Signal Color", + "gui.enderio.conduit.redstone.strong_signal": "Strong Signal", "gui.enderio.conduit_channel": "Channel", "gui.enderio.fluid_conduit.change_fluid1": "Locked Fluid:", "gui.enderio.fluid_conduit.change_fluid2": "Click to reset!", diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitRedstoneSignalAware.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitRedstoneSignalAware.java index d4da0ef318..ad6020b23e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitRedstoneSignalAware.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitRedstoneSignalAware.java @@ -5,6 +5,10 @@ @FunctionalInterface public interface ConduitRedstoneSignalAware { + // Useful in contexts in which you know the config doesn't require signals. + // Mainly intended for the hardcoded redstone conduit checks. + ConduitRedstoneSignalAware NONE = signalColor -> false; + /** * Whether the block has a redstone signal. * @param signalColor if set, will also check for a signal in the attached redstone conduit network. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java index 57350924b8..48cb163aa1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -3,6 +3,7 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.facade.FacadeType; import java.util.List; @@ -89,6 +90,13 @@ public interface ConduitBundleReader { */ ConnectionConfig getConnectionConfig(Direction side, Holder> conduit); + /** + * @param side + * @param conduit + * @return + */ + T getConnectionConfig(Direction side, Holder> conduit, ConnectionConfigType type); + /** * An endpoint is a side which has a "connection plate" to another block, rather than to continued line of bundles. * @param side the side being checked. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java index c0cc61157c..a8ad9a7d07 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java @@ -6,6 +6,7 @@ import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.ApiStatus; @@ -28,6 +29,9 @@ public interface ConduitScreenHelper { AbstractWidget addRedstoneControlPicker(int x, int y, Component title, Supplier getter, Consumer setter); + AbstractWidget addToggleButton(int x, int y, int width, int height, Component enabledTitle, Component disabledTitle, ResourceLocation enabledSprite, + ResourceLocation disabledSprite, Supplier getter, Consumer setter); + // TODO: Create icon button // TODO: Create custom picker? diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java index dbe31b940d..b5921e6523 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java @@ -85,8 +85,8 @@ protected void preProcessReceivers(List receivers) { protected abstract void tickColoredGraph( ServerLevel level, T conduit, - List inserts, - List extracts, + List senders, + List receivers, DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java index 0ac5c4bd8e..f53f40d8b6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java @@ -2,9 +2,8 @@ import com.enderio.base.common.init.EIODataComponents; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; -import java.util.Optional; -import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -12,7 +11,6 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; @@ -26,7 +24,7 @@ public int getColor(BlockState state, @Nullable BlockAndTintGetter level, @Nulla tintIndex = unmoveTintIndex(tintIndex); if (level != null && pos != null) { BlockEntity entity = level.getBlockEntity(pos); - if (entity instanceof NewConduitBundleBlockEntity conduitBundleBlock) { + if (entity instanceof ConduitBundleBlockEntity conduitBundleBlock) { if (conduitBundleBlock.hasFacade()) { var facade = conduitBundleBlock.getFacadeBlock(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java index 4a7ea422c6..daa22d1160 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java @@ -20,6 +20,7 @@ import com.enderio.conduits.client.gui.screen.types.ConduitScreenTypes; import com.enderio.conduits.common.conduit.menu.NewConduitMenu; import com.enderio.conduits.common.init.ConduitLang; +import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; @@ -301,7 +302,10 @@ public void addWidgets(ScreenHelper screenHelper) { public void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { if (screenType != null) { + guiGraphics.pose().pushPose(); + guiGraphics.pose().translate(22, 7, 0); screenType.renderLabels(guiGraphics, font, mouseX, mouseY); + guiGraphics.pose().popPose(); } } @@ -377,6 +381,15 @@ public AbstractWidget addRedstoneControlPicker(int x, int y, Component title, Su return widget; } + @Override + public AbstractWidget addToggleButton(int x, int y, int width, int height, Component enabledTitle, Component disabledTitle, ResourceLocation enabledSprite, + ResourceLocation disabledSprite, Supplier getter, Consumer setter) { + + var widget = ToggleIconButton.of(getAreaLeft() + x, getAreaTop() + y, width, height, enabledSprite, disabledSprite, enabledTitle, disabledTitle, getter, setter); + addRenderableWidget(widget); + return widget; + } + // Dynamic UI utilities @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java index d8aa8de18c..1793528fdb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java @@ -16,7 +16,8 @@ public class ConduitScreenTypes { @EnsureSide(EnsureSide.Side.CLIENT) public static void init() { SCREEN_TYPES = Map.of( - ConduitTypes.ITEM.get(), new ItemConduitScreenType() + ConduitTypes.ITEM.get(), new ItemConduitScreenType(), + ConduitTypes.REDSTONE.get(), new RedstoneConduitScreenType() ); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java index 756c7c582d..17a227ca1e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java @@ -1,5 +1,6 @@ package com.enderio.conduits.client.gui.screen.types; +import com.enderio.base.api.EnderIO; import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.api.menu.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; @@ -8,9 +9,15 @@ import com.enderio.conduits.common.init.ConduitLang; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; public class ItemConduitScreenType extends ConduitScreenType { + private static final ResourceLocation ICON_ROUND_ROBIN_ENABLED = EnderIO.loc("icon/round_robin_enabled"); + private static final ResourceLocation ICON_ROUND_ROBIN_DISABLED = EnderIO.loc("icon/round_robin_disabled"); + private static final ResourceLocation ICON_SELF_FEED_ENABLED = EnderIO.loc("icon/self_feed_enabled"); + private static final ResourceLocation ICON_SELF_FEED_DISABLED = EnderIO.loc("icon/self_feed_disabled"); + @Override public void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess) { // Add insert/extract checkboxes. @@ -20,13 +27,25 @@ public void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess.getConnectionConfig().isReceive(), value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + // Channel colors screen.addColorPicker(0, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); screen.addColorPicker(90, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().receiveColor(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); - var redstoneChannelWidget = screen.addColorPicker(90 + 20, 40, ConduitLang.REDSTONE_CHANNEL, () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), + // Round robin + screen.addToggleButton(90 + 16 + 4, 20, 16, 16, ConduitLang.ROUND_ROBIN_ENABLED, ConduitLang.ROUND_ROBIN_DISABLED, + ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, () -> dataAccess.getConnectionConfig().isRoundRobin(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsRoundRobin(value))); + + // Self feed + screen.addToggleButton(90 + (16 + 4) * 2, 20, 16, 16, ConduitLang.SELF_FEED_ENABLED, ConduitLang.SELF_FEED_DISABLED, + ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, () -> dataAccess.getConnectionConfig().isSelfFeed(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsSelfFeed(value))); + + // Redstone control + var redstoneChannelWidget = screen.addColorPicker(90 + 16 + 4, 40, ConduitLang.REDSTONE_CHANNEL, () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); // Only show the redstone widget when redstone control is sensitive to signals. @@ -37,15 +56,13 @@ public void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); // TODO: Show redstone signal indicators (somehow) - - // TODO: Item-specific buttons } @Override public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { super.renderLabels(guiGraphics, font, mouseX, mouseY); - guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, 22 + 16 + 2, 7 + 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 22 + 90 + 16 + 2, 7 + 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, 16 + 2, 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 90 + 16 + 2, 4, 4210752, false); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java new file mode 100644 index 0000000000..af5e7f2b0a --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java @@ -0,0 +1,45 @@ +package com.enderio.conduits.client.gui.screen.types; + +import com.enderio.conduits.api.menu.ConduitMenuDataAccess; +import com.enderio.conduits.api.screen.ConduitScreenHelper; +import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; +import com.enderio.conduits.common.init.ConduitLang; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; + +public class RedstoneConduitScreenType extends ConduitScreenType { + @Override + public void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess) { + // Add insert/extract checkboxes. + screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isReceive(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + + screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isSend(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); + + // Channel colors + screen.addColorPicker(0, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().receiveColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + + screen.addColorPicker(90, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + + // Strong signal + screen.addCheckbox(90, 40, () -> dataAccess.getConnectionConfig().isStrongOutputSignal(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsStrongOutputSignal(value))); + } + + @Override + public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, font, mouseX, mouseY); + + guiGraphics.drawString(font, ConduitLang.CONDUIT_INPUT, 16 + 2, 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_OUTPUT, 90 + 16 + 2, 4, 4210752, false); + + guiGraphics.drawString(font, ConduitLang.CONDUIT_REDSTONE_SIGNAL_COLOR, 16 + 2, 20 + 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_REDSTONE_SIGNAL_COLOR, 90 + 16 + 2, 20 + 4, 4210752, false); + + guiGraphics.drawString(font, ConduitLang.CONDUIT_REDSTONE_STRONG_SIGNAL, 90 + 16 + 2, 40 + 4, 4210752, false); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java index f34d5b6474..634e52692a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java @@ -52,8 +52,8 @@ public static ConduitConnectionRenderState of(Holder> conduit, Con // TODO: Tidy the language here. canInput = ioConnectionConfig.isSend(); canOutput = ioConnectionConfig.isReceive(); - inputChannel = ioConnectionConfig.receiveColor(); - outputChannel = ioConnectionConfig.sendColor(); + inputChannel = ioConnectionConfig.sendColor(); + outputChannel = ioConnectionConfig.receiveColor(); // TODO: Need support for the new redstone control system. } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java index dfaa25cc1e..030a5f00e9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java @@ -1,7 +1,7 @@ package com.enderio.conduits.client.particle; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.conduit.bundle.NewConduitShape; +import com.enderio.conduits.common.conduit.bundle.ConduitShape; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleEngine; @@ -64,7 +64,7 @@ public int getLightColor(float partialTick) { public static void addDestroyEffects(BlockPos pos, Conduit conduit) { Level level = Minecraft.getInstance().level; ParticleEngine engine = Minecraft.getInstance().particleEngine; - List boxes = NewConduitShape.CONNECTION.toAabbs(); + List boxes = ConduitShape.CONNECTION.toAabbs(); double countMult = 1D / boxes.size(); boxes.forEach(aabb -> { double sizeX = Math.min(1D, aabb.maxX - aabb.minX); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java index 5915a1e592..3b5eb7c001 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java @@ -4,7 +4,7 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.ticker.ConduitTicker; -import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; @@ -356,7 +356,7 @@ public static boolean isRedstoneActive(Level level, BlockPos pos, DyeColor color return false; } - if (!(level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle)) { + if (!(level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle)) { return false; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java similarity index 92% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java index 6b1fd6965f..ac6c5d8b9d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java @@ -2,9 +2,9 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitCapabilities; +import com.enderio.conduits.api.ConduitRedstoneSignalAware; import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; import com.enderio.conduits.client.particle.ConduitBreakParticle; import com.enderio.conduits.common.conduit.ConduitBlockItem; @@ -62,11 +62,11 @@ import net.neoforged.fml.loading.FMLLoader; import org.jetbrains.annotations.Nullable; -public class NewConduitBundleBlock extends Block implements EntityBlock { +public class ConduitBundleBlock extends Block implements EntityBlock { private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; - public NewConduitBundleBlock(Properties properties) { + public ConduitBundleBlock(Properties properties) { super(properties); registerDefaultState(getStateDefinition().any().setValue(WATERLOGGED, false)); } @@ -82,7 +82,7 @@ public NewConduitBundleBlock(Properties properties) { // return createTickerHelper(blockEntityType, typeSupplier.get(), // EIOBlockEntity::tick); return (level1, pos, state1, blockEntity) -> { - if (blockEntity instanceof NewConduitBundleBlockEntity conduitBundleBlockEntity) { + if (blockEntity instanceof ConduitBundleBlockEntity conduitBundleBlockEntity) { if (level.isClientSide) { conduitBundleBlockEntity.clientTick(); } else { @@ -98,7 +98,7 @@ public NewConduitBundleBlock(Properties properties) { @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { // TODO: Revert these changes for showing individual parts here. do it in ConduitHighlightEvent! - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduit) { if (conduit.hasFacade() && FacadeHelper.areFacadesVisible()) { return Shapes.block(); } @@ -169,7 +169,7 @@ protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, Bloc } private VoxelShape getBundleShape(BlockGetter level, BlockPos pos, boolean canHideFacade) { - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduit) { if (conduit.hasFacade() && (!canHideFacade || FacadeHelper.areFacadesVisible())) { return Shapes.block(); } @@ -206,7 +206,7 @@ public ItemStack getCloneItemStack(BlockState state, HitResult target, LevelRead } } - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity blockEntity) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity blockEntity) { if (blockEntity.hasFacade() && FacadeHelper.areFacadesVisible()) { return blockEntity.getFacadeBlock().asItem().getDefaultInstance(); } @@ -240,7 +240,7 @@ protected boolean canBeReplaced(BlockState state, BlockPlaceContext useContext) protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduit) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduit) { conduit.updateNeighborRedstone(); conduit.updateConnections(level, pos, neighborPos, true); @@ -273,7 +273,7 @@ public BlockState updateShape(BlockState state, Direction direction, BlockState level.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(level)); } - if (level.getBlockEntity(currentPos) instanceof NewConduitBundleBlockEntity conduit) { + if (level.getBlockEntity(currentPos) instanceof ConduitBundleBlockEntity conduit) { conduit.updateShape(); } @@ -296,7 +296,7 @@ public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable L return; } - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit != null) { conduitBundle.addConduit(conduit, player); @@ -318,7 +318,7 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, HitResult hit = visualPick(player); - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { if (conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()) { SoundType soundtype = state.getSoundType(level, pos, player); level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, @@ -406,7 +406,7 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, @Override protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { // TODO: The connection shouldn't include the plate.. if we hit the plate open the first conduit? var conduitConnection = conduitBundle.getShape().getConnectionFromHit(pos, hitResult); @@ -438,7 +438,7 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { var result = addConduit(stack, level, pos, player, conduitBundle); if (result != ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION) { return result; @@ -456,7 +456,7 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev } private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos pos, Player player, - NewConduitBundleBlockEntity conduitBundle) { + ConduitBundleBlockEntity conduitBundle) { // Get the conduit from the item Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit == null) { @@ -502,7 +502,7 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos } private ItemInteractionResult addFacade(ItemStack stack, Level level, BlockPos pos, Player player, - NewConduitBundleBlockEntity conduitBundle) { + ConduitBundleBlockEntity conduitBundle) { var facadeProvider = stack.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); if (facadeProvider == null || !facadeProvider.isValid()) { return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; @@ -547,7 +547,7 @@ public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos return false; } - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { // Get the redstone conduit var redstoneConduit = conduitBundle.getConduitByType(ConduitTypes.REDSTONE.get()); if (redstoneConduit == null) { @@ -559,11 +559,8 @@ public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos return false; } - if (!(conduitBundle.getConnectionConfig(direction, redstoneConduit) instanceof RedstoneConduitConnectionConfig config)) { - return false; - } - - return config.canInsert(); + var config = conduitBundle.getConnectionConfig(direction, redstoneConduit, RedstoneConduitConnectionConfig.TYPE); + return config.canSend(ConduitRedstoneSignalAware.NONE); } return false; @@ -580,7 +577,7 @@ protected int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, } private int getNetworkSignal(BlockGetter level, BlockPos pos, Direction direction, boolean isDirectSignal) { - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { // TODO: Do we need to have signals on client side? If so we need to put this into the client NBT. if (conduitBundle.getLevel().isClientSide()) { return 0; @@ -597,16 +594,12 @@ private int getNetworkSignal(BlockGetter level, BlockPos pos, Direction directio return 0; } - if (!(conduitBundle.getConnectionConfig(direction.getOpposite(), redstoneConduit) instanceof RedstoneConduitConnectionConfig config)) { - return 0; - } - - if (!config.canInsert()) { + var config = conduitBundle.getConnectionConfig(direction.getOpposite(), redstoneConduit, RedstoneConduitConnectionConfig.TYPE); + if (!config.canSend(ConduitRedstoneSignalAware.NONE)) { return 0; } - // TODO: Check for strong signal in config. - if (isDirectSignal) { + if (isDirectSignal && !config.isStrongOutputSignal()) { return 0; } @@ -621,7 +614,7 @@ private int getNetworkSignal(BlockGetter level, BlockPos pos, Direction directio return 0; } - return context.getSignal(config.insertChannel()); + return context.getSignal(config.sendColor()); } return 0; @@ -632,7 +625,7 @@ private int getNetworkSignal(BlockGetter level, BlockPos pos, Direction directio // region Facade Behaviours private Optional getFacadeBlock(BlockGetter level, BlockPos pos) { - if (level.getBlockEntity(pos) instanceof NewConduitBundleBlockEntity conduitBundle) { + if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { if (conduitBundle.hasFacade()) { return Optional.of(conduitBundle.getFacadeBlock()); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java similarity index 95% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index 0f8f3db259..7d4ec09439 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -4,12 +4,14 @@ import com.enderio.conduits.ConduitNBTKeys; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitCapabilities; +import com.enderio.conduits.api.ConduitRedstoneSignalAware; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.bundle.ConduitInventory; import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.bundle.ConduitBundleAccessor; import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.facade.FacadeType; import com.enderio.conduits.api.network.node.NodeData; import com.enderio.conduits.client.model.conduit.bundle.ConduitBundleRenderState; @@ -26,6 +28,7 @@ import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; import com.enderio.conduits.common.conduit.menu.NewConduitMenu; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.blockentity.EnderBlockEntity; @@ -68,13 +71,11 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.fml.loading.FMLLoader; import net.neoforged.neoforge.capabilities.BlockCapability; @@ -82,7 +83,7 @@ import net.neoforged.neoforge.client.model.data.ModelData; import org.jetbrains.annotations.Nullable; -public final class NewConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor, Clearable, Wrenchable, NewConduitMenu.ConnectionAccessor { +public final class ConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor, Clearable, Wrenchable, NewConduitMenu.ConnectionAccessor { public static final int MAX_CONDUITS = 9; @@ -92,7 +93,7 @@ public final class NewConduitBundleBlockEntity extends EnderBlockEntity implemen private Map>, ConnectionContainer> conduitConnections = new HashMap<>(); - private final NewConduitBundleInventory inventory; + private final ConduitBundleInventory inventory; // Map of all conduit nodes for this bundle. private final Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); @@ -105,17 +106,17 @@ public final class NewConduitBundleBlockEntity extends EnderBlockEntity implemen // The client has no nodes, so we hold the data like this. private final Map>, CompoundTag> clientConduitDataTags = new HashMap<>(); - private final NewConduitShape shape = new NewConduitShape(); + private final ConduitShape shape = new ConduitShape(); private boolean hasDirtyNodes = false; // Deferred connection check private UpdateState checkConnection = UpdateState.NONE; - public NewConduitBundleBlockEntity(BlockPos worldPosition, BlockState blockState) { + public ConduitBundleBlockEntity(BlockPos worldPosition, BlockState blockState) { super(ConduitBlockEntities.CONDUIT.get(), worldPosition, blockState); - inventory = new NewConduitBundleInventory(this) { + inventory = new ConduitBundleInventory(this) { @Override protected void onChanged() { setChanged(); @@ -186,6 +187,16 @@ public void onLoad() { private void bundleChanged() { level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); level.updateNeighborsAt(getBlockPos(), getBlockState().getBlock()); + + // Redstone conduits also need to update the neighbours they point to (for strong connections) + // TODO: This could wind up being sub-optimal? Maybe add some more specific hooks for when the config/connections are changed? + var redstoneConduit = getConduitByType(ConduitTypes.REDSTONE.get()); + if (redstoneConduit != null) { + for (Direction side : Direction.values()) { + level.updateNeighborsAt(getBlockPos().relative(side), getBlockState().getBlock()); + } + } + level.invalidateCapabilities(getBlockPos()); setChanged(); updateShape(); @@ -197,7 +208,7 @@ private void bundleChanged() { // region Shape and Model - public NewConduitShape getShape() { + public ConduitShape getShape() { return shape; } @@ -233,7 +244,7 @@ public boolean canBeOrIsConnection(Direction side, Holder> conduit } // Cannot create a connection to a bundle - if (level.getBlockEntity(getBlockPos().relative(side)) instanceof NewConduitBundleBlockEntity) { + if (level.getBlockEntity(getBlockPos().relative(side)) instanceof ConduitBundleBlockEntity) { return false; } @@ -279,7 +290,7 @@ public ItemInteractionResult onWrenched(UseOnContext context) { onConnectionsUpdated(conduitConnection.getSecond()); // If we were connected to another bundle, we need to sever the graph - if (level.getBlockEntity(getBlockPos().relative(conduitConnection.getFirst())) instanceof NewConduitBundleBlockEntity neighborBundle) { + if (level.getBlockEntity(getBlockPos().relative(conduitConnection.getFirst())) instanceof ConduitBundleBlockEntity neighborBundle) { neighborBundle.setConnectionStatus(conduitConnection.getFirst().getOpposite(), conduitConnection.getSecond(), ConnectionStatus.DISABLED); neighborBundle.onConnectionsUpdated(conduitConnection.getSecond()); @@ -331,7 +342,7 @@ public Component getDisplayName() { @Override public @Nullable AbstractContainerMenu createMenu(int containerId, Inventory inventory, Player player) { - return new NewConduitMenu(containerId, inventory, NewConduitBundleBlockEntity.this, side, conduit); + return new NewConduitMenu(containerId, inventory, ConduitBundleBlockEntity.this, side, conduit); } } @@ -382,7 +393,7 @@ private boolean hasRedstoneSignal(@Nullable DyeColor signalColor) { // region Capability Proxies - public static ICapabilityProvider createCapabilityProvider( + public static ICapabilityProvider createCapabilityProvider( BlockCapability cap) { return (be, context) -> { for (Holder> conduit : be.getConduits()) { @@ -398,7 +409,7 @@ public static ICapabilityProvider TCap getProxiedCapability(BlockCapability capability, - NewConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { + ConduitBundleBlockEntity blockEntity, Holder> conduit, @Nullable TContext context) { if (blockEntity.level == null) { return null; @@ -668,7 +679,7 @@ private void removeNeighborConnection(Direction side, Holder> cond return; } - if (!(level.getBlockEntity(getBlockPos().relative(side)) instanceof NewConduitBundleBlockEntity neighborBundle)) { + if (!(level.getBlockEntity(getBlockPos().relative(side)) instanceof ConduitBundleBlockEntity neighborBundle)) { return; } @@ -755,6 +766,17 @@ public ConnectionConfig getConnectionConfig(Direction side, Holder return conduitConnections.get(conduit).getConfig(side); } + @Override + public T getConnectionConfig(Direction side, Holder> conduit, ConnectionConfigType type) { + var config = conduitConnections.get(conduit).getConfig(side); + if (config.type() != type) { + throw new IllegalStateException("Connection config type mismatch."); + } + + //noinspection unchecked + return (T)config; + } + @Override public void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config) { if (config.type() != conduit.value().connectionConfigType()) { @@ -828,7 +850,7 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boole var node = conduitNodes.get(conduit); if (level.getBlockEntity( - getBlockPos().relative(side)) instanceof NewConduitBundleBlockEntity neighbourConduitBundle) { + getBlockPos().relative(side)) instanceof ConduitBundleBlockEntity neighbourConduitBundle) { // Connect to another bundle which has a compatible conduit. if (neighbourConduitBundle.canConnectTo(side.getOpposite(), conduit, node, isForcedConnection)) { // Make connections to both sides @@ -873,18 +895,16 @@ private void connectConduit(Direction side, Holder> conduit) { conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) .setStatus(side, ConnectionStatus.CONNECTED_CONDUIT); onConnectionsUpdated(conduit); - setChanged(); - level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); - updateShape(); + + bundleChanged(); } private void connectBlock(Direction side, Holder> conduit) { conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) .setStatus(side, ConnectionStatus.CONNECTED_BLOCK); onConnectionsUpdated(conduit); - setChanged(); - level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); - updateShape(); + + bundleChanged(); } // TODO: poorly named, we're disconnecting from another conduit on the given @@ -901,9 +921,7 @@ private void disconnect(Direction side, Holder> conduit) { } if (hasChanged) { - setChanged(); - level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); - updateShape(); + bundleChanged(); } } @@ -919,7 +937,7 @@ private void dropConnectionItems(Direction side, Holder> conduit) // TODO: I've not properly reviewed this method. public void updateConnections(Level level, BlockPos pos, @Nullable BlockPos fromPos, boolean shouldActivate) { - if (fromPos != null && level.getBlockEntity(fromPos) instanceof NewConduitBundleBlockEntity) { + if (fromPos != null && level.getBlockEntity(fromPos) instanceof ConduitBundleBlockEntity) { return; } @@ -1427,7 +1445,7 @@ public boolean hasEndpoint(Direction side) { } } - private record ConnectionHost(NewConduitBundleBlockEntity conduitBundle, Holder> conduit) implements ConduitConnectionHost { + private record ConnectionHost(ConduitBundleBlockEntity conduitBundle, Holder> conduit) implements ConduitConnectionHost { @Override public BlockPos pos() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleInventory.java similarity index 94% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleInventory.java index d9488fc4e8..01c18fff8c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitBundleInventory.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleInventory.java @@ -21,7 +21,7 @@ import net.neoforged.neoforge.common.util.INBTSerializable; import net.neoforged.neoforge.items.IItemHandlerModifiable; -public class NewConduitBundleInventory implements IItemHandlerModifiable, INBTSerializable { +public class ConduitBundleInventory implements IItemHandlerModifiable, INBTSerializable { // TODO: Currently conduit inventories are fairly strict - we might be able to // improve this in the future? @@ -35,7 +35,7 @@ public class NewConduitBundleInventory implements IItemHandlerModifiable, INBTSe private Map>, Map>> conduitSlots = new HashMap<>(); - public NewConduitBundleInventory(ConduitBundleReader conduitBundle) { + public ConduitBundleInventory(ConduitBundleReader conduitBundle) { this.conduitBundle = conduitBundle; } @@ -52,7 +52,7 @@ public void removeConduit(Holder> conduit) { @Override public int getSlots() { - return MAX_SLOTS_PER_CONDUIT * NewConduitBundleBlockEntity.MAX_CONDUITS * MAX_CONNECTIONS; + return MAX_SLOTS_PER_CONDUIT * ConduitBundleBlockEntity.MAX_CONDUITS * MAX_CONNECTIONS; } @Override @@ -189,7 +189,7 @@ public void deserializeNBT(HolderLookup.Provider registries, CompoundTag tag) { } } - private record InventoryReference(NewConduitBundleInventory inventory, Holder> conduit) + private record InventoryReference(ConduitBundleInventory inventory, Holder> conduit) implements ConduitInventory { @Override public ItemStack getStackInSlot(Direction side, SlotType slotType) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitShape.java similarity index 99% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitShape.java index a69ad08ca8..78ef4871ae 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/NewConduitShape.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitShape.java @@ -21,7 +21,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; -public class NewConduitShape { +public class ConduitShape { private final Map>>, VoxelShape> conduitConnections = new HashMap<>(); private final Map>, VoxelShape> conduitShapes = new HashMap<>(); @@ -33,7 +33,7 @@ public class NewConduitShape { private static final VoxelShape CORE = Block.box(6.5f, 6.5f, 6.5f, 9.5f, 9.5f, 9.5f); private VoxelShape totalShape = CORE; - public NewConduitShape() { + public ConduitShape() { } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java index d4e27de59f..8500e82928 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/NewConduitMenu.java @@ -5,10 +5,8 @@ import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; -import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitMenus; import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; @@ -28,12 +26,12 @@ // This means server menu should get/set connections direct from the BE but the client should have a standalone config store. // Need to work out what this means for the client sync tag - it might need to be synced separately to the client from this GUI too. // Possibly create an NBT sync slot and then use it for that? -public class NewConduitMenu extends BaseBlockEntityMenu { +public class NewConduitMenu extends BaseBlockEntityMenu { public static final int BUTTON_TOGGLE_0_ID = 0; public static final int BUTTON_TOGGLE_1_ID = 1; public static final int BUTTON_SELECT_CONDUIT_START_ID = 2; - public static final int BUTTON_SELECT_CONDUIT_ID_COUNT = NewConduitBundleBlockEntity.MAX_CONDUITS; + public static final int BUTTON_SELECT_CONDUIT_ID_COUNT = ConduitBundleBlockEntity.MAX_CONDUITS; private static final int RESERVED_BUTTON_ID_COUNT = BUTTON_SELECT_CONDUIT_START_ID + BUTTON_SELECT_CONDUIT_ID_COUNT + 1; @@ -45,7 +43,7 @@ public class NewConduitMenu extends BaseBlockEntityMenu> selectedConduit) { + public NewConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBlockEntity blockEntity, Direction side, Holder> selectedConduit) { super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory, blockEntity); this.side = side; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java index 72f1a33cb3..93516a262e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java @@ -25,10 +25,10 @@ public class ItemConduitTicker extends NewIOAwareConduitTicker { @Override - protected void tickColoredGraph(ServerLevel level, ItemConduit conduit, List inserts, List extracts, DyeColor color, + protected void tickColoredGraph(ServerLevel level, ItemConduit conduit, List senders, List receivers, DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { - toNextExtract: for (Connection extract : extracts) { + toNextExtract: for (Connection extract : receivers) { ItemConduitNodeData nodeData = extract.node().getOrCreateNodeData(ConduitTypes.NodeData.ITEM.get()); IItemHandler extractHandler = extract.itemHandler(); @@ -53,14 +53,14 @@ protected void tickColoredGraph(ServerLevel level, ItemConduit conduit, List connectionConfigTyp @Override public RedstoneConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { - return new RedstoneConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel); + return new RedstoneConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel, false); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java index f1efb854ba..639027cb4c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java @@ -2,8 +2,7 @@ import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; +import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -13,32 +12,36 @@ import net.minecraft.world.item.DyeColor; public record RedstoneConduitConnectionConfig( - boolean canInsert, - DyeColor insertChannel, - boolean canExtract, - DyeColor extractChannel -) implements ChanneledIOConnectionConfig { + boolean isSend, + DyeColor sendColor, + boolean isReceive, + DyeColor receiveColor, + boolean isStrongOutputSignal +) implements NewIOConnectionConfig { - public static RedstoneConduitConnectionConfig DEFAULT = new RedstoneConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.RED); + public static RedstoneConduitConnectionConfig DEFAULT = new RedstoneConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.RED, false); public static MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( - Codec.BOOL.fieldOf("can_insert").forGetter(RedstoneConduitConnectionConfig::canInsert), - DyeColor.CODEC.fieldOf("insert_channel").forGetter(RedstoneConduitConnectionConfig::insertChannel), - Codec.BOOL.fieldOf("can_extract").forGetter(RedstoneConduitConnectionConfig::canExtract), - DyeColor.CODEC.fieldOf("extract_channel").forGetter(RedstoneConduitConnectionConfig::extractChannel) + Codec.BOOL.fieldOf("is_send").forGetter(RedstoneConduitConnectionConfig::isSend), + DyeColor.CODEC.fieldOf("send_color").forGetter(RedstoneConduitConnectionConfig::sendColor), + Codec.BOOL.fieldOf("is_receive").forGetter(RedstoneConduitConnectionConfig::isReceive), + DyeColor.CODEC.fieldOf("receive_color").forGetter(RedstoneConduitConnectionConfig::receiveColor), + Codec.BOOL.fieldOf("is_strong_output_signal").forGetter(RedstoneConduitConnectionConfig::isStrongOutputSignal) ).apply(instance, RedstoneConduitConnectionConfig::new) ); public static StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.BOOL, - RedstoneConduitConnectionConfig::canInsert, + RedstoneConduitConnectionConfig::isSend, DyeColor.STREAM_CODEC, - RedstoneConduitConnectionConfig::insertChannel, + RedstoneConduitConnectionConfig::sendColor, ByteBufCodecs.BOOL, - RedstoneConduitConnectionConfig::canExtract, + RedstoneConduitConnectionConfig::isReceive, DyeColor.STREAM_CODEC, - RedstoneConduitConnectionConfig::extractChannel, + RedstoneConduitConnectionConfig::receiveColor, + ByteBufCodecs.BOOL, + RedstoneConduitConnectionConfig::isStrongOutputSignal, RedstoneConduitConnectionConfig::new ); @@ -47,27 +50,27 @@ public record RedstoneConduitConnectionConfig( @Override public ConnectionConfig reconnected() { - return new RedstoneConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.insertChannel, DEFAULT.canExtract, DEFAULT.extractChannel); + return new RedstoneConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, receiveColor, isStrongOutputSignal); } - @Override - public IOConnectionConfig withInsert(boolean canInsert) { - return new RedstoneConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel); + public RedstoneConduitConnectionConfig withIsSend(boolean isSend) { + return new RedstoneConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, isStrongOutputSignal); } - @Override - public IOConnectionConfig withExtract(boolean canExtract) { - return new RedstoneConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel); + public RedstoneConduitConnectionConfig withSendColor(DyeColor sendColor) { + return new RedstoneConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, isStrongOutputSignal); } - @Override - public RedstoneConduitConnectionConfig withInputChannel(DyeColor inputChannel) { - return new RedstoneConduitConnectionConfig(canInsert, inputChannel, canExtract, extractChannel); + public RedstoneConduitConnectionConfig withIsReceive(boolean isReceive) { + return new RedstoneConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, isStrongOutputSignal); } - @Override - public RedstoneConduitConnectionConfig withOutputChannel(DyeColor outputChannel) { - return new RedstoneConduitConnectionConfig(canInsert, insertChannel, canExtract, outputChannel); + public RedstoneConduitConnectionConfig withReceiveColor(DyeColor receiveColor) { + return new RedstoneConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, isStrongOutputSignal); + } + + public RedstoneConduitConnectionConfig withIsStrongOutputSignal(boolean isStrongOutputSignal) { + return new RedstoneConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, isStrongOutputSignal); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java index c5296a3e7f..b7cb9b69c3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java @@ -15,6 +15,7 @@ public class RedstoneConduitNetworkContext implements ConduitNetworkContext TYPE = new ConduitNetworkContextType<>(null, RedstoneConduitNetworkContext::new); private boolean isActive; + private Map previousChannelSignals = new HashMap<>(); private Map channelSignals = new HashMap<>(); public RedstoneConduitNetworkContext() { @@ -37,13 +38,26 @@ public int getSignal(DyeColor color) { return channelSignals.getOrDefault(color, 0); } + // Used for change detection in the ticker. + public int getSignalLastTick(DyeColor color) { + return previousChannelSignals.getOrDefault(color, 0); + } + public void clear() { + // Save for change detection + for (DyeColor color : DyeColor.values()) { + previousChannelSignals.put(color, getSignal(color)); + } + channelSignals.clear(); isActive = false; } public void setSignal(DyeColor color, int signal) { - channelSignals.put(color, signal); + if (getSignal(color) < signal) { + channelSignals.put(color, signal); + } + isActive = channelSignals.values().stream().anyMatch(i -> i > 0); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java index 61cfb86005..6afed080b0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java @@ -4,6 +4,7 @@ import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.ChannelIOAwareConduitTicker; +import com.enderio.conduits.api.ticker.NewIOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.redstone.RedstoneExtractFilter; @@ -17,9 +18,7 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -public class RedstoneConduitTicker extends ChannelIOAwareConduitTicker { - - private final Map activeColors = new EnumMap<>(DyeColor.class); +public class RedstoneConduitTicker extends NewIOAwareConduitTicker { @Override public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork graph, @@ -29,7 +28,6 @@ public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork boolean isActiveBeforeTick = context.isActive(); context.clear(); - activeColors.clear(); super.tickGraph(level, conduit, graph, coloredRedstoneProvider); // If active changed, nodes need to be synced. @@ -41,18 +39,17 @@ public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork } @Override - public void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List inserts, - List extracts, DyeColor color, ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider) { + protected void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List senders, + List receivers, DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { RedstoneConduitNetworkContext networkContext = graph.getOrCreateContext(RedstoneConduitNetworkContext.TYPE); - for (SimpleConnection extract : extracts) { + for (Connection receiver : receivers) { int signal; - if (extract.extractFilter() instanceof RedstoneExtractFilter filter) { - signal = filter.getInputSignal(level, extract.neighborPos(), extract.neighborSide()); + if (receiver.extractFilter() instanceof RedstoneExtractFilter filter) { + signal = filter.getInputSignal(level, receiver.neighborPos(), receiver.neighborSide()); } else { - signal = level.getSignal(extract.neighborPos(), extract.neighborSide()); + signal = level.getSignal(receiver.neighborPos(), receiver.neighborSide()); } if (signal > 0) { @@ -60,20 +57,32 @@ public void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List senders, List receivers) { + return senders.isEmpty() && receivers.isEmpty(); } @Override - protected boolean shouldSkipColor(List extractList, List insertList) { - // Skip if the channel is completely un-utilised. - return extractList.isEmpty() && insertList.isEmpty(); + protected @Nullable Connection createConnection(Level level, ConduitNode node, Direction side) { + return new Connection(node, side, node.getConnectionConfig(side, RedstoneConduitConnectionConfig.TYPE)); + } + + protected static class Connection extends SimpleConnection { + public Connection(ConduitNode node, Direction side, RedstoneConduitConnectionConfig config) { + super(node, side, config); + } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java index 4771ce5704..9e5ead741a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlockEntities.java @@ -2,7 +2,7 @@ import com.enderio.conduits.EnderIOConduits; import com.enderio.conduits.api.EnderIOConduitsRegistries; -import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import com.enderio.regilite.holder.RegiliteBlockEntity; import com.enderio.regilite.registry.BlockEntityRegistry; import net.neoforged.bus.api.IEventBus; @@ -15,8 +15,8 @@ public class ConduitBlockEntities { private static final BlockEntityRegistry BLOCK_ENTITY_REGISTRY = EnderIOConduits.REGILITE.blockEntityRegistry(); - public static final RegiliteBlockEntity CONDUIT = BLOCK_ENTITY_REGISTRY - .registerBlockEntity("conduit", NewConduitBundleBlockEntity::new, ConduitBlocks.CONDUIT); + public static final RegiliteBlockEntity CONDUIT = BLOCK_ENTITY_REGISTRY + .registerBlockEntity("conduit", ConduitBundleBlockEntity::new, ConduitBlocks.CONDUIT); @SubscribeEvent public static void registerConduitCapabilities(RegisterCapabilitiesEvent event) { @@ -29,7 +29,7 @@ public static void registerConduitCapabilities(RegisterCapabilitiesEvent event) private static void registerConduitCapability(RegisterCapabilitiesEvent event, BlockCapability capability) { event.registerBlockEntity(capability, CONDUIT.get(), - NewConduitBundleBlockEntity.createCapabilityProvider(capability)); + ConduitBundleBlockEntity.createCapabilityProvider(capability)); } public static void register(IEventBus bus) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlocks.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlocks.java index 81ab8242d9..29cf2b2644 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlocks.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitBlocks.java @@ -4,7 +4,7 @@ import com.enderio.conduits.EnderIOConduits; import com.enderio.conduits.client.ConduitFacadeColor; import com.enderio.conduits.common.conduit.ConduitBlockItem; -import com.enderio.conduits.common.conduit.bundle.NewConduitBundleBlock; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlock; import com.enderio.conduits.data.model.ConduitBlockState; import com.enderio.regilite.holder.RegiliteBlock; import com.enderio.regilite.registry.BlockRegistry; @@ -19,8 +19,8 @@ public class ConduitBlocks { private static final ItemRegistry ITEM_REGISTRY = EnderIOConduits.REGILITE.itemRegistry(); private static final BlockRegistry BLOCK_REGISTRY = EnderIOConduits.REGILITE.blockRegistry(); - public static final RegiliteBlock CONDUIT = BLOCK_REGISTRY - .registerBlock("conduit", NewConduitBundleBlock::new, + public static final RegiliteBlock CONDUIT = BLOCK_REGISTRY + .registerBlock("conduit", ConduitBundleBlock::new, BlockBehaviour.Properties.of() .strength(1.5f, 10) .noLootTable() diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java index f2be768231..0ceade5274 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java @@ -84,6 +84,12 @@ public class ConduitLang { public static final Component CONDUIT_OUTPUT = addTranslation("gui", EnderIO.loc("conduit.output"), "Output"); + // Redstone Conduit + public static final Component CONDUIT_REDSTONE_SIGNAL_COLOR = addTranslation("gui", EnderIO.loc("conduit.redstone.signal_color"), + "Signal Color"); + public static final Component CONDUIT_REDSTONE_STRONG_SIGNAL = addTranslation("gui", EnderIO.loc("conduit.redstone.strong_signal"), + "Strong Signal"); + public static final MutableComponent TRANSPARENT_FACADE_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit_facade.transparent"), "Transparent: Hides conduits when painted with a translucent block"); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java index 7ad3e73cf5..7ebc630e62 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/integrations/cctweaked/EIOBundledRedstoneProvider.java @@ -1,16 +1,14 @@ package com.enderio.conduits.common.integrations.cctweaked; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.conduit.block.ConduitBundleBlockEntity; -import com.enderio.conduits.common.conduit.connection.ConnectionState; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.api.ConduitRedstoneSignalAware; +import com.enderio.conduits.api.connection.ConnectionStatus; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitTypes; -import com.enderio.conduits.common.init.Conduits; import dan200.computercraft.api.redstone.BundledRedstoneProvider; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Holder; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -23,24 +21,40 @@ public class EIOBundledRedstoneProvider implements BundledRedstoneProvider { public int getBundledRedstoneOutput(Level world, BlockPos pos, Direction side) { BlockEntity be = world.getBlockEntity(pos); - Holder> redstoneConduit = world.holderOrThrow(Conduits.REDSTONE); - -// if (be instanceof ConduitBundleBlockEntity conduit) { -// ConnectionState connectionState = conduit.getBundle().getConnectionState(side, redstoneConduit); -// if (connectionState instanceof DynamicConnectionState dyn && dyn.isInsert()) { -// RedstoneConduitData data = conduit.getBundle().getNodeFor(redstoneConduit).getData(ConduitTypes.Data.REDSTONE.get()); -// if (data == null) { -// return -1; -// } -// -// int out = 0; -// -// for (DyeColor color : DyeColor.values()) { -// out |= (data.isActive(color) ? 1 : 0) << color.getId(); -// } -// return out; -// } -// } + if (be instanceof ConduitBundleBlockEntity conduit) { + var redstoneConduit = conduit.getConduitByType(ConduitTypes.REDSTONE.get()); + if (redstoneConduit == null) { + return -1; + } + + if (conduit.getConnectionStatus(side, redstoneConduit) != ConnectionStatus.CONNECTED_BLOCK) { + return -1; + } + + var config = conduit.getConnectionConfig(side, redstoneConduit, RedstoneConduitConnectionConfig.TYPE); + if (!config.canSend(ConduitRedstoneSignalAware.NONE)) { + return -1; + } + + var node = conduit.getConduitNode(redstoneConduit); + var network = node.getNetwork(); + if (network == null) { + return -1; + } + + var context = network.getContext(RedstoneConduitNetworkContext.TYPE); + if (context == null) { + return -1; + } + + int out = 0; + + for (DyeColor color : DyeColor.values()) { + out |= (context.isActive(color) ? 1 : 0) << color.getId(); + } + return out; + } + return -1; } } From 1c7fc5e1a61b64d99b8ffb885880e4840b219e1c Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sat, 11 Jan 2025 01:10:54 +0000 Subject: [PATCH 12/27] chore: Re-add client facades map and use highlight event instead of the messy getShape I did --- .../client/ConduitFacadeRendering.java | 168 +++++++++--------- .../client/ConduitHighlightEvent.java | 31 ++-- .../client/gui/screen/NewConduitScreen.java | 13 +- .../conduit/bundle/ConduitBundleBlock.java | 59 +----- .../bundle/ConduitBundleBlockEntity.java | 29 ++- .../{NewConduitMenu.java => ConduitMenu.java} | 6 +- .../conduits/common/init/ConduitMenus.java | 6 +- .../network/ConduitClientPayloadHandler.java | 4 - .../network/ConduitCommonPayloadHandler.java | 4 +- 9 files changed, 139 insertions(+), 181 deletions(-) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/{NewConduitMenu.java => ConduitMenu.java} (96%) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeRendering.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeRendering.java index c1a9cb5986..ee5415d84b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeRendering.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeRendering.java @@ -1,83 +1,85 @@ -//package com.enderio.conduits.client; -// -//import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; -//import com.mojang.blaze3d.vertex.VertexConsumer; -//import java.util.Map; -//import net.minecraft.client.Minecraft; -//import net.minecraft.client.multiplayer.ClientLevel; -//import net.minecraft.client.renderer.LightTexture; -//import net.minecraft.client.renderer.Sheets; -//import net.minecraft.client.renderer.texture.OverlayTexture; -//import net.minecraft.core.BlockPos; -//import net.minecraft.util.FastColor; -//import net.minecraft.util.RandomSource; -//import net.minecraft.world.level.LightLayer; -//import net.minecraft.world.level.block.state.BlockState; -//import net.neoforged.api.distmarker.Dist; -//import net.neoforged.bus.api.SubscribeEvent; -//import net.neoforged.fml.common.EventBusSubscriber; -//import net.neoforged.neoforge.client.event.RenderLevelStageEvent; -//import net.neoforged.neoforge.client.model.data.ModelData; -//import net.neoforged.neoforge.client.model.pipeline.VertexConsumerWrapper; -// -//@EventBusSubscriber(bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) -//public class ConduitFacadeRendering { -// -// @SubscribeEvent -// static void renderFacade(RenderLevelStageEvent event) { -// if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS || FacadeHelper.areFacadesVisible()) { -// return; -// } -// -// for (Map.Entry entry : ConduitBundleBlockEntity.FACADES.entrySet()) { -// ClientLevel level = Minecraft.getInstance().level; -// if (!level.isLoaded(entry.getKey())) { -// return; -// } -// if (level.getBlockState(entry.getKey()).getBlock() instanceof ConduitBundleBlock) { -// if (entry.getValue() == null) { -// continue; -// } -// -// var baseConsumer = Minecraft.getInstance() -// .renderBuffers() -// .bufferSource() -// .getBuffer(Sheets.translucentCullBlockSheet()); -// var wrappedConsumer = new VertexConsumerWrapper(baseConsumer) { -// @Override -// public VertexConsumer setColor(int r, int g, int b, int a) { -// super.setColor(r, g, b, 85); -// return this; -// } -// }; -// -// var cameraPos = event.getCamera().getPosition(); -// event.getPoseStack().pushPose(); -// event.getPoseStack() -// .translate(entry.getKey().getX() - cameraPos.x, entry.getKey().getY() - cameraPos.y, -// entry.getKey().getZ() - cameraPos.z); -// -// var model = Minecraft.getInstance() -// .getModelManager() -// .getBlockModelShaper() -// .getBlockModel(entry.getValue()); -// int color = Minecraft.getInstance().getBlockColors().getColor(entry.getValue(), level, entry.getKey()); -// for (var renderType : model.getRenderTypes(entry.getValue(), RandomSource.create(), ModelData.EMPTY)) { -// Minecraft.getInstance() -// .getBlockRenderer() -// .getModelRenderer() -// .renderModel(event.getPoseStack().last(), wrappedConsumer, entry.getValue(), model, -// FastColor.ARGB32.red(color) / 255.0F, FastColor.ARGB32.green(color) / 255.0F, -// FastColor.ARGB32.blue(color) / 255.0F, -// LightTexture.pack(level.getBrightness(LightLayer.BLOCK, entry.getKey()), -// level.getBrightness(LightLayer.SKY, entry.getKey())), -// OverlayTexture.NO_OVERLAY, -// model.getModelData(level, entry.getKey(), entry.getValue(), ModelData.EMPTY), -// renderType); -// } -// Minecraft.getInstance().renderBuffers().bufferSource().endBatch(Sheets.translucentCullBlockSheet()); -// event.getPoseStack().popPose(); -// } -// } -// } -//} +package com.enderio.conduits.client; + +import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlock; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; +import com.mojang.blaze3d.vertex.VertexConsumer; +import java.util.Map; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.util.FastColor; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.client.model.data.ModelData; +import net.neoforged.neoforge.client.model.pipeline.VertexConsumerWrapper; + +@EventBusSubscriber(bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) +public class ConduitFacadeRendering { + + @SubscribeEvent + static void renderFacade(RenderLevelStageEvent event) { + if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS || FacadeHelper.areFacadesVisible()) { + return; + } + + for (Map.Entry entry : ConduitBundleBlockEntity.FACADES.entrySet()) { + ClientLevel level = Minecraft.getInstance().level; + if (!level.isLoaded(entry.getKey())) { + return; + } + if (level.getBlockState(entry.getKey()).getBlock() instanceof ConduitBundleBlock) { + if (entry.getValue() == null) { + continue; + } + + var baseConsumer = Minecraft.getInstance() + .renderBuffers() + .bufferSource() + .getBuffer(Sheets.translucentCullBlockSheet()); + var wrappedConsumer = new VertexConsumerWrapper(baseConsumer) { + @Override + public VertexConsumer setColor(int r, int g, int b, int a) { + super.setColor(r, g, b, 85); + return this; + } + }; + + var cameraPos = event.getCamera().getPosition(); + event.getPoseStack().pushPose(); + event.getPoseStack() + .translate(entry.getKey().getX() - cameraPos.x, entry.getKey().getY() - cameraPos.y, + entry.getKey().getZ() - cameraPos.z); + + var model = Minecraft.getInstance() + .getModelManager() + .getBlockModelShaper() + .getBlockModel(entry.getValue()); + int color = Minecraft.getInstance().getBlockColors().getColor(entry.getValue(), level, entry.getKey()); + for (var renderType : model.getRenderTypes(entry.getValue(), RandomSource.create(), ModelData.EMPTY)) { + Minecraft.getInstance() + .getBlockRenderer() + .getModelRenderer() + .renderModel(event.getPoseStack().last(), wrappedConsumer, entry.getValue(), model, + FastColor.ARGB32.red(color) / 255.0F, FastColor.ARGB32.green(color) / 255.0F, + FastColor.ARGB32.blue(color) / 255.0F, + LightTexture.pack(level.getBrightness(LightLayer.BLOCK, entry.getKey()), + level.getBrightness(LightLayer.SKY, entry.getKey())), + OverlayTexture.NO_OVERLAY, + model.getModelData(level, entry.getKey(), entry.getValue(), ModelData.EMPTY), + renderType); + } + Minecraft.getInstance().renderBuffers().bufferSource().endBatch(Sheets.translucentCullBlockSheet()); + event.getPoseStack().popPose(); + } + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitHighlightEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitHighlightEvent.java index d9bac83658..ecdec9e2c4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitHighlightEvent.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitHighlightEvent.java @@ -2,6 +2,7 @@ import com.enderio.conduits.EnderIOConduits; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; @@ -23,20 +24,20 @@ public static void highlight(RenderHighlightEvent.Block event) { return; } -// if (minecraft.level -// .getBlockEntity(event.getTarget().getBlockPos()) instanceof ConduitBundleBlockEntity conduit) { -// // Use standard block highlights for facades. -// if (conduit.getBundle().hasFacade() && FacadeHelper.areFacadesVisible()) { -// return; -// } -// -// event.setCanceled(true); -// BlockPos pos = event.getTarget().getBlockPos(); -// Vec3 camPos = event.getCamera().getPosition(); -// LevelRenderer.renderShape(event.getPoseStack(), event.getMultiBufferSource().getBuffer(RenderType.lines()), -// conduit.getShape().getShapeFromHit(event.getTarget().getBlockPos(), event.getTarget()), -// (double) pos.getX() - camPos.x, (double) pos.getY() - camPos.y, (double) pos.getZ() - camPos.z, -// 0.0F, 0.0F, 0.0F, 0.4F); -// } + if (minecraft.level + .getBlockEntity(event.getTarget().getBlockPos()) instanceof ConduitBundleBlockEntity conduit) { + // Use standard block highlights for facades. + if (conduit.hasFacade() && FacadeHelper.areFacadesVisible()) { + return; + } + + event.setCanceled(true); + BlockPos pos = event.getTarget().getBlockPos(); + Vec3 camPos = event.getCamera().getPosition(); + LevelRenderer.renderShape(event.getPoseStack(), event.getMultiBufferSource().getBuffer(RenderType.lines()), + conduit.getShape().getShapeFromHit(event.getTarget().getBlockPos(), event.getTarget()), + (double) pos.getX() - camPos.x, (double) pos.getY() - camPos.y, (double) pos.getZ() - camPos.z, + 0.0F, 0.0F, 0.0F, 0.4F); + } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java index daa22d1160..8224de44e3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java @@ -18,9 +18,8 @@ import com.enderio.conduits.api.screen.ConduitScreenHelper; import com.enderio.conduits.api.screen.ConduitScreenType; import com.enderio.conduits.client.gui.screen.types.ConduitScreenTypes; -import com.enderio.conduits.common.conduit.menu.NewConduitMenu; +import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.init.ConduitLang; -import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; @@ -46,7 +45,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -public class NewConduitScreen extends EnderContainerScreen { +public class NewConduitScreen extends EnderContainerScreen { public static final ResourceLocation TEXTURE = EnderIO.loc("textures/gui/conduit.png"); private static final int WIDTH = 206; private static final int HEIGHT = 195; @@ -57,7 +56,7 @@ public class NewConduitScreen extends EnderContainerScreen { private final List preRenderActions = new ArrayList<>(); - public NewConduitScreen(NewConduitMenu pMenu, Inventory pPlayerInventory, Component pTitle) { + public NewConduitScreen(ConduitMenu pMenu, Inventory pPlayerInventory, Component pTitle) { super(pMenu, pPlayerInventory, pTitle); // this.shouldRenderLabels = true; @@ -89,15 +88,15 @@ protected void init() { // Add enable checkboxes if (menu.connectionConfigType().supportsIO()) { addRenderableWidget(ToggleIconButton.createCheckbox(leftX, leftY, () -> getIOConnectionConfig().canInsert(), - newVal -> handleButtonPress(NewConduitMenu.BUTTON_TOGGLE_0_ID))); + newVal -> handleButtonPress(ConduitMenu.BUTTON_TOGGLE_0_ID))); addRenderableWidget(ToggleIconButton.createCheckbox(rightX, rightY, () -> getIOConnectionConfig().canExtract(), - newVal -> handleButtonPress(NewConduitMenu.BUTTON_TOGGLE_1_ID))); + newVal -> handleButtonPress(ConduitMenu.BUTTON_TOGGLE_1_ID))); leftY += 20; rightY += 20; } else { addRenderableWidget(ToggleIconButton.createCheckbox(leftX, leftY, this::isConnected, - newVal -> handleButtonPress(NewConduitMenu.BUTTON_TOGGLE_0_ID))); + newVal -> handleButtonPress(ConduitMenu.BUTTON_TOGGLE_0_ID))); leftY += 20; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java index ac6c5d8b9d..9c526d5391 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java @@ -97,63 +97,6 @@ public ConduitBundleBlock(Properties properties) { @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - // TODO: Revert these changes for showing individual parts here. do it in ConduitHighlightEvent! - if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduit) { - if (conduit.hasFacade() && FacadeHelper.areFacadesVisible()) { - return Shapes.block(); - } - - // Ensure if a bundle is bugged with 0 conduits that it can be broken. - if (!conduit.getConduits().isEmpty()) { - // Only show the conduit that is being aimed at if this is a player. - if (context instanceof EntityCollisionContext entityCollisionContext) { - if (entityCollisionContext.getEntity() instanceof Player player) { - - // TODO: Config for this accessibility feature -// if (true) { -// var heldConduit = ConduitA11yManager.getHeldConduit(); -// -// // Option 1: always full -// // Return a full shape if the player is holding a conduit so they don't have to aim -//// if (heldConduit != null) { -//// return Shapes.block(); -//// return conduit.getShape().getEncompassingShape(); -//// } -// -// // Option 2: Full when present -// if (conduit.hasConduitStrict(heldConduit)) { -// return Shapes.block(); -// } -// } - - HitResult hit = visualPick(player); - if (hit.getType() == HitResult.Type.BLOCK) { - return conduit.getShape().getShapeFromHit(pos, hit); - } - } - } - - return conduit.getShape().getTotalShape(); - } - } - - // If there's no block entity, no shape - this will stop a bounding box flash - // when the bundle is first placed - return Shapes.empty(); - } - - private HitResult visualPick(Player player) { - double hitDistance = player.blockInteractionRange() + 5; - Vec3 from = player.getEyePosition(1); - - Vec3 viewVec = player.getViewVector(1); - Vec3 to = from.add(viewVec.scale(hitDistance)); - return player.level().clip(new ClipContext(from, to, ClipContext.Block.VISUAL, ClipContext.Fluid.NONE, player)); - } - - @Override - protected VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - // Needs separate handling so that the stock getShape can filter by VISUAL for player hit detection. return getBundleShape(level, pos, true); } @@ -316,7 +259,7 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, // TODO: Destroying the last conduit in the block has a laggy disconnect for the // neighbours... - HitResult hit = visualPick(player); + HitResult hit = player.pick(player.blockInteractionRange() + 5, 1, false);; if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { if (conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index 7d4ec09439..9f9484640d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -1,10 +1,10 @@ package com.enderio.conduits.common.conduit.bundle; +import com.enderio.base.api.UseOnly; import com.enderio.base.common.blockentity.Wrenchable; import com.enderio.conduits.ConduitNBTKeys; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitCapabilities; -import com.enderio.conduits.api.ConduitRedstoneSignalAware; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.bundle.ConduitInventory; import com.enderio.conduits.api.bundle.SlotType; @@ -27,8 +27,7 @@ import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; -import com.enderio.conduits.common.conduit.menu.NewConduitMenu; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; +import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.blockentity.EnderBlockEntity; @@ -77,16 +76,20 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.fml.LogicalSide; import net.neoforged.fml.loading.FMLLoader; import net.neoforged.neoforge.capabilities.BlockCapability; import net.neoforged.neoforge.capabilities.ICapabilityProvider; import net.neoforged.neoforge.client.model.data.ModelData; import org.jetbrains.annotations.Nullable; -public final class ConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor, Clearable, Wrenchable, NewConduitMenu.ConnectionAccessor { +public final class ConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor, Clearable, Wrenchable, ConduitMenu.ConnectionAccessor { public static final int MAX_CONDUITS = 9; + @UseOnly(LogicalSide.CLIENT) + public static final Map FACADES = new HashMap<>(); + private ItemStack facadeProvider = ItemStack.EMPTY; private List>> conduits = new ArrayList<>(); @@ -222,6 +225,12 @@ public void updateModel() { if (level != null) { level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), Block.UPDATE_ALL); } + + if (hasFacade()) { + FACADES.put(worldPosition, getFacadeBlock().defaultBlockState()); + } else { + FACADES.remove(worldPosition); + } } @Override @@ -342,7 +351,7 @@ public Component getDisplayName() { @Override public @Nullable AbstractContainerMenu createMenu(int containerId, Inventory inventory, Player player) { - return new NewConduitMenu(containerId, inventory, ConduitBundleBlockEntity.this, side, conduit); + return new ConduitMenu(containerId, inventory, ConduitBundleBlockEntity.this, side, conduit); } } @@ -1119,6 +1128,10 @@ private void loadConduitFromSavedData(ConduitSavedData savedData, Holder { +public class ConduitMenu extends BaseBlockEntityMenu { public static final int BUTTON_TOGGLE_0_ID = 0; public static final int BUTTON_TOGGLE_1_ID = 1; @@ -43,7 +43,7 @@ public class NewConduitMenu extends BaseBlockEntityMenu> selectedConduit) { + public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBlockEntity blockEntity, Direction side, Holder> selectedConduit) { super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory, blockEntity); this.side = side; @@ -56,7 +56,7 @@ public NewConduitMenu(int containerId, Inventory playerInventory, ConduitBundleB addPlayerInventorySlots(23, 113); } - public NewConduitMenu(int containerId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { + public ConduitMenu(int containerId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory, buf, ConduitBlockEntities.CONDUIT.get()); side = buf.readEnum(Direction.class); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java index a09a324817..10d945d1c4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java @@ -5,7 +5,7 @@ import com.enderio.conduits.client.gui.RedstoneDoubleChannelFilterScreen; import com.enderio.conduits.client.gui.RedstoneTimerFilterScreen; import com.enderio.conduits.client.gui.screen.NewConduitScreen; -import com.enderio.conduits.common.conduit.menu.NewConduitMenu; +import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.menu.RedstoneCountFilterMenu; import com.enderio.conduits.common.menu.RedstoneDoubleChannelFilterMenu; import com.enderio.conduits.common.menu.RedstoneTimerFilterMenu; @@ -16,8 +16,8 @@ public class ConduitMenus { private static final MenuRegistry MENU_REGISTRY = EnderIOConduits.REGILITE.menuRegistry(); - public static final RegiliteMenu CONDUIT_MENU = MENU_REGISTRY - .registerMenu("conduit", NewConduitMenu::new, () -> NewConduitScreen::new); + public static final RegiliteMenu CONDUIT_MENU = MENU_REGISTRY + .registerMenu("conduit", ConduitMenu::new, () -> NewConduitScreen::new); public static final RegiliteMenu REDSTONE_DOUBLE_CHANNEL_FILTER = MENU_REGISTRY .registerMenu("redstone_and_filter", RedstoneDoubleChannelFilterMenu::factory, () -> RedstoneDoubleChannelFilterScreen::new); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java index ed89ad67a2..40d3866930 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java @@ -1,9 +1,5 @@ package com.enderio.conduits.common.network; -import com.enderio.conduits.common.conduit.menu.NewConduitMenu; -import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; -import net.neoforged.neoforge.network.handling.IPayloadContext; - public class ConduitClientPayloadHandler { private static final ConduitClientPayloadHandler INSTANCE = new ConduitClientPayloadHandler(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java index f6c9e63ab5..75291d3de2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.network; -import com.enderio.conduits.common.conduit.menu.NewConduitMenu; +import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; import net.neoforged.neoforge.network.handling.IPayloadContext; @@ -11,7 +11,7 @@ public void handle(SetConduitConnectionConfigPacket packet, IPayloadContext cont // TODO: This is the same handler for client & server, maybe we need a common payload handler? context.enqueueWork(() -> { if (packet.containerId() == context.player().containerMenu.containerId) { - if (context.player().containerMenu instanceof NewConduitMenu menu) { + if (context.player().containerMenu instanceof ConduitMenu menu) { menu.setConnectionConfig(packet.connectionConfig()); } } From dde17be72aca12dd6dd1b99fa9369541de4490cd Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sat, 11 Jan 2025 02:16:46 +0000 Subject: [PATCH 13/27] fix: Some conduit disconnect issues and redstone bugs Also optimised redstone conduit updates a bit. --- .../conduit/bundle/ConduitBundleBlock.java | 2 - .../bundle/ConduitBundleBlockEntity.java | 40 +++++++++++++------ .../type/redstone/RedstoneConduit.java | 10 +++-- .../RedstoneConduitNetworkContext.java | 21 ++++++++-- .../type/redstone/RedstoneConduitTicker.java | 17 ++++---- 5 files changed, 60 insertions(+), 30 deletions(-) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java index 9c526d5391..22cdaf8479 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java @@ -189,8 +189,6 @@ protected void neighborChanged(BlockState state, Level level, BlockPos pos, Bloc // Invalidate caps in case of redstone update or something else. level.invalidateCapabilities(pos); - - // TODO: If redstone conduit, trigger a neighbour update for connections. } super.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index 9f9484640d..f0a02a7a84 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -190,16 +190,6 @@ public void onLoad() { private void bundleChanged() { level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); level.updateNeighborsAt(getBlockPos(), getBlockState().getBlock()); - - // Redstone conduits also need to update the neighbours they point to (for strong connections) - // TODO: This could wind up being sub-optimal? Maybe add some more specific hooks for when the config/connections are changed? - var redstoneConduit = getConduitByType(ConduitTypes.REDSTONE.get()); - if (redstoneConduit != null) { - for (Direction side : Direction.values()) { - level.updateNeighborsAt(getBlockPos().relative(side), getBlockState().getBlock()); - } - } - level.invalidateCapabilities(getBlockPos()); setChanged(); updateShape(); @@ -315,6 +305,8 @@ public ItemInteractionResult onWrenched(UseOnContext context) { ConduitSavedData.addPotentialGraph(conduitConnection.getSecond(), thisNode.getGraph(), serverLevel); ConduitSavedData.addPotentialGraph(conduitConnection.getSecond(), otherNode.getGraph(), serverLevel); + + bundleChanged(); } else { // TODO: Warn, this is a bad place to be. } @@ -647,9 +639,6 @@ public void removeConduit(Holder> conduit, @Nullable Player player } } - // Remove neighbour connections - removeNeighborConnections(conduit); - // Node remove event if (!level.isClientSide()) { var node = getConduitNode(conduit); @@ -670,6 +659,16 @@ public void removeConduit(Holder> conduit, @Nullable Player player conduitConnections.remove(conduit); conduitNodes.remove(conduit); + // Remove neighbour connections + removeNeighborConnections(conduit); + + // Fire redstone updates, if applicable. + if (conduit.value().type() == ConduitTypes.REDSTONE.get()) { + for (Direction side : Direction.values()) { + redstoneConduitChanged(side); + } + } + bundleChanged(); } @@ -1398,6 +1397,13 @@ public void clearContent() { // endregion + private void redstoneConduitChanged(Direction side) { + BlockPos neighborPos = getBlockPos().relative(side); + if (!level.getBlockState(neighborPos).is(getBlockState().getBlock())) { + level.updateNeighborsAt(getBlockPos().relative(side), getBlockState().getBlock()); + } + } + private class ConnectionContainer { private final Holder> conduit; private final Map statuses = new EnumMap<>(Direction.class); @@ -1436,6 +1442,10 @@ public void setStatus(Direction side, ConnectionStatus status) { } } } + + if (conduit.value().type() == ConduitTypes.REDSTONE.get()) { + redstoneConduitChanged(side); + } } public ConnectionConfig getConfig(Direction side) { @@ -1455,6 +1465,10 @@ public ConnectionConfig getConfig(Direction side) { public void setConfig(Direction side, ConnectionConfig config) { configs.put(side, config); + + if (conduit.value().type() == ConduitTypes.REDSTONE.get()) { + redstoneConduitChanged(side); + } } public boolean hasEndpoint(Direction side) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java index 62808ff778..581caf6354 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java @@ -3,10 +3,7 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.bundle.ConduitBundleReader; -import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.menu.ConduitMenuExtension; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitType; @@ -29,6 +26,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Set; + public record RedstoneConduit( ResourceLocation texture, ResourceLocation activeTexture, @@ -84,6 +83,11 @@ public ResourceLocation getTexture(@Nullable CompoundTag clientDataTag) { return texture(); } + @Override + public void onConnectionsUpdated(ConduitNode node, Level level, BlockPos pos, Set connectedSides) { + node.markDirty(); + } + @Override public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { BlockPos neighbor = conduitPos.relative(direction); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java index b7cb9b69c3..e9ec50e3f8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java @@ -2,8 +2,6 @@ import com.enderio.conduits.api.network.ConduitNetworkContext; import com.enderio.conduits.api.network.ConduitNetworkContextType; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.world.item.DyeColor; import java.util.HashMap; @@ -18,6 +16,8 @@ public class RedstoneConduitNetworkContext implements ConduitNetworkContext previousChannelSignals = new HashMap<>(); private Map channelSignals = new HashMap<>(); + private NewNetworkDelay newNetworkDelay = NewNetworkDelay.NEW; + public RedstoneConduitNetworkContext() { } @@ -26,6 +26,10 @@ private RedstoneConduitNetworkContext(boolean isActive, HashMap type() { return TYPE; } + + // Because the context is cleared before the graph ticks, we need to represent "newness" as three states. + private enum NewNetworkDelay { + NEW, NEW_DECAY, OLD + } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java index 6afed080b0..668996beac 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java @@ -3,14 +3,11 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.ticker.ChannelIOAwareConduitTicker; import com.enderio.conduits.api.ticker.NewIOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.redstone.RedstoneExtractFilter; -import java.util.EnumMap; import java.util.List; -import java.util.Map; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -26,14 +23,16 @@ public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork var context = graph.getOrCreateContext(RedstoneConduitNetworkContext.TYPE); boolean isActiveBeforeTick = context.isActive(); - context.clear(); + context.nextTick(); super.tickGraph(level, conduit, graph, coloredRedstoneProvider); - // If active changed, nodes need to be synced. - if (context.isActive() != isActiveBeforeTick) { + // If active changed -or- this graph is fresh, nodes need to be synced. + if (context.isNew() || context.isActive() != isActiveBeforeTick) { for (var node : graph.getNodes()) { - node.markDirty(); + if (node.isLoaded()) { + node.markDirty(); + } } } } @@ -57,8 +56,8 @@ protected void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List } } - // Only update neighbours if the signal strength changed this time. - if (networkContext.getSignal(color) != networkContext.getSignalLastTick(color)) { + // Only update neighbours if this is a new context or the signal strength changed this time. + if (networkContext.isNew() || networkContext.getSignal(color) != networkContext.getSignalLastTick(color)) { for (Connection sender : senders) { level.updateNeighborsAt(sender.pos(), ConduitBlocks.CONDUIT.get()); From 79eebcdcb5b83aa5215b6900bde8eb0763ac4320 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sat, 11 Jan 2025 02:31:49 +0000 Subject: [PATCH 14/27] fix: Redstone conduits removed from world when loading --- .../common/conduit/bundle/ConduitBundleBlockEntity.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index f0a02a7a84..9539ceacac 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -1398,9 +1398,11 @@ public void clearContent() { // endregion private void redstoneConduitChanged(Direction side) { - BlockPos neighborPos = getBlockPos().relative(side); - if (!level.getBlockState(neighborPos).is(getBlockState().getBlock())) { - level.updateNeighborsAt(getBlockPos().relative(side), getBlockState().getBlock()); + if (level != null) { + BlockPos neighborPos = getBlockPos().relative(side); + if (!level.getBlockState(neighborPos).is(getBlockState().getBlock())) { + level.updateNeighborsAt(getBlockPos().relative(side), getBlockState().getBlock()); + } } } From 31c52b03fe4ebd4deb87c7574526144519258c71 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 12 Jan 2025 03:12:09 +0000 Subject: [PATCH 15/27] chore: Lots of work on polishing conduit block behaviour and sync Also re-added logic for redstone input filtering --- .../resources/assets/enderio/lang/en_us.json | 1 + .../com/enderio/conduits/api/Conduit.java | 28 +- .../api/bundle/ConduitBundleReader.java | 10 +- .../RedstoneSensitiveConnectionConfig.java | 20 + .../api/menu/ConduitMenuComponent.java | 34 -- .../api/menu/ConduitMenuExtension.java | 35 -- .../conduits/api/menu/ConduitMenuLayout.java | 10 - .../conduits/api/menu/ConduitMenuType.java | 70 ---- .../api/model/ConduitModelModifier.java | 15 +- .../ConduitMenuDataAccess.java | 6 +- .../api/screen/ConduitScreenExtension.java | 1 + .../api/screen/ConduitScreenType.java | 1 - .../RegisterConduitScreenExtensionsEvent.java | 1 + .../RegisterConduitScreenTypesEvent.java | 21 ++ .../client/ConduitBundleExtension.java | 42 ++- .../conduits/client/ConduitClientSetup.java | 15 +- .../gui/conduit/ConduitScreenExtensions.java | 1 + .../conduit/FluidConduitScreenExtension.java | 5 +- .../conduit/ItemConduitScreenExtension.java | 67 ---- .../client/gui/screen/NewConduitScreen.java | 194 +--------- .../filter}/RedstoneCountFilterScreen.java | 2 +- .../RedstoneDoubleChannelFilterScreen.java | 3 +- .../filter}/RedstoneTimerFilterScreen.java | 2 +- .../gui/screen/types/ConduitScreenTypes.java | 9 +- .../screen/types/ItemConduitScreenType.java | 4 +- .../types/RedstoneConduitScreenType.java | 2 +- .../conduit/bundle/ConduitBundleModel.java | 22 +- .../bundle/ConduitBundleRenderState.java | 42 +-- .../bundle/ConduitConnectionRenderState.java | 32 +- .../modifier/EnergyConduitModelModifier.java | 11 - .../modifier/FluidConduitModelModifier.java | 6 +- .../RedstoneConduitModelModifier.java | 28 -- .../client/particle/ConduitBreakParticle.java | 85 ++++- .../conduit/bundle/ConduitBundleBlock.java | 116 +++--- .../bundle/ConduitBundleBlockEntity.java | 351 ++++++++++-------- .../conduit/facades/ConduitFacadeItem.java | 2 +- .../ConnectionState.java | 3 +- .../DynamicConnectionState.java | 2 +- .../LegacyFluidConduitData.java} | 25 +- .../LegacyItemConduitData.java} | 26 +- .../LegacyRedstoneConduitData.java} | 23 +- .../StaticConnectionStates.java | 2 +- .../{connection => legacy}/package-info.java | 2 +- .../common/conduit/menu/ConduitMenu.java | 157 ++++---- .../common/conduit/menu/package-info.java | 4 + .../conduit/type/energy/EnergyConduit.java | 1 - .../energy/EnergyConduitNetworkContext.java | 1 - .../type/energy/EnergyConduitStorage.java | 1 - .../conduit/type/fluid/FluidConduit.java | 41 +- .../fluid/FluidConduitConnectionConfig.java | 1 - .../common/conduit/type/item/ItemConduit.java | 22 +- .../item/ItemConduitConnectionConfig.java | 18 +- .../conduit/type/item/ItemConduitTicker.java | 2 - .../type/redstone/RedstoneConduit.java | 14 +- .../RedstoneConduitNetworkContext.java | 4 +- .../conduits/common/init/ConduitLang.java | 3 + .../conduits/common/init/ConduitMenus.java | 6 +- .../conduits/common/init/ConduitTypes.java | 22 +- .../network/C2SSetConduitConnectionState.java | 38 -- .../network/C2SSetConduitExtendedData.java | 26 -- .../network/ConduitClientPayloadHandler.java | 13 + .../network/ConduitCommonPayloadHandler.java | 2 - .../common/network/ConduitNetwork.java | 19 +- .../network/ConduitServerPayloadHandler.java | 53 --- .../network/S2CConduitExtraGuiDataPacket.java | 30 ++ .../common/network/S2CConduitListPacket.java | 3 + .../SetConduitConnectionConfigPacket.java | 2 +- .../C2SConduitConnectionPacket.java | 12 - .../C2SSetConduitChannelPacket.java | 47 --- .../C2SSetConduitRedstoneChannelPacket.java | 38 -- .../C2SSetConduitRedstoneControlPacket.java | 39 -- .../common/redstone/RedstoneANDFilter.java | 6 +- .../common/redstone/RedstoneCountFilter.java | 8 +- .../common/redstone/RedstoneInsertFilter.java | 4 +- .../common/redstone/RedstoneNANDFilter.java | 6 +- .../common/redstone/RedstoneNORFilter.java | 6 +- .../common/redstone/RedstoneNOTFilter.java | 6 +- .../common/redstone/RedstoneORFilter.java | 6 +- .../common/redstone/RedstoneTLatchFilter.java | 8 +- .../common/redstone/RedstoneXNORFilter.java | 6 +- .../common/redstone/RedstoneXORFilter.java | 6 +- 81 files changed, 795 insertions(+), 1263 deletions(-) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/RedstoneSensitiveConnectionConfig.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuComponent.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuExtension.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuLayout.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java rename enderio-conduits/src/main/java/com/enderio/conduits/api/{menu => screen}/ConduitMenuDataAccess.java (73%) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenTypesEvent.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ItemConduitScreenExtension.java rename enderio-conduits/src/main/java/com/enderio/conduits/client/gui/{ => screen/filter}/RedstoneCountFilterScreen.java (97%) rename enderio-conduits/src/main/java/com/enderio/conduits/client/gui/{ => screen/filter}/RedstoneDoubleChannelFilterScreen.java (95%) rename enderio-conduits/src/main/java/com/enderio/conduits/client/gui/{ => screen/filter}/RedstoneTimerFilterScreen.java (97%) delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/EnergyConduitModelModifier.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/RedstoneConduitModelModifier.java rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{connection => legacy}/ConnectionState.java (94%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{connection => legacy}/DynamicConnectionState.java (99%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{type/fluid/FluidConduitData.java => legacy/LegacyFluidConduitData.java} (73%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{type/item/ItemConduitData.java => legacy/LegacyItemConduitData.java} (84%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{type/redstone/RedstoneConduitData.java => legacy/LegacyRedstoneConduitData.java} (73%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{connection => legacy}/StaticConnectionStates.java (97%) rename enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/{connection => legacy}/package-info.java (62%) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/package-info.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitConnectionState.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitExtraGuiDataPacket.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java rename enderio-conduits/src/main/java/com/enderio/conduits/common/network/{connections => }/SetConduitConnectionConfigPacket.java (94%) delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java diff --git a/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json b/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json index 32bd0c5dd1..4eed1333a1 100644 --- a/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json +++ b/enderio-conduits/src/generated/resources/assets/enderio/lang/en_us.json @@ -1,6 +1,7 @@ { "block.enderio.conduit": "Conduit Bundle", "gui.enderio.conduit.enabled": "Enabled", + "gui.enderio.conduit.error.no_screen_type": "Error: No screen type defined", "gui.enderio.conduit.extract": "Extract", "gui.enderio.conduit.input": "Input", "gui.enderio.conduit.insert": "Insert", diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index 9341501824..36860f8458 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -29,7 +29,6 @@ import net.minecraft.world.item.component.TooltipProvider; import net.minecraft.world.level.Level; import net.neoforged.neoforge.capabilities.BlockCapability; -import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.Nullable; public interface Conduit, TConnectionConfig extends ConnectionConfig> extends Comparable, TooltipProvider { @@ -105,9 +104,20 @@ default boolean canConnectToConduit(Holder> other) { /** * This can be used to prevent connection between nodes with incompatible data. + * Warning: If you are unable to determine if the conduit is connectable, always return false - otherwise the client visual can desync. + * @apiNote only called on the server side, should mirror the behaviour of {@link #canConnectConduits(ConduitNode, ConduitNode)} for seamless block placement. * @return true if both nodes are compatible. */ - default boolean canConnectNodes(ConduitNode selfNode, ConduitNode otherNode) { + default boolean canConnectConduits(@Nullable CompoundTag selfRenderData, @Nullable CompoundTag otherRenderData) { + return true; + } + + /** + * This can be used to prevent connection between nodes with incompatible data. + * @apiNote only called on the server side. For seamless block placement, implement {@link #canConnectConduits(CompoundTag, CompoundTag)} + * @return true if both nodes are compatible. + */ + default boolean canConnectConduits(ConduitNode selfNode, ConduitNode otherNode) { return true; } @@ -132,9 +142,9 @@ default boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) /** * Gets the conduit texture to display, given the data. - * @param clientDataTag client data from {@link #getClientDataTag(ConduitNode)}. + * @param extraWorldData client data from {@link #getExtraWorldData(ConduitBundleReader, ConduitNode)}. */ - default ResourceLocation getTexture(@Nullable CompoundTag clientDataTag) { + default ResourceLocation getTexture(@Nullable CompoundTag extraWorldData) { return texture(); } @@ -191,16 +201,18 @@ default void copyLegacyData(ConduitNode node, ConduitDataAccessor legacyDataAcce // region Custom Sync - default boolean hasClientDataTag() { - return false; + @Nullable + default CompoundTag getExtraGuiData(ConduitBundleReader conduitBundle, ConduitNode node, Direction side) { + return null; } /** * Create a custom tag for syncing data from node data or network context to the client for extra behaviours. * @return custom sync data. */ - default CompoundTag getClientDataTag(ConduitNode node) { - throw new NotImplementedException(); + @Nullable + default CompoundTag getExtraWorldData(ConduitBundleReader conduitBundle, ConduitNode node) { + return null; } // endregion diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java index 48cb163aa1..50673a7e0e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -1,6 +1,7 @@ package com.enderio.conduits.api.bundle; import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; @@ -41,7 +42,11 @@ public interface ConduitBundleReader { * @return the client data tag, or null if there is none or the conduit doesn't sync extra data. */ @Nullable - CompoundTag getConduitClientDataTag(Holder> conduit); + CompoundTag getConduitExtraWorldData(Holder> conduit); + + // TODO: Docs + @Nullable + CompoundTag getConduitExtraGuiData(Direction side, Holder> conduit); /** * @implNote compare conduits using {@link Conduit#canConnectToConduit(Holder)} @@ -50,6 +55,9 @@ public interface ConduitBundleReader { */ boolean hasConduitByType(Holder> conduit); + // TODO: Docs + boolean hasConduitByType(ConduitType conduitType); + /** * @param conduit the conduit to check for * @return whether the bundle has this specific conduit. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/RedstoneSensitiveConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/RedstoneSensitiveConnectionConfig.java new file mode 100644 index 0000000000..d1c279ab78 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/RedstoneSensitiveConnectionConfig.java @@ -0,0 +1,20 @@ +package com.enderio.conduits.api.connection.config; + +import net.minecraft.world.item.DyeColor; +import org.jetbrains.annotations.ApiStatus; + +import java.util.List; + +/** + * Get the list of redstone signal colors that this connection is sensitive to. + * This is exclusively used for conduit connection rendering. + */ +@ApiStatus.Experimental +public interface RedstoneSensitiveConnectionConfig { + // TODO: Update this when we support 2 redstone colors. + /** + * @apiNote currently the conduit bundle model is only capable of rendering one signal color. In future this will expand to two. + * @return the redstone signal(s) this conduit is sensitive to. + */ + List getRedstoneSignalColors(); +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuComponent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuComponent.java deleted file mode 100644 index 58f9ce6038..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuComponent.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.enderio.conduits.api.menu; - -import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.mojang.datafixers.types.Func; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.DyeColor; -import org.jetbrains.annotations.ApiStatus; - -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; - -// TODO: is this stupid? -// It allows most menus to be defined without the need for custom widget logic. -@ApiStatus.Experimental -public sealed interface ConduitMenuComponent { - int x(); - int y(); - - record Text(int x, int y, Component text) implements ConduitMenuComponent { - } - - record ToggleButton(int x, int y, Component title, ResourceLocation enabledSprite, ResourceLocation disabledSprite, Function getter, Function onToggle) implements ConduitMenuComponent { - } - - record ColorPicker(int x, int y, Component title, Function getter, BiFunction setter) implements ConduitMenuComponent { - } - - record RedstoneControlPicker(int x, int y, Component title, Function getter, BiFunction setter) implements ConduitMenuComponent { - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuExtension.java deleted file mode 100644 index a6fc9ea201..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuExtension.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.enderio.conduits.api.menu; - -import com.enderio.conduits.api.network.node.ConduitNode; -import org.jetbrains.annotations.ApiStatus; - -import java.util.Map; -import java.util.function.Consumer; - -@ApiStatus.Experimental -public class ConduitMenuExtension { - // Enables custom button actions (like changing round robin mode) etc. for the menu. - // this is simple enough for 90% of use cases, and others can go ahead and use a packet. - private Map> customButtonActions; - - @ApiStatus.Internal - public boolean onMenuButtonClicked(ConduitNode node, int id) { - if (customButtonActions.containsKey(id)) { - customButtonActions.get(id).accept(node); - return true; - } - - return false; - } - - public static class Builder { - private Builder() { - } - - public Builder addCustomButtonAction(int buttonId, Runnable action) { - // TODO: Add to map. - - return this; - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuLayout.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuLayout.java deleted file mode 100644 index be94775f25..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuLayout.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.enderio.conduits.api.menu; - -import net.minecraft.network.chat.Component; - -public sealed interface ConduitMenuLayout permits ConduitMenuLayout.SingleColumn, ConduitMenuLayout.TwoColumns { - record SingleColumn(Component title, Runnable toggled) implements ConduitMenuLayout {} - - record TwoColumns(Component leftTitle, Runnable toggleLeft, Component rightTitle, Runnable toggleRight) implements - ConduitMenuLayout {} -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java deleted file mode 100644 index 4b6b493ad7..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuType.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.enderio.conduits.api.menu; - -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; - -public class ConduitMenuType { - - private final ConnectionConfigType connectionConfigType; - private final ConduitMenuLayout layout; - private final List> components; - - private ConduitMenuType(ConnectionConfigType connectionConfigType, ConduitMenuLayout layout, List> components) { - this.connectionConfigType = connectionConfigType; - this.layout = layout; - this.components = List.copyOf(components); - } - - public ConnectionConfigType connectionType() { - return connectionConfigType; - } - - public ConduitMenuLayout layout() { - return layout; - } - - public List> components() { - return components; - } - - public static , TConnectionConfig extends ConnectionConfig> Builder builder(ConnectionConfigType connectionConfigType) { - return new Builder<>(connectionConfigType); - } - - public static class Builder, TConnectionConfig extends ConnectionConfig> { - private final ConnectionConfigType connectionConfigType; - - @Nullable - private ConduitMenuLayout layout; - - private List> components = new ArrayList<>(); - - private Builder(ConnectionConfigType connectionConfigType) { - this.connectionConfigType = connectionConfigType; - } - - public Builder layout(ConduitMenuLayout layout) { - this.layout = layout; - return this; - } - - public Builder addComponent(ConduitMenuComponent component) { - this.components.add(component); - return this; - } - - public ConduitMenuType build() { - if (layout == null) { - throw new IllegalStateException("Layout must be set"); - } - - return new ConduitMenuType<>(connectionConfigType, layout, components); - } - } - -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java index e2d86e6f3f..c2e3e8d153 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java @@ -16,23 +16,10 @@ public interface ConduitModelModifier { - /** - * Used when the connection config does not support coloured connections. - * @return the colour to render arrows if not specified by the connection config. - */ - @Deprecated(forRemoval = true) - default DyeColor getDefaultArrowColor() { - return DyeColor.GREEN; - } - - default boolean shouldShowFakeConnection(ConduitBundleReader reader, Direction side) { - return false; - } - /** * Create additional quads to be rendered at the point of conduit connection. */ - default List createConnectionQuads(Holder> conduit, @Nullable CompoundTag clientDataTag, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, + default List createConnectionQuads(Holder> conduit, @Nullable CompoundTag extraWorldData, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, @Nullable RenderType type) { return List.of(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuDataAccess.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java similarity index 73% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuDataAccess.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java index 75c593149f..bdc96948cc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/menu/ConduitMenuDataAccess.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java @@ -1,8 +1,9 @@ -package com.enderio.conduits.api.menu; +package com.enderio.conduits.api.screen; import com.enderio.conduits.api.connection.config.ConnectionConfig; import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.function.Function; @@ -11,5 +12,6 @@ public interface ConduitMenuDataAccess { T getConnectionConfig(); void updateConnectionConfig(Function configModifier); - CompoundTag getClientDataTag(); + @Nullable + CompoundTag getExtraGuiData(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java index 1e51c446f7..9065faf6bb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java @@ -12,6 +12,7 @@ /** * Extend the conduit screen with additional widgets. */ +@Deprecated(forRemoval = true) public interface ConduitScreenExtension { @FunctionalInterface diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java index de88e85cad..4821a22325 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java @@ -1,7 +1,6 @@ package com.enderio.conduits.api.screen; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.menu.ConduitMenuDataAccess; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import org.jetbrains.annotations.ApiStatus; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java index 01730d37bc..6a6b1a8f4b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +@Deprecated(forRemoval = true) public class RegisterConduitScreenExtensionsEvent extends Event implements IModBusEvent { public interface ConduitScreenExtensionFactory { ConduitScreenExtension createExtension(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenTypesEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenTypesEvent.java new file mode 100644 index 0000000000..63d8b06583 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenTypesEvent.java @@ -0,0 +1,21 @@ +package com.enderio.conduits.api.screen; + +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.ConduitType; +import net.neoforged.bus.api.Event; +import net.neoforged.fml.event.IModBusEvent; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class RegisterConduitScreenTypesEvent extends Event implements IModBusEvent { + private final Map, ConduitScreenType> screenTypes = new ConcurrentHashMap<>(); + + public void register(ConduitType> conduitType, ConduitScreenType screenType) { + screenTypes.put(conduitType, screenType); + } + + public Map, ConduitScreenType> getScreenTypes() { + return Map.copyOf(screenTypes); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java index 83fcedb8d9..8619f708ea 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java @@ -1,9 +1,17 @@ package com.enderio.conduits.client; +import com.enderio.conduits.api.bundle.ConduitBundleReader; +import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; +import com.enderio.conduits.client.particle.ConduitBreakParticle; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlock; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleEngine; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.neoforged.neoforge.client.extensions.common.IClientBlockExtensions; @@ -16,13 +24,37 @@ private ConduitBundleExtension() { @Override public boolean addHitEffects(BlockState state, Level level, HitResult target, ParticleEngine manager) { - // TODO: Do it based on the aimed conduit - return true; + if (!(target instanceof BlockHitResult blockHitResult)) { + return false; + } + + if (level.getBlockEntity(blockHitResult.getBlockPos()) instanceof ConduitBundleBlockEntity conduitBundle) { + // TODO: Get the conduit texture and add it to the particle manager. + + if (conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()) { + return false; + } + + var conduit = conduitBundle.getShape().getConduit(blockHitResult.getBlockPos(), target); + if (conduit != null) { + ConduitBreakParticle.addCrackEffects(blockHitResult.getBlockPos(), state, conduit.value(), blockHitResult.getDirection()); + } + + return true; + } + + return false; } @Override - public boolean addDestroyEffects(BlockState state, Level Level, BlockPos pos, ParticleEngine manager) { - // TODO: Do it based on the aimed conduit. - return true; + public boolean addDestroyEffects(BlockState state, Level level, BlockPos pos, ParticleEngine manager) { + // Use vanilla particles if we have a visible facade. + // Conduit break particles are handled by the BE. + if (level.getBlockEntity(pos) instanceof ConduitBundleReader conduitBundle) { + return !(conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()); + } + + // Not a bundle + return false; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java index c60a6f3988..2a20037ef5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java @@ -4,17 +4,17 @@ import com.enderio.conduits.EnderIOConduits; import com.enderio.conduits.api.model.RegisterConduitModelModifiersEvent; import com.enderio.conduits.api.screen.RegisterConduitScreenExtensionsEvent; +import com.enderio.conduits.api.screen.RegisterConduitScreenTypesEvent; import com.enderio.conduits.client.gui.conduit.ConduitScreenExtensions; import com.enderio.conduits.client.gui.conduit.FluidConduitScreenExtension; -import com.enderio.conduits.client.gui.conduit.ItemConduitScreenExtension; import com.enderio.conduits.client.gui.screen.types.ConduitScreenTypes; +import com.enderio.conduits.client.gui.screen.types.ItemConduitScreenType; +import com.enderio.conduits.client.gui.screen.types.RedstoneConduitScreenType; import com.enderio.conduits.client.model.conduit.ConduitItemModelLoader; import com.enderio.conduits.client.model.conduit.facades.FacadeItemGeometry; import com.enderio.conduits.client.model.conduit.modifier.ConduitModelModifiers; -import com.enderio.conduits.client.model.conduit.modifier.EnergyConduitModelModifier; import com.enderio.conduits.client.model.conduit.modifier.FluidConduitModelModifier; import com.enderio.conduits.client.model.conduit.bundle.ConduitBundleGeometry; -import com.enderio.conduits.client.model.conduit.modifier.RedstoneConduitModelModifier; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.init.ConduitTypes; import java.util.ArrayList; @@ -59,14 +59,17 @@ public static void clientSetup(FMLClientSetupEvent event) { @SubscribeEvent public static void registerConduitCoreModelModifiers(RegisterConduitModelModifiersEvent event) { event.register(ConduitTypes.FLUID.get(), FluidConduitModelModifier::new); - event.register(ConduitTypes.ENERGY.get(), EnergyConduitModelModifier::new); - event.register(ConduitTypes.REDSTONE.get(), RedstoneConduitModelModifier::new); } @SubscribeEvent public static void registerConduitScreenExtensions(RegisterConduitScreenExtensionsEvent event) { event.register(ConduitTypes.FLUID.get(), FluidConduitScreenExtension::new); - event.register(ConduitTypes.ITEM.get(), ItemConduitScreenExtension::new); + } + + @SubscribeEvent + public static void registerConduitScreenTypes(RegisterConduitScreenTypesEvent event) { + event.register(ConduitTypes.REDSTONE.get(), new RedstoneConduitScreenType()); + event.register(ConduitTypes.ITEM.get(), new ItemConduitScreenType()); } @SubscribeEvent diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java index 1adb226ca5..8c4da4c3de 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.Map; +@Deprecated(forRemoval = true) public class ConduitScreenExtensions { private static Map, ConduitScreenExtension> EXTENSIONS; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java index 066a98a88a..b1d9f1ca69 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java @@ -3,8 +3,7 @@ import com.enderio.base.api.EnderIO; import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; import com.enderio.conduits.api.screen.ConduitScreenExtension; -import com.enderio.base.common.lang.EIOLang; -import com.enderio.conduits.common.conduit.type.fluid.FluidConduitData; +import com.enderio.conduits.common.conduit.legacy.LegacyFluidConduitData; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.util.TooltipUtil; @@ -45,7 +44,7 @@ public List createWidgets(Screen screen, ConduitDataAccessor con new FluidWidget(widgetsStart.add(0, 20), () -> conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()).lockedFluid(), () -> { - FluidConduitData data = conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()); + LegacyFluidConduitData data = conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()); data.setShouldReset(true); updateConduitData.sendUpdate(); }) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ItemConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ItemConduitScreenExtension.java deleted file mode 100644 index 12f0aa6426..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ItemConduitScreenExtension.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.enderio.conduits.client.gui.conduit; - -import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; -import com.enderio.conduits.api.screen.ConduitScreenExtension; -import com.enderio.base.common.lang.EIOLang; -import com.enderio.conduits.common.init.ConduitLang; -import com.enderio.conduits.common.init.ConduitTypes; -import com.enderio.core.client.gui.widgets.ToggleIconButton; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import org.joml.Vector2i; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -public class ItemConduitScreenExtension implements ConduitScreenExtension { - - private static final ResourceLocation ICON_ROUND_ROBIN_ENABLED = EnderIO.loc("icon/round_robin_enabled"); - private static final ResourceLocation ICON_ROUND_ROBIN_DISABLED = EnderIO.loc("icon/round_robin_disabled"); - private static final ResourceLocation ICON_SELF_FEED_ENABLED = EnderIO.loc("icon/self_feed_enabled"); - private static final ResourceLocation ICON_SELF_FEED_DISABLED = EnderIO.loc("icon/self_feed_disabled"); - - @Override - public List createWidgets(Screen screen, ConduitDataAccessor conduitDataAccessor, UpdateDispatcher updateConduitData, - Supplier direction, Vector2i widgetsStart) { - List widgets = new ArrayList<>(); - - widgets.add(ToggleIconButton.of( - widgetsStart.x() + 110, - widgetsStart.y() + 20, - 16, - 16, - ICON_ROUND_ROBIN_ENABLED, - ICON_ROUND_ROBIN_DISABLED, - ConduitLang.ROUND_ROBIN_ENABLED, - ConduitLang.ROUND_ROBIN_DISABLED, - () -> conduitDataAccessor.getOrCreateData(ConduitTypes.Data.ITEM.get()).get(direction.get()).isRoundRobin, - bool -> { - var data = conduitDataAccessor.getOrCreateData(ConduitTypes.Data.ITEM.get()); - var sideData = data.compute(direction.get()); - sideData.isRoundRobin = bool; - updateConduitData.sendUpdate(); - })); - - widgets.add(ToggleIconButton.of( - widgetsStart.x() + 130, - widgetsStart.y() + 20, - 16, - 16, - ICON_SELF_FEED_ENABLED, - ICON_SELF_FEED_DISABLED, - ConduitLang.SELF_FEED_ENABLED, - ConduitLang.SELF_FEED_DISABLED, - () -> conduitDataAccessor.getOrCreateData(ConduitTypes.Data.ITEM.get()).get(direction.get()).isSelfFeed, - bool -> { - var data = conduitDataAccessor.getOrCreateData(ConduitTypes.Data.ITEM.get()); - var sideData = data.compute(direction.get()); - sideData.isSelfFeed = bool; - updateConduitData.sendUpdate(); - })); - return widgets; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java index 8224de44e3..8b887ee67d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java @@ -4,26 +4,16 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.base.client.gui.widget.DyeColorPickerWidget; import com.enderio.base.client.gui.widget.RedstoneControlPickerWidget; -import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; -import com.enderio.conduits.api.menu.ConduitMenuComponent; -import com.enderio.conduits.api.menu.ConduitMenuDataAccess; -import com.enderio.conduits.api.menu.ConduitMenuType; +import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; import com.enderio.conduits.api.screen.ConduitScreenType; import com.enderio.conduits.client.gui.screen.types.ConduitScreenTypes; import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.init.ConduitLang; -import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; -import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; -import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; -import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; +import com.enderio.conduits.common.network.SetConduitConnectionConfigPacket; import com.enderio.core.client.gui.screen.EnderContainerScreen; import com.enderio.core.client.gui.widgets.ToggleIconButton; import net.minecraft.client.gui.GuiGraphics; @@ -31,7 +21,6 @@ import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; -import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -74,75 +63,8 @@ protected void init() { if (screenTypeContainer.hasScreenType()) { screenTypeContainer.addWidgets(screenHelper); - return; } - // Left column - int leftX = getGuiLeft() + 22; - int leftY = getGuiTop() + 7; - - // Right column - int rightX = getGuiLeft() + 22 + 90; - int rightY = getGuiTop() + 7; - - // Add enable checkboxes - if (menu.connectionConfigType().supportsIO()) { - addRenderableWidget(ToggleIconButton.createCheckbox(leftX, leftY, () -> getIOConnectionConfig().canInsert(), - newVal -> handleButtonPress(ConduitMenu.BUTTON_TOGGLE_0_ID))); - addRenderableWidget(ToggleIconButton.createCheckbox(rightX, rightY, () -> getIOConnectionConfig().canExtract(), - newVal -> handleButtonPress(ConduitMenu.BUTTON_TOGGLE_1_ID))); - - leftY += 20; - rightY += 20; - } else { - addRenderableWidget(ToggleIconButton.createCheckbox(leftX, leftY, this::isConnected, - newVal -> handleButtonPress(ConduitMenu.BUTTON_TOGGLE_0_ID))); - - leftY += 20; - } - - // Channels - if (menu.connectionConfigType().supportsIOChannels()) { - addRenderableWidget(new DyeColorPickerWidget(leftX, leftY, - () -> getChannelledIOConnectionConfig().insertChannel(), - color -> PacketDistributor.sendToServer(new C2SSetConduitChannelPacket(pos(), menu.getSide(), menu.getSelectedConduit(), - C2SSetConduitChannelPacket.Side.INPUT, color)), - ConduitLang.CONDUIT_CHANNEL)); - - addRenderableWidget(new DyeColorPickerWidget(rightX, rightY, - () -> getChannelledIOConnectionConfig().extractChannel(), - color -> PacketDistributor.sendToServer(new C2SSetConduitChannelPacket(pos(), menu.getSide(), menu.getSelectedConduit(), - C2SSetConduitChannelPacket.Side.OUTPUT, color)), - ConduitLang.CONDUIT_CHANNEL)); - - leftY += 20; - rightY += 20; - } - - // Redstone Control - if (menu.connectionConfigType().supportsRedstoneControl()) { - final AbstractWidget redstoneControlButton = addRenderableWidget(new DyeColorPickerWidget(rightX + 20, rightY, - () -> getRedstoneControlledConnectionConfig().redstoneChannel(), - color -> PacketDistributor.sendToServer(new C2SSetConduitRedstoneChannelPacket(pos(), menu.getSide(), menu.getSelectedConduit(), color)), - ConduitLang.REDSTONE_CHANNEL)); - - RedstoneControl redstoneControl = getRedstoneControlledConnectionConfig().redstoneControl(); - redstoneControlButton.visible = redstoneControl != RedstoneControl.NEVER_ACTIVE && - redstoneControl != RedstoneControl.ALWAYS_ACTIVE; - - addRenderableWidget(new RedstoneControlPickerWidget(rightX, rightY, - () -> getRedstoneControlledConnectionConfig().redstoneControl(), - mode -> { - PacketDistributor.sendToServer(new C2SSetConduitRedstoneControlPacket(pos(), menu.getSide(), menu.getSelectedConduit(), mode)); - redstoneControlButton.visible = mode != RedstoneControl.NEVER_ACTIVE && mode != RedstoneControl.ALWAYS_ACTIVE; - }, - EIOLang.REDSTONE_MODE)); - - rightY += 20; - } - - // TODO: Screen extensions - // TODO: Conduit selection buttons } @@ -152,98 +74,13 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partia super.render(guiGraphics, mouseX, mouseY, partialTick); } - // Example of conduit menu type thing. -// private ConduitMenuType EXAMPLE = ConduitMenuType.builder(ItemConduitConnectionConfig.TYPE) -// .layout(/* TODO */) // << Ignore, i was going to do the enable buttons here, but I think I'll just make those components too. -// .addComponent(new ConduitMenuComponent.ColorPicker<>(22, 7, ConduitLang.CONDUIT_CHANNEL, -// ItemConduitConnectionConfig::insertChannel, ItemConduitConnectionConfig::withInputChannel)) -// .addComponent(new ConduitMenuComponent.ColorPicker<>(22, 112, ConduitLang.CONDUIT_CHANNEL, -// ItemConduitConnectionConfig::extractChannel, ItemConduitConnectionConfig::withOutputChannel)) -// .addComponent(new ConduitMenuComponent.RedstoneControlPicker<>(22, 112, EIOLang.REDSTONE_MODE, -// ItemConduitConnectionConfig::receiveRedstoneControl, ItemConduitConnectionConfig::withRedstoneControl)) -// .build(); - - private void addComponents(ConduitMenuType menuType) { - Supplier config = () -> getConnectionConfig(menuType.connectionType()); - - for (var component : menuType.components()) { - int x = getGuiLeft() + component.x(); - int y = getGuiTop() + component.y(); - - if (component instanceof ConduitMenuComponent.Text text) { - // TODO - } else if (component instanceof ConduitMenuComponent.ToggleButton toggleButton) { - // TODO - } else if (component instanceof ConduitMenuComponent.ColorPicker colorPicker) { - addRenderableWidget(new DyeColorPickerWidget(x, y, - () -> colorPicker.getter().apply(config.get()), - color -> {}, // TODO: Send packet with component ID and value - colorPicker.title())); - } else if (component instanceof ConduitMenuComponent.RedstoneControlPicker redstoneControlPicker) { - // TODO - } - } - } - - private BlockPos pos() { - return menu.getBlockEntity().getBlockPos(); - } - - private boolean isConnected() { - return menu.isConnected(); - } - - private ConnectionConfig getConnectionConfig() { - return menu.connectionConfig(); - } - - private T getConnectionConfig(ConnectionConfigType configType) { - return menu.connectionConfig(configType); - } - - private IOConnectionConfig getIOConnectionConfig() { - if (!menu.connectionConfigType().supportsIO()) { - throw new IllegalStateException("Connection config type does not support IO"); - } - - if (!(getConnectionConfig() instanceof IOConnectionConfig ioConnectionConfig)) { - throw new IllegalStateException("Connection config is not an IO connection config. Mismatch between connection type class and instance."); - } - - return ioConnectionConfig; - } - - private ChanneledIOConnectionConfig getChannelledIOConnectionConfig() { - if (!menu.connectionConfigType().supportsIOChannels()) { - throw new IllegalStateException("Connection config type does not support IO"); - } - - if (!(getConnectionConfig() instanceof ChanneledIOConnectionConfig chanelledIOConnectionConfig)) { - throw new IllegalStateException("Connection config is not an IO connection config. Mismatch between connection type class and instance."); - } - - return chanelledIOConnectionConfig; - } - - private RedstoneControlledConnection getRedstoneControlledConnectionConfig() { - if (!menu.connectionConfigType().supportsRedstoneControl()) { - throw new IllegalStateException("Connection config type does not support redstone control"); - } - - if (!(getConnectionConfig() instanceof RedstoneControlledConnection redstoneControlledConnection)) { - throw new IllegalStateException("Connection config is not a redstone controlled connection config. Mismatch between connection type class and instance."); - } - - return redstoneControlledConnection; - } - @Override protected void renderBg(GuiGraphics guiGraphics, float v, int i, int i1) { guiGraphics.blit(TEXTURE, getGuiLeft(), getGuiTop(), 0, 0, imageWidth, imageHeight); - if (menu.connectionConfigType().supportsIO()) { - guiGraphics.blit(TEXTURE, getGuiLeft() + 102, getGuiTop() + 7, 255, 0, 1, 97); - } +// if (menu.connectionConfigType().supportsIO()) { +// guiGraphics.blit(TEXTURE, getGuiLeft() + 102, getGuiTop() + 7, 255, 0, 1, 97); +// } // TODO for (SlotType type : SlotType.values()) { @@ -260,23 +97,10 @@ protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { if (screenTypeContainer.hasScreenType()) { screenTypeContainer.renderLabels(guiGraphics, mouseX, mouseY); } else { - if (menu.connectionConfigType().supportsIO()) { - // TODO: Test for a signal type -or- adopt input/output as the standard. - guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INSERT, 22 + 16 + 2, 7 + 4, 4210752, false); - guiGraphics.drawString(this.font, ConduitLang.CONDUIT_EXTRACT, 112 + 16 + 2, 7 + 4, 4210752, false); - - // guiGraphics.drawString(this.font, ConduitLang.CONDUIT_INPUT, 22 + 16 + 2, 7 + 4, 4210752, false); - // guiGraphics.drawString(this.font, ConduitLang.CONDUIT_OUTPUT, 112 + 16 + 2, 7 + 4, 4210752, false); - } else { - guiGraphics.drawString(this.font, ConduitLang.CONDUIT_ENABLED, 22 + 16 + 2, 7 + 4, 4210752, false); - } + guiGraphics.drawString(this.font, ConduitLang.CONDUIT_ERROR_NO_SCREEN_TYPE, 22, 7 + 4, 0xffff5733, false); } } -// private , U extends ConnectionConfig> ConduitScreenHelper createHelper() { -// -// } - // Due to the generics, the menu data access and screen type need to be contained here. private class ConduitScreenTypeContainer { private final ConduitMenuDataAccess dataAccess; @@ -326,8 +150,8 @@ public void updateConnectionConfig(java.util.function.Function configModif } @Override - public CompoundTag getClientDataTag() { - return menu.getClientDataTag(); + public CompoundTag getExtraGuiData() { + return menu.extraGuiData(); } }; } @@ -357,8 +181,6 @@ public int getUsableHeight() { return 0; } - // TODO: would be cool to make these relative? - @Override public AbstractWidget addCheckbox(int x, int y, Supplier getter, Consumer setter) { var widget = ToggleIconButton.createCheckbox(getAreaLeft() + x, getAreaTop() + y, getter, setter); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneCountFilterScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneCountFilterScreen.java similarity index 97% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneCountFilterScreen.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneCountFilterScreen.java index e6a27aba24..d76272aea4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneCountFilterScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneCountFilterScreen.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.client.gui; +package com.enderio.conduits.client.gui.screen.filter; import com.enderio.base.api.EnderIO; import com.enderio.base.client.gui.widget.DyeColorPickerWidget; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneDoubleChannelFilterScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneDoubleChannelFilterScreen.java similarity index 95% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneDoubleChannelFilterScreen.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneDoubleChannelFilterScreen.java index 8e4b4f9697..b2635980ca 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneDoubleChannelFilterScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneDoubleChannelFilterScreen.java @@ -1,8 +1,7 @@ -package com.enderio.conduits.client.gui; +package com.enderio.conduits.client.gui.screen.filter; import com.enderio.base.api.EnderIO; import com.enderio.base.client.gui.widget.DyeColorPickerWidget; -import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.menu.RedstoneDoubleChannelFilterMenu; import com.enderio.core.client.gui.screen.EIOScreen; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneTimerFilterScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneTimerFilterScreen.java similarity index 97% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneTimerFilterScreen.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneTimerFilterScreen.java index 747ad8d281..f565eb7604 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/RedstoneTimerFilterScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneTimerFilterScreen.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.client.gui; +package com.enderio.conduits.client.gui.screen.filter; import com.enderio.base.api.EnderIO; import com.enderio.base.common.lang.EIOLang; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java index 1793528fdb..ac8755d06b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java @@ -4,8 +4,10 @@ import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.api.screen.RegisterConduitScreenTypesEvent; import com.enderio.conduits.common.init.ConduitTypes; import me.liliandev.ensure.ensures.EnsureSide; +import net.neoforged.fml.ModLoader; import org.jetbrains.annotations.Nullable; import java.util.Map; @@ -15,10 +17,9 @@ public class ConduitScreenTypes { @EnsureSide(EnsureSide.Side.CLIENT) public static void init() { - SCREEN_TYPES = Map.of( - ConduitTypes.ITEM.get(), new ItemConduitScreenType(), - ConduitTypes.REDSTONE.get(), new RedstoneConduitScreenType() - ); + var event = new RegisterConduitScreenTypesEvent(); + ModLoader.postEvent(event); + SCREEN_TYPES = Map.copyOf(event.getScreenTypes()); } @EnsureSide(EnsureSide.Side.CLIENT) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java index 17a227ca1e..3748e6508d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java @@ -2,7 +2,7 @@ import com.enderio.base.api.EnderIO; import com.enderio.base.common.lang.EIOLang; -import com.enderio.conduits.api.menu.ConduitMenuDataAccess; +import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; import com.enderio.conduits.api.screen.ConduitScreenType; import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig; @@ -55,7 +55,7 @@ public void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess.getConnectionConfig().receiveRedstoneControl(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); - // TODO: Show redstone signal indicators (somehow) + // TODO: Show redstone signal indicators using the extra NBT payload. } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java index af5e7f2b0a..1d00b2ada9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java @@ -1,6 +1,6 @@ package com.enderio.conduits.client.gui.screen.types; -import com.enderio.conduits.api.menu.ConduitMenuDataAccess; +import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; import com.enderio.conduits.api.screen.ConduitScreenType; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java index 35b9c1c1ea..1f20eff29a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java @@ -2,7 +2,6 @@ import static com.enderio.conduits.client.ConduitClientSetup.*; -import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.model.ConduitModelModifier; import com.enderio.conduits.client.ConduitFacadeColor; @@ -31,11 +30,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.SingleThreadedRandomSource; -import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.client.ChunkRenderTypeSet; import net.neoforged.neoforge.client.model.IDynamicBakedModel; import net.neoforged.neoforge.client.model.IQuadTransformer; @@ -100,7 +97,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction var connectedTypes = bundleState.getConnectedConduits(direction); for (int i = 0; i < connectedTypes.size(); i++) { Holder> conduit = connectedTypes.get(i); - CompoundTag clientData = bundleState.getConduitClientDataTag(conduit); + CompoundTag extraWorldData = bundleState.getExtraWorldData(conduit); Vec3i offset = OffsetHelper.translationFor(direction.getAxis(), OffsetHelper.offsetConduit(i, connectedTypes.size())); @@ -116,7 +113,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction .getModifier(conduit.value().type()); if (conduitModelModifier != null) { quads.addAll(rotationTranslation.process(conduitModelModifier.createConnectionQuads(conduit, - clientData, side, direction, rand, renderType))); + extraWorldData, side, direction, rand, renderType))); } if (isEnd) { @@ -143,8 +140,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction } // TODO: Need support for dual-color redstone control. - if (connectionState.redstoneControl() == RedstoneControl.ACTIVE_WITH_SIGNAL - || connectionState.redstoneControl() == RedstoneControl.ACTIVE_WITHOUT_SIGNAL) { + if (connectionState.isRedstoneSensitive()) { quads.addAll(rotationTranslation .andThen(new ColorQuadTransformer(null, connectionState.redstoneChannel())) .process(modelOf(CONDUIT_IO_REDSTONE).getQuads(state, preRotation, rand, @@ -329,19 +325,25 @@ public TextureAtlasSprite getParticleIcon() { @Override public TextureAtlasSprite getParticleIcon(ModelData data) { - // TODO temp particle fix + // This is only used for facades. ConduitBundleRenderState bundleState = data.get(ConduitBundleRenderState.PROPERTY); - if (bundleState == null || bundleState.conduits().isEmpty()) { + if (bundleState == null) { return ModelHelper.getMissingTexture(); } - if (bundleState.hasFacade()) { + if (bundleState.hasFacade() && FacadeHelper.areFacadesVisible()) { return Minecraft.getInstance() .getBlockRenderer() .getBlockModel(bundleState.facade()) .getParticleIcon(data.get(FACADE_MODEL_DATA)); } + + // Shouldn't be called anymore, but sensible fallback to have: + if (bundleState.conduits().isEmpty()) { + return ModelHelper.getMissingTexture(); + } + return sprite(bundleState.getTexture(bundleState.conduits().getFirst())); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java index 85026598b3..764dfaadcd 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java @@ -3,17 +3,12 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.connection.ConnectionStatus; -import com.enderio.conduits.api.model.ConduitModelModifier; -import com.enderio.conduits.client.model.conduit.modifier.ConduitModelModifiers; import com.enderio.conduits.common.conduit.OffsetHelper; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import com.google.common.collect.HashMultimap; -import com.mojang.datafixers.util.Pair; import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -29,7 +24,7 @@ public class ConduitBundleRenderState { private Direction.Axis mainAxis; private List>> conduits; - private Map>, CompoundTag> conduitClientData; + private Map>, CompoundTag> extraWorldData; private Map>>> conduitsByDirection; private Map>, ConduitConnectionRenderState>> conduitConnections; @@ -44,34 +39,17 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { renderState.mainAxis = OffsetHelper.findMainAxis(bundle); renderState.conduits = List.copyOf(bundle.getConduits()); - renderState.conduitClientData = new HashMap<>(); + renderState.extraWorldData = new HashMap<>(); for (var conduit : renderState.conduits) { - var tag = bundle.getConduitClientDataTag(conduit); + var tag = bundle.getConduitExtraWorldData(conduit); if (tag != null) { - renderState.conduitClientData.put(conduit, tag.copy()); - } - } - - HashMultimap>> fakeConnections = HashMultimap.create(); - for (var conduit : renderState.conduits) { - for (var side : Direction.values()) { - ConduitModelModifier conduitModelModifier = ConduitModelModifiers - .getModifier(conduit.value().type()); - - if (conduitModelModifier != null && conduitModelModifier.shouldShowFakeConnection(bundle, side)) { - fakeConnections.put(side, conduit); - } + renderState.extraWorldData.put(conduit, tag.copy()); } } renderState.conduitsByDirection = new HashMap<>(); for (var side : Direction.values()) { - var connected = new ArrayList<>(bundle.getConnectedConduits(side)); - if (fakeConnections.containsKey(side)) { - connected.addAll(fakeConnections.get(side)); - } - - renderState.conduitsByDirection.put(side, connected); + renderState.conduitsByDirection.put(side, bundle.getConnectedConduits(side)); } renderState.conduitConnections = new HashMap<>(); @@ -82,10 +60,6 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { var connectionConfig = bundle.getConnectionConfig(side, conduit); var connectionRenderState = ConduitConnectionRenderState.of(conduit, connectionConfig); conduits.put(conduit, connectionRenderState); - } else if (fakeConnections.containsKey(side)) { - if (fakeConnections.get(side).contains(conduit)) { - conduits.put(conduit, ConduitConnectionRenderState.fake()); - } } } @@ -109,8 +83,8 @@ public static ConduitBundleRenderState of(ConduitBundleReader bundle) { } @Nullable - public CompoundTag getConduitClientDataTag(Holder> conduit) { - return conduitClientData.get(conduit); + public CompoundTag getExtraWorldData(Holder> conduit) { + return extraWorldData.get(conduit); } public List>> getConnectedConduits(Direction side) { @@ -130,7 +104,7 @@ public Direction.Axis mainAxis() { } public ResourceLocation getTexture(Holder> conduit) { - return conduit.value().getTexture(getConduitClientDataTag(conduit)); + return conduit.value().getTexture(getExtraWorldData(conduit)); } public boolean hasFacade() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java index 634e52692a..7ef7635099 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java @@ -4,6 +4,7 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; +import com.enderio.conduits.api.connection.config.RedstoneSensitiveConnectionConfig; import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; @@ -18,12 +19,12 @@ public record ConduitConnectionRenderState( DyeColor inputChannel, boolean canOutput, DyeColor outputChannel, - RedstoneControl redstoneControl, + boolean isRedstoneSensitive, DyeColor redstoneChannel ) { public static ConduitConnectionRenderState fake() { - return new ConduitConnectionRenderState(false, DyeColor.GREEN, false, DyeColor.GREEN, RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); + return new ConduitConnectionRenderState(false, DyeColor.GREEN, false, DyeColor.GREEN, false, DyeColor.RED); } @EnsureSide(EnsureSide.Side.CLIENT) @@ -39,14 +40,6 @@ public static ConduitConnectionRenderState of(Holder> conduit, Con if (ioConnectionConfig instanceof ChanneledIOConnectionConfig channeledIOConnectionConfig) { inputChannel = channeledIOConnectionConfig.insertChannel(); outputChannel = channeledIOConnectionConfig.extractChannel(); - } else { - ConduitModelModifier conduitModelModifier = ConduitModelModifiers - .getModifier(conduit.value().type()); - - if (conduitModelModifier != null) { - inputChannel = conduitModelModifier.getDefaultArrowColor(); - outputChannel = conduitModelModifier.getDefaultArrowColor(); - } } } else if (connectionConfig instanceof NewIOConnectionConfig ioConnectionConfig) { // TODO: Tidy the language here. @@ -54,16 +47,23 @@ public static ConduitConnectionRenderState of(Holder> conduit, Con canOutput = ioConnectionConfig.isReceive(); inputChannel = ioConnectionConfig.sendColor(); outputChannel = ioConnectionConfig.receiveColor(); - - // TODO: Need support for the new redstone control system. } - RedstoneControl redstoneControl = RedstoneControl.ALWAYS_ACTIVE; + boolean isRedstoneSensitive = false; DyeColor redstoneChannel = DyeColor.RED; if (connectionConfig instanceof RedstoneControlledConnection redstoneControlledConnection) { - redstoneControl = redstoneControlledConnection.redstoneControl(); - redstoneChannel = redstoneControlledConnection.redstoneChannel(); + if (redstoneControlledConnection.redstoneControl().isRedstoneSensitive()) { + isRedstoneSensitive = true; + redstoneChannel = redstoneControlledConnection.redstoneChannel(); + } + } else if (connectionConfig instanceof RedstoneSensitiveConnectionConfig redstoneSensitiveConfig) { + // TODO: Support for multiple colours + var channelColors = redstoneSensitiveConfig.getRedstoneSignalColors(); + if (!channelColors.isEmpty()) { + isRedstoneSensitive = true; + redstoneChannel = channelColors.getFirst(); + } } return new ConduitConnectionRenderState( @@ -71,7 +71,7 @@ public static ConduitConnectionRenderState of(Holder> conduit, Con inputChannel, canOutput, outputChannel, - redstoneControl, + isRedstoneSensitive, redstoneChannel ); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/EnergyConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/EnergyConduitModelModifier.java deleted file mode 100644 index 750a79f9b3..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/EnergyConduitModelModifier.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.enderio.conduits.client.model.conduit.modifier; - -import com.enderio.conduits.api.model.ConduitModelModifier; -import net.minecraft.world.item.DyeColor; - -public class EnergyConduitModelModifier implements ConduitModelModifier { - @Override - public DyeColor getDefaultArrowColor() { - return DyeColor.RED; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java index e233f7234a..9e7db53457 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java @@ -32,17 +32,17 @@ public class FluidConduitModelModifier implements ConduitModelModifier { private static final ModelResourceLocation FLUID_MODEL = ModelResourceLocation.standalone(EnderIO.loc("block/extra/fluids")); @Override - public List createConnectionQuads(Holder> conduit, @Nullable CompoundTag clientDataTag, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, + public List createConnectionQuads(Holder> conduit, @Nullable CompoundTag extraWorldData, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, @Nullable RenderType type) { if (!(conduit.value() instanceof FluidConduit fluidConduit && fluidConduit.isMultiFluid())) { return List.of(); } - if (clientDataTag == null || !clientDataTag.contains("LockedFluid")) { + if (extraWorldData == null || !extraWorldData.contains("LockedFluid")) { return List.of(); } - ResourceLocation lockedFluidId = ResourceLocation.parse(clientDataTag.getString("LockedFluid")); + ResourceLocation lockedFluidId = ResourceLocation.parse(extraWorldData.getString("LockedFluid")); Fluid lockedFluid = BuiltInRegistries.FLUID.get(lockedFluidId); if (!lockedFluid.isSame(Fluids.EMPTY)) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/RedstoneConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/RedstoneConduitModelModifier.java deleted file mode 100644 index 63969b00c5..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/RedstoneConduitModelModifier.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.enderio.conduits.client.model.conduit.modifier; - -import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.conduits.api.bundle.ConduitBundleReader; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; -import com.enderio.conduits.api.model.ConduitModelModifier; -import net.minecraft.core.Direction; - -public class RedstoneConduitModelModifier implements ConduitModelModifier { - @Override - public boolean shouldShowFakeConnection(ConduitBundleReader reader, Direction side) { - if (!reader.isEndpoint(side)) { - return false; - } - - // Find a conduit that might be using our signal. - for (var conduit : reader.getConnectedConduits(side)) { - var config = reader.getConnectionConfig(side, conduit); - - if (config instanceof RedstoneControlledConnection redstoneControlledConnection) { - return redstoneControlledConnection.redstoneControl() != RedstoneControl.ALWAYS_ACTIVE && - redstoneControlledConnection.redstoneControl() != RedstoneControl.NEVER_ACTIVE; - } - } - - return false; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java index 030a5f00e9..2fcccdd38f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java @@ -1,6 +1,7 @@ package com.enderio.conduits.client.particle; import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import com.enderio.conduits.common.conduit.bundle.ConduitShape; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -9,11 +10,13 @@ import net.minecraft.client.particle.TextureSheetParticle; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.VoxelShape; import java.util.List; @@ -61,18 +64,23 @@ public int getLightColor(float partialTick) { return i == 0 && this.level.hasChunkAt(this.pos) ? LevelRenderer.getLightColor(this.level, this.pos) : i; } - public static void addDestroyEffects(BlockPos pos, Conduit conduit) { - Level level = Minecraft.getInstance().level; + public static void addDestroyEffects(BlockPos pos, BlockState state, Conduit conduit) { + ClientLevel level = Minecraft.getInstance().level; + if (level == null) { + return; + } + ParticleEngine engine = Minecraft.getInstance().particleEngine; - List boxes = ConduitShape.CONNECTION.toAabbs(); - double countMult = 1D / boxes.size(); - boxes.forEach(aabb -> { - double sizeX = Math.min(1D, aabb.maxX - aabb.minX); - double sizeY = Math.min(1D, aabb.maxY - aabb.minY); - double sizeZ = Math.min(1D, aabb.maxZ - aabb.minZ); - int xCount = Math.max(2, Mth.ceil(sizeX / 0.25D * countMult)); - int yCount = Math.max(2, Mth.ceil(sizeY / 0.25D * countMult)); - int zCount = Math.max(2, Mth.ceil(sizeZ / 0.25D * countMult)); +// List boxes = ConduitShape.CONNECTION.toAabbs(); + VoxelShape shape = state.getShape(level, pos); + + shape.forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> { + double sizeX = Math.min(1D, maxX - minX); + double sizeY = Math.min(1D, maxY - minY); + double sizeZ = Math.min(1D, maxZ - minZ); + int xCount = Math.max(2, Mth.ceil(sizeX / 0.25D)); + int yCount = Math.max(2, Mth.ceil(sizeY / 0.25D)); + int zCount = Math.max(2, Mth.ceil(sizeZ / 0.25D)); for (int iX = 0; iX < xCount; ++iX) { for (int iY = 0; iY < yCount; ++iY) { @@ -80,13 +88,58 @@ public static void addDestroyEffects(BlockPos pos, Conduit conduit) { double offX = ((double) iX + 0.5D) / (double) xCount; double offY = ((double) iY + 0.5D) / (double) yCount; double offZ = ((double) iZ + 0.5D) / (double) zCount; - double x = pos.getX() + offX * sizeX + aabb.minX; - double y = pos.getY() + offY * sizeY + aabb.minY; - double z = pos.getZ() + offZ * sizeZ + aabb.minZ; - engine.add(new ConduitBreakParticle((ClientLevel) level, x, y, z, offX - 0.5D, offY - 0.5D, offZ - 0.5D, pos, conduit.texture())); + double x = pos.getX() + offX * sizeX + minX; + double y = pos.getY() + offY * sizeY + minY; + double z = pos.getZ() + offZ * sizeZ + minZ; + engine.add(new ConduitBreakParticle(level, x, y, z, offX - 0.5D, offY - 0.5D, offZ - 0.5D, pos, conduit.texture())); } } } }); } + + public static void addCrackEffects(BlockPos pos, BlockState state, Conduit conduit, Direction side) { + ClientLevel level = Minecraft.getInstance().level; + if (level == null) { + return; + } + + ParticleEngine engine = Minecraft.getInstance().particleEngine; + List boxes = ConduitShape.CONNECTION.toAabbs(); + double countMult = 1D / boxes.size(); + + int i = pos.getX(); + int j = pos.getY(); + int k = pos.getZ(); + float f = 0.1F; + AABB aabb = state.getShape(level, pos).bounds(); + double x = (double)i + level.getRandom().nextDouble() * (aabb.maxX - aabb.minX - 0.2F) + 0.1F + aabb.minX; + double y = (double)j + level.getRandom().nextDouble() * (aabb.maxY - aabb.minY - 0.2F) + 0.1F + aabb.minY; + double z = (double)k + level.getRandom().nextDouble() * (aabb.maxZ - aabb.minZ - 0.2F) + 0.1F + aabb.minZ; + if (side == Direction.DOWN) { + y = (double)j + aabb.minY - 0.1F; + } + + if (side == Direction.UP) { + y = (double)j + aabb.maxY + 0.1F; + } + + if (side == Direction.NORTH) { + z = (double)k + aabb.minZ - 0.1F; + } + + if (side == Direction.SOUTH) { + z = (double)k + aabb.maxZ + 0.1F; + } + + if (side == Direction.WEST) { + x = (double)i + aabb.minX - 0.1F; + } + + if (side == Direction.EAST) { + x = (double)i + aabb.maxX + 0.1F; + } + + engine.add(new ConduitBreakParticle(level, x, y, z, 0.0D, 0.0D, 0.0D, pos, conduit.texture()).setPower(0.2F).scale(0.6F)); + } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java index 22cdaf8479..b676e0f0d1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java @@ -4,11 +4,11 @@ import com.enderio.conduits.api.ConduitCapabilities; import com.enderio.conduits.api.ConduitRedstoneSignalAware; import com.enderio.conduits.api.connection.ConnectionStatus; -import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; import com.enderio.conduits.client.particle.ConduitBreakParticle; import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.api.bundle.AddConduitResult; +import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitBlockEntities; @@ -16,6 +16,7 @@ import java.util.Optional; import com.enderio.conduits.common.init.ConduitTypes; +import com.enderio.conduits.common.redstone.RedstoneInsertFilter; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -54,9 +55,7 @@ import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.neoforged.fml.loading.FMLLoader; @@ -257,7 +256,7 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, // TODO: Destroying the last conduit in the block has a laggy disconnect for the // neighbours... - HitResult hit = player.pick(player.blockInteractionRange() + 5, 1, false);; + HitResult hit = player.pick(player.blockInteractionRange() + 5, 1, false); if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { if (conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()) { @@ -265,8 +264,10 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - if (!player.getAbilities().instabuild) { - conduitBundle.dropFacadeItem(); + if (!level.isClientSide()) { + if (!player.getAbilities().instabuild) { + conduitBundle.dropFacadeItem(); + } } int lightLevelBefore = level.getLightEmission(pos); @@ -321,16 +322,16 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + if (level.isClientSide) { + ConduitBreakParticle.addDestroyEffects(pos, state, conduit.value()); + } + conduitBundle.removeConduit(conduit, player); if (conduitBundle.isEmpty()) { return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); } else { level.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(player, state)); - - if (level.isClientSide) { - ConduitBreakParticle.addDestroyEffects(pos, conduit.value()); - } return false; } } @@ -354,13 +355,7 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP if (conduitConnection != null) { if (conduitBundle.getConnectionStatus(conduitConnection.getFirst(), conduitConnection.getSecond()) == ConnectionStatus.CONNECTED_BLOCK) { if (player instanceof ServerPlayer serverPlayer) { - serverPlayer.openMenu(conduitBundle.getMenuProvider(conduitConnection.getFirst(), conduitConnection.getSecond()), - buf -> { - buf.writeBlockPos(pos); - buf.writeEnum(conduitConnection.getFirst()); - Conduit.STREAM_CODEC.encode(buf, conduitConnection.getSecond()); - ConnectionConfig.STREAM_CODEC.encode(buf, conduitBundle.getConnectionConfig(conduitConnection.getFirst(), conduitConnection.getSecond())); - }); + ConduitMenu.openConduitMenu(serverPlayer, pos, conduitBundle, conduitConnection.getFirst(), conduitConnection.getSecond()); } return InteractionResult.sidedSuccess(level.isClientSide()); @@ -408,37 +403,34 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } - // Do not consult the bundle on the client. - if (!level.isClientSide()) { - // Attempt to add to the bundle - AddConduitResult addResult = conduitBundle.addConduit(conduit, player); - - if (addResult instanceof AddConduitResult.Upgrade upgradeResult) { - if (!player.getAbilities().instabuild) { - stack.shrink(1); - player.getInventory() - .placeItemBackInInventory(ConduitBlockItem.getStackFor(upgradeResult.replacedConduit(), 1)); - } - } else if (addResult instanceof AddConduitResult.Insert addedResult) { - if (!player.getAbilities().instabuild) { - stack.shrink(1); - } - } else { - if (!FMLLoader.isProduction()) { - throw new IllegalStateException( - "ConduitBundleAccessor#canAddConduit returned true, but addConduit returned BLOCKED"); - } + // Attempt to add to the bundle + AddConduitResult addResult = conduitBundle.addConduit(conduit, player); - return ItemInteractionResult.FAIL; + if (addResult instanceof AddConduitResult.Upgrade(Holder> replacedConduit)) { + if (!player.getAbilities().instabuild) { + stack.shrink(1); + player.getInventory() + .placeItemBackInInventory(ConduitBlockItem.getStackFor(replacedConduit, 1)); + } + } else if (addResult instanceof AddConduitResult.Insert) { + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } + } else { + if (!FMLLoader.isProduction()) { + throw new IllegalStateException( + "ConduitBundleAccessor#canAddConduit returned true, but addConduit returned BLOCKED"); } - BlockState blockState = level.getBlockState(pos); - SoundType soundtype = blockState.getSoundType(level, pos, player); - level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); + return ItemInteractionResult.FAIL; } + BlockState blockState = level.getBlockState(pos); + SoundType soundtype = blockState.getSoundType(level, pos, player); + level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); + return ItemInteractionResult.sidedSuccess(level.isClientSide()); } @@ -453,27 +445,25 @@ private ItemInteractionResult addFacade(ItemStack stack, Level level, BlockPos p return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } - if (!level.isClientSide()) { - int lightLevelBefore = level.getLightEmission(pos); + int lightLevelBefore = level.getLightEmission(pos); - conduitBundle.setFacadeProvider(stack); - if (!player.getAbilities().instabuild) { - stack.shrink(1); - } - - // Handle light change - if (lightLevelBefore != level.getLightEmission(pos)) { - level.getLightEngine().checkBlock(pos); - } + conduitBundle.setFacadeProvider(stack); + if (!player.getAbilities().instabuild) { + stack.shrink(1); + } - // Block place effects - BlockState blockState = level.getBlockState(pos); - SoundType soundtype = blockState.getSoundType(level, pos, player); - level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); + // Handle light change + if (lightLevelBefore != level.getLightEmission(pos)) { + level.getLightEngine().checkBlock(pos); } + // Block place effects + BlockState blockState = level.getBlockState(pos); + SoundType soundtype = blockState.getSoundType(level, pos, player); + level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); + return ItemInteractionResult.sidedSuccess(level.isClientSide()); } @@ -519,7 +509,7 @@ protected int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, private int getNetworkSignal(BlockGetter level, BlockPos pos, Direction direction, boolean isDirectSignal) { if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { - // TODO: Do we need to have signals on client side? If so we need to put this into the client NBT. + // No client redstone, network is server-only. if (conduitBundle.getLevel().isClientSide()) { return 0; } @@ -555,6 +545,10 @@ private int getNetworkSignal(BlockGetter level, BlockPos pos, Direction directio return 0; } + if (node.getInsertFilter(direction) instanceof RedstoneInsertFilter redstoneInsertFilter) { + return redstoneInsertFilter.getOutputSignal(context, config.sendColor()); + } + return context.getSignal(config.sendColor()); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index 9539ceacac..bc98574b05 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -19,9 +19,9 @@ import com.enderio.conduits.common.conduit.ConduitSavedData; import com.enderio.conduits.common.conduit.ConduitSorter; import com.enderio.conduits.api.bundle.AddConduitResult; -import com.enderio.conduits.common.conduit.connection.ConnectionState; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import com.enderio.conduits.common.conduit.connection.StaticConnectionStates; +import com.enderio.conduits.common.conduit.legacy.ConnectionState; +import com.enderio.conduits.common.conduit.legacy.DynamicConnectionState; +import com.enderio.conduits.common.conduit.legacy.StaticConnectionStates; import com.enderio.conduits.common.conduit.graph.ConduitConnectionHost; import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; @@ -57,18 +57,15 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.network.Connection; -import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Clearable; +import net.minecraft.world.Container; import net.minecraft.world.ItemInteractionResult; -import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; @@ -101,13 +98,14 @@ public final class ConduitBundleBlockEntity extends EnderBlockEntity implements // Map of all conduit nodes for this bundle. private final Map>, ConduitGraphObject> conduitNodes = new HashMap<>(); - // Used to recover missing nodes when loading the bundle. + // Data recovery mechanism private final Map>, ConduitGraphObject> lazyNodes = new HashMap<>(); private ListTag lazyNodeNBT = null; private Map>, NodeData> lazyNodeData = null; - // The client has no nodes, so we hold the data like this. - private final Map>, CompoundTag> clientConduitDataTags = new HashMap<>(); + // Client-side extra render data + @UseOnly(LogicalSide.CLIENT) + private final Map>, CompoundTag> clientConduitExtraWorldData = new HashMap<>(); private final ConduitShape shape = new ConduitShape(); @@ -116,6 +114,15 @@ public final class ConduitBundleBlockEntity extends EnderBlockEntity implements // Deferred connection check private UpdateState checkConnection = UpdateState.NONE; + // NBT Keys + private static final String FACADE_PROVIDER_KEY = "FacadeProvider"; + private static final String CONDUITS_KEY = "Conduits"; + private static final String CONNECTIONS_KEY = "Connections"; + private static final String CONDUIT_INV_KEY = "ConduitInv"; + private static final String NODE_DATA_KEY = "NodeData"; + + private static final String CONDUIT_CLIENT_WORLD_DATA_KEY = "ConduitWorldData"; + public ConduitBundleBlockEntity(BlockPos worldPosition, BlockState blockState) { super(ConduitBlockEntities.CONDUIT.get(), worldPosition, blockState); @@ -127,6 +134,16 @@ protected void onChanged() { }; } + @Override + public void clearContent() { + // Remove all conduits and facades, this is normally called by /set + for (var conduit : getConduits()) { + removeConduit(conduit, null); + } + + clearFacade(); + } + @Override public void serverTick() { super.serverTick(); @@ -137,16 +154,14 @@ public void serverTick() { updateConnections(level, getBlockPos(), null, false); } -// if (this.level.getGameTime() % 5 == 0) { - if (hasDirtyNodes) { - // This is for sending updates to clients when the nodes are dirty - // as such we only fire a block update - // TODO: We're also saving here, but maybe we shouldn't bother? - level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); - setChanged(); - hasDirtyNodes = false; - } -// } + if (hasDirtyNodes) { + // This is for sending updates to clients when the nodes are dirty + // as such we only fire a block update + // TODO: We're also saving here, but maybe we shouldn't bother? + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); + setChanged(); + hasDirtyNodes = false; + } } } @@ -232,6 +247,11 @@ public ModelData getModelData() { // region Menu + @Override + public boolean stillValid(Player player) { + return Container.stillValidBlockEntity(this, player); + } + public boolean canBeOrIsConnection(Direction side, Holder> conduit) { if (level == null) { return false; @@ -252,10 +272,6 @@ public boolean canBeOrIsConnection(Direction side, Holder> conduit return true; } - public MenuProvider getMenuProvider(Direction side, Holder> conduit) { - return new ConduitMenuProvider(side, conduit); - } - @Override public ItemInteractionResult onWrenched(UseOnContext context) { if (level == null) { @@ -326,27 +342,6 @@ public ItemInteractionResult onWrenched(UseOnContext context) { return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } - private class ConduitMenuProvider implements MenuProvider { - - private final Direction side; - private final Holder> conduit; - - private ConduitMenuProvider(Direction side, Holder> conduit) { - this.side = side; - this.conduit = conduit; - } - - @Override - public Component getDisplayName() { - return conduit.value().description(); - } - - @Override - public @Nullable AbstractContainerMenu createMenu(int containerId, Inventory inventory, Player player) { - return new ConduitMenu(containerId, inventory, ConduitBundleBlockEntity.this, side, conduit); - } - } - // endregion // region Redstone Cache @@ -376,8 +371,8 @@ private boolean hasRedstoneSignal(@Nullable DyeColor signalColor) { return false; } - var conduitNode = getConduitNode(redstoneConduit); - var network = conduitNode.getNetwork(); + var node = getConduitNode(redstoneConduit); + var network = node.getNetwork(); if (network == null) { return false; } @@ -437,9 +432,9 @@ public boolean hasConduitByType(Holder> conduit) { return conduits.stream().anyMatch(c -> c.value().canConnectToConduit(conduit)); } - @Nullable - public Holder> getConduitByType(ConduitType conduitType) { - return conduits.stream().filter(c -> c.value().type() == conduitType).findFirst().orElse(null); + @Override + public boolean hasConduitByType(ConduitType conduitType) { + return conduits.stream().anyMatch(c -> c.value().type() == conduitType); } @Override @@ -447,6 +442,11 @@ public boolean hasConduitStrict(Holder> conduit) { return conduits.contains(conduit); } + @Nullable + public Holder> getConduitByType(ConduitType conduitType) { + return conduits.stream().filter(c -> c.value().type() == conduitType).findFirst().orElse(null); + } + @Override public boolean isEmpty() { return conduits.isEmpty() && !hasFacade(); @@ -504,7 +504,7 @@ public boolean canAddConduit(Holder> conduit) { @Override public AddConduitResult addConduit(Holder> conduit, @Nullable Player player) { - if (level == null || !(level instanceof ServerLevel serverLevel)) { + if (level == null) { return new AddConduitResult.Blocked(); } @@ -525,7 +525,7 @@ public AddConduitResult addConduit(Holder> conduit, @Nullable Play // Add connections entry var oldConnectionContainer = conduitConnections.remove(replacementCandidate.get()); - conduitConnections.put(conduit, oldConnectionContainer.copyFor(conduit)); // TODO: Remove incompatible connections! + conduitConnections.put(conduit, oldConnectionContainer.copyFor(conduit)); if (!level.isClientSide()) { ConduitGraphObject oldNode = conduitNodes.remove(replacementCandidate.get()); @@ -600,13 +600,13 @@ public AddConduitResult addConduit(Holder> conduit, @Nullable Play tryConnectTo(side, conduit, false); } - if (!level.isClientSide()) { + if (level instanceof ServerLevel serverLevel) { ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(getConduitNode(conduit).getGraph()), serverLevel); } - if (result instanceof AddConduitResult.Upgrade upgrade - && !upgrade.replacedConduit().value().canConnectToConduit(conduit)) { - removeNeighborConnections(conduit); + if (result instanceof AddConduitResult.Upgrade(Holder> replacedConduit) + && !replacedConduit.value().canConnectToConduit(conduit)) { + removeNeighborConnections(replacedConduit); } bundleChanged(); @@ -642,12 +642,14 @@ public void removeConduit(Holder> conduit, @Nullable Player player // Node remove event if (!level.isClientSide()) { var node = getConduitNode(conduit); - conduit.value().onRemoved(node, level, getBlockPos()); - node.detach(); + if (node != null) { + conduit.value().onRemoved(node, level, getBlockPos()); + node.detach(); - // Remove from the graph. - if (node.getGraph() != null) { - node.getGraph().remove(node); + // Remove from the graph. + if (node.getGraph() != null) { + node.getGraph().remove(node); + } } } @@ -706,7 +708,7 @@ private void removeNeighborConnection(Direction side, Holder> cond private void dropItem(ItemStack stack) { if (level != null) { level.addFreshEntity( - new ItemEntity(level, getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), stack)); + new ItemEntity(level, getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), stack.copy())); } } @@ -730,16 +732,20 @@ public ConduitGraphObject getConduitNode(Holder> conduit) { @Override @Nullable - public CompoundTag getConduitClientDataTag(Holder> conduit) { - if (!conduit.value().hasClientDataTag()) { - return null; - } - + public CompoundTag getConduitExtraWorldData(Holder> conduit) { if (level != null && !level.isClientSide()) { - return conduit.value().getClientDataTag(getConduitNode(conduit)); + return conduit.value().getExtraWorldData(this, getConduitNode(conduit)); } - return clientConduitDataTags.get(conduit); + return clientConduitExtraWorldData.get(conduit); + } + + // Synced by the GUI, only available on the server BE. + @EnsureSide(EnsureSide.Side.SERVER) + @Override + @Nullable + public CompoundTag getConduitExtraGuiData(Direction side, Holder> conduit) { + return conduit.value().getExtraGuiData(this, getConduitNode(conduit), side); } @EnsureSide(EnsureSide.Side.SERVER) @@ -792,6 +798,12 @@ public void setConnectionConfig(Direction side, Holder> conduit, C } conduitConnections.get(conduit).setConfig(side, config); + if (config.isConnected()) { + setConnectionStatus(side, conduit, ConnectionStatus.CONNECTED_BLOCK); + } else { + setConnectionStatus(side, conduit, ConnectionStatus.DISABLED); + } + bundleChanged(); } @@ -811,6 +823,7 @@ public boolean isEndpoint(Direction side) { // TODO: This needs a better name or to handle blocks as well as conduits before // it can be exposed via the interface. + @EnsureSide(EnsureSide.Side.SERVER) public boolean canConnectTo(Direction side, Holder> conduit, ConduitGraphObject otherNode, boolean isForcedConnection) { if (level == null) { @@ -821,7 +834,25 @@ public boolean canConnectTo(Direction side, Holder> conduit, Condu return false; } - if (!conduit.value().canConnectNodes(conduitNodes.get(conduit), otherNode)) { + if (!conduit.value().canConnectConduits(conduitNodes.get(conduit), otherNode)) { + return false; + } + + return isForcedConnection || conduitConnections.get(conduit).getStatus(side) != ConnectionStatus.DISABLED; + } + + @EnsureSide(EnsureSide.Side.CLIENT) + public boolean canConnectTo(Direction side, Holder> conduit, @Nullable CompoundTag otherExtraWorldData, + boolean isForcedConnection) { + if (level == null) { + return false; + } + + if (!doTypesMatch(conduit)) { + return false; + } + + if (!conduit.value().canConnectConduits(getConduitExtraWorldData(conduit), otherExtraWorldData)) { return false; } @@ -847,20 +878,26 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boole throw new IllegalArgumentException("Conduit is not present in this bundle."); } - // Don't attempt a connection if we already have one, or we're disabled (and not - // forcing a connection) + // Do not attempt to connect if we're not forcing a disabled connection ConnectionStatus currentStatus = conduitConnections.get(conduit).getStatus(side); - if (currentStatus.isConnected() - || (!isForcedConnection && currentStatus == ConnectionStatus.DISABLED)) { + if ((!isForcedConnection && currentStatus == ConnectionStatus.DISABLED)) { return false; } - var node = conduitNodes.get(conduit); - if (level.getBlockEntity( getBlockPos().relative(side)) instanceof ConduitBundleBlockEntity neighbourConduitBundle) { + var node = conduitNodes.get(conduit); + + // TODO: This is really ugly. + boolean canConnectToNeighbour; + if (level.isClientSide()) { + canConnectToNeighbour = neighbourConduitBundle.canConnectTo(side, conduit, getConduitExtraWorldData(conduit), isForcedConnection); + } else { + canConnectToNeighbour = neighbourConduitBundle.canConnectTo(side.getOpposite(), conduit, node, isForcedConnection); + } + // Connect to another bundle which has a compatible conduit. - if (neighbourConduitBundle.canConnectTo(side.getOpposite(), conduit, node, isForcedConnection)) { + if (canConnectToNeighbour) { // Make connections to both sides connectConduit(side, conduit); neighbourConduitBundle.connectConduit(side.getOpposite(), conduit); @@ -877,6 +914,7 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boole return true; } + disconnect(side, conduit); return false; } else if (conduit.value().canConnectToBlock(level, getBlockPos(), side) || (isForcedConnection && conduit.value().canForceConnectToBlock(level, getBlockPos(), side))) { @@ -1017,7 +1055,7 @@ public ItemStack getFacadeProvider() { @Override public void setFacadeProvider(ItemStack facadeProvider) { - this.facadeProvider = facadeProvider; + this.facadeProvider = facadeProvider.copyWithCount(1); bundleChanged(); } @@ -1040,6 +1078,28 @@ public Packet getUpdatePacket() { return ClientboundBlockEntityDataPacket.create(this); } + @Override + public CompoundTag getUpdateTag(HolderLookup.Provider registries) { + CompoundTag updateTag = super.getUpdateTag(registries); + + // Send conduit sync data + ListTag nodeDataList = new ListTag(); + + for (var conduit : conduits) { + var node = getConduitNode(conduit); + var clientDataTag = conduit.value().getExtraWorldData(this, node); + if (clientDataTag != null && !clientDataTag.isEmpty()) { + CompoundTag tag = new CompoundTag(); + tag.put("Conduit", Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit).getOrThrow()); + tag.put("Data", clientDataTag); + nodeDataList.add(tag); + } + } + + updateTag.put(CONDUIT_CLIENT_WORLD_DATA_KEY, nodeDataList); + return updateTag; + } + @Override public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { super.onDataPacket(net, pkt, lookupProvider); @@ -1154,36 +1214,6 @@ public void setRemoved() { } } - private static final String FACADE_PROVIDER_KEY = "FacadeProvider"; - private static final String CONDUITS_KEY = "Conduits"; - private static final String CONNECTIONS_KEY = "Connections"; - private static final String NODES_KEY = "Nodes"; - public static final String CONDUIT_INV_KEY = "ConduitInv"; - public static final String NODE_DATA_KEY = "NodeData"; - - private static final String CONDUIT_CLIENT_SYNC_DATA_KEY = "ConduitSyncTags"; - - @Override - public CompoundTag getUpdateTag(HolderLookup.Provider registries) { - CompoundTag updateTag = super.getUpdateTag(registries); - - // Send conduit sync data - ListTag nodeDataList = new ListTag(); - - for (var conduit : conduits) { - if (conduit.value().hasClientDataTag()) { - var node = getConduitNode(conduit); - CompoundTag tag = new CompoundTag(); - tag.put("Conduit", Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit).getOrThrow()); - tag.put("Data", conduit.value().getClientDataTag(node)); - nodeDataList.add(tag); - } - } - - updateTag.put(CONDUIT_CLIENT_SYNC_DATA_KEY, nodeDataList); - return updateTag; - } - @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { super.saveAdditional(tag, registries); @@ -1332,71 +1362,22 @@ protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) } // Load synced node data - if (tag.contains(CONDUIT_CLIENT_SYNC_DATA_KEY)) { - clientConduitDataTags.clear(); + if (tag.contains(CONDUIT_CLIENT_WORLD_DATA_KEY)) { + clientConduitExtraWorldData.clear(); - ListTag nodeDataList = tag.getList(CONDUIT_CLIENT_SYNC_DATA_KEY, Tag.TAG_COMPOUND); + ListTag nodeDataList = tag.getList(CONDUIT_CLIENT_WORLD_DATA_KEY, Tag.TAG_COMPOUND); var serializationContext = registries.createSerializationContext(NbtOps.INSTANCE); for (int i = 0; i < nodeDataList.size(); i++) { CompoundTag nodeTag = nodeDataList.getCompound(i); var conduit = Conduit.CODEC.parse(serializationContext, nodeTag.get("Conduit")).getOrThrow(); - clientConduitDataTags.put(conduit, nodeTag.getCompound("Data")); - } - } - } - - @SuppressWarnings("removal") - private void loadFromLegacyBundle(LegacyConduitBundle bundle) { - // Copy the conduit list - conduits = new ArrayList<>(); - conduits.addAll(bundle.conduits); - - // Copy facade provider - facadeProvider = bundle.facadeItem.copy(); - - // Copy legacy connections into the new bundle - conduitConnections = new HashMap<>(); - for (var conduit : conduits) { - int conduitIndex = conduits.indexOf(conduit); - var connections = conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new); - - for (Direction side : Direction.values()) { - var legacySide = bundle.connections.get(side); - - var state = legacySide.getConnectionState(conduitIndex); - - if (state == StaticConnectionStates.CONNECTED || state == StaticConnectionStates.CONNECTED_ACTIVE) { - connections.setStatus(side, ConnectionStatus.CONNECTED_CONDUIT); - } else if (state == StaticConnectionStates.DISCONNECTED) { - connections.setStatus(side, ConnectionStatus.DISCONNECTED); - } else if (state == StaticConnectionStates.DISABLED) { - connections.setStatus(side, ConnectionStatus.DISABLED); - } else if (state instanceof DynamicConnectionState dynamicState) { - connections.setStatus(side, ConnectionStatus.CONNECTED_BLOCK); - - connections.setConfig(side, conduit.value().convertConnection(dynamicState.isInsert(), dynamicState.isExtract(), - dynamicState.insertChannel(), dynamicState.extractChannel(), dynamicState.control(), - dynamicState.redstoneChannel())); - - inventory.setStackInSlot(conduit, side, SlotType.FILTER_INSERT, dynamicState.filterInsert()); - inventory.setStackInSlot(conduit, side, SlotType.FILTER_EXTRACT, dynamicState.filterExtract()); - } + clientConduitExtraWorldData.put(conduit, nodeTag.getCompound("Data")); } } } - @Override - public void clearContent() { - // Remove all conduits and facades, this is normally called by /set - for (var conduit : getConduits()) { - removeConduit(conduit, null); - } - - clearFacade(); - } - // endregion + // Special casing for redstone conduits. private void redstoneConduitChanged(Direction side) { if (level != null) { BlockPos neighborPos = getBlockPos().relative(side); @@ -1541,6 +1522,10 @@ public UpdateState activate() { } } + // region Legacy Bundle Conversion + + // TODO: Ender IO 8 - Remove. + // Matches the same data format as the original conduit bundle. // Enables us to convert between the new and old formats easily. @SuppressWarnings("removal") @@ -1593,4 +1578,46 @@ public ConnectionState getConnectionState(int index) { } } } + + @SuppressWarnings("removal") + private void loadFromLegacyBundle(LegacyConduitBundle bundle) { + // Copy the conduit list + conduits = new ArrayList<>(); + conduits.addAll(bundle.conduits); + + // Copy facade provider + facadeProvider = bundle.facadeItem.copy(); + + // Copy legacy connections into the new bundle + conduitConnections = new HashMap<>(); + for (var conduit : conduits) { + int conduitIndex = conduits.indexOf(conduit); + var connections = conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new); + + for (Direction side : Direction.values()) { + var legacySide = bundle.connections.get(side); + + var state = legacySide.getConnectionState(conduitIndex); + + if (state == StaticConnectionStates.CONNECTED || state == StaticConnectionStates.CONNECTED_ACTIVE) { + connections.setStatus(side, ConnectionStatus.CONNECTED_CONDUIT); + } else if (state == StaticConnectionStates.DISCONNECTED) { + connections.setStatus(side, ConnectionStatus.DISCONNECTED); + } else if (state == StaticConnectionStates.DISABLED) { + connections.setStatus(side, ConnectionStatus.DISABLED); + } else if (state instanceof DynamicConnectionState dynamicState) { + connections.setStatus(side, ConnectionStatus.CONNECTED_BLOCK); + + connections.setConfig(side, conduit.value().convertConnection(dynamicState.isInsert(), dynamicState.isExtract(), + dynamicState.insertChannel(), dynamicState.extractChannel(), dynamicState.control(), + dynamicState.redstoneChannel())); + + inventory.setStackInSlot(conduit, side, SlotType.FILTER_INSERT, dynamicState.filterInsert()); + inventory.setStackInSlot(conduit, side, SlotType.FILTER_EXTRACT, dynamicState.filterExtract()); + } + } + } + } + + // endregion } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/facades/ConduitFacadeItem.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/facades/ConduitFacadeItem.java index 45891e4823..b9bcc43049 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/facades/ConduitFacadeItem.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/facades/ConduitFacadeItem.java @@ -35,7 +35,7 @@ public InteractionResult place(BlockPlaceContext context) { // Allow placing from the edge of an adjacent block BlockState blockState = level.getBlockState(blockpos); - if (!blockState.isAir()) { + if (!blockState.canBeReplaced()) { // noinspection DataFlowIssue return blockState .useItemOn(context.getItemInHand(), level, player, context.getHand(), diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/ConnectionState.java similarity index 94% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/ConnectionState.java index 63bdaa03de..26e42a7bcc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/ConnectionState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/ConnectionState.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit.connection; +package com.enderio.conduits.common.conduit.legacy; import com.mojang.datafixers.util.Either; import com.mojang.serialization.Codec; @@ -7,6 +7,7 @@ import net.minecraft.network.codec.StreamCodec; import org.apache.commons.lang3.NotImplementedException; +@Deprecated(forRemoval = true, since = "7.2") public sealed interface ConnectionState permits StaticConnectionStates, DynamicConnectionState { Codec CODEC = diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/DynamicConnectionState.java similarity index 99% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/DynamicConnectionState.java index e7f4e0748c..4cc147df9d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/DynamicConnectionState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/DynamicConnectionState.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit.connection; +package com.enderio.conduits.common.conduit.legacy; import com.enderio.base.api.UseOnly; import com.enderio.base.api.misc.RedstoneControl; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyFluidConduitData.java similarity index 73% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitData.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyFluidConduitData.java index 093460de8c..37cbb6a584 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyFluidConduitData.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit.type.fluid; +package com.enderio.conduits.common.conduit.legacy; import com.enderio.conduits.api.network.node.NodeData; import com.enderio.conduits.api.network.node.legacy.ConduitData; @@ -18,33 +18,34 @@ import java.util.Objects; -public class FluidConduitData implements ConduitData { +@Deprecated(forRemoval = true, since = "7.2.0-alpha") +public class LegacyFluidConduitData implements ConduitData { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( + public static MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( Codec.BOOL.fieldOf("should_reset").forGetter(i -> i.shouldReset), BuiltInRegistries.FLUID.byNameCodec() .optionalFieldOf("locked_fluid", Fluids.EMPTY) .forGetter(i -> i.lockedFluid) - ).apply(instance, FluidConduitData::new) + ).apply(instance, LegacyFluidConduitData::new) ); - public static StreamCodec STREAM_CODEC = StreamCodec.composite( + public static StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.BOOL, i -> i.shouldReset, ByteBufCodecs.registry(Registries.FLUID), i -> i.lockedFluid, - FluidConduitData::new + LegacyFluidConduitData::new ); private Fluid lockedFluid = Fluids.EMPTY; private boolean shouldReset = false; - public FluidConduitData() { + public LegacyFluidConduitData() { } @SuppressWarnings("OptionalUsedAsFieldOrParameterType") - public FluidConduitData(boolean shouldReset, Fluid fluid) { + public LegacyFluidConduitData(boolean shouldReset, Fluid fluid) { this.shouldReset = shouldReset; this.lockedFluid = fluid; } @@ -66,7 +67,7 @@ public void setShouldReset(boolean shouldReset) { } @Override - public FluidConduitData withClientChanges(FluidConduitData guiData) { + public LegacyFluidConduitData withClientChanges(LegacyFluidConduitData guiData) { this.shouldReset = guiData.shouldReset; // TODO: Soon we will swap to records which will mean this will be a new instance. @@ -75,12 +76,12 @@ public FluidConduitData withClientChanges(FluidConduitData guiData) { } @Override - public FluidConduitData deepCopy() { - return new FluidConduitData(shouldReset, lockedFluid); + public LegacyFluidConduitData deepCopy() { + return new LegacyFluidConduitData(shouldReset, lockedFluid); } @Override - public ConduitDataType type() { + public ConduitDataType type() { return ConduitTypes.Data.FLUID.get(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyItemConduitData.java similarity index 84% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitData.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyItemConduitData.java index fca58cdb23..a473a69caa 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyItemConduitData.java @@ -1,8 +1,9 @@ -package com.enderio.conduits.common.conduit.type.item; +package com.enderio.conduits.common.conduit.legacy; import com.enderio.conduits.api.network.node.NodeData; import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.common.conduit.type.item.ItemConduitNodeData; import com.enderio.conduits.common.init.ConduitTypes; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; @@ -18,32 +19,33 @@ import java.util.Map; import java.util.Objects; -public class ItemConduitData implements ConduitData { +@Deprecated(forRemoval = true, since = "7.2.0-alpha") +public class LegacyItemConduitData implements ConduitData { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( + public static MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( Codec.unboundedMap(Direction.CODEC, ItemSidedData.CODEC) .fieldOf("item_sided_data").forGetter(i -> i.itemSidedData) - ).apply(instance, ItemConduitData::new) + ).apply(instance, LegacyItemConduitData::new) ); - public static StreamCodec STREAM_CODEC = + public static StreamCodec STREAM_CODEC = ByteBufCodecs.map(i -> (Map) new HashMap(i), Direction.STREAM_CODEC, ItemSidedData.STREAM_CODEC) - .map(ItemConduitData::new, i -> i.itemSidedData).cast(); + .map(LegacyItemConduitData::new, i -> i.itemSidedData).cast(); public Map itemSidedData; - public ItemConduitData() { + public LegacyItemConduitData() { itemSidedData = new HashMap<>(Direction.values().length); } - public ItemConduitData(Map itemSidedData) { + public LegacyItemConduitData(Map itemSidedData) { this.itemSidedData = new HashMap<>(itemSidedData); } @Override - public ItemConduitData withClientChanges(ItemConduitData guiData) { + public LegacyItemConduitData withClientChanges(LegacyItemConduitData guiData) { for (Direction direction : Direction.values()) { compute(direction).applyGuiChanges(guiData.get(direction)); } @@ -67,7 +69,7 @@ public int hashCode() { } @Override - public ConduitDataType type() { + public ConduitDataType type() { return ConduitTypes.Data.ITEM.get(); } @@ -86,7 +88,7 @@ public ConduitDataType type() { } @Override - public ItemConduitData deepCopy() { + public LegacyItemConduitData deepCopy() { var newSidedData = new HashMap(Direction.values().length); for (Direction direction : Direction.values()) { if (itemSidedData.containsKey(direction)) { @@ -94,7 +96,7 @@ public ItemConduitData deepCopy() { } } - return new ItemConduitData(newSidedData); + return new LegacyItemConduitData(newSidedData); } public static class ItemSidedData { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyRedstoneConduitData.java similarity index 73% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitData.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyRedstoneConduitData.java index cf2308314b..429d691c28 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyRedstoneConduitData.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit.type.redstone; +package com.enderio.conduits.common.conduit.legacy; import com.enderio.conduits.api.network.node.NodeData; import com.enderio.conduits.api.network.node.legacy.ConduitData; @@ -18,36 +18,37 @@ import java.util.Map; import java.util.Objects; -public class RedstoneConduitData implements ConduitData { +@Deprecated(forRemoval = true, since = "7.2") +public class LegacyRedstoneConduitData implements ConduitData { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( + public static MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( Codec.BOOL.fieldOf("is_active").forGetter(i -> i.isActive), Codec.unboundedMap(DyeColor.CODEC, Codec.INT).fieldOf("active_colors").forGetter(i -> i.activeColors) - ).apply(instance, RedstoneConduitData::new) + ).apply(instance, LegacyRedstoneConduitData::new) ); - public static StreamCodec STREAM_CODEC = StreamCodec.composite( + public static StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.BOOL, r -> r.isActive, ByteBufCodecs.map(HashMap::new, DyeColor.STREAM_CODEC, ByteBufCodecs.INT), r -> r.activeColors, - RedstoneConduitData::new + LegacyRedstoneConduitData::new ); private boolean isActive = false; private final EnumMap activeColors = new EnumMap<>(DyeColor.class); - public RedstoneConduitData() { + public LegacyRedstoneConduitData() { } - private RedstoneConduitData(boolean isActive, Map activeColors) { + private LegacyRedstoneConduitData(boolean isActive, Map activeColors) { this.isActive = isActive; this.activeColors.putAll(activeColors); } @Override - public ConduitDataType type() { + public ConduitDataType type() { return ConduitTypes.Data.REDSTONE.get(); } @@ -87,8 +88,8 @@ public void setActiveColor(DyeColor color, int signal) { } @Override - public RedstoneConduitData deepCopy() { - return new RedstoneConduitData(isActive, new EnumMap<>(activeColors)); + public LegacyRedstoneConduitData deepCopy() { + return new LegacyRedstoneConduitData(isActive, new EnumMap<>(activeColors)); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/StaticConnectionStates.java similarity index 97% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/StaticConnectionStates.java index 10c5212fb6..efe8b09fff 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/StaticConnectionStates.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/StaticConnectionStates.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.conduit.connection; +package com.enderio.conduits.common.conduit.legacy; import com.mojang.serialization.Codec; import io.netty.buffer.ByteBuf; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/package-info.java similarity index 62% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/package-info.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/package-info.java index b8891fb1ae..7e1665c1bf 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/connection/package-info.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/package-info.java @@ -1,4 +1,4 @@ @javax.annotation.ParametersAreNonnullByDefault @net.minecraft.MethodsReturnNonnullByDefault -package com.enderio.conduits.common.conduit.connection; +package com.enderio.conduits.common.conduit.legacy; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java index a0434b578d..d98f673252 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java @@ -2,38 +2,59 @@ import com.enderio.base.api.UseOnly; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitMenus; -import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; +import com.enderio.conduits.common.network.S2CConduitExtraGuiDataPacket; +import com.enderio.conduits.common.network.SetConduitConnectionConfigPacket; import com.enderio.core.common.menu.BaseBlockEntityMenu; +import com.enderio.core.common.menu.BaseEnderMenu; +import me.liliandev.ensure.ensures.EnsureSide; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.network.PacketDistributor; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; +import java.util.Optional; // TODO: Make this not connect to the block entity at all, that way when the screen desyncs, the client world isn't desynced too. // This means server menu should get/set connections direct from the BE but the client should have a standalone config store. // Need to work out what this means for the client sync tag - it might need to be synced separately to the client from this GUI too. // Possibly create an NBT sync slot and then use it for that? -public class ConduitMenu extends BaseBlockEntityMenu { +public class ConduitMenu extends BaseEnderMenu { + + public static void openConduitMenu(ServerPlayer serverPlayer, BlockPos pos, ConduitBundleBlockEntity conduitBundle, Direction side, + Holder> conduit) { + serverPlayer.openMenu(new SimpleMenuProvider((containerId, inventory, player) -> + new ConduitMenu(containerId, inventory, conduitBundle, side, conduit), + conduit.value().description()), + buf -> { + buf.writeEnum(side); + Conduit.STREAM_CODEC.encode(buf, conduit); + ConnectionConfig.STREAM_CODEC.encode(buf, conduitBundle.getConnectionConfig(side, conduit)); - public static final int BUTTON_TOGGLE_0_ID = 0; - public static final int BUTTON_TOGGLE_1_ID = 1; - public static final int BUTTON_SELECT_CONDUIT_START_ID = 2; - public static final int BUTTON_SELECT_CONDUIT_ID_COUNT = ConduitBundleBlockEntity.MAX_CONDUITS; + //noinspection DataFlowIssue + ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) + .map(opt -> opt.orElse(null), Optional::ofNullable) + .encode(buf, conduitBundle.getConduitExtraGuiData(side, conduit)); + }); + } - private static final int RESERVED_BUTTON_ID_COUNT = BUTTON_SELECT_CONDUIT_START_ID + BUTTON_SELECT_CONDUIT_ID_COUNT + 1; + public static final int BUTTON_CHANGE_CONDUIT_START_ID = 0; + public static final int BUTTON_CHANGE_CONDUIT_ID_COUNT = ConduitBundleBlockEntity.MAX_CONDUITS; private final Direction side; private Holder> selectedConduit; // TODO: Sync with sync slot instead of using initial menu open? @@ -43,12 +64,15 @@ public class ConduitMenu extends BaseBlockEntityMenu { @UseOnly(LogicalSide.SERVER) private ConnectionConfig remoteConnectionConfig; - public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBlockEntity blockEntity, Direction side, Holder> selectedConduit) { - super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory, blockEntity); + @UseOnly(LogicalSide.SERVER) + private CompoundTag remoteExtraGuiData; + + public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBlockEntity conduitBundle, Direction side, Holder> selectedConduit) { + super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory); this.side = side; this.selectedConduit = selectedConduit; - this.connectionAccessor = blockEntity; + this.connectionAccessor = conduitBundle; this.remoteConnectionConfig = connectionAccessor.getConnectionConfig(side, selectedConduit); // TODO: Add conduit slots. @@ -57,11 +81,11 @@ public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBloc } public ConduitMenu(int containerId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { - super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory, buf, ConduitBlockEntities.CONDUIT.get()); + super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory); side = buf.readEnum(Direction.class); selectedConduit = Conduit.STREAM_CODEC.decode(buf); - this.connectionAccessor = new ClientConnectionAccessor(ConnectionConfig.STREAM_CODEC.decode(buf)); + this.connectionAccessor = new ClientConnectionAccessor(buf); // TODO: Add conduit slots. @@ -96,83 +120,37 @@ public T connectionConfig(ConnectionConfigType t public void setConnectionConfig(ConnectionConfig config) { connectionAccessor.setConnectionConfig(side, selectedConduit, config); - - // TODO. -// if (newConfig.isConnected()) { -// bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.CONNECTED_BLOCK); -// } else { -// bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.DISABLED); -// } } - public boolean isConnected() { - return getBlockEntity().getConnectionStatus(side, selectedConduit) == ConnectionStatus.CONNECTED_BLOCK; + @Nullable + public CompoundTag extraGuiData() { + return connectionAccessor.getConduitExtraGuiData(side, selectedConduit); } - public CompoundTag getClientDataTag() { - // TODO: Sync in this menu too - return getBlockEntity().getConduitClientDataTag(selectedConduit); + @EnsureSide(EnsureSide.Side.CLIENT) + public void setExtraGuiData(CompoundTag extraGuiData) { + if (connectionAccessor instanceof ClientConnectionAccessor clientConnectionAccessor) { + clientConnectionAccessor.extraGuiData = extraGuiData; + } } @Override public boolean stillValid(Player player) { - return super.stillValid(player) && connectionAccessor.canBeOrIsConnection(side, selectedConduit); + return connectionAccessor.stillValid(player) && connectionAccessor.canBeOrIsConnection(side, selectedConduit); } @Override public boolean clickMenuButton(Player player, int id) { - var bundle = getBlockEntity(); - var currentConfig = connectionConfig(); - - switch (id) { - case BUTTON_TOGGLE_0_ID: - if (currentConfig instanceof IOConnectionConfig ioConfig) { - var newConfig = ioConfig.withInsert(!ioConfig.canInsert()); - bundle.setConnectionConfig(side, selectedConduit, newConfig); - - if (newConfig.isConnected()) { - bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.CONNECTED_BLOCK); - } else { - bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.DISCONNECTED); - } - } else { - // Non IO connections are controlled soley by the connection type. - var connectionType = bundle.getConnectionStatus(side, selectedConduit); - if (connectionType == ConnectionStatus.CONNECTED_BLOCK) { - bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.DISCONNECTED); - } else { - bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.CONNECTED_BLOCK); - } - } - - return true; - case BUTTON_TOGGLE_1_ID: - if (currentConfig instanceof IOConnectionConfig ioConfig) { - var newConfig = ioConfig.withExtract(!ioConfig.canExtract()); - bundle.setConnectionConfig(side, selectedConduit, newConfig); - - if (newConfig.isConnected()) { - bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.CONNECTED_BLOCK); - } else { - bundle.setConnectionStatus(side, selectedConduit, ConnectionStatus.DISCONNECTED); - } - } - return true; - } + //var bundle = getBlockEntity(); + //var currentConfig = connectionConfig(); - if (id >= BUTTON_SELECT_CONDUIT_START_ID && id <= BUTTON_SELECT_CONDUIT_START_ID + BUTTON_SELECT_CONDUIT_ID_COUNT) { + if (id >= BUTTON_CHANGE_CONDUIT_START_ID && id <= BUTTON_CHANGE_CONDUIT_ID_COUNT + BUTTON_CHANGE_CONDUIT_ID_COUNT) { // TODO: attempt to change to a different conduit on the same face. - var conduitList = getBlockEntity().getConduits(); + //var conduitList = getBlockEntity().getConduits(); // TODO Find and switch to conduit and tell the client. } -// if (id >= RESERVED_BUTTON_ID_COUNT) { -// if (menuConfig().onMenuButtonClicked(conduitNode(), id - RESERVED_BUTTON_ID_COUNT)) { -// return true; -// } -// } - return super.clickMenuButton(player, id); } @@ -187,10 +165,16 @@ public void broadcastChanges() { super.broadcastChanges(); if (getPlayerInventory().player instanceof ServerPlayer serverPlayer) { - if (!connectionConfig().equals(remoteConnectionConfig)) { + if (!Objects.equals(connectionConfig(), remoteConnectionConfig)) { PacketDistributor.sendToPlayer(serverPlayer, new SetConduitConnectionConfigPacket(containerId, connectionConfig())); this.remoteConnectionConfig = connectionConfig(); } + + var extraGuiData = extraGuiData(); + if (!Objects.equals(extraGuiData, remoteExtraGuiData)) { + PacketDistributor.sendToPlayer(serverPlayer, new S2CConduitExtraGuiDataPacket(containerId, extraGuiData)); + this.remoteExtraGuiData = extraGuiData; + } } } @@ -200,14 +184,25 @@ public interface ConnectionAccessor { ConnectionConfig getConnectionConfig(Direction side, Holder> conduit); void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config); boolean canBeOrIsConnection(Direction side, Holder> conduit); + + @Nullable + CompoundTag getConduitExtraGuiData(Direction side, Holder> conduit); + + boolean stillValid(Player player); } private static class ClientConnectionAccessor implements ConnectionAccessor { private ConnectionConfig connectionConfig; - public ClientConnectionAccessor(ConnectionConfig connectionConfig) { - this.connectionConfig = connectionConfig; + @Nullable + private CompoundTag extraGuiData; + + public ClientConnectionAccessor(RegistryFriendlyByteBuf buf) { + this.connectionConfig = ConnectionConfig.STREAM_CODEC.decode(buf); + extraGuiData = ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) + .map(opt -> opt.orElse(null), Optional::ofNullable) + .decode(buf); } @Override @@ -224,5 +219,15 @@ public void setConnectionConfig(Direction side, Holder> conduit, C public boolean canBeOrIsConnection(Direction side, Holder> conduit) { return true; } + + @Override + public CompoundTag getConduitExtraGuiData(Direction side, Holder> conduit) { + return extraGuiData; + } + + @Override + public boolean stillValid(Player player) { + return true; + } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/package-info.java new file mode 100644 index 0000000000..fc2c317dd0 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/package-info.java @@ -0,0 +1,4 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault + +package com.enderio.conduits.common.conduit.menu; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index 54f84a4a97..f8f63e1503 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -4,7 +4,6 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; -import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitType; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java index bd8f92fc3f..eca1901fcb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java @@ -2,7 +2,6 @@ import com.enderio.conduits.api.network.ConduitNetworkContext; import com.enderio.conduits.api.network.ConduitNetworkContextType; -import com.enderio.conduits.common.init.Conduits; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java index 0e3a8ddb30..f774afcf63 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java @@ -1,7 +1,6 @@ package com.enderio.conduits.common.conduit.type.energy; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.common.init.Conduits; import net.neoforged.neoforge.energy.IEnergyStorage; public record EnergyConduitStorage( diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index 9af7318a59..727eaca67d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -6,9 +6,7 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.bundle.ConduitBundleReader; -import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.menu.ConduitMenuExtension; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.bundle.SlotType; @@ -39,6 +37,7 @@ import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.fluids.capability.IFluidHandler; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public record FluidConduit(ResourceLocation texture, Component description, int transferRatePerTick, boolean isMultiFluid) implements Conduit { @@ -89,7 +88,24 @@ public boolean canBeReplacedBy(Holder> otherConduit) { } @Override - public boolean canConnectNodes(ConduitNode selfNode, ConduitNode otherNode) { + public boolean canConnectConduits(@Nullable CompoundTag selfRenderData, @Nullable CompoundTag otherRenderData) { + // If there's no data for one of the nodes, the network must be fresh or uninitialized. + if (selfRenderData == null || otherRenderData == null) { + return true; + } + + if (selfRenderData.contains("LockedFluid") || otherRenderData.contains("LockedFluid")) { + return true; + } + + var selfLockedFluid = BuiltInRegistries.FLUID.get(ResourceLocation.parse(selfRenderData.getString("LockedFluid"))); + var otherLockedFluid = BuiltInRegistries.FLUID.get(ResourceLocation.parse(selfRenderData.getString("LockedFluid"))); + + return selfLockedFluid.isSame(otherLockedFluid); + } + + @Override + public boolean canConnectConduits(ConduitNode selfNode, ConduitNode otherNode) { // Ensure the networks are not locked to different fluids before connecting. var selfNetwork = selfNode.getNetwork(); var otherNetwork = otherNode.getNetwork(); @@ -150,23 +166,22 @@ public void copyLegacyData(ConduitNode node, ConduitDataAccessor legacyDataAcces } @Override - public boolean hasClientDataTag() { - return true; - } - - @Override - public CompoundTag getClientDataTag(ConduitNode node) { - var tag = new CompoundTag(); - + @Nullable + public CompoundTag getExtraWorldData(ConduitBundleReader conduitBundle, ConduitNode node) { if (node.getNetwork() == null) { - return tag; + return null; } var context = node.getNetwork().getContext(FluidConduitNetworkContext.TYPE); if (context == null) { - return tag; + return null; + } + + if (context.lockedFluid().isSame(Fluids.EMPTY)) { + return null; } + var tag = new CompoundTag(); tag.putString("LockedFluid", BuiltInRegistries.FLUID.getKey(context.lockedFluid()).toString()); return tag; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java index 5c55c46924..5da4e5ca4d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java @@ -6,7 +6,6 @@ import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; -import com.enderio.conduits.common.init.ConduitTypes; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java index 082d6cab4e..c22e5d4ad2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java @@ -8,9 +8,7 @@ import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.SlotType; -import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.menu.ConduitMenuExtension; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; import com.enderio.conduits.common.init.ConduitLang; @@ -21,6 +19,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.resources.ResourceLocation; @@ -31,6 +30,7 @@ import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.Consumer; @@ -137,6 +137,24 @@ public void copyLegacyData(ConduitNode node, ConduitDataAccessor legacyDataAcces } } + @Override + @Nullable + public CompoundTag getExtraGuiData(ConduitBundleReader conduitBundle, ConduitNode node, Direction side) { + if (!node.isConnectedTo(side)) { + return null; + } + + var config = node.getConnectionConfig(side, connectionConfigType()); + if (!config.receiveRedstoneControl().isRedstoneSensitive()) { + return null; + } + + CompoundTag tag = new CompoundTag(); + tag.putBoolean("HasRedstoneSignal", node.hasRedstoneSignal(config.receiveRedstoneChannel())); + tag.putBoolean("HasRedstoneConduit", conduitBundle.hasConduitByType(ConduitTypes.REDSTONE.get())); + return tag; + } + @Override public int compareTo(@NotNull ItemConduit o) { double selfEffectiveSpeed = transferRatePerCycle() * (20.0 / graphTickRate()); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java index c277364731..bbafb9bab5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java @@ -6,8 +6,7 @@ import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.api.connection.config.RedstoneSensitiveConnectionConfig; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -16,6 +15,8 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; +import java.util.List; + public record ItemConduitConnectionConfig( boolean isSend, DyeColor sendColor, @@ -26,7 +27,7 @@ public record ItemConduitConnectionConfig( boolean isRoundRobin, boolean isSelfFeed, int priority -) implements NewIOConnectionConfig { +) implements NewIOConnectionConfig, RedstoneSensitiveConnectionConfig { public static ItemConduitConnectionConfig DEFAULT = new ItemConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); @@ -91,7 +92,7 @@ public boolean canReceive(ConduitRedstoneSignalAware signalAware) { @Override public ConnectionConfig reconnected() { - return new ItemConduitConnectionConfig(DEFAULT.isSend, DEFAULT.sendColor, DEFAULT.isReceive, DEFAULT.receiveColor, receiveRedstoneControl, + return new ItemConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } @@ -136,4 +137,13 @@ public ItemConduitConnectionConfig withPriority(int priority) { public ConnectionConfigType type() { return TYPE; } + + @Override + public List getRedstoneSignalColors() { + if (receiveRedstoneControl.isRedstoneSensitive()) { + return List.of(receiveRedstoneChannel); + } + + return List.of(); + } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java index 93516a262e..16d8ab197a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java @@ -4,11 +4,9 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.ticker.ChannelIOAwareConduitTicker; import com.enderio.conduits.api.ticker.NewIOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitTypes; -import java.util.Collections; import java.util.Comparator; import java.util.List; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java index 581caf6354..4659ebe7ff 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java @@ -3,6 +3,7 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitMenuData; @@ -75,9 +76,9 @@ public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) } @Override - public ResourceLocation getTexture(@Nullable CompoundTag clientDataTag) { - if (clientDataTag != null) { - return clientDataTag.contains("IsActive") && clientDataTag.getBoolean("IsActive") ? activeTexture() : texture(); + public ResourceLocation getTexture(@Nullable CompoundTag extraWorldData) { + if (extraWorldData != null) { + return extraWorldData.contains("IsActive") && extraWorldData.getBoolean("IsActive") ? activeTexture() : texture(); } return texture(); @@ -115,12 +116,7 @@ public RedstoneConduitConnectionConfig convertConnection(boolean isInsert, boole } @Override - public boolean hasClientDataTag() { - return true; - } - - @Override - public CompoundTag getClientDataTag(ConduitNode node) { + public CompoundTag getExtraWorldData(ConduitBundleReader conduitBundle, ConduitNode node) { var tag = new CompoundTag(); if (node.getNetwork() == null) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java index e9ec50e3f8..0ac6af5b55 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java @@ -73,14 +73,12 @@ public void setSignal(DyeColor color, int signal) { @Override public RedstoneConduitNetworkContext mergeWith(RedstoneConduitNetworkContext other) { - // Ticker will be responsible for updating it. return copy(); } @Override public RedstoneConduitNetworkContext copy() { - // Ticker will be responsible for updating it. - return new RedstoneConduitNetworkContext(false, new HashMap<>()); + return new RedstoneConduitNetworkContext(isActive, new HashMap<>(channelSignals)); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java index 0ceade5274..d1be785939 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java @@ -76,6 +76,9 @@ public class ConduitLang { public static final MutableComponent ITEM_EFFECTIVE_RATE_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit.item.effective_rate"), "Effective Rate: %s Items/sec"); + public static final Component CONDUIT_ERROR_NO_SCREEN_TYPE = addTranslation("gui", EnderIO.loc("conduit.error.no_screen_type"), + "Error: No screen type defined"); + public static final Component CONDUIT_ENABLED = addTranslation("gui", EnderIO.loc("conduit.enabled"), "Enabled"); public static final Component CONDUIT_INSERT = addTranslation("gui", EnderIO.loc("conduit.insert"), "Insert"); public static final Component CONDUIT_EXTRACT = addTranslation("gui", EnderIO.loc("conduit.extract"), diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java index 10d945d1c4..83d09b09ba 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java @@ -1,9 +1,9 @@ package com.enderio.conduits.common.init; import com.enderio.conduits.EnderIOConduits; -import com.enderio.conduits.client.gui.RedstoneCountFilterScreen; -import com.enderio.conduits.client.gui.RedstoneDoubleChannelFilterScreen; -import com.enderio.conduits.client.gui.RedstoneTimerFilterScreen; +import com.enderio.conduits.client.gui.screen.filter.RedstoneCountFilterScreen; +import com.enderio.conduits.client.gui.screen.filter.RedstoneDoubleChannelFilterScreen; +import com.enderio.conduits.client.gui.screen.filter.RedstoneTimerFilterScreen; import com.enderio.conduits.client.gui.screen.NewConduitScreen; import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.menu.RedstoneCountFilterMenu; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java index f49445cbe0..92021d0f35 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java @@ -12,15 +12,15 @@ import com.enderio.conduits.common.conduit.type.energy.EnergyConduitNetworkContext; import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; import com.enderio.conduits.common.conduit.type.fluid.FluidConduitConnectionConfig; -import com.enderio.conduits.common.conduit.type.fluid.FluidConduitData; +import com.enderio.conduits.common.conduit.legacy.LegacyFluidConduitData; import com.enderio.conduits.common.conduit.type.fluid.FluidConduitNetworkContext; import com.enderio.conduits.common.conduit.type.item.ItemConduit; import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig; -import com.enderio.conduits.common.conduit.type.item.ItemConduitData; +import com.enderio.conduits.common.conduit.legacy.LegacyItemConduitData; import com.enderio.conduits.common.conduit.type.item.ItemConduitNodeData; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduit; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.legacy.LegacyRedstoneConduitData; import java.util.function.Supplier; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; @@ -48,16 +48,16 @@ public static class Data { private static final DeferredRegister> CONDUIT_DATA_TYPES = DeferredRegister .create(EnderIOConduitsRegistries.CONDUIT_DATA_TYPE, EnderIO.NAMESPACE); - public static final Supplier> ITEM = CONDUIT_DATA_TYPES.register("item", - () -> new ConduitDataType<>(ItemConduitData.CODEC, ItemConduitData.STREAM_CODEC, ItemConduitData::new)); + public static final Supplier> ITEM = CONDUIT_DATA_TYPES.register("item", + () -> new ConduitDataType<>(LegacyItemConduitData.CODEC, LegacyItemConduitData.STREAM_CODEC, LegacyItemConduitData::new)); - public static final Supplier> FLUID = CONDUIT_DATA_TYPES.register("fluid", - () -> new ConduitDataType<>(FluidConduitData.CODEC, FluidConduitData.STREAM_CODEC, - FluidConduitData::new)); + public static final Supplier> FLUID = CONDUIT_DATA_TYPES.register("fluid", + () -> new ConduitDataType<>(LegacyFluidConduitData.CODEC, LegacyFluidConduitData.STREAM_CODEC, + LegacyFluidConduitData::new)); - public static final Supplier> REDSTONE = CONDUIT_DATA_TYPES - .register("redstone", () -> new ConduitDataType<>(RedstoneConduitData.CODEC, - RedstoneConduitData.STREAM_CODEC, RedstoneConduitData::new)); + public static final Supplier> REDSTONE = CONDUIT_DATA_TYPES + .register("redstone", () -> new ConduitDataType<>(LegacyRedstoneConduitData.CODEC, + LegacyRedstoneConduitData.STREAM_CODEC, LegacyRedstoneConduitData::new)); } public static class ConnectionTypes { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitConnectionState.java deleted file mode 100644 index 8312e44556..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitConnectionState.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.enderio.conduits.common.network; - -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.conduit.connection.DynamicConnectionState; -import com.enderio.core.EnderCore; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; - -public record C2SSetConduitConnectionState( - BlockPos pos, - Direction direction, - Holder> conduit, - DynamicConnectionState connectionState -) implements CustomPacketPayload { - - public static final Type TYPE = new Type<>(EnderCore.loc("c2s_conduit_connection_state")); - - public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - BlockPos.STREAM_CODEC, - C2SSetConduitConnectionState::pos, - Direction.STREAM_CODEC, - C2SSetConduitConnectionState::direction, - Conduit.STREAM_CODEC, - C2SSetConduitConnectionState::conduit, - DynamicConnectionState.STREAM_CODEC, - C2SSetConduitConnectionState::connectionState, - C2SSetConduitConnectionState::new - ); - - @Override - public Type type() { - return TYPE; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java deleted file mode 100644 index 7cee664c8f..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SSetConduitExtendedData.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.enderio.conduits.common.network; - -import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; - -public record C2SSetConduitExtendedData(BlockPos pos, Holder> conduit, - ConduitDataContainer conduitDataContainer) implements CustomPacketPayload { - - public static final Type TYPE = new Type<>(EnderIO.loc("c2s_conduit_extended_data")); - - public static StreamCodec STREAM_CODEC = StreamCodec.composite( - BlockPos.STREAM_CODEC, C2SSetConduitExtendedData::pos, Conduit.STREAM_CODEC, - C2SSetConduitExtendedData::conduit, ConduitDataContainer.STREAM_CODEC, - C2SSetConduitExtendedData::conduitDataContainer, C2SSetConduitExtendedData::new); - - @Override - public Type type() { - return TYPE; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java index 40d3866930..8444f1e3ae 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java @@ -1,8 +1,21 @@ package com.enderio.conduits.common.network; +import com.enderio.conduits.common.conduit.menu.ConduitMenu; +import net.neoforged.neoforge.network.handling.IPayloadContext; + public class ConduitClientPayloadHandler { private static final ConduitClientPayloadHandler INSTANCE = new ConduitClientPayloadHandler(); + public void handle(S2CConduitExtraGuiDataPacket packet, IPayloadContext context) { + context.enqueueWork(() -> { + if (packet.containerId() == context.player().containerMenu.containerId) { + if (context.player().containerMenu instanceof ConduitMenu menu) { + menu.setExtraGuiData(packet.extraGuiData()); + } + } + }); + } + public static ConduitClientPayloadHandler getInstance() { return INSTANCE; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java index 75291d3de2..f94fd063b9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitCommonPayloadHandler.java @@ -1,14 +1,12 @@ package com.enderio.conduits.common.network; import com.enderio.conduits.common.conduit.menu.ConduitMenu; -import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; import net.neoforged.neoforge.network.handling.IPayloadContext; public class ConduitCommonPayloadHandler { private static final ConduitCommonPayloadHandler INSTANCE = new ConduitCommonPayloadHandler(); public void handle(SetConduitConnectionConfigPacket packet, IPayloadContext context) { - // TODO: This is the same handler for client & server, maybe we need a common payload handler? context.enqueueWork(() -> { if (packet.containerId() == context.player().containerMenu.containerId) { if (context.player().containerMenu instanceof ConduitMenu menu) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java index dedf00acd4..a923280a36 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java @@ -1,12 +1,7 @@ package com.enderio.conduits.common.network; import com.enderio.conduits.EnderIOConduits; -import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; -import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; -import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; -import com.enderio.conduits.common.network.connections.SetConduitConnectionConfigPacket; import com.enderio.core.EnderCore; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; @@ -22,9 +17,6 @@ public static void register(final RegisterPayloadHandlersEvent event) { .registrar(EnderCore.MOD_ID) .versioned(PROTOCOL_VERSION); - registrar.playToServer(ConduitMenuSelectionPacket.TYPE, ConduitMenuSelectionPacket.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleConduitMenuSelection); - registrar.playToServer(DoubleChannelPacket.TYPE, DoubleChannelPacket.STREAM_CODEC, ConduitServerPayloadHandler.getInstance()::handleDoubleChannelFilter); @@ -34,14 +26,11 @@ public static void register(final RegisterPayloadHandlersEvent event) { registrar.playToServer(CountFilterPacket.TYPE, CountFilterPacket.STREAM_CODEC, ConduitServerPayloadHandler.getInstance()::handleCountFilter); - registrar.playToServer(C2SSetConduitChannelPacket.TYPE, C2SSetConduitChannelPacket.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleSetConduitChannelPacket); - - registrar.playToServer(C2SSetConduitRedstoneControlPacket.TYPE, C2SSetConduitRedstoneControlPacket.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleSetConduitRedstoneControlPacket); + registrar.playToServer(ConduitMenuSelectionPacket.TYPE, ConduitMenuSelectionPacket.STREAM_CODEC, + ConduitServerPayloadHandler.getInstance()::handleConduitMenuSelection); - registrar.playToServer(C2SSetConduitRedstoneChannelPacket.TYPE, C2SSetConduitRedstoneChannelPacket.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleSetConduitRedstoneChannelPacket); + registrar.playToClient(S2CConduitExtraGuiDataPacket.TYPE, S2CConduitExtraGuiDataPacket.STREAM_CODEC, + ConduitClientPayloadHandler.getInstance()::handle); registrar.playBidirectional(SetConduitConnectionConfigPacket.TYPE, SetConduitConnectionConfigPacket.STREAM_CODEC, ConduitCommonPayloadHandler.getInstance()::handle); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java index d25c7b9851..ca0d58540b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java @@ -1,21 +1,11 @@ package com.enderio.conduits.common.network; import com.enderio.base.common.init.EIOCapabilities; -import com.enderio.conduits.api.bundle.ConduitBundleAccessor; -import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; -import com.enderio.conduits.common.network.connections.C2SConduitConnectionPacket; -import com.enderio.conduits.common.network.connections.C2SSetConduitChannelPacket; -import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneChannelPacket; -import com.enderio.conduits.common.network.connections.C2SSetConduitRedstoneControlPacket; import com.enderio.conduits.common.redstone.DoubleRedstoneChannel; import com.enderio.conduits.common.redstone.RedstoneCountFilter; import com.enderio.conduits.common.redstone.RedstoneTimerFilter; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; import net.neoforged.neoforge.network.handling.IPayloadContext; -import org.apache.logging.log4j.util.TriConsumer; public class ConduitServerPayloadHandler { private static final ConduitServerPayloadHandler INSTANCE = new ConduitServerPayloadHandler(); @@ -61,47 +51,4 @@ public void handleCountFilter(CountFilterPacket packet, IPayloadContext context) } }); } - - public void handleSetConduitChannelPacket(C2SSetConduitChannelPacket packet, IPayloadContext context) { - handleConduitConfigPacket(packet, context, (p, conduitBundle, currentConfig) -> { - if (currentConfig instanceof ChanneledIOConnectionConfig channelledConnectionConfig) { - if (packet.channelSide() == C2SSetConduitChannelPacket.Side.INPUT) { - conduitBundle.setConnectionConfig(p.side(), p.conduit(), - channelledConnectionConfig.withInputChannel(p.channelColor())); - } else { - conduitBundle.setConnectionConfig(p.side(), p.conduit(), - channelledConnectionConfig.withOutputChannel(p.channelColor())); - } - } - }); - } - - public void handleSetConduitRedstoneControlPacket(C2SSetConduitRedstoneControlPacket packet, IPayloadContext context) { - handleConduitConfigPacket(packet, context, (p, conduitBundle, currentConfig) -> { - if (currentConfig instanceof RedstoneControlledConnection redstoneControlledConnection) { - conduitBundle.setConnectionConfig(p.side(), p.conduit(), - redstoneControlledConnection.withRedstoneControl(p.redstoneControl())); - } - }); - } - - public void handleSetConduitRedstoneChannelPacket(C2SSetConduitRedstoneChannelPacket packet, IPayloadContext context) { - handleConduitConfigPacket(packet, context, (p, conduitBundle, currentConfig) -> { - if (currentConfig instanceof RedstoneControlledConnection redstoneControlledConnection) { - conduitBundle.setConnectionConfig(p.side(), p.conduit(), - redstoneControlledConnection.withRedstoneChannel(p.redstoneChannel())); - } - }); - } - - private void handleConduitConfigPacket(T packet, IPayloadContext context, TriConsumer packetConsumer) { - context.enqueueWork(() -> { - var level = context.player().level(); - BlockEntity be = level.getBlockEntity(packet.pos()); - if (be instanceof ConduitBundleAccessor conduitBundle) { - var currentConfig = conduitBundle.getConnectionConfig(packet.side(), packet.conduit()); - packetConsumer.accept(packet, conduitBundle, currentConfig); - } - }); - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitExtraGuiDataPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitExtraGuiDataPacket.java new file mode 100644 index 0000000000..03905a9be7 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitExtraGuiDataPacket.java @@ -0,0 +1,30 @@ +package com.enderio.conduits.common.network; + +import com.enderio.base.api.EnderIO; +import io.netty.buffer.ByteBuf; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public record S2CConduitExtraGuiDataPacket(int containerId, @Nullable CompoundTag extraGuiData) implements CustomPacketPayload { + + public static Type TYPE = new Type<>(EnderIO.loc("conduit_extra_gui_data")); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.INT, + S2CConduitExtraGuiDataPacket::containerId, + ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) + .map(opt -> opt.orElse(null), Optional::ofNullable), + S2CConduitExtraGuiDataPacket::extraGuiData, + S2CConduitExtraGuiDataPacket::new + ); + + @Override + public Type type() { + return TYPE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java new file mode 100644 index 0000000000..eac01893ec --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java @@ -0,0 +1,3 @@ +package com.enderio.conduits.common.network; + +public class S2CConduitListPacket {} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/SetConduitConnectionConfigPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/SetConduitConnectionConfigPacket.java similarity index 94% rename from enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/SetConduitConnectionConfigPacket.java rename to enderio-conduits/src/main/java/com/enderio/conduits/common/network/SetConduitConnectionConfigPacket.java index 02c6f4f5f5..7ff4f3d021 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/SetConduitConnectionConfigPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/SetConduitConnectionConfigPacket.java @@ -1,4 +1,4 @@ -package com.enderio.conduits.common.network.connections; +package com.enderio.conduits.common.network; import com.enderio.base.api.EnderIO; import com.enderio.conduits.api.connection.config.ConnectionConfig; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java deleted file mode 100644 index cf856bbcf2..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SConduitConnectionPacket.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.enderio.conduits.common.network.connections; - -import com.enderio.conduits.api.Conduit; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; - -public interface C2SConduitConnectionPacket { - BlockPos pos(); - Direction side(); - Holder> conduit(); -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java deleted file mode 100644 index 0a03154745..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitChannelPacket.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.enderio.conduits.common.network.connections; - -import com.enderio.base.api.EnderIO; -import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.conduits.api.Conduit; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.world.item.DyeColor; - -public record C2SSetConduitChannelPacket( - BlockPos pos, - Direction side, - Holder> conduit, - Side channelSide, - DyeColor channelColor -) implements C2SConduitConnectionPacket, CustomPacketPayload { - - public static Type TYPE = new Type<>(EnderIO.loc("conduit_channel")); - - public static StreamCodec STREAM_CODEC = StreamCodec.composite( - BlockPos.STREAM_CODEC, - C2SSetConduitChannelPacket::pos, - Direction.STREAM_CODEC, - C2SSetConduitChannelPacket::side, - Conduit.STREAM_CODEC, - C2SSetConduitChannelPacket::conduit, - ByteBufCodecs.BOOL.map(b -> b ? Side.INPUT : Side.OUTPUT, s -> s == Side.INPUT), - C2SSetConduitChannelPacket::channelSide, - DyeColor.STREAM_CODEC, - C2SSetConduitChannelPacket::channelColor, - C2SSetConduitChannelPacket::new - ); - - public enum Side { - INPUT, OUTPUT, - } - - @Override - public Type type() { - return TYPE; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java deleted file mode 100644 index 116c6af8df..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneChannelPacket.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.enderio.conduits.common.network.connections; - -import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.Conduit; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.world.item.DyeColor; - -public record C2SSetConduitRedstoneChannelPacket( - BlockPos pos, - Direction side, - Holder> conduit, - DyeColor redstoneChannel -) implements C2SConduitConnectionPacket, CustomPacketPayload { - - public static Type TYPE = new Type<>(EnderIO.loc("conduit_redstone_channel")); - - public static StreamCodec STREAM_CODEC = StreamCodec.composite( - BlockPos.STREAM_CODEC, - C2SSetConduitRedstoneChannelPacket::pos, - Direction.STREAM_CODEC, - C2SSetConduitRedstoneChannelPacket::side, - Conduit.STREAM_CODEC, - C2SSetConduitRedstoneChannelPacket::conduit, - DyeColor.STREAM_CODEC, - C2SSetConduitRedstoneChannelPacket::redstoneChannel, - C2SSetConduitRedstoneChannelPacket::new - ); - - @Override - public Type type() { - return TYPE; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java deleted file mode 100644 index dd4e68990b..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/connections/C2SSetConduitRedstoneControlPacket.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.enderio.conduits.common.network.connections; - -import com.enderio.base.api.EnderIO; -import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.conduits.api.Conduit; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.world.item.DyeColor; - -public record C2SSetConduitRedstoneControlPacket( - BlockPos pos, - Direction side, - Holder> conduit, - RedstoneControl redstoneControl -) implements C2SConduitConnectionPacket, CustomPacketPayload { - - public static Type TYPE = new Type<>(EnderIO.loc("conduit_redstone_control")); - - public static StreamCodec STREAM_CODEC = StreamCodec.composite( - BlockPos.STREAM_CODEC, - C2SSetConduitRedstoneControlPacket::pos, - Direction.STREAM_CODEC, - C2SSetConduitRedstoneControlPacket::side, - Conduit.STREAM_CODEC, - C2SSetConduitRedstoneControlPacket::conduit, - RedstoneControl.STREAM_CODEC, - C2SSetConduitRedstoneControlPacket::redstoneControl, - C2SSetConduitRedstoneControlPacket::new - ); - - @Override - public Type type() { - return TYPE; - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneANDFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneANDFilter.java index b3b4e5d907..3d50599349 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneANDFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneANDFilter.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.redstone; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitComponents; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; @@ -12,8 +12,8 @@ public RedstoneANDFilter(ItemStack stack) { } @Override - public int getOutputSignal(RedstoneConduitData data, DyeColor control) { - boolean b = data.isActive(getFirstChannel()) && data.isActive(getSecondChannel()); + public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { + boolean b = context.isActive(getFirstChannel()) && context.isActive(getSecondChannel()); return b ? 15 : 0 ; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneCountFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneCountFilter.java index fd146e2da1..de8c9e92c1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneCountFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneCountFilter.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.redstone; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitComponents; import com.enderio.conduits.common.network.CountFilterPacket; import com.mojang.serialization.Codec; @@ -22,16 +22,16 @@ public RedstoneCountFilter(ItemStack stack) { } @Override - public int getOutputSignal(RedstoneConduitData data, DyeColor control) { + public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { DyeColor channel = getChannel(); int maxCount = getMaxCount(); boolean deactivated = isDeactivated(); int count = getCount(); - if (data.isActive(channel) && deactivated) { + if (context.isActive(channel) && deactivated) { count++; deactivated = false; } - if (!data.isActive(channel)) { + if (!context.isActive(channel)) { deactivated = true; } if (count > maxCount) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneInsertFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneInsertFilter.java index d8705d8063..2c43750a0c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneInsertFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneInsertFilter.java @@ -1,10 +1,10 @@ package com.enderio.conduits.common.redstone; import com.enderio.base.api.filter.ResourceFilter; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import net.minecraft.world.item.DyeColor; public interface RedstoneInsertFilter extends ResourceFilter { - int getOutputSignal(RedstoneConduitData data, DyeColor control); + int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNANDFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNANDFilter.java index ad58772e3f..d6cb755dae 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNANDFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNANDFilter.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.redstone; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitComponents; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; @@ -12,8 +12,8 @@ public RedstoneNANDFilter(ItemStack stack) { } @Override - public int getOutputSignal(RedstoneConduitData data, DyeColor control) { - boolean b = data.isActive(getFirstChannel()) && data.isActive(getSecondChannel()); + public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { + boolean b = context.isActive(getFirstChannel()) && context.isActive(getSecondChannel()); return b ? 0 : 15; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNORFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNORFilter.java index bf3bda2954..1df423a6f0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNORFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNORFilter.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.redstone; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitComponents; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; @@ -12,8 +12,8 @@ public RedstoneNORFilter(ItemStack stack) { } @Override - public int getOutputSignal(RedstoneConduitData data, DyeColor control) { - boolean b = data.isActive(getFirstChannel()) || data.isActive(getSecondChannel()); + public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { + boolean b = context.isActive(getFirstChannel()) || context.isActive(getSecondChannel()); return b ? 0 : 15; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNOTFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNOTFilter.java index d68145fd3d..2aebd16478 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNOTFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneNOTFilter.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.redstone; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.DyeColor; @@ -14,8 +14,8 @@ private RedstoneNOTFilter() { } @Override - public int getOutputSignal(RedstoneConduitData data, DyeColor control) { - return data.isActive(control) ? 0 : 15; + public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { + return context.isActive(control) ? 0 : 15; } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneORFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneORFilter.java index afa4b64580..00541408f4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneORFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneORFilter.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.redstone; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitComponents; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; @@ -12,8 +12,8 @@ public RedstoneORFilter(ItemStack stack) { } @Override - public int getOutputSignal(RedstoneConduitData data, DyeColor control) { - boolean b = data.isActive(getFirstChannel()) || data.isActive(getSecondChannel()); + public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { + boolean b = context.isActive(getFirstChannel()) || context.isActive(getSecondChannel()); return b ? 15 : 0; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneTLatchFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneTLatchFilter.java index f516b49a72..c2c0575ca5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneTLatchFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneTLatchFilter.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.redstone; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitComponents; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -20,14 +20,14 @@ public RedstoneTLatchFilter(ItemStack stack) { } @Override - public int getOutputSignal(RedstoneConduitData data, DyeColor control) { + public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { boolean output = isActive(); - if (data.isActive(control) && isDeactivated()) { + if (context.isActive(control) && isDeactivated()) { output = !output; setState(output, false); } - if (!data.isActive(control) && !isDeactivated()) { + if (!context.isActive(control) && !isDeactivated()) { setState(output, true); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneXNORFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneXNORFilter.java index f8e51215c3..f0000cbdd7 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneXNORFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneXNORFilter.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.redstone; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitComponents; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; @@ -12,8 +12,8 @@ public RedstoneXNORFilter(ItemStack stack) { } @Override - public int getOutputSignal(RedstoneConduitData data, DyeColor control) { - boolean b = data.isActive(getFirstChannel()) ^ data.isActive(getSecondChannel()); + public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { + boolean b = context.isActive(getFirstChannel()) ^ context.isActive(getSecondChannel()); return b ? 0 : 15; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneXORFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneXORFilter.java index f2658a7d81..d435be2713 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneXORFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneXORFilter.java @@ -1,6 +1,6 @@ package com.enderio.conduits.common.redstone; -import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitData; +import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitComponents; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; @@ -12,8 +12,8 @@ public RedstoneXORFilter(ItemStack stack) { } @Override - public int getOutputSignal(RedstoneConduitData data, DyeColor control) { - boolean b = data.isActive(getFirstChannel()) ^ data.isActive(getSecondChannel()); + public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { + boolean b = context.isActive(getFirstChannel()) ^ context.isActive(getSecondChannel()); return b ? 15 : 0; } } From f2d1b92fc051e222c687f40bd5b7333b5d6e4c81 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 12 Jan 2025 03:18:40 +0000 Subject: [PATCH 16/27] chore: spotlessApply --- build.gradle.kts | 2 +- .../gui/widget/DyeColorPickerWidget.java | 30 ++--- .../base/common/blockentity/Wrenchable.java | 5 - .../base/common/item/tool/YetaWrenchItem.java | 1 - .../enderio/base/common/lang/EIOEnumLang.java | 37 +++--- .../com/enderio/base/common/lang/EIOLang.java | 33 +++-- .../com/enderio/conduits/api/Conduit.java | 10 +- .../com/enderio/conduits/api/ConduitType.java | 30 ++--- .../api/EnderIOConduitsRegistries.java | 38 +++--- .../conduits/api/bundle/AddConduitResult.java | 11 +- .../api/bundle/ConduitBundleReader.java | 7 +- .../enderio/conduits/api/bundle/SlotType.java | 17 ++- .../api/connection/ConnectionStatus.java | 4 +- .../connection/config/ConnectionConfig.java | 7 +- .../config/ConnectionConfigType.java | 11 +- .../RedstoneSensitiveConnectionConfig.java | 3 +- .../io/ChanneledIOConnectionConfig.java | 2 + .../config/io/IOConnectionConfig.java | 2 + .../RedstoneControlledConnection.java | 2 + .../api/model/ConduitModelModifier.java | 9 +- .../RegisterConduitModelModifiersEvent.java | 5 +- .../conduits/api/network/ConduitNetwork.java | 1 - .../network/ConduitNetworkContextType.java | 7 +- .../api/network/node/ConduitNode.java | 3 +- .../conduits/api/network/node/NodeData.java | 2 +- .../api/network/node/NodeDataType.java | 1 - .../network/node/legacy/ConduitDataType.java | 6 +- .../api/screen/ConduitMenuDataAccess.java | 4 +- .../api/screen/ConduitScreenExtension.java | 9 +- .../api/screen/ConduitScreenHelper.java | 19 ++- .../api/screen/ConduitScreenType.java | 3 +- .../RegisterConduitScreenExtensionsEvent.java | 8 +- .../RegisterConduitScreenTypesEvent.java | 5 +- .../ticker/ChannelIOAwareConduitTicker.java | 20 +-- .../conduits/api/ticker/ConduitTicker.java | 3 - .../api/ticker/IOAwareConduitTicker.java | 26 ++-- .../api/ticker/LoadedAwareConduitTicker.java | 17 +-- .../api/ticker/NewIOAwareConduitTicker.java | 18 +-- .../client/ConduitBundleExtension.java | 6 +- .../conduits/client/ConduitClientSetup.java | 2 +- .../conduits/client/ConduitFacadeColor.java | 5 +- .../client/gui/ConduitSelectionButton.java | 11 +- .../gui/conduit/ConduitScreenExtensions.java | 5 +- .../conduit/FluidConduitScreenExtension.java | 42 +++--- .../client/gui/screen/NewConduitScreen.java | 29 ++-- .../filter/RedstoneCountFilterScreen.java | 15 +-- .../RedstoneDoubleChannelFilterScreen.java | 13 +- .../filter/RedstoneTimerFilterScreen.java | 11 +- .../gui/screen/types/ConduitScreenTypes.java | 9 +- .../screen/types/ItemConduitScreenType.java | 45 ++++--- .../types/RedstoneConduitScreenType.java | 13 +- .../model/conduit/ConduitItemModelLoader.java | 14 +- .../conduit/bundle/ConduitBundleModel.java | 2 +- .../bundle/ConduitBundleRenderState.java | 2 - .../bundle/ConduitConnectionRenderState.java | 23 +--- .../modifier/ConduitModelModifiers.java | 14 +- .../modifier/FluidConduitModelModifier.java | 26 ++-- .../client/particle/ConduitBreakParticle.java | 34 ++--- .../common/conduit/ConduitA11yManager.java | 3 +- .../common/conduit/ConduitSavedData.java | 3 +- .../common/conduit/ConduitSorter.java | 54 ++++---- .../conduits/common/conduit/SlotData.java | 2 +- .../conduit/bundle/ConduitBundleBlock.java | 37 +++--- .../bundle/ConduitBundleBlockEntity.java | 125 +++++++++++------- .../bundle/ConduitBundleInventory.java | 2 +- .../common/conduit/bundle/ConduitShape.java | 8 +- .../conduit/facades/ConduitFacadeItem.java | 7 +- .../conduit/graph/ConduitConnectionHost.java | 7 + .../conduit/graph/ConduitGraphContext.java | 6 +- .../conduit/graph/ConduitGraphObject.java | 45 ++++--- .../conduit/legacy/ConnectionState.java | 7 +- .../legacy/LegacyFluidConduitData.java | 32 ++--- .../conduit/legacy/LegacyItemConduitData.java | 62 ++++----- .../legacy/LegacyRedstoneConduitData.java | 32 +++-- .../common/conduit/menu/ConduitMenu.java | 61 ++++----- .../conduit/type/energy/EnergyConduit.java | 18 +-- .../energy/EnergyConduitConnectionConfig.java | 48 +++---- .../energy/EnergyConduitNetworkContext.java | 13 +- .../type/energy/EnergyConduitStorage.java | 12 +- .../type/energy/EnergyConduitTicker.java | 18 +-- .../conduit/type/fluid/FluidConduit.java | 25 ++-- .../fluid/FluidConduitConnectionConfig.java | 75 +++++------ .../fluid/FluidConduitNetworkContext.java | 18 +-- .../type/fluid/FluidConduitTicker.java | 19 +-- .../common/conduit/type/item/ItemConduit.java | 54 ++++---- .../item/ItemConduitConnectionConfig.java | 117 ++++++++-------- .../type/item/ItemConduitNodeData.java | 13 +- .../conduit/type/item/ItemConduitTicker.java | 22 +-- .../type/redstone/RedstoneConduit.java | 43 +++--- .../RedstoneConduitConnectionConfig.java | 48 +++---- .../RedstoneConduitNetworkContext.java | 12 +- .../type/redstone/RedstoneConduitTicker.java | 11 +- .../conduits/common/init/ConduitLang.java | 51 ++++--- .../conduits/common/init/ConduitMenus.java | 17 +-- .../conduits/common/init/ConduitTypes.java | 50 +++---- .../conduits/common/init/Conduits.java | 21 ++- .../network/ConduitMenuSelectionPacket.java | 8 +- .../common/network/ConduitNetwork.java | 18 ++- .../network/S2CConduitExtraGuiDataPacket.java | 16 +-- .../common/network/S2CConduitListPacket.java | 3 +- .../SetConduitConnectionConfigPacket.java | 19 +-- .../common/redstone/RedstoneANDFilter.java | 2 +- .../common/redstone/RedstoneCountFilter.java | 44 +++--- .../conduits/data/recipe/ConduitRecipes.java | 75 ++++++----- .../jade/EIOConduitsJadePlugin.java | 8 +- .../common/block/LegacyMachineBlock.java | 1 - .../blocks/base/block/MachineBlock.java | 4 - .../base/blockentity/MachineBlockEntity.java | 1 - 108 files changed, 1022 insertions(+), 1114 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3cd6083bf1..0ae4e3dea6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -45,7 +45,7 @@ subprojects { encoding("UTF-8") java { - cleanthat() + cleanthat().version("2.8") eclipse().configFile("$rootDir/config/codeformat/codeformat.xml") diff --git a/enderio-base/src/main/java/com/enderio/base/client/gui/widget/DyeColorPickerWidget.java b/enderio-base/src/main/java/com/enderio/base/client/gui/widget/DyeColorPickerWidget.java index 7e2eb8f274..9389ba5c38 100644 --- a/enderio-base/src/main/java/com/enderio/base/client/gui/widget/DyeColorPickerWidget.java +++ b/enderio-base/src/main/java/com/enderio/base/client/gui/widget/DyeColorPickerWidget.java @@ -3,37 +3,23 @@ import com.enderio.base.client.gui.icon.EIOEnumIcons; import com.enderio.base.common.lang.EIOEnumLang; import com.enderio.core.client.gui.widgets.BaseEnumPickerWidget; +import java.util.function.Consumer; +import java.util.function.Supplier; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.Nullable; -import java.util.function.Consumer; -import java.util.function.Supplier; - public class DyeColorPickerWidget extends BaseEnumPickerWidget { // Reproduces the old ColorControl order for player familiarity. - private static final DyeColor[] ORDERED_VALUES = new DyeColor[] { - DyeColor.GREEN, - DyeColor.BROWN, - DyeColor.BLUE, - DyeColor.PURPLE, - DyeColor.CYAN, - DyeColor.LIGHT_GRAY, - DyeColor.GRAY, - DyeColor.PINK, - DyeColor.LIME, - DyeColor.YELLOW, - DyeColor.LIGHT_BLUE, - DyeColor.MAGENTA, - DyeColor.ORANGE, - DyeColor.WHITE, - DyeColor.BLACK, - DyeColor.RED, - }; + private static final DyeColor[] ORDERED_VALUES = new DyeColor[] { DyeColor.GREEN, DyeColor.BROWN, DyeColor.BLUE, + DyeColor.PURPLE, DyeColor.CYAN, DyeColor.LIGHT_GRAY, DyeColor.GRAY, DyeColor.PINK, DyeColor.LIME, + DyeColor.YELLOW, DyeColor.LIGHT_BLUE, DyeColor.MAGENTA, DyeColor.ORANGE, DyeColor.WHITE, DyeColor.BLACK, + DyeColor.RED, }; - public DyeColorPickerWidget(int pX, int pY, Supplier getter, Consumer setter, Component optionName) { + public DyeColorPickerWidget(int pX, int pY, Supplier getter, Consumer setter, + Component optionName) { super(pX, pY, 16, 16, DyeColor.class, getter, setter, optionName); } diff --git a/enderio-base/src/main/java/com/enderio/base/common/blockentity/Wrenchable.java b/enderio-base/src/main/java/com/enderio/base/common/blockentity/Wrenchable.java index 54b83288ba..e490d04517 100644 --- a/enderio-base/src/main/java/com/enderio/base/common/blockentity/Wrenchable.java +++ b/enderio-base/src/main/java/com/enderio/base/common/blockentity/Wrenchable.java @@ -1,12 +1,7 @@ package com.enderio.base.common.blockentity; -import com.enderio.base.api.UseOnly; -import net.minecraft.core.Direction; import net.minecraft.world.ItemInteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.UseOnContext; -import net.neoforged.fml.LogicalSide; -import org.jetbrains.annotations.Nullable; // TODO: Move to API. diff --git a/enderio-base/src/main/java/com/enderio/base/common/item/tool/YetaWrenchItem.java b/enderio-base/src/main/java/com/enderio/base/common/item/tool/YetaWrenchItem.java index 7671451b25..00a1c7d9ad 100644 --- a/enderio-base/src/main/java/com/enderio/base/common/item/tool/YetaWrenchItem.java +++ b/enderio-base/src/main/java/com/enderio/base/common/item/tool/YetaWrenchItem.java @@ -1,7 +1,6 @@ package com.enderio.base.common.item.tool; import com.enderio.base.api.capability.SideConfig; -import com.enderio.base.common.blockentity.Wrenchable; import com.enderio.base.common.init.EIOCapabilities; import com.mojang.datafixers.util.Either; import java.util.Optional; diff --git a/enderio-base/src/main/java/com/enderio/base/common/lang/EIOEnumLang.java b/enderio-base/src/main/java/com/enderio/base/common/lang/EIOEnumLang.java index 640b2e783e..045f343d00 100644 --- a/enderio-base/src/main/java/com/enderio/base/common/lang/EIOEnumLang.java +++ b/enderio-base/src/main/java/com/enderio/base/common/lang/EIOEnumLang.java @@ -21,25 +21,24 @@ public class EIOEnumLang { .addTranslation(RedstoneControl.NEVER_ACTIVE, "Never Active") .build(); - public static final EnumTranslationMap DYE_COLOR = builder(DyeColor.class, - "redstone") - .addTranslation(DyeColor.WHITE, "White") - .addTranslation(DyeColor.ORANGE, "Orange") - .addTranslation(DyeColor.MAGENTA, "Magenta") - .addTranslation(DyeColor.LIGHT_BLUE, "Light Blue") - .addTranslation(DyeColor.YELLOW, "Yellow") - .addTranslation(DyeColor.LIME, "Lime") - .addTranslation(DyeColor.PINK, "Pink") - .addTranslation(DyeColor.GRAY, "Gray") - .addTranslation(DyeColor.LIGHT_GRAY, "Light Gray") - .addTranslation(DyeColor.CYAN, "Cyan") - .addTranslation(DyeColor.PURPLE, "Purple") - .addTranslation(DyeColor.BLUE, "Blue") - .addTranslation(DyeColor.BROWN, "Brown") - .addTranslation(DyeColor.GREEN, "Green") - .addTranslation(DyeColor.RED, "Red") - .addTranslation(DyeColor.BLACK, "Black") - .build(); + public static final EnumTranslationMap DYE_COLOR = builder(DyeColor.class, "redstone") + .addTranslation(DyeColor.WHITE, "White") + .addTranslation(DyeColor.ORANGE, "Orange") + .addTranslation(DyeColor.MAGENTA, "Magenta") + .addTranslation(DyeColor.LIGHT_BLUE, "Light Blue") + .addTranslation(DyeColor.YELLOW, "Yellow") + .addTranslation(DyeColor.LIME, "Lime") + .addTranslation(DyeColor.PINK, "Pink") + .addTranslation(DyeColor.GRAY, "Gray") + .addTranslation(DyeColor.LIGHT_GRAY, "Light Gray") + .addTranslation(DyeColor.CYAN, "Cyan") + .addTranslation(DyeColor.PURPLE, "Purple") + .addTranslation(DyeColor.BLUE, "Blue") + .addTranslation(DyeColor.BROWN, "Brown") + .addTranslation(DyeColor.GREEN, "Green") + .addTranslation(DyeColor.RED, "Red") + .addTranslation(DyeColor.BLACK, "Black") + .build(); public static final EnumTranslationMap GLASS_COLLISION = builder( GlassCollisionPredicate.class, "collision") diff --git a/enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java b/enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java index bae90df157..89b1e1f835 100644 --- a/enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java +++ b/enderio-base/src/main/java/com/enderio/base/common/lang/EIOLang.java @@ -34,19 +34,19 @@ public class EIOLang { // region Items - public static final Component DARK_STEEL_LADDER_FASTER = TooltipUtil.style( - addTranslation("tooltip", EnderIO.loc("dark_steel_ladder.faster"), "Faster than regular ladders")); + public static final Component DARK_STEEL_LADDER_FASTER = TooltipUtil + .style(addTranslation("tooltip", EnderIO.loc("dark_steel_ladder.faster"), "Faster than regular ladders")); public static final Component SOUL_VIAL_ERROR_PLAYER = addTranslation("message", EnderIO.loc("soul_vial.error_player"), "You cannot put player in a bottle!"); - public static final Component SOUL_VIAL_ERROR_BOSS = addTranslation("message", - EnderIO.loc("soul_vial.error_boss"), "Nice try. Bosses don't like bottles."); + public static final Component SOUL_VIAL_ERROR_BOSS = addTranslation("message", EnderIO.loc("soul_vial.error_boss"), + "Nice try. Bosses don't like bottles."); public static final Component SOUL_VIAL_ERROR_BLACKLISTED = addTranslation("message", EnderIO.loc("soul_vial.error_blacklisted"), "This entity has been blacklisted."); public static final Component SOUL_VIAL_ERROR_FAILED = addTranslation("message", EnderIO.loc("soul_vial.error_failed"), "This entity cannot be captured."); - public static final Component SOUL_VIAL_ERROR_DEAD = addTranslation("message", - EnderIO.loc("soul_vial.error_dead"), "Cannot capture a dead mob!"); + public static final Component SOUL_VIAL_ERROR_DEAD = addTranslation("message", EnderIO.loc("soul_vial.error_dead"), + "Cannot capture a dead mob!"); public static final MutableComponent SOUL_VIAL_TOOLTIP_HEALTH = addTranslation("tooltip", EnderIO.loc("soul_vial.health"), "Health: %s/%s"); @@ -57,8 +57,7 @@ public class EIOLang { public static final Component TOO_MANY_LEVELS = addTranslation("info", EnderIO.loc("too_many_levels"), "You have more than 21862 levels, that's too much XP."); - public static final Component REDSTONE_MODE = addTranslation("gui", EnderIO.loc("redstone.mode"), - "Redstone Mode"); + public static final Component REDSTONE_MODE = addTranslation("gui", EnderIO.loc("redstone.mode"), "Redstone Mode"); public static final MutableComponent TANK_EMPTY_STRING = addTranslation("tooltip", EnderIO.loc("fluid_tank.tank_empty_tooltip"), "Empty tank"); @@ -242,8 +241,8 @@ private static Component enchantmentDescription(String enchantmentName, String s "Don't tell the others"); public static final Component RICH_ADVANCEMENT_DESCRIPTION = addTranslation("advancements", EnderIO.loc("rich.description"), "Make others think you are rich"); - public static final Component RICHER_ADVANCEMENT_TITLE = addTranslation("advancements", - EnderIO.loc("richer.title"), "Is this real?"); + public static final Component RICHER_ADVANCEMENT_TITLE = addTranslation("advancements", EnderIO.loc("richer.title"), + "Is this real?"); public static final Component RICHER_ADVANCEMENT_DESCRIPTION = addTranslation("advancements", EnderIO.loc("richer.description"), "Make others think you are richer"); @@ -268,10 +267,10 @@ private static Component enchantmentDescription(String enchantmentName, String s // region JEI - public static final Component JEI_FIRE_CRAFTING_TITLE = addTranslation("jei", EnderIO.loc("fire_crafting"), - "title", "Fire Crafting"); - public static final Component JEI_FIRE_CRAFTING_VALID_BLOCKS = addTranslation("jei", - EnderIO.loc("fire_crafting"), "valid_blocks", "Valid Blocks:"); + public static final Component JEI_FIRE_CRAFTING_TITLE = addTranslation("jei", EnderIO.loc("fire_crafting"), "title", + "Fire Crafting"); + public static final Component JEI_FIRE_CRAFTING_VALID_BLOCKS = addTranslation("jei", EnderIO.loc("fire_crafting"), + "valid_blocks", "Valid Blocks:"); public static final Component JEI_FIRE_CRAFTING_VALID_DIMENSIONS = addTranslation("jei", EnderIO.loc("fire_crafting"), "valid_dimensions", "Valid Dimensions:"); public static final Component JEI_FIRE_CRAFTING_LOOT_TABLE = addTranslation("jei", EnderIO.loc("fire_crafting"), @@ -295,12 +294,10 @@ private static void registerGlassLang() { String colorName = createEnglishPrefix(color); addTranslation("block", - EnderIO - .loc("clear_glass" + lightingKeyName + "_" + color.getName().toLowerCase(Locale.ROOT)), + EnderIO.loc("clear_glass" + lightingKeyName + "_" + color.getName().toLowerCase(Locale.ROOT)), colorName + lightingName + "Clear Glass"); addTranslation("block", - EnderIO - .loc("fused_quartz" + lightingKeyName + "_" + color.getName().toLowerCase(Locale.ROOT)), + EnderIO.loc("fused_quartz" + lightingKeyName + "_" + color.getName().toLowerCase(Locale.ROOT)), colorName + lightingName + "Fused Quartz"); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index 36860f8458..ec5fb4823d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -31,7 +31,8 @@ import net.neoforged.neoforge.capabilities.BlockCapability; import org.jetbrains.annotations.Nullable; -public interface Conduit, TConnectionConfig extends ConnectionConfig> extends Comparable, TooltipProvider { +public interface Conduit, TConnectionConfig extends ConnectionConfig> + extends Comparable, TooltipProvider { Codec> DIRECT_CODEC = EnderIOConduitsRegistries.CONDUIT_TYPE.byNameCodec() .dispatch(Conduit::type, ConduitType::codec); @@ -165,8 +166,9 @@ default void onConnectTo(ConduitNode selfNode, ConduitNode otherNode) { // endregion @Nullable - default TCapability proxyCapability(Level level, ColoredRedstoneProvider coloredRedstoneProvider, ConduitNode node, BlockCapability capability, - @Nullable TContext context) { + default TCapability proxyCapability(Level level, + ColoredRedstoneProvider coloredRedstoneProvider, ConduitNode node, + BlockCapability capability, @Nullable TContext context) { return null; } @@ -185,7 +187,7 @@ default TCapability proxyCapability(Level level, Colored */ @Deprecated(since = "7.2") TConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, - DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel); + DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel); /** * Copy legacy data from the old conduit data accessor to the new node however you wish. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java index 22f4a981e9..18ba1d718b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitType.java @@ -3,7 +3,9 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.Direction; +import java.util.HashSet; +import java.util.Set; +import java.util.function.BiFunction; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; @@ -12,17 +14,12 @@ import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.capabilities.BlockCapability; -import java.util.HashSet; -import java.util.Set; -import java.util.function.BiFunction; - // TODO: Change this from an interface to a record + builder? // No point in having an interface imo. public interface ConduitType> { Codec> CODEC = Codec.lazyInitialized(EnderIOConduitsRegistries.CONDUIT_TYPE::byNameCodec); - StreamCodec> STREAM_CODEC = StreamCodec.recursive( - streamCodec -> ByteBufCodecs.registry(EnderIOConduitsRegistries.Keys.CONDUIT_TYPE) - ); + StreamCodec> STREAM_CODEC = StreamCodec + .recursive(streamCodec -> ByteBufCodecs.registry(EnderIOConduitsRegistries.Keys.CONDUIT_TYPE)); /** * @return The codec used for datapack read and sync. @@ -47,12 +44,10 @@ public interface ConduitType> { } static > Builder builder(BiFunction factory) { - return new Builder(RecordCodecBuilder.mapCodec( - builder -> builder.group( - ResourceLocation.CODEC.fieldOf("texture").forGetter(Conduit::texture), - ComponentSerialization.CODEC.fieldOf("description").forGetter(Conduit::description) - ).apply(builder, factory) - )); + return new Builder(RecordCodecBuilder.mapCodec(builder -> builder + .group(ResourceLocation.CODEC.fieldOf("texture").forGetter(Conduit::texture), + ComponentSerialization.CODEC.fieldOf("description").forGetter(Conduit::description)) + .apply(builder, factory))); } class Builder> { @@ -73,9 +68,8 @@ public ConduitType build() { return new SimpleType<>(codec, exposedCapabilities); } - record SimpleType>( - MapCodec codec, - Set> exposedCapabilities - ) implements ConduitType {} + record SimpleType>(MapCodec codec, Set> exposedCapabilities) + implements ConduitType { + } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java index f3c12587d3..0d62e6f60e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java @@ -11,32 +11,32 @@ public class EnderIOConduitsRegistries { - public static final Registry> CONDUIT_TYPE = new RegistryBuilder<>(Keys.CONDUIT_TYPE) - .sync(true) - .create(); + public static final Registry> CONDUIT_TYPE = new RegistryBuilder<>(Keys.CONDUIT_TYPE).sync(true) + .create(); public static final Registry> CONDUIT_DATA_TYPE = new RegistryBuilder<>(Keys.CONDUIT_DATA_TYPE) - .sync(true) - .create(); + .sync(true) + .create(); - public static final Registry> CONDUIT_NODE_DATA_TYPE = new RegistryBuilder<>(Keys.CONDUIT_NODE_DATA_TYPE) - .sync(true) - .create(); + public static final Registry> CONDUIT_NODE_DATA_TYPE = new RegistryBuilder<>( + Keys.CONDUIT_NODE_DATA_TYPE).sync(true).create(); - public static final Registry> CONDUIT_CONNECTION_CONFIG_TYPE = new RegistryBuilder<>(Keys.CONDUIT_CONNECTION_CONFIG_TYPE) - .sync(true) - .create(); + public static final Registry> CONDUIT_CONNECTION_CONFIG_TYPE = new RegistryBuilder<>( + Keys.CONDUIT_CONNECTION_CONFIG_TYPE).sync(true).create(); - public static final Registry> CONDUIT_NETWORK_CONTEXT_TYPE = new RegistryBuilder<>(Keys.CONDUIT_NETWORK_CONTEXT_TYPE) - .sync(true) - .create(); + public static final Registry> CONDUIT_NETWORK_CONTEXT_TYPE = new RegistryBuilder<>( + Keys.CONDUIT_NETWORK_CONTEXT_TYPE).sync(true).create(); public static class Keys { - public static final ResourceKey>> CONDUIT_DATA_TYPE = createKey("conduit_data_type"); - - public static final ResourceKey>> CONDUIT_NODE_DATA_TYPE = createKey("conduit_node_data_type"); - public static final ResourceKey>> CONDUIT_CONNECTION_CONFIG_TYPE = createKey("conduit_connection_config_type"); - public static final ResourceKey>> CONDUIT_NETWORK_CONTEXT_TYPE = createKey("conduit_network_context_type"); + public static final ResourceKey>> CONDUIT_DATA_TYPE = createKey( + "conduit_data_type"); + + public static final ResourceKey>> CONDUIT_NODE_DATA_TYPE = createKey( + "conduit_node_data_type"); + public static final ResourceKey>> CONDUIT_CONNECTION_CONFIG_TYPE = createKey( + "conduit_connection_config_type"); + public static final ResourceKey>> CONDUIT_NETWORK_CONTEXT_TYPE = createKey( + "conduit_network_context_type"); public static final ResourceKey>> CONDUIT_TYPE = createKey("conduit_type"); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java index dc339f3df9..cb3e9a9d2b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/AddConduitResult.java @@ -5,13 +5,14 @@ import org.jetbrains.annotations.ApiStatus; @ApiStatus.Experimental -public sealed interface AddConduitResult permits AddConduitResult.Upgrade, AddConduitResult.Blocked, AddConduitResult.Insert{ - record Upgrade(Holder> replacedConduit) implements AddConduitResult { +public sealed interface AddConduitResult + permits AddConduitResult.Upgrade, AddConduitResult.Blocked, AddConduitResult.Insert { + record Upgrade(Holder> replacedConduit) implements AddConduitResult { @Override public String toString() { - return "Upgrade[" + replacedConduit.getRegisteredName() + "]"; - } - } + return "Upgrade[" + replacedConduit.getRegisteredName() + "]"; + } + } final class Insert implements AddConduitResult { @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java index 50673a7e0e..fdb8f38e29 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -6,10 +6,8 @@ import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.facade.FacadeType; - -import java.util.List; - import com.enderio.conduits.api.network.node.ConduitNode; +import java.util.List; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; @@ -103,7 +101,8 @@ public interface ConduitBundleReader { * @param conduit * @return */ - T getConnectionConfig(Direction side, Holder> conduit, ConnectionConfigType type); + T getConnectionConfig(Direction side, Holder> conduit, + ConnectionConfigType type); /** * An endpoint is a side which has a "connection plate" to another block, rather than to continued line of bundles. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java index 451134e7a6..7da19acbaa 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java @@ -3,16 +3,15 @@ import com.enderio.conduits.api.ConduitMenuData; public enum SlotType { - FILTER_EXTRACT, - FILTER_INSERT, - UPGRADE_EXTRACT; + FILTER_EXTRACT, FILTER_INSERT, UPGRADE_EXTRACT; public static final int Y_POSITION = 71; + public int getX() { return switch (this) { - case FILTER_EXTRACT -> 113; - case FILTER_INSERT -> 23; - case UPGRADE_EXTRACT -> 131; + case FILTER_EXTRACT -> 113; + case FILTER_INSERT -> 23; + case UPGRADE_EXTRACT -> 131; }; } @@ -22,9 +21,9 @@ public int getY() { public boolean isAvailableFor(ConduitMenuData data) { return switch (this) { - case FILTER_INSERT -> data.hasFilterInsert(); - case FILTER_EXTRACT -> data.hasFilterExtract(); - case UPGRADE_EXTRACT -> data.hasUpgrade(); + case FILTER_INSERT -> data.hasFilterInsert(); + case FILTER_EXTRACT -> data.hasFilterExtract(); + case UPGRADE_EXTRACT -> data.hasUpgrade(); }; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConnectionStatus.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConnectionStatus.java index bb17aa819c..c32666b877 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConnectionStatus.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/ConnectionStatus.java @@ -2,14 +2,12 @@ import io.netty.buffer.ByteBuf; import java.util.function.IntFunction; - +import javax.annotation.Nullable; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.ByIdMap; import net.minecraft.util.StringRepresentable; -import javax.annotation.Nullable; - public enum ConnectionStatus implements StringRepresentable { /** * This conduit is not connected to anything. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java index 3fdc0396d5..75e9ce1fde 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java @@ -2,7 +2,6 @@ import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.network.node.legacy.ConduitData; -import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.mojang.serialization.Codec; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; @@ -18,11 +17,11 @@ public interface ConnectionConfig { Codec GENERIC_CODEC = EnderIOConduitsRegistries.CONDUIT_CONNECTION_CONFIG_TYPE.byNameCodec() - .dispatch(ConnectionConfig::type, ConnectionConfigType::codec); + .dispatch(ConnectionConfig::type, ConnectionConfigType::codec); StreamCodec STREAM_CODEC = ByteBufCodecs - .registry(EnderIOConduitsRegistries.Keys.CONDUIT_CONNECTION_CONFIG_TYPE) - .dispatch(ConnectionConfig::type, ConnectionConfigType::streamCodec); + .registry(EnderIOConduitsRegistries.Keys.CONDUIT_CONNECTION_CONFIG_TYPE) + .dispatch(ConnectionConfig::type, ConnectionConfigType::streamCodec); /** * @return whether the conduit should still be connected with this configuration. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java index 61b0e63f5f..6e5f47e217 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java @@ -4,17 +4,12 @@ import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.mojang.serialization.MapCodec; +import java.util.function.Supplier; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import java.util.function.Supplier; - -public record ConnectionConfigType( - Class clazz, - MapCodec codec, - StreamCodec streamCodec, - Supplier defaultSupplier -) { +public record ConnectionConfigType(Class clazz, MapCodec codec, + StreamCodec streamCodec, Supplier defaultSupplier) { public T getDefault() { return defaultSupplier.get(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/RedstoneSensitiveConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/RedstoneSensitiveConnectionConfig.java index d1c279ab78..2323adf577 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/RedstoneSensitiveConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/RedstoneSensitiveConnectionConfig.java @@ -1,10 +1,9 @@ package com.enderio.conduits.api.connection.config; +import java.util.List; import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.ApiStatus; -import java.util.List; - /** * Get the list of redstone signal colors that this connection is sensitive to. * This is exclusively used for conduit connection rendering. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java index 115904d6cd..82ea1072c3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java @@ -6,8 +6,10 @@ @ApiStatus.Experimental public interface ChanneledIOConnectionConfig extends IOConnectionConfig { DyeColor insertChannel(); + DyeColor extractChannel(); ChanneledIOConnectionConfig withInputChannel(DyeColor inputChannel); + ChanneledIOConnectionConfig withOutputChannel(DyeColor outputChannel); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java index 6c4c68cbb6..a6d1ee9db5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java @@ -9,9 +9,11 @@ public interface IOConnectionConfig extends ConnectionConfig { // TODO: canSend/canReceive? Might be clearer when used with Redstone signals? boolean canInsert(); + boolean canExtract(); IOConnectionConfig withInsert(boolean canInsert); + IOConnectionConfig withExtract(boolean canExtract); @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java index d4363eadaf..1ae452f097 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java @@ -13,8 +13,10 @@ @ApiStatus.Experimental public interface RedstoneControlledConnection extends ConnectionConfig { RedstoneControl redstoneControl(); + DyeColor redstoneChannel(); RedstoneControlledConnection withRedstoneControl(RedstoneControl redstoneControl); + RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java index c2e3e8d153..7356f50ebe 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/ConduitModelModifier.java @@ -1,7 +1,7 @@ package com.enderio.conduits.api.model; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.bundle.ConduitBundleReader; +import java.util.List; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.ModelResourceLocation; @@ -9,18 +9,15 @@ import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.RandomSource; -import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.Nullable; -import java.util.List; - public interface ConduitModelModifier { /** * Create additional quads to be rendered at the point of conduit connection. */ - default List createConnectionQuads(Holder> conduit, @Nullable CompoundTag extraWorldData, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, - @Nullable RenderType type) { + default List createConnectionQuads(Holder> conduit, @Nullable CompoundTag extraWorldData, + @Nullable Direction facing, Direction connectionDirection, RandomSource rand, @Nullable RenderType type) { return List.of(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java index 2f00b8fa3b..b30cef94ca 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/model/RegisterConduitModelModifiersEvent.java @@ -2,11 +2,10 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitType; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; - import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import net.neoforged.bus.api.Event; +import net.neoforged.fml.event.IModBusEvent; public class RegisterConduitModelModifiersEvent extends Event implements IModBusEvent { public interface ConduitCoreModelModifierFactory { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetwork.java index 00b88e3c42..07a3b8dc30 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetwork.java @@ -1,7 +1,6 @@ package com.enderio.conduits.api.network; import com.enderio.conduits.api.network.node.ConduitNode; - import java.util.Collection; public interface ConduitNetwork extends ConduitNetworkContextAccessor { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextType.java index 3d95325c0c..cff9971e76 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/ConduitNetworkContextType.java @@ -1,8 +1,9 @@ package com.enderio.conduits.api.network; import com.mojang.serialization.Codec; -import org.jetbrains.annotations.Nullable; - import java.util.function.Supplier; +import org.jetbrains.annotations.Nullable; -public record ConduitNetworkContextType>(@Nullable Codec codec, Supplier factory) {} +public record ConduitNetworkContextType>(@Nullable Codec codec, + Supplier factory) { +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java index db8365737f..167816853b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/ConduitNode.java @@ -24,7 +24,8 @@ public interface ConduitNode extends NodeDataAccessor, ConnectionConfigAccessor ResourceFilter getInsertFilter(Direction direction); // TODO: investigate nullability for this interface? - @Nullable ConduitNetwork getNetwork(); + @Nullable + ConduitNetwork getNetwork(); /** * @return whether this node's bundle is loaded and ticking in the world diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeData.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeData.java index 575d8ef4c4..ba707bc443 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeData.java @@ -11,7 +11,7 @@ */ public interface NodeData { Codec GENERIC_CODEC = EnderIOConduitsRegistries.CONDUIT_NODE_DATA_TYPE.byNameCodec() - .dispatch(NodeData::type, NodeDataType::codec); + .dispatch(NodeData::type, NodeDataType::codec); NodeDataType type(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataType.java index 616f507b55..306ed23816 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/NodeDataType.java @@ -1,7 +1,6 @@ package com.enderio.conduits.api.network.node; import com.mojang.serialization.MapCodec; - import java.util.function.Supplier; public record NodeDataType(MapCodec codec, Supplier factory) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java index e61af6bd51..2618efae31 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java @@ -1,10 +1,10 @@ package com.enderio.conduits.api.network.node.legacy; import com.mojang.serialization.MapCodec; +import java.util.function.Supplier; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import java.util.function.Supplier; - -public record ConduitDataType>(MapCodec codec, StreamCodec streamCodec, Supplier factory) { +public record ConduitDataType>(MapCodec codec, + StreamCodec streamCodec, Supplier factory) { } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java index bdc96948cc..908043aee2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java @@ -1,15 +1,15 @@ package com.enderio.conduits.api.screen; import com.enderio.conduits.api.connection.config.ConnectionConfig; +import java.util.function.Function; import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -import java.util.function.Function; - @ApiStatus.Experimental public interface ConduitMenuDataAccess { T getConnectionConfig(); + void updateConnectionConfig(Function configModifier); @Nullable diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java index 9065faf6bb..01b11dd406 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java @@ -1,14 +1,13 @@ package com.enderio.conduits.api.screen; import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; +import java.util.List; +import java.util.function.Supplier; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.Direction; import org.joml.Vector2i; -import java.util.List; -import java.util.function.Supplier; - /** * Extend the conduit screen with additional widgets. */ @@ -28,6 +27,6 @@ interface UpdateDispatcher { * @param widgetsStart the position on which widgets start * @return Widgets that manipulate the extended ConduitData, these changes are synced back to the server */ - List createWidgets(Screen screen, ConduitDataAccessor conduitDataAccessor, UpdateDispatcher updateDispatcher, - Supplier direction, Vector2i widgetsStart); + List createWidgets(Screen screen, ConduitDataAccessor conduitDataAccessor, + UpdateDispatcher updateDispatcher, Supplier direction, Vector2i widgetsStart); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java index a8ad9a7d07..b1cd431071 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java @@ -1,6 +1,8 @@ package com.enderio.conduits.api.screen; import com.enderio.base.api.misc.RedstoneControl; +import java.util.function.Consumer; +import java.util.function.Supplier; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -10,16 +12,16 @@ import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.ApiStatus; -import java.util.function.Consumer; -import java.util.function.Supplier; - @ApiStatus.Experimental public interface ConduitScreenHelper { // Positions int getAreaLeft(); + int getAreaTop(); + int getUsableWidth(); + int getUsableHeight(); // Built-in widget support @@ -27,10 +29,12 @@ public interface ConduitScreenHelper { AbstractWidget addColorPicker(int x, int y, Component title, Supplier getter, Consumer setter); - AbstractWidget addRedstoneControlPicker(int x, int y, Component title, Supplier getter, Consumer setter); + AbstractWidget addRedstoneControlPicker(int x, int y, Component title, Supplier getter, + Consumer setter); - AbstractWidget addToggleButton(int x, int y, int width, int height, Component enabledTitle, Component disabledTitle, ResourceLocation enabledSprite, - ResourceLocation disabledSprite, Supplier getter, Consumer setter); + AbstractWidget addToggleButton(int x, int y, int width, int height, Component enabledTitle, Component disabledTitle, + ResourceLocation enabledSprite, ResourceLocation disabledSprite, Supplier getter, + Consumer setter); // TODO: Create icon button @@ -42,7 +46,10 @@ AbstractWidget addToggleButton(int x, int y, int width, int height, Component en // Custom widget support W addRenderableWidget(W widget); + W addRenderableOnly(W renderable); + W addWidget(W listener); + void removeWidget(GuiEventListener listener); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java index 4821a22325..cebf198192 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java @@ -9,7 +9,8 @@ public abstract class ConduitScreenType { // TODO: Other built-in behaviours like this. - // Could also create IOConduitScreenType with automated helpers for adding the toggles. + // Could also create IOConduitScreenType with automated helpers for adding the + // toggles. private boolean renderSideSeparator = false; public abstract void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java index 6a6b1a8f4b..b92f6af3eb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java @@ -2,11 +2,10 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitType; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; - import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import net.neoforged.bus.api.Event; +import net.neoforged.fml.event.IModBusEvent; @Deprecated(forRemoval = true) public class RegisterConduitScreenExtensionsEvent extends Event implements IModBusEvent { @@ -16,7 +15,8 @@ public interface ConduitScreenExtensionFactory { private final Map, ConduitScreenExtensionFactory> extensions = new ConcurrentHashMap<>(); - public void register(ConduitType> conduitType, ConduitScreenExtensionFactory extensionFactory) { + public void register(ConduitType> conduitType, + ConduitScreenExtensionFactory extensionFactory) { extensions.put(conduitType, extensionFactory); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenTypesEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenTypesEvent.java index 63d8b06583..dd57aa46c0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenTypesEvent.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenTypesEvent.java @@ -2,11 +2,10 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitType; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; - import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import net.neoforged.bus.api.Event; +import net.neoforged.fml.event.IModBusEvent; public class RegisterConduitScreenTypesEvent extends Event implements IModBusEvent { private final Map, ConduitScreenType> screenTypes = new ConcurrentHashMap<>(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java index f36e7a0367..c2e2c5700a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java @@ -1,15 +1,14 @@ package com.enderio.conduits.api.ticker; import com.enderio.base.api.filter.ResourceFilter; -import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; +import java.util.List; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -17,8 +16,6 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -import java.util.List; - /** * A channel IO-aware ticker. * @@ -28,10 +25,11 @@ * @param The type of connection for the ticker implementation */ public abstract class ChannelIOAwareConduitTicker, U extends ChannelIOAwareConduitTicker.SimpleConnection> - implements ConduitTicker { + implements ConduitTicker { @Override - public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider) { ListMultimap extracts = ArrayListMultimap.create(); ListMultimap inserts = ArrayListMultimap.create(); for (ConduitNode node : graph.getNodes()) { @@ -79,14 +77,8 @@ protected boolean shouldSkipColor(List extractList, List insertList) { @Nullable protected abstract U createConnection(Level level, ConduitNode node, Direction side); - protected abstract void tickColoredGraph( - ServerLevel level, - T conduit, - List inserts, - List extracts, - DyeColor color, - ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider); + protected abstract void tickColoredGraph(ServerLevel level, T conduit, List inserts, List extracts, + DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); public static class SimpleConnection { private final ConduitNode node; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java index 9b70ea6a73..1a4209c678 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ConduitTicker.java @@ -3,10 +3,7 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.network.ConduitNetwork; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; public interface ConduitTicker> { void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java index 25a31f665e..6018b7992a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java @@ -8,18 +8,19 @@ import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; +import java.util.ArrayList; +import java.util.List; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.List; - -public abstract class IOAwareConduitTicker, TConnection extends IOAwareConduitTicker.SimpleConnection> implements ConduitTicker { +public abstract class IOAwareConduitTicker, TConnection extends IOAwareConduitTicker.SimpleConnection> + implements ConduitTicker { @Override - public void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + public void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider) { List extracts = new ArrayList<>(); List inserts = new ArrayList<>(); for (ConduitNode node : graph.getNodes()) { @@ -62,16 +63,12 @@ protected boolean shouldSkip(List extractList, List in @Nullable protected abstract TConnection createConnection(Level level, ConduitNode node, Direction side); - protected abstract void tickGraph( - ServerLevel level, - TConduit conduit, - List inserts, - List extracts, - ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider); + protected abstract void tickGraph(ServerLevel level, TConduit conduit, List inserts, + List extracts, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); // TODO: This needs to be factored out... - private boolean isActive(ServerLevel level, Direction side, ConduitNode node, ColoredRedstoneProvider coloredRedstoneProvider) { + private boolean isActive(ServerLevel level, Direction side, ConduitNode node, + ColoredRedstoneProvider coloredRedstoneProvider) { var connectionConfig = node.getConnectionConfig(side); if (!(connectionConfig instanceof RedstoneControlledConnection redstoneControlledConnection)) { return true; @@ -85,7 +82,8 @@ private boolean isActive(ServerLevel level, Direction side, ConduitNode node, Co return false; } - boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), redstoneControlledConnection.redstoneChannel()); + boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), + redstoneControlledConnection.redstoneChannel()); if (!hasRedstone) { for (Direction direction : Direction.values()) { if (level.getSignal(node.getPos().relative(direction), direction.getOpposite()) > 0) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java index 7442394677..b75ffa9092 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/LoadedAwareConduitTicker.java @@ -4,24 +4,19 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; - import java.util.List; +import net.minecraft.server.level.ServerLevel; public interface LoadedAwareConduitTicker> extends ConduitTicker { @Override - default void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { - List nodeIdentifiers = graph.getNodes() - .stream().filter(ConduitNode::isLoaded) - .toList(); + default void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider) { + List nodeIdentifiers = graph.getNodes().stream().filter(ConduitNode::isLoaded).toList(); tickGraph(level, conduit, nodeIdentifiers, graph, coloredRedstoneProvider); } - void tickGraph(ServerLevel level, TConduit type, - List loadedNodes, ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider); + void tickGraph(ServerLevel level, TConduit type, List loadedNodes, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java index b5921e6523..4ebc138d53 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java @@ -8,6 +8,7 @@ import com.enderio.conduits.api.network.node.ConduitNode; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; +import java.util.List; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -15,8 +16,6 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -import java.util.List; - /** * A channel IO-aware ticker. * @@ -26,10 +25,11 @@ * @param The type of connection for the ticker implementation */ public abstract class NewIOAwareConduitTicker, U extends NewIOConnectionConfig, V extends NewIOAwareConduitTicker.SimpleConnection> - implements ConduitTicker { + implements ConduitTicker { @Override - public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider) { ListMultimap senders = ArrayListMultimap.create(); ListMultimap receivers = ArrayListMultimap.create(); @@ -82,14 +82,8 @@ protected void preProcessReceivers(List receivers) { @Nullable protected abstract V createConnection(Level level, ConduitNode node, Direction side); - protected abstract void tickColoredGraph( - ServerLevel level, - T conduit, - List senders, - List receivers, - DyeColor color, - ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider); + protected abstract void tickColoredGraph(ServerLevel level, T conduit, List senders, List receivers, + DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); public static class SimpleConnection { private final ConduitNode node; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java index 8619f708ea..eadf91a91f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitBundleExtension.java @@ -3,10 +3,7 @@ import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; import com.enderio.conduits.client.particle.ConduitBreakParticle; -import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlock; import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleEngine; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; @@ -37,7 +34,8 @@ public boolean addHitEffects(BlockState state, Level level, HitResult target, Pa var conduit = conduitBundle.getShape().getConduit(blockHitResult.getBlockPos(), target); if (conduit != null) { - ConduitBreakParticle.addCrackEffects(blockHitResult.getBlockPos(), state, conduit.value(), blockHitResult.getDirection()); + ConduitBreakParticle.addCrackEffects(blockHitResult.getBlockPos(), state, conduit.value(), + blockHitResult.getDirection()); } return true; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java index 2a20037ef5..5d814c7e37 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java @@ -11,10 +11,10 @@ import com.enderio.conduits.client.gui.screen.types.ItemConduitScreenType; import com.enderio.conduits.client.gui.screen.types.RedstoneConduitScreenType; import com.enderio.conduits.client.model.conduit.ConduitItemModelLoader; +import com.enderio.conduits.client.model.conduit.bundle.ConduitBundleGeometry; import com.enderio.conduits.client.model.conduit.facades.FacadeItemGeometry; import com.enderio.conduits.client.model.conduit.modifier.ConduitModelModifiers; import com.enderio.conduits.client.model.conduit.modifier.FluidConduitModelModifier; -import com.enderio.conduits.client.model.conduit.bundle.ConduitBundleGeometry; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.init.ConduitTypes; import java.util.ArrayList; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java index f53f40d8b6..6bdc8fece6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitFacadeColor.java @@ -2,7 +2,6 @@ import com.enderio.base.common.init.EIODataComponents; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; - import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColor; @@ -31,8 +30,8 @@ public int getColor(BlockState state, @Nullable BlockAndTintGetter level, @Nulla if (FacadeHelper.areFacadesVisible()) { int color = Minecraft.getInstance() - .getBlockColors() - .getColor(facade.defaultBlockState(), level, pos, tintIndex); + .getBlockColors() + .getColor(facade.defaultBlockState(), level, pos, tintIndex); if (color != -1) { return color; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java index 843084d163..84b0feb4fe 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java @@ -3,6 +3,8 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.client.gui.screen.NewConduitScreen; import com.mojang.blaze3d.systems.RenderSystem; +import java.util.function.Consumer; +import java.util.function.Supplier; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.narration.NarrationElementOutput; @@ -12,15 +14,13 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import java.util.function.Consumer; -import java.util.function.Supplier; - public class ConduitSelectionButton extends AbstractButton { private final Holder> conduit; private final Supplier>> getter; private final Consumer>> setter; - public ConduitSelectionButton(int pX, int pY, Holder> conduit, Supplier>> getter, Consumer>> setter) { + public ConduitSelectionButton(int pX, int pY, Holder> conduit, Supplier>> getter, + Consumer>> setter) { super(pX, pY, 21, 24, Component.empty()); this.conduit = conduit; this.getter = getter; @@ -50,7 +50,8 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa ResourceLocation iconLocation = MissingTextureAtlasSprite.getLocation(); ResourceLocation conduitKey = conduit.unwrapKey().map(ResourceKey::location).orElse(null); if (conduitKey != null) { - iconLocation = ResourceLocation.fromNamespaceAndPath(conduitKey.getNamespace(), "conduit_icon/" + conduitKey.getPath()); + iconLocation = ResourceLocation.fromNamespaceAndPath(conduitKey.getNamespace(), + "conduit_icon/" + conduitKey.getPath()); } guiGraphics.blitSprite(iconLocation, getX() + 3, getY() + 6, 12, 12); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java index 8c4da4c3de..0b847d36a0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java @@ -3,13 +3,12 @@ import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.screen.ConduitScreenExtension; import com.enderio.conduits.api.screen.RegisterConduitScreenExtensionsEvent; +import java.util.HashMap; +import java.util.Map; import me.liliandev.ensure.ensures.EnsureSide; import net.neoforged.fml.ModLoader; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; - @Deprecated(forRemoval = true) public class ConduitScreenExtensions { private static Map, ConduitScreenExtension> EXTENSIONS; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java index b1d9f1ca69..be0c0b3a49 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java @@ -8,6 +8,8 @@ import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.util.TooltipUtil; import com.mojang.blaze3d.systems.RenderSystem; +import java.util.List; +import java.util.function.Supplier; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; @@ -27,28 +29,22 @@ import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import org.joml.Vector2i; -import java.util.List; -import java.util.function.Supplier; - public final class FluidConduitScreenExtension implements ConduitScreenExtension { private static final ResourceLocation WIDGET_TEXTURE = EnderIO.loc("textures/gui/fluidbackground.png"); @Override - public List createWidgets(Screen screen, ConduitDataAccessor conduitDataAccessor, UpdateDispatcher updateConduitData, - Supplier direction, Vector2i widgetsStart) { + public List createWidgets(Screen screen, ConduitDataAccessor conduitDataAccessor, + UpdateDispatcher updateConduitData, Supplier direction, Vector2i widgetsStart) { if (conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()).lockedFluid().isSame(Fluids.EMPTY)) { return List.of(); } - return List.of( - new FluidWidget(widgetsStart.add(0, 20), - () -> conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()).lockedFluid(), - () -> { + return List.of(new FluidWidget(widgetsStart.add(0, 20), + () -> conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()).lockedFluid(), () -> { LegacyFluidConduitData data = conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()); data.setShouldReset(true); updateConduitData.sendUpdate(); - }) - ); + })); } private static class FluidWidget extends AbstractWidget { @@ -71,7 +67,9 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa MutableComponent tooltip = ConduitLang.FLUID_CONDUIT_CHANGE_FLUID1.copy(); tooltip.append("\n").append(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID2); if (!currentFluid.get().isSame(Fluids.EMPTY)) { - tooltip.append("\n").append(TooltipUtil.withArgs(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID3, currentFluid.get().getFluidType().getDescription())); + tooltip.append("\n") + .append(TooltipUtil.withArgs(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID3, + currentFluid.get().getFluidType().getDescription())); } setTooltip(Tooltip.create(TooltipUtil.style(tooltip))); } @@ -86,23 +84,23 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa IClientFluidTypeExtensions props = IClientFluidTypeExtensions.of(currentFluid.get()); ResourceLocation still = props.getStillTexture(); - AbstractTexture texture = Minecraft.getInstance().getTextureManager().getTexture(TextureAtlas.LOCATION_BLOCKS); + AbstractTexture texture = Minecraft.getInstance() + .getTextureManager() + .getTexture(TextureAtlas.LOCATION_BLOCKS); if (texture instanceof TextureAtlas atlas) { TextureAtlasSprite sprite = atlas.getSprite(still); int color = props.getTintColor(); - RenderSystem.setShaderColor( - FastColor.ARGB32.red(color) / 255.0F, - FastColor.ARGB32.green(color) / 255.0F, - FastColor.ARGB32.blue(color) / 255.0F, - FastColor.ARGB32.alpha(color) / 255.0F); + RenderSystem.setShaderColor(FastColor.ARGB32.red(color) / 255.0F, + FastColor.ARGB32.green(color) / 255.0F, FastColor.ARGB32.blue(color) / 255.0F, + FastColor.ARGB32.alpha(color) / 255.0F); RenderSystem.enableBlend(); + int atlasWidth = (int) (sprite.contents().width() / (sprite.getU1() - sprite.getU0())); + int atlasHeight = (int) (sprite.contents().height() / (sprite.getV1() - sprite.getV0())); - int atlasWidth = (int)(sprite.contents().width() / (sprite.getU1() - sprite.getU0())); - int atlasHeight = (int)(sprite.contents().height() / (sprite.getV1() - sprite.getV0())); - - guiGraphics.blit(TextureAtlas.LOCATION_BLOCKS, getX() + 1, getY() + 1, 0, sprite.getU0()*atlasWidth, sprite.getV0()*atlasHeight, 12, 12, atlasWidth, atlasHeight); + guiGraphics.blit(TextureAtlas.LOCATION_BLOCKS, getX() + 1, getY() + 1, 0, sprite.getU0() * atlasWidth, + sprite.getV0() * atlasHeight, 12, 12, atlasWidth, atlasHeight); RenderSystem.setShaderColor(1, 1, 1, 1); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java index 8b887ee67d..7f4ab95e39 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java @@ -16,6 +16,10 @@ import com.enderio.conduits.common.network.SetConduitConnectionConfigPacket; import com.enderio.core.client.gui.screen.EnderContainerScreen; import com.enderio.core.client.gui.widgets.ToggleIconButton; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Renderable; @@ -29,11 +33,6 @@ import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Supplier; - public class NewConduitScreen extends EnderContainerScreen { public static final ResourceLocation TEXTURE = EnderIO.loc("textures/gui/conduit.png"); private static final int WIDTH = 206; @@ -101,7 +100,8 @@ protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { } } - // Due to the generics, the menu data access and screen type need to be contained here. + // Due to the generics, the menu data access and screen type need to be + // contained here. private class ConduitScreenTypeContainer { private final ConduitMenuDataAccess dataAccess; @@ -132,7 +132,8 @@ public void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { } } - private , U extends ConnectionConfig> ConduitMenuDataAccess createDataAccess(Conduit conduit) { + private , U extends ConnectionConfig> ConduitMenuDataAccess createDataAccess( + Conduit conduit) { return new ConduitMenuDataAccess<>() { @Override public U getConnectionConfig() { @@ -189,24 +190,28 @@ public AbstractWidget addCheckbox(int x, int y, Supplier getter, Consum } @Override - public AbstractWidget addColorPicker(int x, int y, Component title, Supplier getter, Consumer setter) { + public AbstractWidget addColorPicker(int x, int y, Component title, Supplier getter, + Consumer setter) { var widget = new DyeColorPickerWidget(getAreaLeft() + x, getAreaTop() + y, getter, setter, title); addRenderableWidget(widget); return widget; } @Override - public AbstractWidget addRedstoneControlPicker(int x, int y, Component title, Supplier getter, Consumer setter) { + public AbstractWidget addRedstoneControlPicker(int x, int y, Component title, Supplier getter, + Consumer setter) { var widget = new RedstoneControlPickerWidget(getAreaLeft() + x, getAreaTop() + y, getter, setter, title); addRenderableWidget(widget); return widget; } @Override - public AbstractWidget addToggleButton(int x, int y, int width, int height, Component enabledTitle, Component disabledTitle, ResourceLocation enabledSprite, - ResourceLocation disabledSprite, Supplier getter, Consumer setter) { + public AbstractWidget addToggleButton(int x, int y, int width, int height, Component enabledTitle, + Component disabledTitle, ResourceLocation enabledSprite, ResourceLocation disabledSprite, + Supplier getter, Consumer setter) { - var widget = ToggleIconButton.of(getAreaLeft() + x, getAreaTop() + y, width, height, enabledSprite, disabledSprite, enabledTitle, disabledTitle, getter, setter); + var widget = ToggleIconButton.of(getAreaLeft() + x, getAreaTop() + y, width, height, enabledSprite, + disabledSprite, enabledTitle, disabledTitle, getter, setter); addRenderableWidget(widget); return widget; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneCountFilterScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneCountFilterScreen.java index d76272aea4..168b7278c7 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneCountFilterScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneCountFilterScreen.java @@ -14,7 +14,7 @@ import org.joml.Vector2i; public class RedstoneCountFilterScreen extends EIOScreen { - private static final Vector2i BG_SIZE = new Vector2i(183,201); + private static final Vector2i BG_SIZE = new Vector2i(183, 201); private static final ResourceLocation BG_TEXTURE = EnderIO.loc("textures/gui/40/item_filter.png"); public RedstoneCountFilterScreen(RedstoneCountFilterMenu pMenu, Inventory pPlayerInventory, Component pTitle) { @@ -25,11 +25,10 @@ public RedstoneCountFilterScreen(RedstoneCountFilterMenu pMenu, Inventory pPlaye protected void init() { super.init(); addRenderableWidget(new DyeColorPickerWidget(this.leftPos + 15, this.topPos + 30, - getMenu().getFilter()::getChannel, - getMenu()::setChannel, - ConduitLang.REDSTONE_CHANNEL)); + getMenu().getFilter()::getChannel, getMenu()::setChannel, ConduitLang.REDSTONE_CHANNEL)); - EditBox pWidget = new EditBox(this.font, this.leftPos + 60, this.topPos + 20, 60, 20, Component.literal("" + getMenu().getFilter().getMaxCount())) { + EditBox pWidget = new EditBox(this.font, this.leftPos + 60, this.topPos + 20, 60, 20, + Component.literal("" + getMenu().getFilter().getMaxCount())) { @Override public boolean charTyped(char pCodePoint, int pModifiers) { return Character.isDigit(pCodePoint) && super.charTyped(pCodePoint, pModifiers); @@ -38,9 +37,9 @@ public boolean charTyped(char pCodePoint, int pModifiers) { pWidget.setValue("" + getMenu().getFilter().getMaxCount()); addRenderableWidget(pWidget); addRenderableWidget(Button.builder(EIOLang.CONFIRM, pButton -> getMenu().setCount(pWidget.getValue())) - .pos(this.leftPos + 60, this.topPos + 41) - .size(60, 20) - .build()); + .pos(this.leftPos + 60, this.topPos + 41) + .size(60, 20) + .build()); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneDoubleChannelFilterScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneDoubleChannelFilterScreen.java index b2635980ca..80b3e0d678 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneDoubleChannelFilterScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneDoubleChannelFilterScreen.java @@ -12,10 +12,11 @@ public class RedstoneDoubleChannelFilterScreen extends EIOScreen { - private static final Vector2i BG_SIZE = new Vector2i(183,201); + private static final Vector2i BG_SIZE = new Vector2i(183, 201); private static final ResourceLocation BG_TEXTURE = EnderIO.loc("textures/gui/40/item_filter.png"); - public RedstoneDoubleChannelFilterScreen(RedstoneDoubleChannelFilterMenu pMenu, Inventory pPlayerInventory, Component pTitle) { + public RedstoneDoubleChannelFilterScreen(RedstoneDoubleChannelFilterMenu pMenu, Inventory pPlayerInventory, + Component pTitle) { super(pMenu, pPlayerInventory, pTitle); } @@ -23,13 +24,9 @@ public RedstoneDoubleChannelFilterScreen(RedstoneDoubleChannelFilterMenu pMenu, protected void init() { super.init(); addRenderableWidget(new DyeColorPickerWidget(this.leftPos + 15, this.topPos + 30, - getMenu().getChannels()::getFirstChannel, - getMenu()::setFirstChannel, - ConduitLang.REDSTONE_CHANNEL)); + getMenu().getChannels()::getFirstChannel, getMenu()::setFirstChannel, ConduitLang.REDSTONE_CHANNEL)); addRenderableWidget(new DyeColorPickerWidget(this.leftPos + 15 + 60, this.topPos + 30, - getMenu().getChannels()::getSecondChannel, - getMenu()::setSecondChannel, - ConduitLang.REDSTONE_CHANNEL)); + getMenu().getChannels()::getSecondChannel, getMenu()::setSecondChannel, ConduitLang.REDSTONE_CHANNEL)); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneTimerFilterScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneTimerFilterScreen.java index f565eb7604..205d4e6d46 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneTimerFilterScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/RedstoneTimerFilterScreen.java @@ -13,7 +13,7 @@ public class RedstoneTimerFilterScreen extends EIOScreen { - private static final Vector2i BG_SIZE = new Vector2i(183,201); + private static final Vector2i BG_SIZE = new Vector2i(183, 201); private static final ResourceLocation BG_TEXTURE = EnderIO.loc("textures/gui/40/item_filter.png"); public RedstoneTimerFilterScreen(RedstoneTimerFilterMenu pMenu, Inventory pPlayerInventory, Component pTitle) { @@ -23,7 +23,8 @@ public RedstoneTimerFilterScreen(RedstoneTimerFilterMenu pMenu, Inventory pPlaye @Override protected void init() { super.init(); - EditBox pWidget = new EditBox(this.font, this.leftPos + 60, this.topPos + 20, 60, 20, Component.literal("" + getMenu().getFilter().getMaxTicks())) { + EditBox pWidget = new EditBox(this.font, this.leftPos + 60, this.topPos + 20, 60, 20, + Component.literal("" + getMenu().getFilter().getMaxTicks())) { @Override public boolean charTyped(char pCodePoint, int pModifiers) { return Character.isDigit(pCodePoint) && super.charTyped(pCodePoint, pModifiers); @@ -32,9 +33,9 @@ public boolean charTyped(char pCodePoint, int pModifiers) { pWidget.setValue("" + getMenu().getFilter().getMaxTicks()); addRenderableWidget(pWidget); addRenderableWidget(Button.builder(EIOLang.CONFIRM, pButton -> getMenu().setTimer(pWidget.getValue())) - .pos(this.leftPos + 60, this.topPos + 41) - .size(60, 20) - .build()); + .pos(this.leftPos + 60, this.topPos + 41) + .size(60, 20) + .build()); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java index ac8755d06b..6f212f0c78 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ConduitScreenTypes.java @@ -5,13 +5,11 @@ import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.screen.ConduitScreenType; import com.enderio.conduits.api.screen.RegisterConduitScreenTypesEvent; -import com.enderio.conduits.common.init.ConduitTypes; +import java.util.Map; import me.liliandev.ensure.ensures.EnsureSide; import net.neoforged.fml.ModLoader; import org.jetbrains.annotations.Nullable; -import java.util.Map; - public class ConduitScreenTypes { private static Map, ConduitScreenType> SCREEN_TYPES; @@ -24,8 +22,9 @@ public static void init() { @EnsureSide(EnsureSide.Side.CLIENT) @Nullable - public static , U extends ConnectionConfig> ConduitScreenType get(ConduitType conduitType) { - //noinspection unchecked + public static , U extends ConnectionConfig> ConduitScreenType get( + ConduitType conduitType) { + // noinspection unchecked return (ConduitScreenType) SCREEN_TYPES.get(conduitType); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java index 3748e6508d..f723fd1403 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java @@ -19,41 +19,48 @@ public class ItemConduitScreenType extends ConduitScreenType dataAccess) { + public void createWidgets(ConduitScreenHelper screen, + ConduitMenuDataAccess dataAccess) { // Add insert/extract checkboxes. screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isSend(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); + value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isReceive(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); // Channel colors screen.addColorPicker(0, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); - screen.addColorPicker(90, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().receiveColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + screen.addColorPicker(90, 20, ConduitLang.CONDUIT_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); // Round robin - screen.addToggleButton(90 + 16 + 4, 20, 16, 16, ConduitLang.ROUND_ROBIN_ENABLED, ConduitLang.ROUND_ROBIN_DISABLED, - ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, () -> dataAccess.getConnectionConfig().isRoundRobin(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsRoundRobin(value))); + screen.addToggleButton(90 + 16 + 4, 20, 16, 16, ConduitLang.ROUND_ROBIN_ENABLED, + ConduitLang.ROUND_ROBIN_DISABLED, ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, + () -> dataAccess.getConnectionConfig().isRoundRobin(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsRoundRobin(value))); // Self feed - screen.addToggleButton(90 + (16 + 4) * 2, 20, 16, 16, ConduitLang.SELF_FEED_ENABLED, ConduitLang.SELF_FEED_DISABLED, - ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, () -> dataAccess.getConnectionConfig().isSelfFeed(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSelfFeed(value))); + screen.addToggleButton(90 + (16 + 4) * 2, 20, 16, 16, ConduitLang.SELF_FEED_ENABLED, + ConduitLang.SELF_FEED_DISABLED, ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, + () -> dataAccess.getConnectionConfig().isSelfFeed(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsSelfFeed(value))); // Redstone control - var redstoneChannelWidget = screen.addColorPicker(90 + 16 + 4, 40, ConduitLang.REDSTONE_CHANNEL, () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); + var redstoneChannelWidget = screen.addColorPicker(90 + 16 + 4, 40, ConduitLang.REDSTONE_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); // Only show the redstone widget when redstone control is sensitive to signals. - screen.addPreRenderAction( - () -> redstoneChannelWidget.visible = dataAccess.getConnectionConfig().receiveRedstoneControl().isRedstoneSensitive()); + screen.addPreRenderAction(() -> redstoneChannelWidget.visible = dataAccess.getConnectionConfig() + .receiveRedstoneControl() + .isRedstoneSensitive()); - screen.addRedstoneControlPicker(90, 40, EIOLang.REDSTONE_MODE, () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); + screen.addRedstoneControlPicker(90, 40, EIOLang.REDSTONE_MODE, + () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); // TODO: Show redstone signal indicators using the extra NBT payload. } @@ -63,6 +70,6 @@ public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mou super.renderLabels(guiGraphics, font, mouseX, mouseY); guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, 16 + 2, 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 90 + 16 + 2, 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 90 + 16 + 2, 4, 4210752, false); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java index 1d00b2ada9..fc5dcf0c59 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java @@ -10,24 +10,25 @@ public class RedstoneConduitScreenType extends ConduitScreenType { @Override - public void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess) { + public void createWidgets(ConduitScreenHelper screen, + ConduitMenuDataAccess dataAccess) { // Add insert/extract checkboxes. screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isReceive(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isSend(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); + value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); // Channel colors screen.addColorPicker(0, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().receiveColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); screen.addColorPicker(90, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); // Strong signal screen.addCheckbox(90, 40, () -> dataAccess.getConnectionConfig().isStrongOutputSignal(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsStrongOutputSignal(value))); + value -> dataAccess.updateConnectionConfig(config -> config.withIsStrongOutputSignal(value))); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModelLoader.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModelLoader.java index f5011a0c8f..41e36bd161 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModelLoader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/ConduitItemModelLoader.java @@ -4,6 +4,9 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; import net.minecraft.client.renderer.block.model.BlockElement; import net.minecraft.client.renderer.block.model.ItemOverrides; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -16,14 +19,11 @@ import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext; import net.neoforged.neoforge.client.model.geometry.IGeometryLoader; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; - public class ConduitItemModelLoader implements IGeometryLoader { @Override - public Geometry read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) throws JsonParseException { + public Geometry read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) + throws JsonParseException { if (!jsonObject.has("elements")) { throw new JsonParseException("An element model must have an \"elements\" member."); } @@ -43,8 +43,8 @@ public Geometry(List elements) { } @Override - public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, - ItemOverrides overrides) { + public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, + Function spriteGetter, ModelState modelState, ItemOverrides overrides) { return new ConduitItemModel(super.bake(context, baker, spriteGetter, modelState, overrides)); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java index 1f20eff29a..76c134c7f8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java @@ -110,7 +110,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction renderType))); ConduitModelModifier conduitModelModifier = ConduitModelModifiers - .getModifier(conduit.value().type()); + .getModifier(conduit.value().type()); if (conduitModelModifier != null) { quads.addAll(rotationTranslation.process(conduitModelModifier.createConnectionQuads(conduit, extraWorldData, side, direction, rand, renderType))); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java index 764dfaadcd..dd0f3f41b4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleRenderState.java @@ -4,11 +4,9 @@ import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.common.conduit.OffsetHelper; - import java.util.HashMap; import java.util.List; import java.util.Map; - import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.core.Direction; import net.minecraft.core.Holder; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java index 7ef7635099..3540b9c6c6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java @@ -1,6 +1,5 @@ package com.enderio.conduits.client.model.conduit.bundle; -import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; @@ -8,20 +7,12 @@ import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; -import com.enderio.conduits.api.model.ConduitModelModifier; -import com.enderio.conduits.client.model.conduit.modifier.ConduitModelModifiers; import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.core.Holder; import net.minecraft.world.item.DyeColor; -public record ConduitConnectionRenderState( - boolean canInput, - DyeColor inputChannel, - boolean canOutput, - DyeColor outputChannel, - boolean isRedstoneSensitive, - DyeColor redstoneChannel -) { +public record ConduitConnectionRenderState(boolean canInput, DyeColor inputChannel, boolean canOutput, + DyeColor outputChannel, boolean isRedstoneSensitive, DyeColor redstoneChannel) { public static ConduitConnectionRenderState fake() { return new ConduitConnectionRenderState(false, DyeColor.GREEN, false, DyeColor.GREEN, false, DyeColor.RED); @@ -66,13 +57,7 @@ public static ConduitConnectionRenderState of(Holder> conduit, Con } } - return new ConduitConnectionRenderState( - canInput, - inputChannel, - canOutput, - outputChannel, - isRedstoneSensitive, - redstoneChannel - ); + return new ConduitConnectionRenderState(canInput, inputChannel, canOutput, outputChannel, isRedstoneSensitive, + redstoneChannel); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitModelModifiers.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitModelModifiers.java index 3d53dd9b76..6623cc3d2d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitModelModifiers.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/ConduitModelModifiers.java @@ -3,15 +3,14 @@ import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.model.ConduitModelModifier; import com.enderio.conduits.api.model.RegisterConduitModelModifiersEvent; -import me.liliandev.ensure.ensures.EnsureSide; -import net.minecraft.client.resources.model.ModelResourceLocation; -import net.neoforged.fml.ModLoader; -import org.jetbrains.annotations.Nullable; - import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import me.liliandev.ensure.ensures.EnsureSide; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.neoforged.fml.ModLoader; +import org.jetbrains.annotations.Nullable; public class ConduitModelModifiers { private static Map, ConduitModelModifier> MODIFIERS; @@ -34,6 +33,9 @@ public static ConduitModelModifier getModifier(ConduitType type) { @EnsureSide(EnsureSide.Side.CLIENT) public static Set getAllModelDependencies() { - return MODIFIERS.values().stream().flatMap(modifier -> modifier.getModelDependencies().stream()).collect(Collectors.toSet()); + return MODIFIERS.values() + .stream() + .flatMap(modifier -> modifier.getModelDependencies().stream()) + .collect(Collectors.toSet()); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java index 9e7db53457..fef248af35 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java @@ -5,6 +5,7 @@ import com.enderio.conduits.api.model.ConduitModelModifier; import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; import com.enderio.core.client.RenderUtil; +import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -25,15 +26,14 @@ import net.neoforged.neoforge.client.model.data.ModelData; import org.jetbrains.annotations.Nullable; -import java.util.List; - public class FluidConduitModelModifier implements ConduitModelModifier { - private static final ModelResourceLocation FLUID_MODEL = ModelResourceLocation.standalone(EnderIO.loc("block/extra/fluids")); + private static final ModelResourceLocation FLUID_MODEL = ModelResourceLocation + .standalone(EnderIO.loc("block/extra/fluids")); @Override - public List createConnectionQuads(Holder> conduit, @Nullable CompoundTag extraWorldData, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, - @Nullable RenderType type) { + public List createConnectionQuads(Holder> conduit, @Nullable CompoundTag extraWorldData, + @Nullable Direction facing, Direction connectionDirection, RandomSource rand, @Nullable RenderType type) { if (!(conduit.value() instanceof FluidConduit fluidConduit && fluidConduit.isMultiFluid())) { return List.of(); } @@ -46,8 +46,9 @@ public List createConnectionQuads(Holder> conduit, @Nul Fluid lockedFluid = BuiltInRegistries.FLUID.get(lockedFluidId); if (!lockedFluid.isSame(Fluids.EMPTY)) { - return new FluidPaintQuadTransformer(lockedFluid) - .process(Minecraft.getInstance().getModelManager().getModel(FLUID_MODEL) + return new FluidPaintQuadTransformer(lockedFluid).process(Minecraft.getInstance() + .getModelManager() + .getModel(FLUID_MODEL) .getQuads(Blocks.COBBLESTONE.defaultBlockState(), facing, rand, ModelData.EMPTY, type)); } @@ -63,12 +64,15 @@ private record FluidPaintQuadTransformer(Fluid fluid) implements IQuadTransforme @Override public void processInPlace(BakedQuad quad) { IClientFluidTypeExtensions clientExtension = IClientFluidTypeExtensions.of(fluid); - TextureAtlasSprite sprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS) - .apply(clientExtension.getStillTexture()); + TextureAtlasSprite sprite = Minecraft.getInstance() + .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) + .apply(clientExtension.getStillTexture()); for (int i = 0; i < 4; i++) { float[] uv0 = RenderUtil.unpackVertices(quad.getVertices(), i, IQuadTransformer.UV0, 2); - uv0[0] = (uv0[0] - quad.getSprite().getU0()) * sprite.contents().width() / quad.getSprite().contents().height() + sprite.getU0(); - uv0[1] = (uv0[1] - quad.getSprite().getV0()) * sprite.contents().width() / quad.getSprite().contents().height() + sprite.getV0(); + uv0[0] = (uv0[0] - quad.getSprite().getU0()) * sprite.contents().width() + / quad.getSprite().contents().height() + sprite.getU0(); + uv0[1] = (uv0[1] - quad.getSprite().getV0()) * sprite.contents().width() + / quad.getSprite().contents().height() + sprite.getV0(); int[] packedTextureData = RenderUtil.packUV(uv0[0], uv0[1]); quad.getVertices()[IQuadTransformer.UV0 + i * IQuadTransformer.STRIDE] = packedTextureData[0]; quad.getVertices()[IQuadTransformer.UV0 + 1 + i * IQuadTransformer.STRIDE] = packedTextureData[1]; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java index 2fcccdd38f..915c3645b6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/particle/ConduitBreakParticle.java @@ -1,8 +1,8 @@ package com.enderio.conduits.client.particle; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import com.enderio.conduits.common.conduit.bundle.ConduitShape; +import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleEngine; @@ -18,17 +18,17 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.shapes.VoxelShape; -import java.util.List; - public class ConduitBreakParticle extends TextureSheetParticle { private final BlockPos pos; private final float uo; private final float vo; - public ConduitBreakParticle(ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed, BlockPos pos, ResourceLocation texture) { + public ConduitBreakParticle(ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, + double zSpeed, BlockPos pos, ResourceLocation texture) { super(level, x, y, z, xSpeed, ySpeed, zSpeed); this.pos = pos; - this.setSprite(Minecraft.getInstance().getModelManager().getAtlas(InventoryMenu.BLOCK_ATLAS).getSprite(texture)); + this.setSprite( + Minecraft.getInstance().getModelManager().getAtlas(InventoryMenu.BLOCK_ATLAS).getSprite(texture)); this.gravity = 1.0F; this.rCol = 0.6F; this.gCol = 0.6F; @@ -91,7 +91,8 @@ public static void addDestroyEffects(BlockPos pos, BlockState state, Conduit int k = pos.getZ(); float f = 0.1F; AABB aabb = state.getShape(level, pos).bounds(); - double x = (double)i + level.getRandom().nextDouble() * (aabb.maxX - aabb.minX - 0.2F) + 0.1F + aabb.minX; - double y = (double)j + level.getRandom().nextDouble() * (aabb.maxY - aabb.minY - 0.2F) + 0.1F + aabb.minY; - double z = (double)k + level.getRandom().nextDouble() * (aabb.maxZ - aabb.minZ - 0.2F) + 0.1F + aabb.minZ; + double x = (double) i + level.getRandom().nextDouble() * (aabb.maxX - aabb.minX - 0.2F) + 0.1F + aabb.minX; + double y = (double) j + level.getRandom().nextDouble() * (aabb.maxY - aabb.minY - 0.2F) + 0.1F + aabb.minY; + double z = (double) k + level.getRandom().nextDouble() * (aabb.maxZ - aabb.minZ - 0.2F) + 0.1F + aabb.minZ; if (side == Direction.DOWN) { - y = (double)j + aabb.minY - 0.1F; + y = (double) j + aabb.minY - 0.1F; } if (side == Direction.UP) { - y = (double)j + aabb.maxY + 0.1F; + y = (double) j + aabb.maxY + 0.1F; } if (side == Direction.NORTH) { - z = (double)k + aabb.minZ - 0.1F; + z = (double) k + aabb.minZ - 0.1F; } if (side == Direction.SOUTH) { - z = (double)k + aabb.maxZ + 0.1F; + z = (double) k + aabb.maxZ + 0.1F; } if (side == Direction.WEST) { - x = (double)i + aabb.minX - 0.1F; + x = (double) i + aabb.minX - 0.1F; } if (side == Direction.EAST) { - x = (double)i + aabb.maxX + 0.1F; + x = (double) i + aabb.maxX + 0.1F; } - engine.add(new ConduitBreakParticle(level, x, y, z, 0.0D, 0.0D, 0.0D, pos, conduit.texture()).setPower(0.2F).scale(0.6F)); + engine.add(new ConduitBreakParticle(level, x, y, z, 0.0D, 0.0D, 0.0D, pos, conduit.texture()).setPower(0.2F) + .scale(0.6F)); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java index 8b4a2942b5..f74d43eef2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitA11yManager.java @@ -6,7 +6,6 @@ import net.minecraft.core.Holder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.living.LivingEquipmentChangeEvent; @@ -15,7 +14,7 @@ /** * A11Y tools for conduit block behaviours. */ -@EventBusSubscriber(/*value = Dist.CLIENT, */modid = EnderIOConduits.MODULE_MOD_ID, bus = EventBusSubscriber.Bus.GAME) +@EventBusSubscriber(/* value = Dist.CLIENT, */modid = EnderIOConduits.MODULE_MOD_ID, bus = EventBusSubscriber.Bus.GAME) public class ConduitA11yManager { private static Holder> heldConduit; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java index 3b5eb7c001..f3e98b4275 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSavedData.java @@ -91,7 +91,8 @@ private ConduitSavedData(CompoundTag nbt, HolderLookup.Provider lookupProvider) } } - private void deserializeGraphs(HolderLookup.Provider lookupProvider, Holder> conduit, ListTag graphs) { + private void deserializeGraphs(HolderLookup.Provider lookupProvider, Holder> conduit, + ListTag graphs) { for (Tag tag1 : graphs) { CompoundTag graphTag = (CompoundTag) tag1; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSorter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSorter.java index ab2636df8b..d5610b55f2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSorter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/ConduitSorter.java @@ -1,9 +1,13 @@ package com.enderio.conduits.common.conduit; +import com.enderio.conduits.EnderIOConduits; +import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.EnderIOConduitsRegistries; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.EnderIOConduits; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.neoforged.bus.api.SubscribeEvent; @@ -11,11 +15,6 @@ import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; import net.neoforged.neoforge.event.server.ServerStartedEvent; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; - /** * This class is used to sort conduit types for display. * This is needed, so upgrading conduits doesn't require shifting of types, but just recalculating the current connection @@ -27,13 +26,17 @@ public class ConduitSorter { @SubscribeEvent public static void serverSortTypes(ServerStartedEvent event) { - var conduitRegistry = event.getServer().registryAccess().registryOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); + var conduitRegistry = event.getServer() + .registryAccess() + .registryOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); sortTypes(conduitRegistry); } @SubscribeEvent public static void clientSortTypes(ClientPlayerNetworkEvent.LoggingIn event) { - var conduitRegistry = event.getPlayer().registryAccess().registryOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); + var conduitRegistry = event.getPlayer() + .registryAccess() + .registryOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); sortTypes(conduitRegistry); } @@ -41,30 +44,31 @@ private static void sortTypes(Registry> registry) { SORTED_CONDUITS.clear(); // Group like types together. - List> conduitTypes = EnderIOConduitsRegistries.CONDUIT_TYPE - .stream() - .sorted(Comparator.comparing(i -> Objects.requireNonNull(EnderIOConduitsRegistries.CONDUIT_TYPE.getKey(i)).toString())) - .toList(); + List> conduitTypes = EnderIOConduitsRegistries.CONDUIT_TYPE.stream() + .sorted(Comparator.comparing( + i -> Objects.requireNonNull(EnderIOConduitsRegistries.CONDUIT_TYPE.getKey(i)).toString())) + .toList(); List>> sortedConduits = new ArrayList<>(); for (ConduitType conduitType : conduitTypes) { - sortedConduits.addAll(gatherConduitsForType(registry, conduitType)); + sortedConduits.addAll(gatherConduitsForType(registry, conduitType)); } SORTED_CONDUITS.addAll(sortedConduits); } - private static > List>> gatherConduitsForType(Registry> registry, ConduitType conduitType) { + private static > List>> gatherConduitsForType( + Registry> registry, ConduitType conduitType) { return registry.holders() - .filter(i -> i.value().type() == conduitType) - // Group by tier, then by name - .sorted(new Comparator>>() { - @Override - public int compare(Holder> o1, Holder> o2) { - return ((T)o1.value()).compareTo((T)o2.value()); - } - }.thenComparing(Holder::getRegisteredName)) - .map(i -> (Holder>)i) - .toList(); + .filter(i -> i.value().type() == conduitType) + // Group by tier, then by name + .sorted(new Comparator>>() { + @Override + public int compare(Holder> o1, Holder> o2) { + return ((T) o1.value()).compareTo((T) o2.value()); + } + }.thenComparing(Holder::getRegisteredName)) + .map(i -> (Holder>) i) + .toList(); } public static int getSortIndex(Holder> conduit) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/SlotData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/SlotData.java index a3630db80a..280ba383d2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/SlotData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/SlotData.java @@ -10,6 +10,6 @@ public static SlotData of(int slot) { } public int slotIndex() { - return direction.ordinal()*3*9 + conduitIndex * 3 + slotType.ordinal(); + return direction.ordinal() * 3 * 9 + conduitIndex * 3 + slotType.ordinal(); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java index b676e0f0d1..1295ecdeb6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java @@ -3,20 +3,19 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitCapabilities; import com.enderio.conduits.api.ConduitRedstoneSignalAware; +import com.enderio.conduits.api.bundle.AddConduitResult; import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.client.model.conduit.facades.FacadeHelper; import com.enderio.conduits.client.particle.ConduitBreakParticle; import com.enderio.conduits.common.conduit.ConduitBlockItem; -import com.enderio.conduits.api.bundle.AddConduitResult; import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitComponents; -import java.util.Optional; - import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.redstone.RedstoneInsertFilter; +import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -214,7 +213,7 @@ public BlockState updateShape(BlockState state, Direction direction, BlockState } if (level.getBlockEntity(currentPos) instanceof ConduitBundleBlockEntity conduit) { - conduit.updateShape(); + conduit.updateShape(); } return super.updateShape(state, direction, neighborState, level, currentPos, neighborPos); @@ -305,8 +304,7 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, // } if (conduit == null) { - conduit = conduitBundle.getShape() - .getConduit(((BlockHitResult) hit).getBlockPos(), hit); + conduit = conduitBundle.getShape().getConduit(((BlockHitResult) hit).getBlockPos(), hit); } if (conduit == null) { @@ -346,16 +344,20 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, // region Open Menu @Override - protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, + BlockHitResult hitResult) { if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { - // TODO: The connection shouldn't include the plate.. if we hit the plate open the first conduit? + // TODO: The connection shouldn't include the plate.. if we hit the plate open + // the first conduit? var conduitConnection = conduitBundle.getShape().getConnectionFromHit(pos, hitResult); if (conduitConnection != null) { - if (conduitBundle.getConnectionStatus(conduitConnection.getFirst(), conduitConnection.getSecond()) == ConnectionStatus.CONNECTED_BLOCK) { + if (conduitBundle.getConnectionStatus(conduitConnection.getFirst(), + conduitConnection.getSecond()) == ConnectionStatus.CONNECTED_BLOCK) { if (player instanceof ServerPlayer serverPlayer) { - ConduitMenu.openConduitMenu(serverPlayer, pos, conduitBundle, conduitConnection.getFirst(), conduitConnection.getSecond()); + ConduitMenu.openConduitMenu(serverPlayer, pos, conduitBundle, conduitConnection.getFirst(), + conduitConnection.getSecond()); } return InteractionResult.sidedSuccess(level.isClientSide()); @@ -409,8 +411,7 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos if (addResult instanceof AddConduitResult.Upgrade(Holder> replacedConduit)) { if (!player.getAbilities().instabuild) { stack.shrink(1); - player.getInventory() - .placeItemBackInInventory(ConduitBlockItem.getStackFor(replacedConduit, 1)); + player.getInventory().placeItemBackInInventory(ConduitBlockItem.getStackFor(replacedConduit, 1)); } } else if (addResult instanceof AddConduitResult.Insert) { if (!player.getAbilities().instabuild) { @@ -419,7 +420,7 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos } else { if (!FMLLoader.isProduction()) { throw new IllegalStateException( - "ConduitBundleAccessor#canAddConduit returned true, but addConduit returned BLOCKED"); + "ConduitBundleAccessor#canAddConduit returned true, but addConduit returned BLOCKED"); } return ItemInteractionResult.FAIL; @@ -428,7 +429,7 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos BlockState blockState = level.getBlockState(pos); SoundType soundtype = blockState.getSoundType(level, pos, player); level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); return ItemInteractionResult.sidedSuccess(level.isClientSide()); @@ -461,7 +462,7 @@ private ItemInteractionResult addFacade(ItemStack stack, Level level, BlockPos p BlockState blockState = level.getBlockState(pos); SoundType soundtype = blockState.getSoundType(level, pos, player); level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); level.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(player, blockState)); return ItemInteractionResult.sidedSuccess(level.isClientSide()); @@ -490,7 +491,8 @@ public boolean canConnectRedstone(BlockState state, BlockGetter level, BlockPos return false; } - var config = conduitBundle.getConnectionConfig(direction, redstoneConduit, RedstoneConduitConnectionConfig.TYPE); + var config = conduitBundle.getConnectionConfig(direction, redstoneConduit, + RedstoneConduitConnectionConfig.TYPE); return config.canSend(ConduitRedstoneSignalAware.NONE); } @@ -525,7 +527,8 @@ private int getNetworkSignal(BlockGetter level, BlockPos pos, Direction directio return 0; } - var config = conduitBundle.getConnectionConfig(direction.getOpposite(), redstoneConduit, RedstoneConduitConnectionConfig.TYPE); + var config = conduitBundle.getConnectionConfig(direction.getOpposite(), redstoneConduit, + RedstoneConduitConnectionConfig.TYPE); if (!config.canSend(ConduitRedstoneSignalAware.NONE)) { return 0; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index bc98574b05..aec4b0be6c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -6,9 +6,10 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitCapabilities; import com.enderio.conduits.api.ConduitType; +import com.enderio.conduits.api.bundle.AddConduitResult; +import com.enderio.conduits.api.bundle.ConduitBundleAccessor; import com.enderio.conduits.api.bundle.ConduitInventory; import com.enderio.conduits.api.bundle.SlotType; -import com.enderio.conduits.api.bundle.ConduitBundleAccessor; import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; @@ -18,15 +19,14 @@ import com.enderio.conduits.common.conduit.ConduitBlockItem; import com.enderio.conduits.common.conduit.ConduitSavedData; import com.enderio.conduits.common.conduit.ConduitSorter; -import com.enderio.conduits.api.bundle.AddConduitResult; -import com.enderio.conduits.common.conduit.legacy.ConnectionState; -import com.enderio.conduits.common.conduit.legacy.DynamicConnectionState; -import com.enderio.conduits.common.conduit.legacy.StaticConnectionStates; import com.enderio.conduits.common.conduit.graph.ConduitConnectionHost; import com.enderio.conduits.common.conduit.graph.ConduitDataContainer; import com.enderio.conduits.common.conduit.graph.ConduitGraphContext; import com.enderio.conduits.common.conduit.graph.ConduitGraphObject; import com.enderio.conduits.common.conduit.graph.ConduitGraphUtility; +import com.enderio.conduits.common.conduit.legacy.ConnectionState; +import com.enderio.conduits.common.conduit.legacy.DynamicConnectionState; +import com.enderio.conduits.common.conduit.legacy.StaticConnectionStates; import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitTypes; @@ -45,7 +45,6 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; - import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.Util; import net.minecraft.core.BlockPos; @@ -80,7 +79,8 @@ import net.neoforged.neoforge.client.model.data.ModelData; import org.jetbrains.annotations.Nullable; -public final class ConduitBundleBlockEntity extends EnderBlockEntity implements ConduitBundleAccessor, Clearable, Wrenchable, ConduitMenu.ConnectionAccessor { +public final class ConduitBundleBlockEntity extends EnderBlockEntity + implements ConduitBundleAccessor, Clearable, Wrenchable, ConduitMenu.ConnectionAccessor { public static final int MAX_CONDUITS = 9; @@ -267,8 +267,10 @@ public boolean canBeOrIsConnection(Direction side, Holder> conduit return false; } - // If they've managed to open the menu, a connection could already have been established - // TODO: Maybe create a map to track canConnect from the conduit so this is a guarantee. + // If they've managed to open the menu, a connection could already have been + // established + // TODO: Maybe create a map to track canConnect from the conduit so this is a + // guarantee. return true; } @@ -290,7 +292,7 @@ public ItemInteractionResult onWrenched(UseOnContext context) { removeConduit(conduit, player); if (isEmpty()) { level.setBlock(getBlockPos(), getBlockState().getFluidState().createLegacyBlock(), - level.isClientSide ? Block.UPDATE_ALL_IMMEDIATE : Block.UPDATE_ALL); + level.isClientSide ? Block.UPDATE_ALL_IMMEDIATE : Block.UPDATE_ALL); } return ItemInteractionResult.sidedSuccess(level.isClientSide()); @@ -305,8 +307,10 @@ public ItemInteractionResult onWrenched(UseOnContext context) { onConnectionsUpdated(conduitConnection.getSecond()); // If we were connected to another bundle, we need to sever the graph - if (level.getBlockEntity(getBlockPos().relative(conduitConnection.getFirst())) instanceof ConduitBundleBlockEntity neighborBundle) { - neighborBundle.setConnectionStatus(conduitConnection.getFirst().getOpposite(), conduitConnection.getSecond(), ConnectionStatus.DISABLED); + if (level.getBlockEntity(getBlockPos() + .relative(conduitConnection.getFirst())) instanceof ConduitBundleBlockEntity neighborBundle) { + neighborBundle.setConnectionStatus(conduitConnection.getFirst().getOpposite(), + conduitConnection.getSecond(), ConnectionStatus.DISABLED); neighborBundle.onConnectionsUpdated(conduitConnection.getSecond()); if (level instanceof ServerLevel serverLevel) { @@ -319,8 +323,10 @@ public ItemInteractionResult onWrenched(UseOnContext context) { thisNode.getGraph().removeSingleEdge(otherNode, thisNode); } - ConduitSavedData.addPotentialGraph(conduitConnection.getSecond(), thisNode.getGraph(), serverLevel); - ConduitSavedData.addPotentialGraph(conduitConnection.getSecond(), otherNode.getGraph(), serverLevel); + ConduitSavedData.addPotentialGraph(conduitConnection.getSecond(), thisNode.getGraph(), + serverLevel); + ConduitSavedData.addPotentialGraph(conduitConnection.getSecond(), otherNode.getGraph(), + serverLevel); bundleChanged(); } else { @@ -416,7 +422,8 @@ private static TCap getProxiedCapability(BlockCapability> conduit) { return true; } - // If there are no replacement opportunities, we cannot have a conduit of this type. + // If there are no replacement opportunities, we cannot have a conduit of this + // type. if (hasConduitByType(conduit)) { return false; } @@ -546,7 +554,8 @@ public AddConduitResult addConduit(Holder> conduit, @Nullable Play result = new AddConduitResult.Upgrade(replacementCandidate.get()); } else { - // If there are no replacement opportunities, we cannot have a conduit of this type. + // If there are no replacement opportunities, we cannot have a conduit of this + // type. if (hasConduitByType(conduit)) { return new AddConduitResult.Blocked(); } @@ -601,7 +610,8 @@ public AddConduitResult addConduit(Holder> conduit, @Nullable Play } if (level instanceof ServerLevel serverLevel) { - ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(getConduitNode(conduit).getGraph()), serverLevel); + ConduitSavedData.addPotentialGraph(conduit, Objects.requireNonNull(getConduitNode(conduit).getGraph()), + serverLevel); } if (result instanceof AddConduitResult.Upgrade(Holder> replacedConduit) @@ -698,17 +708,17 @@ private void removeNeighborConnection(Direction side, Holder> cond if (level instanceof ServerLevel serverLevel) { if (neighborBundle.hasConduitByType(conduit)) { Optional.of(neighborBundle.getConduitNode(conduit)) - .map(ConduitGraphObject::getGraph) - .filter(Objects::nonNull) - .ifPresent(graph -> ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel)); + .map(ConduitGraphObject::getGraph) + .filter(Objects::nonNull) + .ifPresent(graph -> ConduitSavedData.addPotentialGraph(conduit, graph, serverLevel)); } } } private void dropItem(ItemStack stack) { if (level != null) { - level.addFreshEntity( - new ItemEntity(level, getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), stack.copy())); + level.addFreshEntity(new ItemEntity(level, getBlockPos().getX(), getBlockPos().getY(), getBlockPos().getZ(), + stack.copy())); } } @@ -781,14 +791,15 @@ public ConnectionConfig getConnectionConfig(Direction side, Holder } @Override - public T getConnectionConfig(Direction side, Holder> conduit, ConnectionConfigType type) { + public T getConnectionConfig(Direction side, Holder> conduit, + ConnectionConfigType type) { var config = conduitConnections.get(conduit).getConfig(side); if (config.type() != type) { throw new IllegalStateException("Connection config type mismatch."); } - //noinspection unchecked - return (T)config; + // noinspection unchecked + return (T) config; } @Override @@ -842,8 +853,8 @@ public boolean canConnectTo(Direction side, Holder> conduit, Condu } @EnsureSide(EnsureSide.Side.CLIENT) - public boolean canConnectTo(Direction side, Holder> conduit, @Nullable CompoundTag otherExtraWorldData, - boolean isForcedConnection) { + public boolean canConnectTo(Direction side, Holder> conduit, + @Nullable CompoundTag otherExtraWorldData, boolean isForcedConnection) { if (level == null) { return false; } @@ -891,9 +902,11 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boole // TODO: This is really ugly. boolean canConnectToNeighbour; if (level.isClientSide()) { - canConnectToNeighbour = neighbourConduitBundle.canConnectTo(side, conduit, getConduitExtraWorldData(conduit), isForcedConnection); + canConnectToNeighbour = neighbourConduitBundle.canConnectTo(side, conduit, + getConduitExtraWorldData(conduit), isForcedConnection); } else { - canConnectToNeighbour = neighbourConduitBundle.canConnectTo(side.getOpposite(), conduit, node, isForcedConnection); + canConnectToNeighbour = neighbourConduitBundle.canConnectTo(side.getOpposite(), conduit, node, + isForcedConnection); } // Connect to another bundle which has a compatible conduit. @@ -939,7 +952,7 @@ public void onConnectionsUpdated(Holder> conduit) { private void connectConduit(Direction side, Holder> conduit) { conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) - .setStatus(side, ConnectionStatus.CONNECTED_CONDUIT); + .setStatus(side, ConnectionStatus.CONNECTED_CONDUIT); onConnectionsUpdated(conduit); bundleChanged(); @@ -947,7 +960,7 @@ private void connectConduit(Direction side, Holder> conduit) { private void connectBlock(Direction side, Holder> conduit) { conduitConnections.computeIfAbsent(conduit, ConnectionContainer::new) - .setStatus(side, ConnectionStatus.CONNECTED_BLOCK); + .setStatus(side, ConnectionStatus.CONNECTED_BLOCK); onConnectionsUpdated(conduit); bundleChanged(); @@ -960,7 +973,7 @@ private void disconnect(Direction side, Holder> conduit) { for (var c : conduits) { if (c.value().canConnectToConduit(conduit)) { conduitConnections.computeIfAbsent(c, ConnectionContainer::new) - .setStatus(side, ConnectionStatus.DISCONNECTED); + .setStatus(side, ConnectionStatus.DISCONNECTED); onConnectionsUpdated(c); hasChanged = true; } @@ -1090,7 +1103,9 @@ public CompoundTag getUpdateTag(HolderLookup.Provider registries) { var clientDataTag = conduit.value().getExtraWorldData(this, node); if (clientDataTag != null && !clientDataTag.isEmpty()) { CompoundTag tag = new CompoundTag(); - tag.put("Conduit", Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit).getOrThrow()); + tag.put("Conduit", + Conduit.CODEC.encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), conduit) + .getOrThrow()); tag.put("Data", clientDataTag); nodeDataList.add(tag); } @@ -1101,7 +1116,8 @@ public CompoundTag getUpdateTag(HolderLookup.Provider registries) { } @Override - public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookupProvider) { + public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, + HolderLookup.Provider lookupProvider) { super.onDataPacket(net, pkt, lookupProvider); updateShape(); @@ -1163,7 +1179,8 @@ private void loadConduitFromSavedData(ConduitSavedData savedData, Holder> conduit) implements ConduitConnectionHost { + private record ConnectionHost(ConduitBundleBlockEntity conduitBundle, Holder> conduit) + implements ConduitConnectionHost { @Override public BlockPos pos() { @@ -1493,7 +1517,8 @@ public void onNodeDirty() { @Override public boolean isLoaded() { - return conduitBundle.level != null && conduitBundle.level.isLoaded(pos()) && conduitBundle.level.shouldTickBlocksAt(pos()); + return conduitBundle.level != null && conduitBundle.level.isLoaded(pos()) + && conduitBundle.level.shouldTickBlocksAt(pos()); } @Override @@ -1511,9 +1536,9 @@ public boolean isInitialized() { public UpdateState next() { return switch (this) { - case NONE, INITIALIZED -> NONE; - case NEXT_NEXT -> NEXT; - case NEXT -> INITIALIZED; + case NONE, INITIALIZED -> NONE; + case NEXT_NEXT -> NEXT; + case NEXT -> INITIALIZED; }; } @@ -1608,9 +1633,11 @@ private void loadFromLegacyBundle(LegacyConduitBundle bundle) { } else if (state instanceof DynamicConnectionState dynamicState) { connections.setStatus(side, ConnectionStatus.CONNECTED_BLOCK); - connections.setConfig(side, conduit.value().convertConnection(dynamicState.isInsert(), dynamicState.isExtract(), - dynamicState.insertChannel(), dynamicState.extractChannel(), dynamicState.control(), - dynamicState.redstoneChannel())); + connections.setConfig(side, + conduit.value() + .convertConnection(dynamicState.isInsert(), dynamicState.isExtract(), + dynamicState.insertChannel(), dynamicState.extractChannel(), + dynamicState.control(), dynamicState.redstoneChannel())); inventory.setStackInSlot(conduit, side, SlotType.FILTER_INSERT, dynamicState.filterInsert()); inventory.setStackInSlot(conduit, side, SlotType.FILTER_EXTRACT, dynamicState.filterExtract()); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleInventory.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleInventory.java index 01c18fff8c..03feba42ac 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleInventory.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleInventory.java @@ -3,9 +3,9 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.common.init.EIOCapabilities; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.ConduitInventory; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.common.conduit.SlotData; import java.util.EnumMap; import java.util.HashMap; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitShape.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitShape.java index 78ef4871ae..7e1d633d1d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitShape.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitShape.java @@ -5,9 +5,8 @@ import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.common.Area; import com.enderio.conduits.common.conduit.OffsetHelper; -import java.util.*; - import com.mojang.datafixers.util.Pair; +import java.util.*; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -47,7 +46,8 @@ public void updateConduit(ConduitBundleReader bundle) { updateTotalShape(); } - // TODO: Looks weird when the connecting boxes arrive, but this at least now matches 1.12 behaviour. + // TODO: Looks weird when the connecting boxes arrive, but this at least now + // matches 1.12 behaviour. public VoxelShape getShapeFromHit(BlockPos pos, HitResult result) { var aimedConduit = getConduit(pos, result); @@ -170,7 +170,7 @@ private void updateShapeForConduit(ConduitBundleReader conduitBundle, Holder> conduit(); + BlockPos pos(); + boolean isConnectedTo(Direction side); + ConnectionConfig getConnectionConfig(Direction side); + void setConnectionConfig(Direction side, ConnectionConfig connectionConfig); + ConduitInventory inventory(); + void onNodeDirty(); + boolean isLoaded(); boolean hasRedstoneSignal(@Nullable DyeColor signalColor); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java index 46b9a4e5e8..9763451485 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphContext.java @@ -1,10 +1,10 @@ package com.enderio.conduits.common.conduit.graph; import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.network.ConduitNetworkContext; import com.enderio.conduits.api.network.ConduitNetworkContextAccessor; import com.enderio.conduits.api.network.ConduitNetworkContextType; -import com.enderio.conduits.api.EnderIOConduitsRegistries; import dev.gigaherz.graph3.Mergeable; import java.util.Objects; import net.minecraft.core.Holder; @@ -128,8 +128,8 @@ public static ConduitGraphContext loadNetworkContext(Holder> condu } @Nullable - private static ConduitNetworkContext loadNetworkContext(Conduit conduit, HolderLookup.Provider lookupProvider, - CompoundTag contextTag) { + private static ConduitNetworkContext loadNetworkContext(Conduit conduit, + HolderLookup.Provider lookupProvider, CompoundTag contextTag) { ResourceLocation serializerKey = ResourceLocation.parse(contextTag.getString("Type")); ConduitNetworkContextType contextType = Objects.requireNonNull( EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE.get(serializerKey), diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java index 092e3e8ddd..27d2cf4ef9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitGraphObject.java @@ -1,21 +1,18 @@ package com.enderio.conduits.common.conduit.graph; import com.enderio.base.api.filter.ResourceFilter; -import com.enderio.base.api.misc.RedstoneControl; import com.enderio.base.common.init.EIOCapabilities; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; -import com.enderio.conduits.api.network.node.NodeData; -import com.enderio.conduits.api.network.node.NodeDataType; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.bundle.SlotType; +import com.enderio.conduits.api.network.node.NodeData; +import com.enderio.conduits.api.network.node.NodeDataType; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.gigaherz.graph3.Graph; import dev.gigaherz.graph3.GraphObject; - import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -32,10 +29,12 @@ public class ConduitGraphObject implements GraphObject, Con ConduitDataContainer.CODEC.fieldOf("data").forGetter(i -> i.legacyDataContainer)) .apply(instance, ConduitGraphObject::new)); - private static final Codec NEW_CODEC = RecordCodecBuilder.create(instance -> instance - .group(BlockPos.CODEC.fieldOf("pos").forGetter(ConduitGraphObject::getPos), - NodeData.GENERIC_CODEC.optionalFieldOf("node_data").forGetter(i -> Optional.ofNullable(i.nodeData))) - .apply(instance, ConduitGraphObject::new)); + private static final Codec NEW_CODEC = RecordCodecBuilder + .create(instance -> instance + .group(BlockPos.CODEC.fieldOf("pos").forGetter(ConduitGraphObject::getPos), + NodeData.GENERIC_CODEC.optionalFieldOf("node_data") + .forGetter(i -> Optional.ofNullable(i.nodeData))) + .apply(instance, ConduitGraphObject::new)); public static final Codec CODEC = Codec.withAlternative(NEW_CODEC, LEGACY_CODEC); @@ -53,7 +52,8 @@ public class ConduitGraphObject implements GraphObject, Con @Nullable private NodeData nodeData; - // TODO: Instead of a special construct, we could just pass the type and bundle in? + // TODO: Instead of a special construct, we could just pass the type and bundle + // in? @Nullable private ConduitConnectionHost connectionHost; @@ -134,7 +134,7 @@ private void upgradeLegacyData() { } // Upgrade with old data - //noinspection deprecation + // noinspection deprecation connectionHost.conduit().value().copyLegacyData(this, legacyDataContainer); legacyDataContainer = null; } @@ -154,7 +154,7 @@ public boolean hasNodeData(NodeDataType type) { @Override public @Nullable T getNodeData(NodeDataType type) { if (nodeData != null && type == nodeData.type()) { - //noinspection unchecked + // noinspection unchecked return (T) nodeData; } @@ -164,12 +164,12 @@ public boolean hasNodeData(NodeDataType type) { @Override public T getOrCreateNodeData(NodeDataType type) { if (nodeData != null && type == nodeData.type()) { - //noinspection unchecked + // noinspection unchecked return (T) nodeData; } nodeData = type.factory().get(); - //noinspection unchecked + // noinspection unchecked return (T) nodeData; } @@ -205,11 +205,12 @@ public T getConnectionConfig(Direction side, Connec var config = getConnectionConfig(side); if (config.type() != type) { - throw new IllegalStateException("Connection config type mismatch! Conversion failed somewhere in the bundle."); + throw new IllegalStateException( + "Connection config type mismatch! Conversion failed somewhere in the bundle."); } - //noinspection unchecked - return (T)config; + // noinspection unchecked + return (T) config; } @Override @@ -233,7 +234,9 @@ public void setConnectionConfig(Direction side, ConnectionConfig config) { throw new IllegalStateException("No connection host!"); } - return connectionHost.inventory().getStackInSlot(direction, SlotType.FILTER_EXTRACT).getCapability(EIOCapabilities.Filter.ITEM); + return connectionHost.inventory() + .getStackInSlot(direction, SlotType.FILTER_EXTRACT) + .getCapability(EIOCapabilities.Filter.ITEM); } @Override @@ -242,7 +245,9 @@ public void setConnectionConfig(Direction side, ConnectionConfig config) { throw new IllegalStateException("No connection host!"); } - return connectionHost.inventory().getStackInSlot(direction, SlotType.FILTER_INSERT).getCapability(EIOCapabilities.Filter.ITEM); + return connectionHost.inventory() + .getStackInSlot(direction, SlotType.FILTER_INSERT) + .getCapability(EIOCapabilities.Filter.ITEM); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/ConnectionState.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/ConnectionState.java index 26e42a7bcc..5790d444ec 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/ConnectionState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/ConnectionState.java @@ -10,8 +10,7 @@ @Deprecated(forRemoval = true, since = "7.2") public sealed interface ConnectionState permits StaticConnectionStates, DynamicConnectionState { - Codec CODEC = - Codec.either(StaticConnectionStates.CODEC, DynamicConnectionState.CODEC) + Codec CODEC = Codec.either(StaticConnectionStates.CODEC, DynamicConnectionState.CODEC) .xmap(e -> e.left().isPresent() ? e.left().get() : e.right().get(), e -> { if (e instanceof StaticConnectionStates staticConnectionStates) { return Either.left(staticConnectionStates); @@ -22,8 +21,8 @@ public sealed interface ConnectionState permits StaticConnectionStates, DynamicC throw new NotImplementedException(); }); - StreamCodec STREAM_CODEC = - ByteBufCodecs.either(StaticConnectionStates.STREAM_CODEC, DynamicConnectionState.STREAM_CODEC) + StreamCodec STREAM_CODEC = ByteBufCodecs + .either(StaticConnectionStates.STREAM_CODEC, DynamicConnectionState.STREAM_CODEC) .map(e -> e.left().isPresent() ? e.left().get() : e.right().get(), e -> { if (e instanceof StaticConnectionStates staticConnectionStates) { return Either.left(staticConnectionStates); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyFluidConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyFluidConduitData.java index 37cbb6a584..1bc2e94144 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyFluidConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyFluidConduitData.java @@ -7,6 +7,7 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import java.util.Objects; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -16,27 +17,21 @@ import net.minecraft.world.level.material.Fluids; import org.jetbrains.annotations.Nullable; -import java.util.Objects; - @Deprecated(forRemoval = true, since = "7.2.0-alpha") public class LegacyFluidConduitData implements ConduitData { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - Codec.BOOL.fieldOf("should_reset").forGetter(i -> i.shouldReset), - BuiltInRegistries.FLUID.byNameCodec() - .optionalFieldOf("locked_fluid", Fluids.EMPTY) - .forGetter(i -> i.lockedFluid) - ).apply(instance, LegacyFluidConduitData::new) - ); + public static MapCodec CODEC = RecordCodecBuilder + .mapCodec( + instance -> instance + .group(Codec.BOOL.fieldOf("should_reset").forGetter(i -> i.shouldReset), + BuiltInRegistries.FLUID.byNameCodec() + .optionalFieldOf("locked_fluid", Fluids.EMPTY) + .forGetter(i -> i.lockedFluid)) + .apply(instance, LegacyFluidConduitData::new)); public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.BOOL, - i -> i.shouldReset, - ByteBufCodecs.registry(Registries.FLUID), - i -> i.lockedFluid, - LegacyFluidConduitData::new - ); + ByteBufCodecs.BOOL, i -> i.shouldReset, ByteBufCodecs.registry(Registries.FLUID), i -> i.lockedFluid, + LegacyFluidConduitData::new); private Fluid lockedFluid = Fluids.EMPTY; private boolean shouldReset = false; @@ -70,8 +65,9 @@ public void setShouldReset(boolean shouldReset) { public LegacyFluidConduitData withClientChanges(LegacyFluidConduitData guiData) { this.shouldReset = guiData.shouldReset; - // TODO: Soon we will swap to records which will mean this will be a new instance. - // This API has been designed with this pending change in mind. + // TODO: Soon we will swap to records which will mean this will be a new + // instance. + // This API has been designed with this pending change in mind. return this; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyItemConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyItemConduitData.java index a473a69caa..5277cc33ae 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyItemConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyItemConduitData.java @@ -1,38 +1,36 @@ package com.enderio.conduits.common.conduit.legacy; import com.enderio.conduits.api.network.node.NodeData; -import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.api.network.node.legacy.ConduitData; +import com.enderio.conduits.api.network.node.legacy.ConduitDataType; import com.enderio.conduits.common.conduit.type.item.ItemConduitNodeData; import com.enderio.conduits.common.init.ConduitTypes; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import io.netty.buffer.ByteBuf; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; import net.minecraft.core.Direction; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - @Deprecated(forRemoval = true, since = "7.2.0-alpha") public class LegacyItemConduitData implements ConduitData { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - Codec.unboundedMap(Direction.CODEC, ItemSidedData.CODEC) - .fieldOf("item_sided_data").forGetter(i -> i.itemSidedData) - ).apply(instance, LegacyItemConduitData::new) - ); + public static MapCodec CODEC = RecordCodecBuilder + .mapCodec(instance -> instance.group(Codec.unboundedMap(Direction.CODEC, ItemSidedData.CODEC) + .fieldOf("item_sided_data") + .forGetter(i -> i.itemSidedData)).apply(instance, LegacyItemConduitData::new)); - public static StreamCodec STREAM_CODEC = - ByteBufCodecs.map(i -> (Map) new HashMap(i), - Direction.STREAM_CODEC, ItemSidedData.STREAM_CODEC) - .map(LegacyItemConduitData::new, i -> i.itemSidedData).cast(); + public static StreamCodec STREAM_CODEC = ByteBufCodecs + .map(i -> (Map) new HashMap(i), Direction.STREAM_CODEC, + ItemSidedData.STREAM_CODEC) + .map(LegacyItemConduitData::new, i -> i.itemSidedData) + .cast(); public Map itemSidedData; @@ -50,8 +48,9 @@ public LegacyItemConduitData withClientChanges(LegacyItemConduitData guiData) { compute(direction).applyGuiChanges(guiData.get(direction)); } - // TODO: Soon we will swap to records which will mean this will be a new instance. - // This API has been designed with this pending change in mind. + // TODO: Soon we will swap to records which will mean this will be a new + // instance. + // This API has been designed with this pending change in mind. return this; } @@ -101,24 +100,17 @@ public LegacyItemConduitData deepCopy() { public static class ItemSidedData { - public static Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group( - Codec.BOOL.fieldOf("is_round_robin").forGetter(i -> i.isRoundRobin), - Codec.INT.fieldOf("rotating_index").forGetter(i -> i.rotatingIndex), - Codec.BOOL.fieldOf("is_self_feed").forGetter(i -> i.isSelfFeed), - Codec.INT.fieldOf("priority").forGetter(i -> i.priority) - ).apply(instance, ItemSidedData::new) - ); - - public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.BOOL, - i -> i.isRoundRobin, - ByteBufCodecs.BOOL, - i -> i.isSelfFeed, - ByteBufCodecs.INT, - i -> i.priority, - ItemSidedData::new - ); + public static Codec CODEC = RecordCodecBuilder + .create(instance -> instance + .group(Codec.BOOL.fieldOf("is_round_robin").forGetter(i -> i.isRoundRobin), + Codec.INT.fieldOf("rotating_index").forGetter(i -> i.rotatingIndex), + Codec.BOOL.fieldOf("is_self_feed").forGetter(i -> i.isSelfFeed), + Codec.INT.fieldOf("priority").forGetter(i -> i.priority)) + .apply(instance, ItemSidedData::new)); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite(ByteBufCodecs.BOOL, + i -> i.isRoundRobin, ByteBufCodecs.BOOL, i -> i.isSelfFeed, ByteBufCodecs.INT, i -> i.priority, + ItemSidedData::new); public static ItemSidedData EMPTY = new ItemSidedData(false, 0, false, 0); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyRedstoneConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyRedstoneConduitData.java index 429d691c28..2aa9983bee 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyRedstoneConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/legacy/LegacyRedstoneConduitData.java @@ -7,34 +7,32 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; import org.jetbrains.annotations.Nullable; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - @Deprecated(forRemoval = true, since = "7.2") public class LegacyRedstoneConduitData implements ConduitData { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - Codec.BOOL.fieldOf("is_active").forGetter(i -> i.isActive), - Codec.unboundedMap(DyeColor.CODEC, Codec.INT).fieldOf("active_colors").forGetter(i -> i.activeColors) - ).apply(instance, LegacyRedstoneConduitData::new) - ); + public static MapCodec CODEC = RecordCodecBuilder + .mapCodec( + instance -> instance + .group(Codec.BOOL.fieldOf("is_active").forGetter(i -> i.isActive), + Codec.unboundedMap(DyeColor.CODEC, Codec.INT) + .fieldOf("active_colors") + .forGetter(i -> i.activeColors)) + .apply(instance, LegacyRedstoneConduitData::new)); public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.BOOL, - r -> r.isActive, - ByteBufCodecs.map(HashMap::new, DyeColor.STREAM_CODEC, ByteBufCodecs.INT), - r -> r.activeColors, - LegacyRedstoneConduitData::new - ); + ByteBufCodecs.BOOL, r -> r.isActive, + ByteBufCodecs.map(HashMap::new, DyeColor.STREAM_CODEC, ByteBufCodecs.INT), r -> r.activeColors, + LegacyRedstoneConduitData::new); private boolean isActive = false; private final EnumMap activeColors = new EnumMap<>(DyeColor.class); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java index d98f673252..036a48d62b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java @@ -5,12 +5,12 @@ import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; -import com.enderio.conduits.common.init.ConduitBlockEntities; import com.enderio.conduits.common.init.ConduitMenus; import com.enderio.conduits.common.network.S2CConduitExtraGuiDataPacket; import com.enderio.conduits.common.network.SetConduitConnectionConfigPacket; -import com.enderio.core.common.menu.BaseBlockEntityMenu; import com.enderio.core.common.menu.BaseEnderMenu; +import java.util.Objects; +import java.util.Optional; import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -27,30 +27,25 @@ import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.Nullable; -import java.util.Objects; -import java.util.Optional; - // TODO: Make this not connect to the block entity at all, that way when the screen desyncs, the client world isn't desynced too. // This means server menu should get/set connections direct from the BE but the client should have a standalone config store. // Need to work out what this means for the client sync tag - it might need to be synced separately to the client from this GUI too. // Possibly create an NBT sync slot and then use it for that? public class ConduitMenu extends BaseEnderMenu { - public static void openConduitMenu(ServerPlayer serverPlayer, BlockPos pos, ConduitBundleBlockEntity conduitBundle, Direction side, - Holder> conduit) { - serverPlayer.openMenu(new SimpleMenuProvider((containerId, inventory, player) -> - new ConduitMenu(containerId, inventory, conduitBundle, side, conduit), - conduit.value().description()), - buf -> { - buf.writeEnum(side); - Conduit.STREAM_CODEC.encode(buf, conduit); - ConnectionConfig.STREAM_CODEC.encode(buf, conduitBundle.getConnectionConfig(side, conduit)); - - //noinspection DataFlowIssue - ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) - .map(opt -> opt.orElse(null), Optional::ofNullable) - .encode(buf, conduitBundle.getConduitExtraGuiData(side, conduit)); - }); + public static void openConduitMenu(ServerPlayer serverPlayer, BlockPos pos, ConduitBundleBlockEntity conduitBundle, + Direction side, Holder> conduit) { + serverPlayer.openMenu(new SimpleMenuProvider((containerId, inventory, player) -> new ConduitMenu(containerId, + inventory, conduitBundle, side, conduit), conduit.value().description()), buf -> { + buf.writeEnum(side); + Conduit.STREAM_CODEC.encode(buf, conduit); + ConnectionConfig.STREAM_CODEC.encode(buf, conduitBundle.getConnectionConfig(side, conduit)); + + // noinspection DataFlowIssue + ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) + .map(opt -> opt.orElse(null), Optional::ofNullable) + .encode(buf, conduitBundle.getConduitExtraGuiData(side, conduit)); + }); } public static final int BUTTON_CHANGE_CONDUIT_START_ID = 0; @@ -67,7 +62,8 @@ public static void openConduitMenu(ServerPlayer serverPlayer, BlockPos pos, Cond @UseOnly(LogicalSide.SERVER) private CompoundTag remoteExtraGuiData; - public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBlockEntity conduitBundle, Direction side, Holder> selectedConduit) { + public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBlockEntity conduitBundle, + Direction side, Holder> selectedConduit) { super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory); this.side = side; @@ -111,7 +107,7 @@ public ConnectionConfig connectionConfig() { public T connectionConfig(ConnectionConfigType type) { var config = connectionConfig(); if (config.type() == type) { - //noinspection unchecked + // noinspection unchecked return (T) config; } @@ -141,12 +137,13 @@ public boolean stillValid(Player player) { @Override public boolean clickMenuButton(Player player, int id) { - //var bundle = getBlockEntity(); - //var currentConfig = connectionConfig(); + // var bundle = getBlockEntity(); + // var currentConfig = connectionConfig(); - if (id >= BUTTON_CHANGE_CONDUIT_START_ID && id <= BUTTON_CHANGE_CONDUIT_ID_COUNT + BUTTON_CHANGE_CONDUIT_ID_COUNT) { + if (id >= BUTTON_CHANGE_CONDUIT_START_ID + && id <= BUTTON_CHANGE_CONDUIT_ID_COUNT + BUTTON_CHANGE_CONDUIT_ID_COUNT) { // TODO: attempt to change to a different conduit on the same face. - //var conduitList = getBlockEntity().getConduits(); + // var conduitList = getBlockEntity().getConduits(); // TODO Find and switch to conduit and tell the client. } @@ -166,13 +163,15 @@ public void broadcastChanges() { if (getPlayerInventory().player instanceof ServerPlayer serverPlayer) { if (!Objects.equals(connectionConfig(), remoteConnectionConfig)) { - PacketDistributor.sendToPlayer(serverPlayer, new SetConduitConnectionConfigPacket(containerId, connectionConfig())); + PacketDistributor.sendToPlayer(serverPlayer, + new SetConduitConnectionConfigPacket(containerId, connectionConfig())); this.remoteConnectionConfig = connectionConfig(); } var extraGuiData = extraGuiData(); if (!Objects.equals(extraGuiData, remoteExtraGuiData)) { - PacketDistributor.sendToPlayer(serverPlayer, new S2CConduitExtraGuiDataPacket(containerId, extraGuiData)); + PacketDistributor.sendToPlayer(serverPlayer, + new S2CConduitExtraGuiDataPacket(containerId, extraGuiData)); this.remoteExtraGuiData = extraGuiData; } } @@ -182,7 +181,9 @@ public interface ConnectionAccessor { // TODO: Conduit menu list. ConnectionConfig getConnectionConfig(Direction side, Holder> conduit); + void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config); + boolean canBeOrIsConnection(Direction side, Holder> conduit); @Nullable @@ -201,8 +202,8 @@ private static class ClientConnectionAccessor implements ConnectionAccessor { public ClientConnectionAccessor(RegistryFriendlyByteBuf buf) { this.connectionConfig = ConnectionConfig.STREAM_CODEC.decode(buf); extraGuiData = ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) - .map(opt -> opt.orElse(null), Optional::ofNullable) - .decode(buf); + .map(opt -> opt.orElse(null), Optional::ofNullable) + .decode(buf); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index f8f63e1503..4d23053b0b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -4,9 +4,9 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; +import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.core.common.util.TooltipUtil; @@ -86,19 +86,20 @@ public boolean canBeReplacedBy(Holder> otherConduit) { @Override public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { - IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, conduitPos.relative(direction), direction.getOpposite()); + IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, + conduitPos.relative(direction), direction.getOpposite()); return capability != null; } @Override - public @Nullable TCap proxyCapability(Level level, ColoredRedstoneProvider coloredRedstoneProvider, ConduitNode node, BlockCapability capability, - @Nullable TContext context) { + public @Nullable TCap proxyCapability(Level level, ColoredRedstoneProvider coloredRedstoneProvider, + ConduitNode node, BlockCapability capability, @Nullable TContext context) { if (Capabilities.EnergyStorage.BLOCK == capability && (context == null || context instanceof Direction)) { boolean isMutable = true; if (context != null) { - Direction side = (Direction)context; + Direction side = (Direction) context; // No connection, no cap. if (!node.isConnectedTo(side)) { @@ -113,7 +114,8 @@ public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction dir if (config.redstoneControl() == RedstoneControl.NEVER_ACTIVE) { isMutable = false; } else if (config.redstoneControl() != RedstoneControl.ALWAYS_ACTIVE) { - boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), config.redstoneChannel()); + boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), + config.redstoneChannel()); if (!hasRedstone) { for (Direction direction : Direction.values()) { if (level.getSignal(node.getPos().relative(direction), direction.getOpposite()) > 0) { @@ -147,8 +149,8 @@ public ConnectionConfigType connectionConfigType( } @Override - public EnergyConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, - RedstoneControl redstoneControl, DyeColor redstoneChannel) { + public EnergyConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, + DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { return new EnergyConduitConnectionConfig(isInsert, isExtract, redstoneControl, redstoneChannel); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java index cca3d30a06..3cc697c1e0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java @@ -13,42 +13,34 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; -public record EnergyConduitConnectionConfig( - boolean canInsert, - boolean canExtract, - RedstoneControl redstoneControl, - DyeColor redstoneChannel -) implements IOConnectionConfig, RedstoneControlledConnection { +public record EnergyConduitConnectionConfig(boolean canInsert, boolean canExtract, RedstoneControl redstoneControl, + DyeColor redstoneChannel) implements IOConnectionConfig, RedstoneControlledConnection { - public static EnergyConduitConnectionConfig DEFAULT = new EnergyConduitConnectionConfig(true, true, RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); + public static EnergyConduitConnectionConfig DEFAULT = new EnergyConduitConnectionConfig(true, true, + RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - Codec.BOOL.fieldOf("can_insert").forGetter(EnergyConduitConnectionConfig::canInsert), - Codec.BOOL.fieldOf("can_extract").forGetter(EnergyConduitConnectionConfig::canExtract), - RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(EnergyConduitConnectionConfig::redstoneControl), - DyeColor.CODEC.fieldOf("redstone_channel").forGetter(EnergyConduitConnectionConfig::redstoneChannel) - ).apply(instance, EnergyConduitConnectionConfig::new) - ); + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance + .group(Codec.BOOL.fieldOf("can_insert").forGetter(EnergyConduitConnectionConfig::canInsert), + Codec.BOOL.fieldOf("can_extract").forGetter(EnergyConduitConnectionConfig::canExtract), + RedstoneControl.CODEC.fieldOf("redstone_control") + .forGetter(EnergyConduitConnectionConfig::redstoneControl), + DyeColor.CODEC.fieldOf("redstone_channel") + .forGetter(EnergyConduitConnectionConfig::redstoneChannel)) + .apply(instance, EnergyConduitConnectionConfig::new)); public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.BOOL, - EnergyConduitConnectionConfig::canInsert, - ByteBufCodecs.BOOL, - EnergyConduitConnectionConfig::canExtract, - RedstoneControl.STREAM_CODEC, - EnergyConduitConnectionConfig::redstoneControl, - DyeColor.STREAM_CODEC, - EnergyConduitConnectionConfig::redstoneChannel, - EnergyConduitConnectionConfig::new - ); + ByteBufCodecs.BOOL, EnergyConduitConnectionConfig::canInsert, ByteBufCodecs.BOOL, + EnergyConduitConnectionConfig::canExtract, RedstoneControl.STREAM_CODEC, + EnergyConduitConnectionConfig::redstoneControl, DyeColor.STREAM_CODEC, + EnergyConduitConnectionConfig::redstoneChannel, EnergyConduitConnectionConfig::new); - public static final ConnectionConfigType TYPE = - new ConnectionConfigType<>(EnergyConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + public static final ConnectionConfigType TYPE = new ConnectionConfigType<>( + EnergyConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { - return new EnergyConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.canExtract, redstoneControl, redstoneChannel); + return new EnergyConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.canExtract, redstoneControl, + redstoneChannel); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java index eca1901fcb..6a12a047c6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitNetworkContext.java @@ -7,14 +7,13 @@ public class EnergyConduitNetworkContext implements ConduitNetworkContext { - public static final Codec CODEC = RecordCodecBuilder.create( - builder -> builder.group( - Codec.INT.fieldOf("energy_stored").forGetter(i -> i.energyStored), - Codec.INT.fieldOf("rotating_index").forGetter(i -> i.rotatingIndex) - ).apply(builder, EnergyConduitNetworkContext::new) - ); + public static final Codec CODEC = RecordCodecBuilder.create(builder -> builder + .group(Codec.INT.fieldOf("energy_stored").forGetter(i -> i.energyStored), + Codec.INT.fieldOf("rotating_index").forGetter(i -> i.rotatingIndex)) + .apply(builder, EnergyConduitNetworkContext::new)); - public static ConduitNetworkContextType TYPE = new ConduitNetworkContextType<>(CODEC, EnergyConduitNetworkContext::new); + public static ConduitNetworkContextType TYPE = new ConduitNetworkContextType<>(CODEC, + EnergyConduitNetworkContext::new); private int energyStored = 0; private int rotatingIndex = 0; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java index f774afcf63..8a3ba638a3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitStorage.java @@ -3,11 +3,7 @@ import com.enderio.conduits.api.network.node.ConduitNode; import net.neoforged.neoforge.energy.IEnergyStorage; -public record EnergyConduitStorage( - boolean isMutable, - int transferRate, - ConduitNode node -) implements IEnergyStorage { +public record EnergyConduitStorage(boolean isMutable, int transferRate, ConduitNode node) implements IEnergyStorage { private static final int ENERGY_BUFFER_SCALER = 4; @@ -48,7 +44,8 @@ public int getEnergyStored() { @Override public int getMaxEnergyStored() { // Capacity is transfer rate + nodeCount * transferRatePerTick / 2 (expanded). - // This ensures at least the transfer rate of the cable is available, but capacity doesn't grow outrageously. + // This ensures at least the transfer rate of the cable is available, but + // capacity doesn't grow outrageously. int nodeCount = node.getNetwork().getNodes().size(); // The maximum number of nodes before the network capacity is INT_MAX. @@ -67,7 +64,8 @@ public boolean canExtract() { } // The block will not expose this capability unless it can be extracted from - // This means we don't have to worry about checking if we can extract at this point. + // This means we don't have to worry about checking if we can extract at this + // point. @Override public boolean canReceive() { return node.getNetwork() != null && isMutable; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java index ef0183c9e4..75723b3acc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java @@ -4,6 +4,8 @@ import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.IOAwareConduitTicker; +import java.util.ArrayList; +import java.util.List; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; @@ -11,19 +13,17 @@ import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.List; - public class EnergyConduitTicker extends IOAwareConduitTicker { public EnergyConduitTicker() { } - // TODO: Need a way to prevent the extracts list from being built as it is unused. + // TODO: Need a way to prevent the extracts list from being built as it is + // unused. @Override - protected void tickGraph(ServerLevel level, EnergyConduit conduit, List inserts, List extracts, ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider) { + protected void tickGraph(ServerLevel level, EnergyConduit conduit, List inserts, + List extracts, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { // Adjust for tick rate. Always flow up so we are at minimum meeting the // required rate. @@ -40,7 +40,8 @@ protected void tickGraph(ServerLevel level, EnergyConduit conduit, List storagesForInsert = new ArrayList<>(); for (var insert : inserts) { - IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, insert.neighborPos(), insert.neighborSide()); + IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, insert.neighborPos(), + insert.neighborSide()); if (capability != null) { storagesForInsert.add(capability); } @@ -80,7 +81,8 @@ protected boolean shouldSkip(List extractList, List inse @Override protected @Nullable EnergyConduitTicker.Connection createConnection(Level level, ConduitNode node, Direction side) { - IEnergyStorage energyStorage = level.getCapability(Capabilities.EnergyStorage.BLOCK, node.getPos().relative(side), side.getOpposite()); + IEnergyStorage energyStorage = level.getCapability(Capabilities.EnergyStorage.BLOCK, + node.getPos().relative(side), side.getOpposite()); if (energyStorage != null) { return new Connection(node, side, energyStorage); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index 727eaca67d..d42ba4bba1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -5,11 +5,11 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.ConduitMenuData; +import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.bundle.ConduitBundleReader; +import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.ConduitType; -import com.enderio.conduits.api.bundle.SlotType; import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; import com.enderio.conduits.common.init.ConduitLang; import com.enderio.conduits.common.init.ConduitTypes; @@ -17,10 +17,8 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; - import java.util.Objects; import java.util.function.Consumer; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -89,7 +87,8 @@ public boolean canBeReplacedBy(Holder> otherConduit) { @Override public boolean canConnectConduits(@Nullable CompoundTag selfRenderData, @Nullable CompoundTag otherRenderData) { - // If there's no data for one of the nodes, the network must be fresh or uninitialized. + // If there's no data for one of the nodes, the network must be fresh or + // uninitialized. if (selfRenderData == null || otherRenderData == null) { return true; } @@ -98,8 +97,10 @@ public boolean canConnectConduits(@Nullable CompoundTag selfRenderData, @Nullabl return true; } - var selfLockedFluid = BuiltInRegistries.FLUID.get(ResourceLocation.parse(selfRenderData.getString("LockedFluid"))); - var otherLockedFluid = BuiltInRegistries.FLUID.get(ResourceLocation.parse(selfRenderData.getString("LockedFluid"))); + var selfLockedFluid = BuiltInRegistries.FLUID + .get(ResourceLocation.parse(selfRenderData.getString("LockedFluid"))); + var otherLockedFluid = BuiltInRegistries.FLUID + .get(ResourceLocation.parse(selfRenderData.getString("LockedFluid"))); return selfLockedFluid.isSame(otherLockedFluid); } @@ -128,7 +129,8 @@ public boolean canConnectConduits(ConduitNode selfNode, ConduitNode otherNode) { @Override public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { - IFluidHandler capability = level.getCapability(Capabilities.FluidHandler.BLOCK, conduitPos.relative(direction), direction.getOpposite()); + IFluidHandler capability = level.getCapability(Capabilities.FluidHandler.BLOCK, conduitPos.relative(direction), + direction.getOpposite()); return capability != null; } @@ -143,9 +145,10 @@ public ConnectionConfigType connectionConfigType() } @Override - public FluidConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, - RedstoneControl redstoneControl, DyeColor redstoneChannel) { - return new FluidConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel, redstoneControl, redstoneChannel); + public FluidConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, + DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { + return new FluidConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel, redstoneControl, + redstoneChannel); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java index 5da4e5ca4d..56c5fdc33b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java @@ -14,82 +14,73 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; -public record FluidConduitConnectionConfig( - boolean canInsert, - DyeColor insertChannel, - boolean canExtract, - DyeColor extractChannel, - RedstoneControl redstoneControl, - DyeColor redstoneChannel -) implements ChanneledIOConnectionConfig, RedstoneControlledConnection { +public record FluidConduitConnectionConfig(boolean canInsert, DyeColor insertChannel, boolean canExtract, + DyeColor extractChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) + implements ChanneledIOConnectionConfig, RedstoneControlledConnection { - public static FluidConduitConnectionConfig DEFAULT = new FluidConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.GREEN, - RedstoneControl.NEVER_ACTIVE, DyeColor.RED); + public static FluidConduitConnectionConfig DEFAULT = new FluidConduitConnectionConfig(false, DyeColor.GREEN, true, + DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED); - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - Codec.BOOL.fieldOf("can_insert").forGetter(FluidConduitConnectionConfig::canInsert), - DyeColor.CODEC.fieldOf("insert_channel").forGetter(FluidConduitConnectionConfig::insertChannel), - Codec.BOOL.fieldOf("can_extract").forGetter(FluidConduitConnectionConfig::canExtract), - DyeColor.CODEC.fieldOf("extract_channel").forGetter(FluidConduitConnectionConfig::extractChannel), - RedstoneControl.CODEC.fieldOf("redstone_control").forGetter(FluidConduitConnectionConfig::redstoneControl), - DyeColor.CODEC.fieldOf("redstone_channel").forGetter(FluidConduitConnectionConfig::redstoneChannel) - ).apply(instance, FluidConduitConnectionConfig::new) - ); + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance + .group(Codec.BOOL.fieldOf("can_insert").forGetter(FluidConduitConnectionConfig::canInsert), + DyeColor.CODEC.fieldOf("insert_channel").forGetter(FluidConduitConnectionConfig::insertChannel), + Codec.BOOL.fieldOf("can_extract").forGetter(FluidConduitConnectionConfig::canExtract), + DyeColor.CODEC.fieldOf("extract_channel").forGetter(FluidConduitConnectionConfig::extractChannel), + RedstoneControl.CODEC.fieldOf("redstone_control") + .forGetter(FluidConduitConnectionConfig::redstoneControl), + DyeColor.CODEC.fieldOf("redstone_channel").forGetter(FluidConduitConnectionConfig::redstoneChannel)) + .apply(instance, FluidConduitConnectionConfig::new)); public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.BOOL, - FluidConduitConnectionConfig::canInsert, - DyeColor.STREAM_CODEC, - FluidConduitConnectionConfig::insertChannel, - ByteBufCodecs.BOOL, - FluidConduitConnectionConfig::canExtract, - DyeColor.STREAM_CODEC, - FluidConduitConnectionConfig::extractChannel, - RedstoneControl.STREAM_CODEC, - FluidConduitConnectionConfig::redstoneControl, - DyeColor.STREAM_CODEC, - FluidConduitConnectionConfig::redstoneChannel, - FluidConduitConnectionConfig::new - ); + ByteBufCodecs.BOOL, FluidConduitConnectionConfig::canInsert, DyeColor.STREAM_CODEC, + FluidConduitConnectionConfig::insertChannel, ByteBufCodecs.BOOL, FluidConduitConnectionConfig::canExtract, + DyeColor.STREAM_CODEC, FluidConduitConnectionConfig::extractChannel, RedstoneControl.STREAM_CODEC, + FluidConduitConnectionConfig::redstoneControl, DyeColor.STREAM_CODEC, + FluidConduitConnectionConfig::redstoneChannel, FluidConduitConnectionConfig::new); public static ConnectionConfigType TYPE = new ConnectionConfigType<>( FluidConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { - return new FluidConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.insertChannel, DEFAULT.canExtract, DEFAULT.extractChannel, redstoneControl, - redstoneChannel); + return new FluidConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.insertChannel, DEFAULT.canExtract, + DEFAULT.extractChannel, redstoneControl, redstoneChannel); } @Override public IOConnectionConfig withInsert(boolean canInsert) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, + redstoneChannel); } @Override public IOConnectionConfig withExtract(boolean canExtract) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, + redstoneChannel); } @Override public FluidConduitConnectionConfig withInputChannel(DyeColor inputChannel) { - return new FluidConduitConnectionConfig(canInsert, inputChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + return new FluidConduitConnectionConfig(canInsert, inputChannel, canExtract, extractChannel, redstoneControl, + redstoneChannel); } @Override public FluidConduitConnectionConfig withOutputChannel(DyeColor outputChannel) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, outputChannel, redstoneControl, redstoneChannel); + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, outputChannel, redstoneControl, + redstoneChannel); } @Override public FluidConduitConnectionConfig withRedstoneControl(RedstoneControl redstoneControl) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, + redstoneChannel); } @Override public RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); + return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, + redstoneChannel); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java index 1f953a9c05..29adf1e4e6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java @@ -11,15 +11,14 @@ // TODO: packet to clear the fluid lock. public class FluidConduitNetworkContext implements ConduitNetworkContext { - public static Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group( - BuiltInRegistries.FLUID.byNameCodec() - .optionalFieldOf("locked_fluid", Fluids.EMPTY) - .forGetter(FluidConduitNetworkContext::lockedFluid) - ).apply(instance, FluidConduitNetworkContext::new) - ); + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance + .group(BuiltInRegistries.FLUID.byNameCodec() + .optionalFieldOf("locked_fluid", Fluids.EMPTY) + .forGetter(FluidConduitNetworkContext::lockedFluid)) + .apply(instance, FluidConduitNetworkContext::new)); - public static ConduitNetworkContextType TYPE = new ConduitNetworkContextType<>(CODEC, FluidConduitNetworkContext::new); + public static ConduitNetworkContextType TYPE = new ConduitNetworkContextType<>(CODEC, + FluidConduitNetworkContext::new); private Fluid lockedFluid; @@ -41,7 +40,8 @@ public void setLockedFluid(Fluid lockedFluid) { @Override public FluidConduitNetworkContext mergeWith(FluidConduitNetworkContext other) { - // Not doing anything here because these graph's should not merge unless the locked fluid is the same. + // Not doing anything here because these graph's should not merge unless the + // locked fluid is the same. return this; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java index e622f952d3..cdfea85a9a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java @@ -5,6 +5,7 @@ import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.ChannelIOAwareConduitTicker; +import java.util.List; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.DyeColor; @@ -18,13 +19,12 @@ import net.neoforged.neoforge.fluids.capability.IFluidHandler; import org.jetbrains.annotations.Nullable; -import java.util.List; - public class FluidConduitTicker extends ChannelIOAwareConduitTicker { private int getScaledFluidRate(FluidConduit conduit) { - // Adjust for tick rate. Always flow up so we are at minimum meeting the required rate. - return (int)Math.ceil(conduit.transferRatePerTick() * (20.0 / conduit.graphTickRate())); + // Adjust for tick rate. Always flow up so we are at minimum meeting the + // required rate. + return (int) Math.ceil(conduit.transferRatePerTick() * (20.0 / conduit.graphTickRate())); } private int doFluidTransfer(FluidStack fluid, Connection extract, List inserts) { @@ -47,7 +47,8 @@ private int doFluidTransfer(FluidStack fluid, Connection extract, List inserts, List extracts, DyeColor color, - ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + protected void tickColoredGraph(ServerLevel level, FluidConduit conduit, List inserts, + List extracts, DyeColor color, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider) { final int fluidRate = getScaledFluidRate(conduit); var context = graph.getOrCreateContext(FluidConduitNetworkContext.TYPE); @@ -100,7 +102,8 @@ protected void tickColoredGraph(ServerLevel level, FluidConduit conduit, List { -public record ItemConduit( - ResourceLocation texture, - Component description, - int transferRatePerCycle, - int graphTickRate -) implements Conduit { - - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - builder -> builder - .group( - ResourceLocation.CODEC.fieldOf("texture").forGetter(ItemConduit::texture), - ComponentSerialization.CODEC.fieldOf("description").forGetter(ItemConduit::description), - // Using optionals in order to support the old conduit format. - Codec.INT.optionalFieldOf("transfer_rate", 4).forGetter(ItemConduit::transferRatePerCycle), - Codec.intRange(1, 20).optionalFieldOf("ticks_per_cycle", 20).forGetter(ItemConduit::graphTickRate) - ).apply(builder, ItemConduit::new) - ); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(builder -> builder + .group(ResourceLocation.CODEC.fieldOf("texture").forGetter(ItemConduit::texture), + ComponentSerialization.CODEC.fieldOf("description").forGetter(ItemConduit::description), + // Using optionals in order to support the old conduit format. + Codec.INT.optionalFieldOf("transfer_rate", 4).forGetter(ItemConduit::transferRatePerCycle), + Codec.intRange(1, 20).optionalFieldOf("ticks_per_cycle", 20).forGetter(ItemConduit::graphTickRate)) + .apply(builder, ItemConduit::new)); private static final ConduitMenuData MENU_DATA = new ConduitMenuData.Simple(true, true, true, true, true, true); @@ -77,9 +69,12 @@ public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) } @Override - public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, TooltipFlag pTooltipFlag) { - String calculatedTransferLimitFormatted = String.format("%,d", (int)Math.floor(transferRatePerCycle() * (20.0 / graphTickRate()))); - pTooltipAdder.accept(TooltipUtil.styledWithArgs(ConduitLang.ITEM_EFFECTIVE_RATE_TOOLTIP, calculatedTransferLimitFormatted)); + public void addToTooltip(Item.TooltipContext pContext, Consumer pTooltipAdder, + TooltipFlag pTooltipFlag) { + String calculatedTransferLimitFormatted = String.format("%,d", + (int) Math.floor(transferRatePerCycle() * (20.0 / graphTickRate()))); + pTooltipAdder.accept( + TooltipUtil.styledWithArgs(ConduitLang.ITEM_EFFECTIVE_RATE_TOOLTIP, calculatedTransferLimitFormatted)); if (pTooltipFlag.hasShiftDown()) { String transferLimitFormatted = String.format("%,d", transferRatePerCycle()); @@ -99,7 +94,8 @@ public boolean showDebugTooltip() { @Override public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { - IItemHandler capability = level.getCapability(Capabilities.ItemHandler.BLOCK, conduitPos.relative(direction), direction.getOpposite()); + IItemHandler capability = level.getCapability(Capabilities.ItemHandler.BLOCK, conduitPos.relative(direction), + direction.getOpposite()); return capability != null; } @@ -110,10 +106,10 @@ public ConnectionConfigType connectionConfigType() // TODO: Move conversions into the connection config type? @Override - public ItemConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, - RedstoneControl redstoneControl, DyeColor redstoneChannel) { + public ItemConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, + DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { return new ItemConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel, redstoneControl, - redstoneChannel, false, false, 0); + redstoneChannel, false, false, 0); } @Override @@ -129,10 +125,10 @@ public void copyLegacyData(ConduitNode node, ConduitDataAccessor legacyDataAcces var oldSideConfig = legacyData.get(side); var currentConfig = node.getConnectionConfig(side, ItemConduitConnectionConfig.TYPE); - node.setConnectionConfig(side, currentConfig - .withIsRoundRobin(oldSideConfig.isRoundRobin) - .withIsSelfFeed(oldSideConfig.isSelfFeed) - .withPriority(oldSideConfig.priority)); + node.setConnectionConfig(side, + currentConfig.withIsRoundRobin(oldSideConfig.isRoundRobin) + .withIsSelfFeed(oldSideConfig.isSelfFeed) + .withPriority(oldSideConfig.priority)); } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java index bbafb9bab5..2f0d1913f2 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java @@ -4,72 +4,50 @@ import com.enderio.base.api.network.MassiveStreamCodec; import com.enderio.conduits.api.ConduitRedstoneSignalAware; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; import com.enderio.conduits.api.connection.config.RedstoneSensitiveConnectionConfig; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import io.netty.buffer.ByteBuf; +import java.util.List; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; -import java.util.List; - -public record ItemConduitConnectionConfig( - boolean isSend, - DyeColor sendColor, - boolean isReceive, - DyeColor receiveColor, - RedstoneControl receiveRedstoneControl, - DyeColor receiveRedstoneChannel, - boolean isRoundRobin, - boolean isSelfFeed, - int priority -) implements NewIOConnectionConfig, RedstoneSensitiveConnectionConfig { - - public static ItemConduitConnectionConfig DEFAULT = new ItemConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.GREEN, - RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); - - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - Codec.BOOL.fieldOf("is_send").forGetter(ItemConduitConnectionConfig::isSend), - DyeColor.CODEC.fieldOf("send_color").forGetter(ItemConduitConnectionConfig::sendColor), - Codec.BOOL.fieldOf("is_receive").forGetter(ItemConduitConnectionConfig::isReceive), - DyeColor.CODEC.fieldOf("receive_color").forGetter(ItemConduitConnectionConfig::receiveColor), - RedstoneControl.CODEC.fieldOf("receive_redstone_control").forGetter(ItemConduitConnectionConfig::receiveRedstoneControl), - DyeColor.CODEC.fieldOf("receive_redstone_channel").forGetter(ItemConduitConnectionConfig::receiveRedstoneChannel), - Codec.BOOL.fieldOf("is_round_robin").forGetter(ItemConduitConnectionConfig::isRoundRobin), - Codec.BOOL.fieldOf("is_self_feed").forGetter(ItemConduitConnectionConfig::isSelfFeed), - Codec.INT.fieldOf("priority").forGetter(ItemConduitConnectionConfig::priority) - ).apply(instance, ItemConduitConnectionConfig::new) - ); +public record ItemConduitConnectionConfig(boolean isSend, DyeColor sendColor, boolean isReceive, DyeColor receiveColor, + RedstoneControl receiveRedstoneControl, DyeColor receiveRedstoneChannel, boolean isRoundRobin, + boolean isSelfFeed, int priority) implements NewIOConnectionConfig, RedstoneSensitiveConnectionConfig { + + public static ItemConduitConnectionConfig DEFAULT = new ItemConduitConnectionConfig(false, DyeColor.GREEN, true, + DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); + + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance + .group(Codec.BOOL.fieldOf("is_send").forGetter(ItemConduitConnectionConfig::isSend), + DyeColor.CODEC.fieldOf("send_color").forGetter(ItemConduitConnectionConfig::sendColor), + Codec.BOOL.fieldOf("is_receive").forGetter(ItemConduitConnectionConfig::isReceive), + DyeColor.CODEC.fieldOf("receive_color").forGetter(ItemConduitConnectionConfig::receiveColor), + RedstoneControl.CODEC.fieldOf("receive_redstone_control") + .forGetter(ItemConduitConnectionConfig::receiveRedstoneControl), + DyeColor.CODEC.fieldOf("receive_redstone_channel") + .forGetter(ItemConduitConnectionConfig::receiveRedstoneChannel), + Codec.BOOL.fieldOf("is_round_robin").forGetter(ItemConduitConnectionConfig::isRoundRobin), + Codec.BOOL.fieldOf("is_self_feed").forGetter(ItemConduitConnectionConfig::isSelfFeed), + Codec.INT.fieldOf("priority").forGetter(ItemConduitConnectionConfig::priority)) + .apply(instance, ItemConduitConnectionConfig::new)); public static StreamCodec STREAM_CODEC = MassiveStreamCodec.composite( - ByteBufCodecs.BOOL, - ItemConduitConnectionConfig::isSend, - DyeColor.STREAM_CODEC, - ItemConduitConnectionConfig::sendColor, - ByteBufCodecs.BOOL, - ItemConduitConnectionConfig::isReceive, - DyeColor.STREAM_CODEC, - ItemConduitConnectionConfig::receiveColor, - RedstoneControl.STREAM_CODEC, - ItemConduitConnectionConfig::receiveRedstoneControl, - DyeColor.STREAM_CODEC, - ItemConduitConnectionConfig::receiveRedstoneChannel, - ByteBufCodecs.BOOL, - ItemConduitConnectionConfig::isRoundRobin, - ByteBufCodecs.BOOL, - ItemConduitConnectionConfig::isSelfFeed, - ByteBufCodecs.INT, - ItemConduitConnectionConfig::priority, - ItemConduitConnectionConfig::new - ); - - public static ConnectionConfigType TYPE = - new ConnectionConfigType<>(ItemConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + ByteBufCodecs.BOOL, ItemConduitConnectionConfig::isSend, DyeColor.STREAM_CODEC, + ItemConduitConnectionConfig::sendColor, ByteBufCodecs.BOOL, ItemConduitConnectionConfig::isReceive, + DyeColor.STREAM_CODEC, ItemConduitConnectionConfig::receiveColor, RedstoneControl.STREAM_CODEC, + ItemConduitConnectionConfig::receiveRedstoneControl, DyeColor.STREAM_CODEC, + ItemConduitConnectionConfig::receiveRedstoneChannel, ByteBufCodecs.BOOL, + ItemConduitConnectionConfig::isRoundRobin, ByteBufCodecs.BOOL, ItemConduitConnectionConfig::isSelfFeed, + ByteBufCodecs.INT, ItemConduitConnectionConfig::priority, ItemConduitConnectionConfig::new); + + public static ConnectionConfigType TYPE = new ConnectionConfigType<>( + ItemConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public boolean canSend(ConduitRedstoneSignalAware signalAware) { @@ -92,45 +70,54 @@ public boolean canReceive(ConduitRedstoneSignalAware signalAware) { @Override public ConnectionConfig reconnected() { - return new ItemConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, receiveColor, receiveRedstoneControl, - receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, receiveColor, + receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } // Generate with methods for each field public ItemConduitConnectionConfig withIsSend(boolean isSend) { - return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } public ItemConduitConnectionConfig withSendColor(DyeColor sendColor) { - return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } public ItemConduitConnectionConfig withIsReceive(boolean isReceive) { - return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } public ItemConduitConnectionConfig withReceiveColor(DyeColor receiveColor) { - return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } public ItemConduitConnectionConfig withReceiveRedstoneControl(RedstoneControl receiveRedstoneControl) { - return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } public ItemConduitConnectionConfig withReceiveRedstoneChannel(DyeColor receiveRedstoneChannel) { - return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } public ItemConduitConnectionConfig withIsRoundRobin(boolean isRoundRobin) { - return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } public ItemConduitConnectionConfig withIsSelfFeed(boolean isSelfFeed) { - return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } public ItemConduitConnectionConfig withPriority(int priority) { - return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitNodeData.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitNodeData.java index 948253f472..64c06aa1e0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitNodeData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitNodeData.java @@ -6,21 +6,22 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.Direction; - import java.util.HashMap; import java.util.Map; +import net.minecraft.core.Direction; /** * Stores round-robin indexes for this node. */ public final class ItemConduitNodeData implements NodeData { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance - .group(Codec.unboundedMap(Direction.CODEC, Codec.INT).fieldOf("round_robin_indexes").forGetter(i -> i.roundRobinIndexes)) - .apply(instance, ItemConduitNodeData::new)); + public static MapCodec CODEC = RecordCodecBuilder + .mapCodec(instance -> instance.group(Codec.unboundedMap(Direction.CODEC, Codec.INT) + .fieldOf("round_robin_indexes") + .forGetter(i -> i.roundRobinIndexes)).apply(instance, ItemConduitNodeData::new)); - public static NodeDataType TYPE = new NodeDataType<>(ItemConduitNodeData.CODEC, ItemConduitNodeData::new); + public static NodeDataType TYPE = new NodeDataType<>(ItemConduitNodeData.CODEC, + ItemConduitNodeData::new); private final Map roundRobinIndexes; public ItemConduitNodeData() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java index 16d8ab197a..491c53af9c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java @@ -6,10 +6,8 @@ import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ticker.NewIOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitTypes; - import java.util.Comparator; import java.util.List; - import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.DyeColor; @@ -20,11 +18,13 @@ import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.Nullable; -public class ItemConduitTicker extends NewIOAwareConduitTicker { +public class ItemConduitTicker + extends NewIOAwareConduitTicker { @Override - protected void tickColoredGraph(ServerLevel level, ItemConduit conduit, List senders, List receivers, DyeColor color, - ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + protected void tickColoredGraph(ServerLevel level, ItemConduit conduit, List senders, + List receivers, DyeColor color, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider) { toNextExtract: for (Connection extract : receivers) { ItemConduitNodeData nodeData = extract.node().getOrCreateNodeData(ConduitTypes.NodeData.ITEM.get()); @@ -46,7 +46,8 @@ protected void tickColoredGraph(ServerLevel level, ItemConduit conduit, List receivers) { @Override @Nullable protected Connection createConnection(Level level, ConduitNode node, Direction side) { - IItemHandler itemHandler = level.getCapability(Capabilities.ItemHandler.BLOCK, node.getPos().relative(side), side.getOpposite()); + IItemHandler itemHandler = level.getCapability(Capabilities.ItemHandler.BLOCK, node.getPos().relative(side), + side.getOpposite()); if (itemHandler != null) { - return new Connection(node, side, node.getConnectionConfig(side, ItemConduitConnectionConfig.TYPE), itemHandler); + return new Connection(node, side, node.getConnectionConfig(side, ItemConduitConnectionConfig.TYPE), + itemHandler); } return null; @@ -120,7 +123,8 @@ protected Connection createConnection(Level level, ConduitNode node, Direction s protected static class Connection extends SimpleConnection { private final IItemHandler itemHandler; - public Connection(ConduitNode node, Direction side, ItemConduitConnectionConfig config, IItemHandler itemHandler) { + public Connection(ConduitNode node, Direction side, ItemConduitConnectionConfig config, + IItemHandler itemHandler) { super(node, side, config); this.itemHandler = itemHandler; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java index 4659ebe7ff..2e67255e42 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java @@ -3,18 +3,19 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.bundle.ConduitBundleReader; -import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitType; +import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.SlotType; +import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.api.network.node.ConduitNode; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.redstone.RedstoneExtractFilter; import com.enderio.conduits.common.redstone.RedstoneInsertFilter; import com.enderio.conduits.common.tag.ConduitTags; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import java.util.Set; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -27,21 +28,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Set; - -public record RedstoneConduit( - ResourceLocation texture, - ResourceLocation activeTexture, - Component description -) implements Conduit { +public record RedstoneConduit(ResourceLocation texture, ResourceLocation activeTexture, Component description) + implements Conduit { - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - builder -> builder.group( - ResourceLocation.CODEC.fieldOf("texture").forGetter(RedstoneConduit::texture), - ResourceLocation.CODEC.fieldOf("active_texture").forGetter(RedstoneConduit::activeTexture), - ComponentSerialization.CODEC.fieldOf("description").forGetter(RedstoneConduit::description) - ).apply(builder, RedstoneConduit::new) - ); + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(builder -> builder + .group(ResourceLocation.CODEC.fieldOf("texture").forGetter(RedstoneConduit::texture), + ResourceLocation.CODEC.fieldOf("active_texture").forGetter(RedstoneConduit::activeTexture), + ComponentSerialization.CODEC.fieldOf("description").forGetter(RedstoneConduit::description)) + .apply(builder, RedstoneConduit::new)); private static final RedstoneConduitTicker TICKER = new RedstoneConduitTicker(); private static final ConduitMenuData MENU_DATA = new ConduitMenuData.Simple(true, true, false, true, true, false); @@ -69,16 +63,17 @@ public ConduitMenuData getMenuData() { @Override public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { return switch (slotType) { - case FILTER_EXTRACT -> resourceFilter instanceof RedstoneExtractFilter; - case FILTER_INSERT -> resourceFilter instanceof RedstoneInsertFilter; - default -> false; + case FILTER_EXTRACT -> resourceFilter instanceof RedstoneExtractFilter; + case FILTER_INSERT -> resourceFilter instanceof RedstoneInsertFilter; + default -> false; }; } @Override public ResourceLocation getTexture(@Nullable CompoundTag extraWorldData) { if (extraWorldData != null) { - return extraWorldData.contains("IsActive") && extraWorldData.getBoolean("IsActive") ? activeTexture() : texture(); + return extraWorldData.contains("IsActive") && extraWorldData.getBoolean("IsActive") ? activeTexture() + : texture(); } return texture(); @@ -94,7 +89,7 @@ public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction dir BlockPos neighbor = conduitPos.relative(direction); BlockState blockState = level.getBlockState(neighbor); return blockState.is(ConduitTags.Blocks.REDSTONE_CONNECTABLE) - || blockState.canRedstoneConnectTo(level, neighbor, direction.getOpposite()); + || blockState.canRedstoneConnectTo(level, neighbor, direction.getOpposite()); } @Override @@ -110,8 +105,8 @@ public ConnectionConfigType connectionConfigTyp } @Override - public RedstoneConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, DyeColor outputChannel, - RedstoneControl redstoneControl, DyeColor redstoneChannel) { + public RedstoneConduitConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, + DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { return new RedstoneConduitConnectionConfig(isInsert, inputChannel, isExtract, outputChannel, false); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java index 639027cb4c..1cda9e0be3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java @@ -11,46 +11,34 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; -public record RedstoneConduitConnectionConfig( - boolean isSend, - DyeColor sendColor, - boolean isReceive, - DyeColor receiveColor, - boolean isStrongOutputSignal -) implements NewIOConnectionConfig { +public record RedstoneConduitConnectionConfig(boolean isSend, DyeColor sendColor, boolean isReceive, + DyeColor receiveColor, boolean isStrongOutputSignal) implements NewIOConnectionConfig { - public static RedstoneConduitConnectionConfig DEFAULT = new RedstoneConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.RED, false); + public static RedstoneConduitConnectionConfig DEFAULT = new RedstoneConduitConnectionConfig(false, DyeColor.GREEN, + true, DyeColor.RED, false); - public static MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group( - Codec.BOOL.fieldOf("is_send").forGetter(RedstoneConduitConnectionConfig::isSend), - DyeColor.CODEC.fieldOf("send_color").forGetter(RedstoneConduitConnectionConfig::sendColor), - Codec.BOOL.fieldOf("is_receive").forGetter(RedstoneConduitConnectionConfig::isReceive), - DyeColor.CODEC.fieldOf("receive_color").forGetter(RedstoneConduitConnectionConfig::receiveColor), - Codec.BOOL.fieldOf("is_strong_output_signal").forGetter(RedstoneConduitConnectionConfig::isStrongOutputSignal) - ).apply(instance, RedstoneConduitConnectionConfig::new) - ); + public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance + .group(Codec.BOOL.fieldOf("is_send").forGetter(RedstoneConduitConnectionConfig::isSend), + DyeColor.CODEC.fieldOf("send_color").forGetter(RedstoneConduitConnectionConfig::sendColor), + Codec.BOOL.fieldOf("is_receive").forGetter(RedstoneConduitConnectionConfig::isReceive), + DyeColor.CODEC.fieldOf("receive_color").forGetter(RedstoneConduitConnectionConfig::receiveColor), + Codec.BOOL.fieldOf("is_strong_output_signal") + .forGetter(RedstoneConduitConnectionConfig::isStrongOutputSignal)) + .apply(instance, RedstoneConduitConnectionConfig::new)); public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.BOOL, - RedstoneConduitConnectionConfig::isSend, - DyeColor.STREAM_CODEC, - RedstoneConduitConnectionConfig::sendColor, - ByteBufCodecs.BOOL, - RedstoneConduitConnectionConfig::isReceive, - DyeColor.STREAM_CODEC, - RedstoneConduitConnectionConfig::receiveColor, - ByteBufCodecs.BOOL, - RedstoneConduitConnectionConfig::isStrongOutputSignal, - RedstoneConduitConnectionConfig::new - ); + ByteBufCodecs.BOOL, RedstoneConduitConnectionConfig::isSend, DyeColor.STREAM_CODEC, + RedstoneConduitConnectionConfig::sendColor, ByteBufCodecs.BOOL, RedstoneConduitConnectionConfig::isReceive, + DyeColor.STREAM_CODEC, RedstoneConduitConnectionConfig::receiveColor, ByteBufCodecs.BOOL, + RedstoneConduitConnectionConfig::isStrongOutputSignal, RedstoneConduitConnectionConfig::new); public static ConnectionConfigType TYPE = new ConnectionConfigType<>( RedstoneConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { - return new RedstoneConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, receiveColor, isStrongOutputSignal); + return new RedstoneConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, receiveColor, + isStrongOutputSignal); } public RedstoneConduitConnectionConfig withIsSend(boolean isSend) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java index 0ac6af5b55..5b13f6cdaf 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitNetworkContext.java @@ -2,15 +2,16 @@ import com.enderio.conduits.api.network.ConduitNetworkContext; import com.enderio.conduits.api.network.ConduitNetworkContextType; -import net.minecraft.world.item.DyeColor; - import java.util.HashMap; import java.util.Map; +import net.minecraft.world.item.DyeColor; public class RedstoneConduitNetworkContext implements ConduitNetworkContext { - // Redstone context is not saved as it is recalculated every graph tick if the network is active. - public static ConduitNetworkContextType TYPE = new ConduitNetworkContextType<>(null, RedstoneConduitNetworkContext::new); + // Redstone context is not saved as it is recalculated every graph tick if the + // network is active. + public static ConduitNetworkContextType TYPE = new ConduitNetworkContextType<>(null, + RedstoneConduitNetworkContext::new); private boolean isActive; private Map previousChannelSignals = new HashMap<>(); @@ -86,7 +87,8 @@ public ConduitNetworkContextType type() { return TYPE; } - // Because the context is cleared before the graph ticks, we need to represent "newness" as three states. + // Because the context is cleared before the graph ticks, we need to represent + // "newness" as three states. private enum NewNetworkDelay { NEW, NEW_DECAY, OLD } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java index 668996beac..cc21bc1079 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java @@ -6,16 +6,15 @@ import com.enderio.conduits.api.ticker.NewIOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.redstone.RedstoneExtractFilter; - import java.util.List; - import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -public class RedstoneConduitTicker extends NewIOAwareConduitTicker { +public class RedstoneConduitTicker extends + NewIOAwareConduitTicker { @Override public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork graph, @@ -39,7 +38,8 @@ public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork @Override protected void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List senders, - List receivers, DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + List receivers, DyeColor color, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider) { RedstoneConduitNetworkContext networkContext = graph.getOrCreateContext(RedstoneConduitNetworkContext.TYPE); @@ -56,7 +56,8 @@ protected void tickColoredGraph(ServerLevel level, RedstoneConduit conduit, List } } - // Only update neighbours if this is a new context or the signal strength changed this time. + // Only update neighbours if this is a new context or the signal strength + // changed this time. if (networkContext.isNew() || networkContext.getSignal(color) != networkContext.getSignalLastTick(color)) { for (Connection sender : senders) { level.updateNeighborsAt(sender.pos(), ConduitBlocks.CONDUIT.get()); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java index d1be785939..9216dfe0c1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitLang.java @@ -18,16 +18,14 @@ public class ConduitLang { "Ender Energy Conduit"); public static final Component REDSTONE_CONDUIT = addTranslation("item", EnderIO.loc("conduit.redstone"), "Redstone Conduit"); - public static final Component FLUID_CONDUIT = addTranslation("item", EnderIO.loc("conduit.fluid"), - "Fluid Conduit"); + public static final Component FLUID_CONDUIT = addTranslation("item", EnderIO.loc("conduit.fluid"), "Fluid Conduit"); public static final Component PRESSURIZED_FLUID_CONDUIT = addTranslation("item", EnderIO.loc("conduit.pressurized_fluid"), "Pressurized Fluid Conduit"); public static final Component ENDER_FLUID_CONDUIT = addTranslation("item", EnderIO.loc("conduit.ender_fluid"), "Ender Fluid Conduit"); - public static final Component ITEM_CONDUIT = addTranslation("item", EnderIO.loc("conduit.item"), - "Item Conduit"); - public static final Component ENHANCED_ITEM_CONDUIT = addTranslation("item", - EnderIO.loc("conduit.enhanced_item"), "Enhanced Item Conduit"); + public static final Component ITEM_CONDUIT = addTranslation("item", EnderIO.loc("conduit.item"), "Item Conduit"); + public static final Component ENHANCED_ITEM_CONDUIT = addTranslation("item", EnderIO.loc("conduit.enhanced_item"), + "Enhanced Item Conduit"); public static final Component ENDER_ITEM_CONDUIT = addTranslation("item", EnderIO.loc("conduit.ender_item"), "Ender Item Conduit"); @@ -35,25 +33,24 @@ public class ConduitLang { // region Conduit Screen Tooltips - public static final Component CONDUIT_CHANNEL = addTranslation("gui", EnderIO.loc("conduit_channel"), - "Channel"); + public static final Component CONDUIT_CHANNEL = addTranslation("gui", EnderIO.loc("conduit_channel"), "Channel"); public static final Component REDSTONE_CHANNEL = addTranslation("gui", EnderIO.loc("redstone_channel"), - "Signal Color"); + "Signal Color"); public static final Component ROUND_ROBIN_ENABLED = addTranslation("gui", EnderIO.loc("round_robin.enabled"), - "Round Robin Enabled"); + "Round Robin Enabled"); public static final Component ROUND_ROBIN_DISABLED = addTranslation("gui", EnderIO.loc("round_robin.disabled"), - "Round Robin Disabled"); + "Round Robin Disabled"); public static final Component SELF_FEED_ENABLED = addTranslation("gui", EnderIO.loc("self_feed.enabled"), - "Self Feed Enabled"); + "Self Feed Enabled"); public static final Component SELF_FEED_DISABLED = addTranslation("gui", EnderIO.loc("self_feed.disabled"), - "Self Feed Disabled"); + "Self Feed Disabled"); public static final Component FLUID_CONDUIT_CHANGE_FLUID1 = addTranslation("gui", - EnderIO.loc("fluid_conduit.change_fluid1"), "Locked Fluid:"); + EnderIO.loc("fluid_conduit.change_fluid1"), "Locked Fluid:"); public static final Component FLUID_CONDUIT_CHANGE_FLUID2 = addTranslation("gui", - EnderIO.loc("fluid_conduit.change_fluid2"), "Click to reset!"); + EnderIO.loc("fluid_conduit.change_fluid2"), "Click to reset!"); public static final MutableComponent FLUID_CONDUIT_CHANGE_FLUID3 = addTranslation("gui", - EnderIO.loc("fluid_conduit.change_fluid3"), "Fluid: %s"); + EnderIO.loc("fluid_conduit.change_fluid3"), "Fluid: %s"); // endregion @@ -68,30 +65,28 @@ public class ConduitLang { public static final MutableComponent FLUID_EFFECTIVE_RATE_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit.fluid.effective_rate"), "Effective Rate: %s mB/t"); - public static final Component MULTI_FLUID_TOOLTIP = addTranslation("tooltip", - EnderIO.loc("conduit.fluid.multi"), "Allows multiple fluids to be transported on the same line"); + public static final Component MULTI_FLUID_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit.fluid.multi"), + "Allows multiple fluids to be transported on the same line"); public static final MutableComponent ITEM_RAW_RATE_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit.item.raw_rate"), "Rate: %s Items/graph tick"); public static final MutableComponent ITEM_EFFECTIVE_RATE_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit.item.effective_rate"), "Effective Rate: %s Items/sec"); - public static final Component CONDUIT_ERROR_NO_SCREEN_TYPE = addTranslation("gui", EnderIO.loc("conduit.error.no_screen_type"), - "Error: No screen type defined"); + public static final Component CONDUIT_ERROR_NO_SCREEN_TYPE = addTranslation("gui", + EnderIO.loc("conduit.error.no_screen_type"), "Error: No screen type defined"); public static final Component CONDUIT_ENABLED = addTranslation("gui", EnderIO.loc("conduit.enabled"), "Enabled"); public static final Component CONDUIT_INSERT = addTranslation("gui", EnderIO.loc("conduit.insert"), "Insert"); - public static final Component CONDUIT_EXTRACT = addTranslation("gui", EnderIO.loc("conduit.extract"), - "Extract"); + public static final Component CONDUIT_EXTRACT = addTranslation("gui", EnderIO.loc("conduit.extract"), "Extract"); public static final Component CONDUIT_INPUT = addTranslation("gui", EnderIO.loc("conduit.input"), "Input"); - public static final Component CONDUIT_OUTPUT = addTranslation("gui", EnderIO.loc("conduit.output"), - "Output"); + public static final Component CONDUIT_OUTPUT = addTranslation("gui", EnderIO.loc("conduit.output"), "Output"); // Redstone Conduit - public static final Component CONDUIT_REDSTONE_SIGNAL_COLOR = addTranslation("gui", EnderIO.loc("conduit.redstone.signal_color"), - "Signal Color"); - public static final Component CONDUIT_REDSTONE_STRONG_SIGNAL = addTranslation("gui", EnderIO.loc("conduit.redstone.strong_signal"), - "Strong Signal"); + public static final Component CONDUIT_REDSTONE_SIGNAL_COLOR = addTranslation("gui", + EnderIO.loc("conduit.redstone.signal_color"), "Signal Color"); + public static final Component CONDUIT_REDSTONE_STRONG_SIGNAL = addTranslation("gui", + EnderIO.loc("conduit.redstone.strong_signal"), "Strong Signal"); public static final MutableComponent TRANSPARENT_FACADE_TOOLTIP = addTranslation("tooltip", EnderIO.loc("conduit_facade.transparent"), diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java index 83d09b09ba..78a6416446 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java @@ -1,10 +1,10 @@ package com.enderio.conduits.common.init; import com.enderio.conduits.EnderIOConduits; +import com.enderio.conduits.client.gui.screen.NewConduitScreen; import com.enderio.conduits.client.gui.screen.filter.RedstoneCountFilterScreen; import com.enderio.conduits.client.gui.screen.filter.RedstoneDoubleChannelFilterScreen; import com.enderio.conduits.client.gui.screen.filter.RedstoneTimerFilterScreen; -import com.enderio.conduits.client.gui.screen.NewConduitScreen; import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.menu.RedstoneCountFilterMenu; import com.enderio.conduits.common.menu.RedstoneDoubleChannelFilterMenu; @@ -16,17 +16,18 @@ public class ConduitMenus { private static final MenuRegistry MENU_REGISTRY = EnderIOConduits.REGILITE.menuRegistry(); - public static final RegiliteMenu CONDUIT_MENU = MENU_REGISTRY - .registerMenu("conduit", ConduitMenu::new, () -> NewConduitScreen::new); + public static final RegiliteMenu CONDUIT_MENU = MENU_REGISTRY.registerMenu("conduit", ConduitMenu::new, + () -> NewConduitScreen::new); public static final RegiliteMenu REDSTONE_DOUBLE_CHANNEL_FILTER = MENU_REGISTRY - .registerMenu("redstone_and_filter", RedstoneDoubleChannelFilterMenu::factory, () -> RedstoneDoubleChannelFilterScreen::new); + .registerMenu("redstone_and_filter", RedstoneDoubleChannelFilterMenu::factory, + () -> RedstoneDoubleChannelFilterScreen::new); - public static final RegiliteMenu REDSTONE_TIMER_FILTER = MENU_REGISTRY - .registerMenu("redstone_timer_filter", RedstoneTimerFilterMenu::factory, () -> RedstoneTimerFilterScreen::new); + public static final RegiliteMenu REDSTONE_TIMER_FILTER = MENU_REGISTRY.registerMenu( + "redstone_timer_filter", RedstoneTimerFilterMenu::factory, () -> RedstoneTimerFilterScreen::new); - public static final RegiliteMenu REDSTONE_COUNT_FILTER = MENU_REGISTRY - .registerMenu("redstone_count_filter", RedstoneCountFilterMenu::factory, () -> RedstoneCountFilterScreen::new); + public static final RegiliteMenu REDSTONE_COUNT_FILTER = MENU_REGISTRY.registerMenu( + "redstone_count_filter", RedstoneCountFilterMenu::factory, () -> RedstoneCountFilterScreen::new); public static void register(IEventBus bus) { MENU_REGISTRY.register(bus); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java index 92021d0f35..e14cc6dc0c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitTypes.java @@ -1,29 +1,28 @@ package com.enderio.conduits.common.init; import com.enderio.base.api.EnderIO; +import com.enderio.conduits.api.ConduitType; +import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.network.ConduitNetworkContextType; import com.enderio.conduits.api.network.node.NodeDataType; import com.enderio.conduits.api.network.node.legacy.ConduitDataType; -import com.enderio.conduits.api.ConduitType; -import com.enderio.conduits.api.EnderIOConduitsRegistries; +import com.enderio.conduits.common.conduit.legacy.LegacyFluidConduitData; +import com.enderio.conduits.common.conduit.legacy.LegacyItemConduitData; +import com.enderio.conduits.common.conduit.legacy.LegacyRedstoneConduitData; import com.enderio.conduits.common.conduit.type.energy.EnergyConduit; import com.enderio.conduits.common.conduit.type.energy.EnergyConduitConnectionConfig; import com.enderio.conduits.common.conduit.type.energy.EnergyConduitNetworkContext; import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; import com.enderio.conduits.common.conduit.type.fluid.FluidConduitConnectionConfig; -import com.enderio.conduits.common.conduit.legacy.LegacyFluidConduitData; import com.enderio.conduits.common.conduit.type.fluid.FluidConduitNetworkContext; import com.enderio.conduits.common.conduit.type.item.ItemConduit; import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig; -import com.enderio.conduits.common.conduit.legacy.LegacyItemConduitData; import com.enderio.conduits.common.conduit.type.item.ItemConduitNodeData; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduit; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; -import com.enderio.conduits.common.conduit.legacy.LegacyRedstoneConduitData; -import java.util.function.Supplier; - import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitNetworkContext; +import java.util.function.Supplier; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.registries.DeferredRegister; @@ -49,11 +48,12 @@ public static class Data { .create(EnderIOConduitsRegistries.CONDUIT_DATA_TYPE, EnderIO.NAMESPACE); public static final Supplier> ITEM = CONDUIT_DATA_TYPES.register("item", - () -> new ConduitDataType<>(LegacyItemConduitData.CODEC, LegacyItemConduitData.STREAM_CODEC, LegacyItemConduitData::new)); + () -> new ConduitDataType<>(LegacyItemConduitData.CODEC, LegacyItemConduitData.STREAM_CODEC, + LegacyItemConduitData::new)); - public static final Supplier> FLUID = CONDUIT_DATA_TYPES.register("fluid", - () -> new ConduitDataType<>(LegacyFluidConduitData.CODEC, LegacyFluidConduitData.STREAM_CODEC, - LegacyFluidConduitData::new)); + public static final Supplier> FLUID = CONDUIT_DATA_TYPES + .register("fluid", () -> new ConduitDataType<>(LegacyFluidConduitData.CODEC, + LegacyFluidConduitData.STREAM_CODEC, LegacyFluidConduitData::new)); public static final Supplier> REDSTONE = CONDUIT_DATA_TYPES .register("redstone", () -> new ConduitDataType<>(LegacyRedstoneConduitData.CODEC, @@ -64,39 +64,39 @@ public static class ConnectionTypes { private static final DeferredRegister> CONNECTION_TYPES = DeferredRegister .create(EnderIOConduitsRegistries.CONDUIT_CONNECTION_CONFIG_TYPE, EnderIO.NAMESPACE); - public static final Supplier> ITEM = CONNECTION_TYPES.register("item", - () -> ItemConduitConnectionConfig.TYPE); + public static final Supplier> ITEM = CONNECTION_TYPES + .register("item", () -> ItemConduitConnectionConfig.TYPE); - public static final Supplier> ENERGY = CONNECTION_TYPES.register("energy", - () -> EnergyConduitConnectionConfig.TYPE); + public static final Supplier> ENERGY = CONNECTION_TYPES + .register("energy", () -> EnergyConduitConnectionConfig.TYPE); - public static final Supplier> REDSTONE = CONNECTION_TYPES.register("redstone", - () -> RedstoneConduitConnectionConfig.TYPE); + public static final Supplier> REDSTONE = CONNECTION_TYPES + .register("redstone", () -> RedstoneConduitConnectionConfig.TYPE); - public static final Supplier> FLUID = CONNECTION_TYPES.register("fluid", - () -> FluidConduitConnectionConfig.TYPE); + public static final Supplier> FLUID = CONNECTION_TYPES + .register("fluid", () -> FluidConduitConnectionConfig.TYPE); } public static class NodeData { private static final DeferredRegister> NODE_DATA_TYPES = DeferredRegister .create(EnderIOConduitsRegistries.CONDUIT_NODE_DATA_TYPE, EnderIO.NAMESPACE); - public static final Supplier> ITEM = NODE_DATA_TYPES - .register("item", () -> ItemConduitNodeData.TYPE); + public static final Supplier> ITEM = NODE_DATA_TYPES.register("item", + () -> ItemConduitNodeData.TYPE); } public static class ContextTypes { public static final DeferredRegister> CONDUIT_NETWORK_CONTEXT_TYPES = DeferredRegister - .create(EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE, EnderIO.NAMESPACE); + .create(EnderIOConduitsRegistries.CONDUIT_NETWORK_CONTEXT_TYPE, EnderIO.NAMESPACE); public static final Supplier> ENERGY = CONDUIT_NETWORK_CONTEXT_TYPES - .register("energy", () -> EnergyConduitNetworkContext.TYPE); + .register("energy", () -> EnergyConduitNetworkContext.TYPE); public static final Supplier> REDSTONE = CONDUIT_NETWORK_CONTEXT_TYPES - .register("redstone", () -> RedstoneConduitNetworkContext.TYPE); + .register("redstone", () -> RedstoneConduitNetworkContext.TYPE); public static final Supplier> FLUID = CONDUIT_NETWORK_CONTEXT_TYPES - .register("fluid", () -> FluidConduitNetworkContext.TYPE); + .register("fluid", () -> FluidConduitNetworkContext.TYPE); } public static void register(IEventBus bus) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java index 85b586a238..ffd76aa44d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/Conduits.java @@ -2,33 +2,28 @@ import com.enderio.base.api.EnderIO; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.network.ConduitNetworkContextType; import com.enderio.conduits.api.EnderIOConduitsRegistries; import com.enderio.conduits.common.conduit.type.energy.EnergyConduit; -import com.enderio.conduits.common.conduit.type.energy.EnergyConduitNetworkContext; import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; import com.enderio.conduits.common.conduit.type.item.ItemConduit; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduit; -import java.util.function.Supplier; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.neoforge.registries.DeferredRegister; public class Conduits { public static ResourceKey> ENERGY = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("energy")); - public static ResourceKey> ENHANCED_ENERGY = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, - EnderIO.loc("enhanced_energy")); + public static ResourceKey> ENHANCED_ENERGY = ResourceKey + .create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("enhanced_energy")); public static ResourceKey> ENDER_ENERGY = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("ender_energy")); public static ResourceKey> REDSTONE = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("redstone")); public static ResourceKey> FLUID = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("fluid")); - public static ResourceKey> PRESSURIZED_FLUID = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, - EnderIO.loc("pressurized_fluid")); + public static ResourceKey> PRESSURIZED_FLUID = ResourceKey + .create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("pressurized_fluid")); public static ResourceKey> ENDER_FLUID = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, EnderIO.loc("ender_fluid")); public static ResourceKey> ITEM = ResourceKey.create(EnderIOConduitsRegistries.Keys.CONDUIT, @@ -44,8 +39,8 @@ public static void bootstrap(BootstrapContext> context) { new EnergyConduit(EnderIO.loc("block/conduit/energy"), ConduitLang.ENERGY_CONDUIT, 1_000)); context.register(ENHANCED_ENERGY, new EnergyConduit(EnderIO.loc("block/conduit/enhanced_energy"), ConduitLang.ENHANCED_ENERGY_CONDUIT, 12_000)); - context.register(ENDER_ENERGY, new EnergyConduit(EnderIO.loc("block/conduit/ender_energy"), - ConduitLang.ENDER_ENERGY_CONDUIT, 48_000)); + context.register(ENDER_ENERGY, + new EnergyConduit(EnderIO.loc("block/conduit/ender_energy"), ConduitLang.ENDER_ENERGY_CONDUIT, 48_000)); context.register(REDSTONE, new RedstoneConduit(EnderIO.loc("block/conduit/redstone"), EnderIO.loc("block/conduit/redstone_active"), ConduitLang.REDSTONE_CONDUIT)); @@ -54,8 +49,8 @@ public static void bootstrap(BootstrapContext> context) { new FluidConduit(EnderIO.loc("block/conduit/fluid"), ConduitLang.FLUID_CONDUIT, 50, false)); context.register(PRESSURIZED_FLUID, new FluidConduit(EnderIO.loc("block/conduit/pressurized_fluid"), ConduitLang.PRESSURIZED_FLUID_CONDUIT, 100, false)); - context.register(ENDER_FLUID, new FluidConduit(EnderIO.loc("block/conduit/ender_fluid"), - ConduitLang.ENDER_FLUID_CONDUIT, 200, true)); + context.register(ENDER_FLUID, + new FluidConduit(EnderIO.loc("block/conduit/ender_fluid"), ConduitLang.ENDER_FLUID_CONDUIT, 200, true)); context.register(ITEM, new ItemConduit(EnderIO.loc("block/conduit/item"), ConduitLang.ITEM_CONDUIT, 4, 20)); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitMenuSelectionPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitMenuSelectionPacket.java index fe3cd703b5..e5a6c9cd0a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitMenuSelectionPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitMenuSelectionPacket.java @@ -9,14 +9,12 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public record ConduitMenuSelectionPacket( - Holder> conduit -) implements CustomPacketPayload { +public record ConduitMenuSelectionPacket(Holder> conduit) implements CustomPacketPayload { public static final Type TYPE = new Type<>(EnderIO.loc("conduit_menu_selection")); - public static StreamCodec STREAM_CODEC = - ByteBufCodecs.holderRegistry(EnderIOConduitsRegistries.Keys.CONDUIT) + public static StreamCodec STREAM_CODEC = ByteBufCodecs + .holderRegistry(EnderIOConduitsRegistries.Keys.CONDUIT) .map(ConduitMenuSelectionPacket::new, ConduitMenuSelectionPacket::conduit); @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java index a923280a36..f0e655248b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java @@ -13,27 +13,25 @@ public class ConduitNetwork { @SubscribeEvent public static void register(final RegisterPayloadHandlersEvent event) { - final PayloadRegistrar registrar = event - .registrar(EnderCore.MOD_ID) - .versioned(PROTOCOL_VERSION); + final PayloadRegistrar registrar = event.registrar(EnderCore.MOD_ID).versioned(PROTOCOL_VERSION); registrar.playToServer(DoubleChannelPacket.TYPE, DoubleChannelPacket.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleDoubleChannelFilter); + ConduitServerPayloadHandler.getInstance()::handleDoubleChannelFilter); registrar.playToServer(TimerFilterPacket.TYPE, TimerFilterPacket.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleTimerFilter); + ConduitServerPayloadHandler.getInstance()::handleTimerFilter); registrar.playToServer(CountFilterPacket.TYPE, CountFilterPacket.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleCountFilter); + ConduitServerPayloadHandler.getInstance()::handleCountFilter); registrar.playToServer(ConduitMenuSelectionPacket.TYPE, ConduitMenuSelectionPacket.STREAM_CODEC, - ConduitServerPayloadHandler.getInstance()::handleConduitMenuSelection); + ConduitServerPayloadHandler.getInstance()::handleConduitMenuSelection); registrar.playToClient(S2CConduitExtraGuiDataPacket.TYPE, S2CConduitExtraGuiDataPacket.STREAM_CODEC, - ConduitClientPayloadHandler.getInstance()::handle); + ConduitClientPayloadHandler.getInstance()::handle); - registrar.playBidirectional(SetConduitConnectionConfigPacket.TYPE, SetConduitConnectionConfigPacket.STREAM_CODEC, - ConduitCommonPayloadHandler.getInstance()::handle); + registrar.playBidirectional(SetConduitConnectionConfigPacket.TYPE, + SetConduitConnectionConfigPacket.STREAM_CODEC, ConduitCommonPayloadHandler.getInstance()::handle); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitExtraGuiDataPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitExtraGuiDataPacket.java index 03905a9be7..e20ed35f13 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitExtraGuiDataPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitExtraGuiDataPacket.java @@ -2,26 +2,22 @@ import com.enderio.base.api.EnderIO; import io.netty.buffer.ByteBuf; +import java.util.Optional; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import org.jetbrains.annotations.Nullable; -import java.util.Optional; - -public record S2CConduitExtraGuiDataPacket(int containerId, @Nullable CompoundTag extraGuiData) implements CustomPacketPayload { +public record S2CConduitExtraGuiDataPacket(int containerId, @Nullable CompoundTag extraGuiData) + implements CustomPacketPayload { public static Type TYPE = new Type<>(EnderIO.loc("conduit_extra_gui_data")); public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.INT, - S2CConduitExtraGuiDataPacket::containerId, - ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) - .map(opt -> opt.orElse(null), Optional::ofNullable), - S2CConduitExtraGuiDataPacket::extraGuiData, - S2CConduitExtraGuiDataPacket::new - ); + ByteBufCodecs.INT, S2CConduitExtraGuiDataPacket::containerId, + ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG).map(opt -> opt.orElse(null), Optional::ofNullable), + S2CConduitExtraGuiDataPacket::extraGuiData, S2CConduitExtraGuiDataPacket::new); @Override public Type type() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java index eac01893ec..6364852d7a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java @@ -1,3 +1,4 @@ package com.enderio.conduits.common.network; -public class S2CConduitListPacket {} +public class S2CConduitListPacket { +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/SetConduitConnectionConfigPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/SetConduitConnectionConfigPacket.java index 7ff4f3d021..7f38edac32 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/SetConduitConnectionConfigPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/SetConduitConnectionConfigPacket.java @@ -7,20 +7,15 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public record SetConduitConnectionConfigPacket( - int containerId, - ConnectionConfig connectionConfig -) implements CustomPacketPayload { +public record SetConduitConnectionConfigPacket(int containerId, ConnectionConfig connectionConfig) + implements CustomPacketPayload { - public static Type TYPE = new Type<>(EnderIO.loc("client_set_conduit_conection_config")); + public static Type TYPE = new Type<>( + EnderIO.loc("client_set_conduit_conection_config")); - public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.INT, - SetConduitConnectionConfigPacket::containerId, - ConnectionConfig.STREAM_CODEC, - SetConduitConnectionConfigPacket::connectionConfig, - SetConduitConnectionConfigPacket::new - ); + public static StreamCodec STREAM_CODEC = StreamCodec + .composite(ByteBufCodecs.INT, SetConduitConnectionConfigPacket::containerId, ConnectionConfig.STREAM_CODEC, + SetConduitConnectionConfigPacket::connectionConfig, SetConduitConnectionConfigPacket::new); @Override public Type type() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneANDFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneANDFilter.java index 3d50599349..ba11d7f9fd 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneANDFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneANDFilter.java @@ -14,6 +14,6 @@ public RedstoneANDFilter(ItemStack stack) { @Override public int getOutputSignal(RedstoneConduitNetworkContext context, DyeColor control) { boolean b = context.isActive(getFirstChannel()) && context.isActive(getSecondChannel()); - return b ? 15 : 0 ; + return b ? 15 : 0; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneCountFilter.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneCountFilter.java index de8c9e92c1..4d8267d05c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneCountFilter.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/redstone/RedstoneCountFilter.java @@ -52,7 +52,8 @@ public int getMaxCount() { public void setMaxCount(int maxCount) { var component = stack.get(ConduitComponents.REDSTONE_COUNT_FILTER); - stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, new Component(component.channel1, maxCount, component.count, component.deactivated)); + stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, + new Component(component.channel1, maxCount, component.count, component.deactivated)); } public int getCount() { @@ -61,7 +62,8 @@ public int getCount() { public void setCount(int count) { var component = stack.get(ConduitComponents.REDSTONE_COUNT_FILTER); - stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, new Component(component.channel1, component.maxCount, count, component.deactivated)); + stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, + new Component(component.channel1, component.maxCount, count, component.deactivated)); } public boolean isDeactivated() { @@ -70,37 +72,31 @@ public boolean isDeactivated() { public void setDeactivated(boolean lastActive) { var component = stack.get(ConduitComponents.REDSTONE_COUNT_FILTER); - stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, new Component(component.channel1, component.maxCount, component.count, lastActive)); + stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, + new Component(component.channel1, component.maxCount, component.count, lastActive)); } public void setState(CountFilterPacket packet) { - stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, new Component(packet.channel1(), packet.maxCount(), packet.count(), packet.active())); + stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, + new Component(packet.channel1(), packet.maxCount(), packet.count(), packet.active())); } public void setChannel(DyeColor channel) { var component = stack.get(ConduitComponents.REDSTONE_COUNT_FILTER); - stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, new Component(channel, component.maxCount, component.count, component.deactivated)); + stack.set(ConduitComponents.REDSTONE_COUNT_FILTER, + new Component(channel, component.maxCount, component.count, component.deactivated)); } public record Component(DyeColor channel1, int maxCount, int count, boolean deactivated) { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> - instance.group(DyeColor.CODEC.fieldOf("channel1").forGetter(Component::channel1), - ExtraCodecs.NON_NEGATIVE_INT.fieldOf("maxCount").forGetter(Component::maxCount), - ExtraCodecs.NON_NEGATIVE_INT.fieldOf("ticks").forGetter(Component::count), - Codec.BOOL.fieldOf("deactivated").forGetter(Component::deactivated)) - .apply(instance, Component::new) - ); - - public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - DyeColor.STREAM_CODEC, - Component::channel1, - ByteBufCodecs.VAR_INT, - Component::maxCount, - ByteBufCodecs.VAR_INT, - Component::count, - ByteBufCodecs.BOOL, - Component::deactivated, - Component::new - ); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance + .group(DyeColor.CODEC.fieldOf("channel1").forGetter(Component::channel1), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("maxCount").forGetter(Component::maxCount), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("ticks").forGetter(Component::count), + Codec.BOOL.fieldOf("deactivated").forGetter(Component::deactivated)) + .apply(instance, Component::new)); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite(DyeColor.STREAM_CODEC, + Component::channel1, ByteBufCodecs.VAR_INT, Component::maxCount, ByteBufCodecs.VAR_INT, + Component::count, ByteBufCodecs.BOOL, Component::deactivated, Component::new); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java b/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java index 49f8922ceb..10de36c939 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/data/recipe/ConduitRecipes.java @@ -25,9 +25,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; -import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.conditions.ModLoadedCondition; -import net.neoforged.neoforge.common.crafting.SizedIngredient; public class ConduitRecipes extends RecipeProvider { @@ -42,7 +40,8 @@ public ConduitRecipes(PackOutput packOutput, CompletableFuture> conduitRegistry = lookupProvider.lookupOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); + HolderGetter> conduitRegistry = lookupProvider + .lookupOrThrow(EnderIOConduitsRegistries.Keys.CONDUIT); var itemConduit = conduitRegistry.getOrThrow(Conduits.ITEM); var fluidConduit = conduitRegistry.getOrThrow(Conduits.FLUID); @@ -267,51 +266,51 @@ private void buildFilterConversionRecipes(RecipeOutput recipeOutput) { private void buildFacadeCraftingRecipes(RecipeOutput recipeOutput) { ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ConduitItems.CONDUIT_FACADE) - .pattern("BBB") - .pattern("B B") - .pattern("BBB") - .define('B', EIOItems.CONDUIT_BINDER) - .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) - .save(recipeOutput); + .pattern("BBB") + .pattern("B B") + .pattern("BBB") + .define('B', EIOItems.CONDUIT_BINDER) + .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) + .save(recipeOutput); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ConduitItems.HARDENED_CONDUIT_FACADE) - .pattern(" O ") - .pattern("OFO") - .pattern(" O ") - .define('O', EIOTags.Items.DUSTS_OBSIDIAN) - .define('F', ConduitItems.CONDUIT_FACADE) - .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) - .save(recipeOutput); + .pattern(" O ") + .pattern("OFO") + .pattern(" O ") + .define('O', EIOTags.Items.DUSTS_OBSIDIAN) + .define('F', ConduitItems.CONDUIT_FACADE) + .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) + .save(recipeOutput); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ConduitItems.TRANSPARENT_CONDUIT_FACADE) - .pattern("BBB") - .pattern("BGB") - .pattern("BBB") - .define('B', EIOItems.CONDUIT_BINDER) - .define('G', EIOTags.Items.CLEAR_GLASS) - .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) - .save(recipeOutput); + .pattern("BBB") + .pattern("BGB") + .pattern("BBB") + .define('B', EIOItems.CONDUIT_BINDER) + .define('G', EIOTags.Items.CLEAR_GLASS) + .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) + .save(recipeOutput); ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ConduitItems.TRANSPARENT_CONDUIT_FACADE) - .requires(ConduitItems.CONDUIT_FACADE) - .requires(EIOTags.Items.CLEAR_GLASS) - .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) - .save(recipeOutput, EnderIO.loc("transparent_conduit_facade_from_conduit_facade")); + .requires(ConduitItems.CONDUIT_FACADE) + .requires(EIOTags.Items.CLEAR_GLASS) + .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) + .save(recipeOutput, EnderIO.loc("transparent_conduit_facade_from_conduit_facade")); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ConduitItems.TRANSPARENT_HARDENED_CONDUIT_FACADE) - .pattern(" O ") - .pattern("OFO") - .pattern(" O ") - .define('O', EIOTags.Items.DUSTS_OBSIDIAN) - .define('F', ConduitItems.TRANSPARENT_CONDUIT_FACADE) - .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) - .save(recipeOutput); + .pattern(" O ") + .pattern("OFO") + .pattern(" O ") + .define('O', EIOTags.Items.DUSTS_OBSIDIAN) + .define('F', ConduitItems.TRANSPARENT_CONDUIT_FACADE) + .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) + .save(recipeOutput); ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ConduitItems.TRANSPARENT_HARDENED_CONDUIT_FACADE) - .requires(ConduitItems.HARDENED_CONDUIT_FACADE) - .requires(EIOTags.Items.CLEAR_GLASS) - .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) - .save(recipeOutput, EnderIO.loc("transparent_hardened_conduit_facade_from_hardened_conduit_facade")); + .requires(ConduitItems.HARDENED_CONDUIT_FACADE) + .requires(EIOTags.Items.CLEAR_GLASS) + .unlockedBy("has_ingredient", InventoryChangeTrigger.TriggerInstance.hasItems(EIOItems.CONDUIT_BINDER)) + .save(recipeOutput, EnderIO.loc("transparent_hardened_conduit_facade_from_hardened_conduit_facade")); } private void buildFacadePaintingRecipes(RecipeOutput recipeOutput) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java b/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java index d058675423..d7c0102131 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/integration/jade/EIOConduitsJadePlugin.java @@ -21,8 +21,12 @@ public void registerClient(IWailaClientRegistration registration) { // Completely replace the block accessor with the facade block if it exists registration.addRayTraceCallback((hitResult, accessor, originalAccessor) -> { if (accessor instanceof BlockAccessor blockAccessor) { - if (blockAccessor.getBlockEntity() instanceof ConduitBundleReader conduitBundle && conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()) { - return registration.blockAccessor().from(blockAccessor).blockState(conduitBundle.getFacadeBlock().defaultBlockState()).build(); + if (blockAccessor.getBlockEntity() instanceof ConduitBundleReader conduitBundle + && conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()) { + return registration.blockAccessor() + .from(blockAccessor) + .blockState(conduitBundle.getFacadeBlock().defaultBlockState()) + .build(); } } return accessor; diff --git a/enderio-machines/src/main/java/com/enderio/machines/common/block/LegacyMachineBlock.java b/enderio-machines/src/main/java/com/enderio/machines/common/block/LegacyMachineBlock.java index b3e0450f3e..41abc8c205 100644 --- a/enderio-machines/src/main/java/com/enderio/machines/common/block/LegacyMachineBlock.java +++ b/enderio-machines/src/main/java/com/enderio/machines/common/block/LegacyMachineBlock.java @@ -1,6 +1,5 @@ package com.enderio.machines.common.block; -import com.enderio.base.common.tag.EIOTags; import com.enderio.machines.common.blockentity.base.LegacyMachineBlockEntity; import com.enderio.regilite.holder.RegiliteBlockEntity; import com.mojang.serialization.Codec; diff --git a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/MachineBlock.java b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/MachineBlock.java index cbb1e611de..65f31d3841 100644 --- a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/MachineBlock.java +++ b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/block/MachineBlock.java @@ -7,14 +7,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; diff --git a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/blockentity/MachineBlockEntity.java b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/blockentity/MachineBlockEntity.java index c077b9699a..770ee6161b 100644 --- a/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/blockentity/MachineBlockEntity.java +++ b/enderio-machines/src/main/java/com/enderio/machines/common/blocks/base/blockentity/MachineBlockEntity.java @@ -38,7 +38,6 @@ import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.ItemContainerContents; import net.minecraft.world.item.context.UseOnContext; From 13d389ea97c1f9031045675007d3e5b9a62944ad Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 12 Jan 2025 14:58:30 +0000 Subject: [PATCH 17/27] feat: Conduit switch buttons in the GUI --- .../connection/config/ConnectionConfig.java | 12 ++ ...on.java => NewConduitSelectionButton.java} | 60 ++++++---- ...wConduitScreen.java => ConduitScreen.java} | 19 +-- .../conduit/bundle/ConduitBundleBlock.java | 2 +- .../bundle/ConduitBundleBlockEntity.java | 25 ++-- .../common/conduit/menu/ConduitMenu.java | 112 +++++++++++++++--- .../energy/EnergyConduitConnectionConfig.java | 12 +- .../fluid/FluidConduitConnectionConfig.java | 14 ++- .../item/ItemConduitConnectionConfig.java | 21 ++-- .../RedstoneConduitConnectionConfig.java | 6 + .../conduits/common/init/ConduitMenus.java | 4 +- .../network/ConduitClientPayloadHandler.java | 10 ++ .../common/network/ConduitNetwork.java | 3 + .../common/network/S2CConduitListPacket.java | 25 +++- 14 files changed, 252 insertions(+), 73 deletions(-) rename enderio-conduits/src/main/java/com/enderio/conduits/client/gui/{ConduitSelectionButton.java => NewConduitSelectionButton.java} (50%) rename enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/{NewConduitScreen.java => ConduitScreen.java} (91%) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java index 75e9ce1fde..7b788e49bb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfig.java @@ -42,5 +42,17 @@ default ConnectionConfig reconnected() { throw new NotImplementedException("This connection config type needs to implement reconnected()."); } + /** + * Modify the config such that isConnected() is true again. + * This will ensure that when the connection is revived, it isn't invalid. + */ + default ConnectionConfig disconnected() { + if (this.isConnected()) { + return this; + } + + throw new NotImplementedException("This connection config type needs to implement reconnected()."); + } + ConnectionConfigType type(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/NewConduitSelectionButton.java similarity index 50% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/gui/NewConduitSelectionButton.java index 84b0feb4fe..e15fff43dc 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/ConduitSelectionButton.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/NewConduitSelectionButton.java @@ -1,10 +1,8 @@ package com.enderio.conduits.client.gui; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.client.gui.screen.NewConduitScreen; +import com.enderio.conduits.client.gui.screen.ConduitScreen; import com.mojang.blaze3d.systems.RenderSystem; -import java.util.function.Consumer; -import java.util.function.Supplier; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.narration.NarrationElementOutput; @@ -13,40 +11,64 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; -public class ConduitSelectionButton extends AbstractButton { - private final Holder> conduit; - private final Supplier>> getter; - private final Consumer>> setter; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; - public ConduitSelectionButton(int pX, int pY, Holder> conduit, Supplier>> getter, - Consumer>> setter) { +public class NewConduitSelectionButton extends AbstractButton { + private final int conduitButtonIndex; + private final Supplier>> currentConduit; + private final Supplier>>> conduitListGetter; + private final Consumer onPressed; + + public NewConduitSelectionButton(int pX, int pY, int conduitButtonIndex, Supplier>> currentConduit, + Supplier>>> conduitListGetter, Consumer onPressed) { super(pX, pY, 21, 24, Component.empty()); - this.conduit = conduit; - this.getter = getter; - this.setter = setter; + this.conduitButtonIndex = conduitButtonIndex; + this.currentConduit = currentConduit; + this.conduitListGetter = conduitListGetter; + this.onPressed = onPressed; + } + + @Nullable + private Holder> getConduit() { + var list = conduitListGetter.get(); + if (conduitButtonIndex >= 0 && conduitButtonIndex < list.size()) { + return list.get(conduitButtonIndex); + } + + return null; } @Override protected boolean isValidClickButton(int pButton) { - return super.isValidClickButton(pButton) && getter.get() != conduit; + var conduit = getConduit(); + return super.isValidClickButton(pButton) && conduit != null && conduit != currentConduit.get(); } @Override public void onPress() { - setter.accept(conduit); + onPressed.accept(conduitButtonIndex); } @Override public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, float pPartialTick) { + var conduit = getConduit(); + if (conduit == null) { + return; + } + RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.enableDepthTest(); - guiGraphics.blit(NewConduitScreen.TEXTURE, getX(), getY(), 227, 0, this.width, this.height); - if (getter.get() == conduit) { - guiGraphics.blit(NewConduitScreen.TEXTURE, getX() - 3, getY(), 224, 0, 3, this.height); + guiGraphics.blit(ConduitScreen.TEXTURE, getX(), getY(), 227, 0, this.width, this.height); + if (currentConduit.get() == conduit) { + guiGraphics.blit(ConduitScreen.TEXTURE, getX() - 3, getY(), 224, 0, 3, this.height); } + // TODO: This shouldn't be a hard-coded path. ResourceLocation iconLocation = MissingTextureAtlasSprite.getLocation(); ResourceLocation conduitKey = conduit.unwrapKey().map(ResourceKey::location).orElse(null); if (conduitKey != null) { @@ -63,8 +85,4 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa @Override protected void updateWidgetNarration(NarrationElementOutput pNarrationElementOutput) { } - - public Holder> getConduit() { - return conduit; - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java similarity index 91% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java index 7f4ab95e39..d3820f369d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/NewConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java @@ -10,6 +10,7 @@ import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.client.gui.NewConduitSelectionButton; import com.enderio.conduits.client.gui.screen.types.ConduitScreenTypes; import com.enderio.conduits.common.conduit.menu.ConduitMenu; import com.enderio.conduits.common.init.ConduitLang; @@ -25,6 +26,7 @@ import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -33,7 +35,7 @@ import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.Nullable; -public class NewConduitScreen extends EnderContainerScreen { +public class ConduitScreen extends EnderContainerScreen { public static final ResourceLocation TEXTURE = EnderIO.loc("textures/gui/conduit.png"); private static final int WIDTH = 206; private static final int HEIGHT = 195; @@ -44,7 +46,7 @@ public class NewConduitScreen extends EnderContainerScreen { private final List preRenderActions = new ArrayList<>(); - public NewConduitScreen(ConduitMenu pMenu, Inventory pPlayerInventory, Component pTitle) { + public ConduitScreen(ConduitMenu pMenu, Inventory pPlayerInventory, Component pTitle) { super(pMenu, pPlayerInventory, pTitle); // this.shouldRenderLabels = true; @@ -64,7 +66,10 @@ protected void init() { screenTypeContainer.addWidgets(screenHelper); } - // TODO: Conduit selection buttons + for (int i = 0; i < 9; i++) { + addRenderableWidget(new NewConduitSelectionButton(getGuiLeft() + 206, getGuiTop() + 4 + 24*i, i, + menu::getSelectedConduit, menu::getConnectedConduits, idx -> handleButtonPress(ConduitMenu.BUTTON_CHANGE_CONDUIT_START_ID + idx))); + } } @Override @@ -227,22 +232,22 @@ public void addPreRenderAction(Runnable runnable) { @Override public W addWidget(W listener) { - return NewConduitScreen.this.addWidget(listener); + return ConduitScreen.this.addWidget(listener); } @Override public W addRenderableOnly(W renderable) { - return NewConduitScreen.this.addRenderableOnly(renderable); + return ConduitScreen.this.addRenderableOnly(renderable); } @Override public W addRenderableWidget(W widget) { - return NewConduitScreen.this.addRenderableWidget(widget); + return ConduitScreen.this.addRenderableWidget(widget); } @Override public void removeWidget(GuiEventListener listener) { - NewConduitScreen.this.removeWidget(listener); + ConduitScreen.this.removeWidget(listener); } } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java index 1295ecdeb6..a89d98a7d5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java @@ -356,7 +356,7 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP if (conduitBundle.getConnectionStatus(conduitConnection.getFirst(), conduitConnection.getSecond()) == ConnectionStatus.CONNECTED_BLOCK) { if (player instanceof ServerPlayer serverPlayer) { - ConduitMenu.openConduitMenu(serverPlayer, pos, conduitBundle, conduitConnection.getFirst(), + ConduitMenu.openConduitMenu(serverPlayer, conduitBundle, conduitConnection.getFirst(), conduitConnection.getSecond()); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index aec4b0be6c..2f814a5603 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -36,6 +36,7 @@ import dev.gigaherz.graph3.Graph; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; import java.util.EnumMap; import java.util.HashMap; @@ -252,6 +253,11 @@ public boolean stillValid(Player player) { return Container.stillValidBlockEntity(this, player); } + @Override + public List>> getAllPossibleConnectedCondutis(Direction side) { + return conduits.stream().filter(c -> canBeOrIsConnection(side, c)).toList(); + } + public boolean canBeOrIsConnection(Direction side, Holder> conduit) { if (level == null) { return false; @@ -267,11 +273,8 @@ public boolean canBeOrIsConnection(Direction side, Holder> conduit return false; } - // If they've managed to open the menu, a connection could already have been - // established - // TODO: Maybe create a map to track canConnect from the conduit so this is a - // guarantee. - return true; + // TODO: This should be cached and updated whenever neighbors change... + return conduit.value().canForceConnectToBlock(level, getBlockPos(), side); } @Override @@ -431,7 +434,7 @@ private static TCap getProxiedCapability(BlockCapability>> getConduits() { - return List.copyOf(conduits); + return Collections.unmodifiableList(conduits); } @Override @@ -1417,8 +1420,11 @@ private class ConnectionContainer { public ConnectionContainer(Holder> conduit) { this.conduit = conduit; + + var defaultConfig = conduit.value().connectionConfigType().getDefault(); for (Direction dir : Direction.values()) { statuses.put(dir, ConnectionStatus.DISCONNECTED); + configs.put(dir, defaultConfig); } } @@ -1461,11 +1467,16 @@ public ConnectionConfig getConfig(Direction side) { // Ensure the connection type is correct. // If it isn't, revert to the default. if (config.type() != conduit.value().connectionConfigType()) { - config = conduit.value().connectionConfigType().getDefault(); + config = defaultConfig; configs.put(side, config); bundleChanged(); } + // We keep the old state in case the wrench is used, but UI will need to show empty arrows. + if (statuses.get(side) != ConnectionStatus.CONNECTED_BLOCK && config.isConnected()) { + return config.disconnected(); + } + return config; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java index 036a48d62b..a90df1c462 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java @@ -4,24 +4,27 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlock; import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import com.enderio.conduits.common.init.ConduitMenus; import com.enderio.conduits.common.network.S2CConduitExtraGuiDataPacket; +import com.enderio.conduits.common.network.S2CConduitListPacket; import com.enderio.conduits.common.network.SetConduitConnectionConfigPacket; import com.enderio.core.common.menu.BaseEnderMenu; +import java.util.List; import java.util.Objects; import java.util.Optional; import me.liliandev.ensure.ensures.EnsureSide; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.network.PacketDistributor; @@ -33,18 +36,12 @@ // Possibly create an NBT sync slot and then use it for that? public class ConduitMenu extends BaseEnderMenu { - public static void openConduitMenu(ServerPlayer serverPlayer, BlockPos pos, ConduitBundleBlockEntity conduitBundle, + public static void openConduitMenu(ServerPlayer serverPlayer, ConduitBundleBlockEntity conduitBundle, Direction side, Holder> conduit) { - serverPlayer.openMenu(new SimpleMenuProvider((containerId, inventory, player) -> new ConduitMenu(containerId, - inventory, conduitBundle, side, conduit), conduit.value().description()), buf -> { + serverPlayer.openMenu(new MenuProvider(conduitBundle, side, conduit), buf -> { buf.writeEnum(side); Conduit.STREAM_CODEC.encode(buf, conduit); - ConnectionConfig.STREAM_CODEC.encode(buf, conduitBundle.getConnectionConfig(side, conduit)); - - // noinspection DataFlowIssue - ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) - .map(opt -> opt.orElse(null), Optional::ofNullable) - .encode(buf, conduitBundle.getConduitExtraGuiData(side, conduit)); + ClientConnectionAccessor.writeStartingSyncData(conduitBundle, side, conduit, buf); }); } @@ -52,7 +49,7 @@ public static void openConduitMenu(ServerPlayer serverPlayer, BlockPos pos, Cond public static final int BUTTON_CHANGE_CONDUIT_ID_COUNT = ConduitBundleBlockEntity.MAX_CONDUITS; private final Direction side; - private Holder> selectedConduit; // TODO: Sync with sync slot instead of using initial menu open? + private final Holder> selectedConduit; private final ConnectionAccessor connectionAccessor; @@ -62,6 +59,9 @@ public static void openConduitMenu(ServerPlayer serverPlayer, BlockPos pos, Cond @UseOnly(LogicalSide.SERVER) private CompoundTag remoteExtraGuiData; + @UseOnly(LogicalSide.SERVER) + private int conduitListHashCode; + public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBlockEntity conduitBundle, Direction side, Holder> selectedConduit) { super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory); @@ -69,7 +69,9 @@ public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBloc this.side = side; this.selectedConduit = selectedConduit; this.connectionAccessor = conduitBundle; - this.remoteConnectionConfig = connectionAccessor.getConnectionConfig(side, selectedConduit); + + // Set to sensible defaults to allow a sync after the menu opens + this.remoteConnectionConfig = selectedConduit.value().connectionConfigType().getDefault(); // TODO: Add conduit slots. @@ -81,7 +83,10 @@ public ConduitMenu(int containerId, Inventory playerInventory, RegistryFriendlyB side = buf.readEnum(Direction.class); selectedConduit = Conduit.STREAM_CODEC.decode(buf); - this.connectionAccessor = new ClientConnectionAccessor(buf); + + // Use default config until synced by broadcastChanges. + var clientConnectionAccessor = new ClientConnectionAccessor(buf); + this.connectionAccessor = clientConnectionAccessor; // TODO: Add conduit slots. @@ -96,6 +101,17 @@ public Direction getSide() { return selectedConduit; } + public List>> getConnectedConduits() { + return connectionAccessor.getAllPossibleConnectedCondutis(side); + } + + @EnsureSide(EnsureSide.Side.CLIENT) + public void setConnectedConduits(List>> connectedConduits) { + if (connectionAccessor instanceof ClientConnectionAccessor clientConnectionAccessor) { + clientConnectionAccessor.connectedConduits = connectedConduits; + } + } + public ConnectionConfigType connectionConfigType() { return selectedConduit.value().connectionConfigType(); } @@ -140,12 +156,20 @@ public boolean clickMenuButton(Player player, int id) { // var bundle = getBlockEntity(); // var currentConfig = connectionConfig(); - if (id >= BUTTON_CHANGE_CONDUIT_START_ID + if (player instanceof ServerPlayer serverPlayer) { + if (id >= BUTTON_CHANGE_CONDUIT_START_ID && id <= BUTTON_CHANGE_CONDUIT_ID_COUNT + BUTTON_CHANGE_CONDUIT_ID_COUNT) { - // TODO: attempt to change to a different conduit on the same face. - // var conduitList = getBlockEntity().getConduits(); + // TODO: attempt to change to a different conduit on the same face. + // var conduitList = getBlockEntity().getConduits(); + + // TODO Find and switch to conduit and tell the client. - // TODO Find and switch to conduit and tell the client. + int conduitIndex = id - BUTTON_CHANGE_CONDUIT_START_ID; + var connectedConduits = getConnectedConduits(); + if (conduitIndex < connectedConduits.size()) { + openConduitMenu(serverPlayer, (ConduitBundleBlockEntity) connectionAccessor, side, connectedConduits.get(conduitIndex)); + } + } } return super.clickMenuButton(player, id); @@ -174,11 +198,18 @@ public void broadcastChanges() { new S2CConduitExtraGuiDataPacket(containerId, extraGuiData)); this.remoteExtraGuiData = extraGuiData; } + + var conduitList = connectionAccessor.getAllPossibleConnectedCondutis(side); + if (conduitListHashCode != conduitList.hashCode()) { + PacketDistributor.sendToPlayer(serverPlayer, + new S2CConduitListPacket(containerId, conduitList)); + conduitListHashCode = conduitList.hashCode(); + } } } public interface ConnectionAccessor { - // TODO: Conduit menu list. + List>> getAllPossibleConnectedCondutis(Direction side); ConnectionConfig getConnectionConfig(Direction side, Holder> conduit); @@ -194,18 +225,41 @@ public interface ConnectionAccessor { private static class ClientConnectionAccessor implements ConnectionAccessor { + private List>> connectedConduits = List.of(); + private ConnectionConfig connectionConfig; @Nullable private CompoundTag extraGuiData; public ClientConnectionAccessor(RegistryFriendlyByteBuf buf) { + this.connectedConduits = Conduit.STREAM_CODEC.apply(ByteBufCodecs.list(ConduitBundleBlockEntity.MAX_CONDUITS)) + .decode(buf); + this.connectionConfig = ConnectionConfig.STREAM_CODEC.decode(buf); + extraGuiData = ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) .map(opt -> opt.orElse(null), Optional::ofNullable) .decode(buf); } + private static void writeStartingSyncData(ConduitBundleBlockEntity conduitBundle, Direction side, Holder> conduit, RegistryFriendlyByteBuf buf) { + Conduit.STREAM_CODEC.apply(ByteBufCodecs.list(ConduitBundleBlockEntity.MAX_CONDUITS)) + .encode(buf, conduitBundle.getAllPossibleConnectedCondutis(side)); + + ConnectionConfig.STREAM_CODEC.encode(buf, conduitBundle.getConnectionConfig(side, conduit)); + + //noinspection DataFlowIssue + ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) + .map(opt -> opt.orElse(null), Optional::ofNullable) + .encode(buf, conduitBundle.getConduitExtraGuiData(side, conduit)); + } + + @Override + public List>> getAllPossibleConnectedCondutis(Direction side) { + return connectedConduits; + } + @Override public ConnectionConfig getConnectionConfig(Direction side, Holder> conduit) { return connectionConfig; @@ -231,4 +285,24 @@ public boolean stillValid(Player player) { return true; } } + + private record MenuProvider(ConduitBundleBlockEntity conduitBundle, Direction side, Holder> conduit) implements + net.minecraft.world.MenuProvider { + + @Override + public Component getDisplayName() { + return conduit.value().description(); + } + + @Override + public AbstractContainerMenu createMenu(int containerId, Inventory inventory, Player player) { + return new ConduitMenu(containerId, inventory, conduitBundle, side, conduit); + } + + @Override + public boolean shouldTriggerClientSideContainerClosingOnOpen() { + // Prevents the mouse from jumping when changing between conduits. + return false; + } + } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java index 3cc697c1e0..e4f3a27a92 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java @@ -39,17 +39,21 @@ public record EnergyConduitConnectionConfig(boolean canInsert, boolean canExtrac @Override public ConnectionConfig reconnected() { - return new EnergyConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.canExtract, redstoneControl, - redstoneChannel); + return new EnergyConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.canExtract, redstoneControl, redstoneChannel); } @Override - public IOConnectionConfig withInsert(boolean canInsert) { + public ConnectionConfig disconnected() { + return new EnergyConduitConnectionConfig(false, false, redstoneControl, redstoneChannel); + } + + @Override + public EnergyConduitConnectionConfig withInsert(boolean canInsert) { return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); } @Override - public IOConnectionConfig withExtract(boolean canExtract) { + public EnergyConduitConnectionConfig withExtract(boolean canExtract) { return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java index 56c5fdc33b..1c4497ffdd 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java @@ -43,18 +43,24 @@ public record FluidConduitConnectionConfig(boolean canInsert, DyeColor insertCha @Override public ConnectionConfig reconnected() { - return new FluidConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.insertChannel, DEFAULT.canExtract, - DEFAULT.extractChannel, redstoneControl, redstoneChannel); + return new FluidConduitConnectionConfig(DEFAULT.canInsert, insertChannel, DEFAULT.canExtract, + extractChannel, redstoneControl, redstoneChannel); } @Override - public IOConnectionConfig withInsert(boolean canInsert) { + public ConnectionConfig disconnected() { + return new FluidConduitConnectionConfig(false, insertChannel, false, + extractChannel, redstoneControl, redstoneChannel); + } + + @Override + public FluidConduitConnectionConfig withInsert(boolean canInsert) { return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); } @Override - public IOConnectionConfig withExtract(boolean canExtract) { + public FluidConduitConnectionConfig withExtract(boolean canExtract) { return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, redstoneChannel); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java index 2f0d1913f2..f003aac3a6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java @@ -20,8 +20,9 @@ public record ItemConduitConnectionConfig(boolean isSend, DyeColor sendColor, bo RedstoneControl receiveRedstoneControl, DyeColor receiveRedstoneChannel, boolean isRoundRobin, boolean isSelfFeed, int priority) implements NewIOConnectionConfig, RedstoneSensitiveConnectionConfig { + public static ItemConduitConnectionConfig DEFAULT = new ItemConduitConnectionConfig(false, DyeColor.GREEN, true, - DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); + DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance .group(Codec.BOOL.fieldOf("is_send").forGetter(ItemConduitConnectionConfig::isSend), @@ -49,6 +50,18 @@ public record ItemConduitConnectionConfig(boolean isSend, DyeColor sendColor, bo public static ConnectionConfigType TYPE = new ConnectionConfigType<>( ItemConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + @Override + public ConnectionConfig reconnected() { + return new ItemConduitConnectionConfig(false, sendColor, true, receiveColor, + receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + } + + @Override + public ConnectionConfig disconnected() { + return new ItemConduitConnectionConfig(false, sendColor, false, receiveColor, + receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + } + @Override public boolean canSend(ConduitRedstoneSignalAware signalAware) { // TODO: sendRedstoneControl @@ -68,12 +81,6 @@ public boolean canReceive(ConduitRedstoneSignalAware signalAware) { } } - @Override - public ConnectionConfig reconnected() { - return new ItemConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, receiveColor, - receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); - } - // Generate with methods for each field public ItemConduitConnectionConfig withIsSend(boolean isSend) { return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java index 1cda9e0be3..3feaa4a5fd 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java @@ -41,6 +41,12 @@ public ConnectionConfig reconnected() { isStrongOutputSignal); } + @Override + public ConnectionConfig disconnected() { + return new RedstoneConduitConnectionConfig(false, sendColor, false, receiveColor, + isStrongOutputSignal); + } + public RedstoneConduitConnectionConfig withIsSend(boolean isSend) { return new RedstoneConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, isStrongOutputSignal); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java index 78a6416446..80ab369140 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/init/ConduitMenus.java @@ -1,7 +1,7 @@ package com.enderio.conduits.common.init; import com.enderio.conduits.EnderIOConduits; -import com.enderio.conduits.client.gui.screen.NewConduitScreen; +import com.enderio.conduits.client.gui.screen.ConduitScreen; import com.enderio.conduits.client.gui.screen.filter.RedstoneCountFilterScreen; import com.enderio.conduits.client.gui.screen.filter.RedstoneDoubleChannelFilterScreen; import com.enderio.conduits.client.gui.screen.filter.RedstoneTimerFilterScreen; @@ -17,7 +17,7 @@ public class ConduitMenus { private static final MenuRegistry MENU_REGISTRY = EnderIOConduits.REGILITE.menuRegistry(); public static final RegiliteMenu CONDUIT_MENU = MENU_REGISTRY.registerMenu("conduit", ConduitMenu::new, - () -> NewConduitScreen::new); + () -> ConduitScreen::new); public static final RegiliteMenu REDSTONE_DOUBLE_CHANNEL_FILTER = MENU_REGISTRY .registerMenu("redstone_and_filter", RedstoneDoubleChannelFilterMenu::factory, diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java index 8444f1e3ae..1ca0651a9b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitClientPayloadHandler.java @@ -16,6 +16,16 @@ public void handle(S2CConduitExtraGuiDataPacket packet, IPayloadContext context) }); } + public void handle(S2CConduitListPacket packet, IPayloadContext context) { + context.enqueueWork(() -> { + if (packet.containerId() == context.player().containerMenu.containerId) { + if (context.player().containerMenu instanceof ConduitMenu menu) { + menu.setConnectedConduits(packet.conduits()); + } + } + }); + } + public static ConduitClientPayloadHandler getInstance() { return INSTANCE; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java index f0e655248b..848f5c98e0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java @@ -30,6 +30,9 @@ public static void register(final RegisterPayloadHandlersEvent event) { registrar.playToClient(S2CConduitExtraGuiDataPacket.TYPE, S2CConduitExtraGuiDataPacket.STREAM_CODEC, ConduitClientPayloadHandler.getInstance()::handle); + registrar.playToClient(S2CConduitListPacket.TYPE, S2CConduitListPacket.STREAM_CODEC, + ConduitClientPayloadHandler.getInstance()::handle); + registrar.playBidirectional(SetConduitConnectionConfigPacket.TYPE, SetConduitConnectionConfigPacket.STREAM_CODEC, ConduitCommonPayloadHandler.getInstance()::handle); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java index 6364852d7a..518708a49e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/S2CConduitListPacket.java @@ -1,4 +1,27 @@ package com.enderio.conduits.common.network; -public class S2CConduitListPacket { +import com.enderio.base.api.EnderIO; +import com.enderio.conduits.api.Conduit; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; +import java.util.List; +import net.minecraft.core.Holder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +public record S2CConduitListPacket(int containerId, List>> conduits) + implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(EnderIO.loc("conduit_list")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.INT, S2CConduitListPacket::containerId, + Conduit.STREAM_CODEC.apply(ByteBufCodecs.list(ConduitBundleBlockEntity.MAX_CONDUITS)), + S2CConduitListPacket::conduits, S2CConduitListPacket::new); + + @Override + public Type type() { + return TYPE; + } } From add09b59dd09e8518c712a937451af68f5af76c1 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 12 Jan 2025 16:40:49 +0000 Subject: [PATCH 18/27] chore: More work on porting to the new screen system. --- .../api/EnderIOConduitsRegistries.java | 2 + .../api/bundle/ConduitBundleAccessor.java | 10 +- .../api/bundle/ConduitBundleReader.java | 10 +- .../config/ConnectionConfigType.java | 20 +- ...ionConfig.java => IOConnectionConfig.java} | 2 +- .../io/ChanneledIOConnectionConfig.java | 15 -- .../config/io/IOConnectionConfig.java | 23 --- .../RedstoneControlledConnection.java | 22 -- .../api/network/node/legacy/ConduitData.java | 1 + .../node/legacy/ConduitDataAccessor.java | 1 + .../network/node/legacy/ConduitDataType.java | 1 + .../api/screen/ConduitMenuDataAccess.java | 7 + .../api/screen/ConduitScreenExtension.java | 32 --- .../RegisterConduitScreenExtensionsEvent.java | 26 --- .../ticker/ChannelIOAwareConduitTicker.java | 122 ----------- .../api/ticker/IOAwareConduitTicker.java | 107 +++++----- .../api/ticker/NewIOAwareConduitTicker.java | 133 ------------ .../conduits/client/ConduitClientSetup.java | 13 +- .../gui/conduit/ConduitScreenExtensions.java | 31 --- .../conduit/FluidConduitScreenExtension.java | 117 ----------- .../client/gui/screen/ConduitScreen.java | 15 +- .../gui/screen/filter/package-info.java | 4 + .../screen/types/EnergyConduitScreenType.java | 51 +++++ .../screen/types/FluidConduitScreenType.java | 194 ++++++++++++++++++ .../types}/package-info.java | 2 +- .../conduit/bundle/ConduitBundleModel.java | 2 +- .../bundle/ConduitConnectionRenderState.java | 20 +- .../modifier/FluidConduitModelModifier.java | 6 +- .../conduit/bundle/ConduitBundleBlock.java | 17 +- .../bundle/ConduitBundleBlockEntity.java | 17 +- .../conduit/graph/ConduitDataContainer.java | 28 +-- .../common/conduit/menu/ConduitMenu.java | 10 + .../conduit/type/energy/EnergyConduit.java | 8 +- .../energy/EnergyConduitConnectionConfig.java | 92 ++++++--- .../type/energy/EnergyConduitTicker.java | 38 ++-- .../conduit/type/fluid/FluidConduit.java | 18 +- .../fluid/FluidConduitConnectionConfig.java | 117 +++++++---- .../fluid/FluidConduitNetworkContext.java | 27 ++- .../type/fluid/FluidConduitTicker.java | 52 +++-- .../item/ItemConduitConnectionConfig.java | 25 ++- .../conduit/type/item/ItemConduitTicker.java | 4 +- .../RedstoneConduitConnectionConfig.java | 7 +- .../type/redstone/RedstoneConduitTicker.java | 4 +- .../network/C2SClearLockedFluidPacket.java | 19 ++ .../common/network/ConduitNetwork.java | 3 + .../network/ConduitServerPayloadHandler.java | 27 +++ 46 files changed, 697 insertions(+), 805 deletions(-) rename enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/{NewIOConnectionConfig.java => IOConnectionConfig.java} (95%) delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/package-info.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java rename enderio-conduits/src/main/java/com/enderio/conduits/client/gui/{conduit => screen/types}/package-info.java (63%) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SClearLockedFluidPacket.java diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java index 0d62e6f60e..0792a56054 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/EnderIOConduitsRegistries.java @@ -14,6 +14,7 @@ public class EnderIOConduitsRegistries { public static final Registry> CONDUIT_TYPE = new RegistryBuilder<>(Keys.CONDUIT_TYPE).sync(true) .create(); + @Deprecated(forRemoval = true, since = "7.2") public static final Registry> CONDUIT_DATA_TYPE = new RegistryBuilder<>(Keys.CONDUIT_DATA_TYPE) .sync(true) .create(); @@ -28,6 +29,7 @@ public class EnderIOConduitsRegistries { Keys.CONDUIT_NETWORK_CONTEXT_TYPE).sync(true).create(); public static class Keys { + @Deprecated(forRemoval = true, since = "7.2") public static final ResourceKey>> CONDUIT_DATA_TYPE = createKey( "conduit_data_type"); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java index d3a9b8943c..bb239c4a44 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java @@ -3,6 +3,7 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.ConnectionStatus; import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.api.network.node.ConduitNode; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.world.entity.player.Player; @@ -24,7 +25,7 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { * @param player the player adding the conduit, or null if performed from another source. * @return the result of the add operation. */ - AddConduitResult addConduit(Holder> conduit, @Nullable Player player); + AddConduitResult addConduit(Holder> conduit, @Nullable Direction primaryConnectionSide, @Nullable Player player); /** * Remove a conduit from the bundle. @@ -38,6 +39,13 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { */ ConduitInventory getInventory(Holder> conduit); + /** + * @throws IllegalArgumentException if the conduit is not present. + * @param conduit the conduit to get a node for. + * @return the conduit node. + */ + ConduitNode getConduitNode(Holder> conduit); + // region Connections /** diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java index fdb8f38e29..865e9d7ef9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -28,13 +28,6 @@ public interface ConduitBundleReader { */ List>> getConduits(); - /** - * @throws IllegalArgumentException if the conduit is not present. - * @param conduit the conduit to get a node for. - * @return the conduit node. - */ - ConduitNode getConduitNode(Holder> conduit); - /** * @param conduit the conduit to get data for. * @return the client data tag, or null if there is none or the conduit doesn't sync extra data. @@ -56,6 +49,9 @@ public interface ConduitBundleReader { // TODO: Docs boolean hasConduitByType(ConduitType conduitType); + // TODO: Docs + Holder> getConduitByType(ConduitType conduitType); + /** * @param conduit the conduit to check for * @return whether the bundle has this specific conduit. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java index 6e5f47e217..e53b8237ee 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/ConnectionConfigType.java @@ -1,31 +1,13 @@ package com.enderio.conduits.api.connection.config; -import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import com.mojang.serialization.MapCodec; import java.util.function.Supplier; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -public record ConnectionConfigType(Class clazz, MapCodec codec, +public record ConnectionConfigType(MapCodec codec, StreamCodec streamCodec, Supplier defaultSupplier) { public T getDefault() { return defaultSupplier.get(); } - - @Deprecated - public boolean supportsIO() { - return IOConnectionConfig.class.isAssignableFrom(clazz); - } - - @Deprecated - public boolean supportsIOChannels() { - return ChanneledIOConnectionConfig.class.isAssignableFrom(clazz); - } - - @Deprecated - public boolean supportsRedstoneControl() { - return RedstoneControlledConnection.class.isAssignableFrom(clazz); - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/NewIOConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/IOConnectionConfig.java similarity index 95% rename from enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/NewIOConnectionConfig.java rename to enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/IOConnectionConfig.java index 49112ad2f6..07660896d1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/NewIOConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/IOConnectionConfig.java @@ -5,7 +5,7 @@ import org.jetbrains.annotations.ApiStatus; @ApiStatus.Experimental -public interface NewIOConnectionConfig extends ConnectionConfig { +public interface IOConnectionConfig extends ConnectionConfig { /** * @return whether the connection is sending resources to the connected block */ diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java deleted file mode 100644 index 82ea1072c3..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/ChanneledIOConnectionConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.enderio.conduits.api.connection.config.io; - -import net.minecraft.world.item.DyeColor; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public interface ChanneledIOConnectionConfig extends IOConnectionConfig { - DyeColor insertChannel(); - - DyeColor extractChannel(); - - ChanneledIOConnectionConfig withInputChannel(DyeColor inputChannel); - - ChanneledIOConnectionConfig withOutputChannel(DyeColor outputChannel); -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java deleted file mode 100644 index a6d1ee9db5..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/io/IOConnectionConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.enderio.conduits.api.connection.config.io; - -import com.enderio.conduits.api.connection.config.ConnectionConfig; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Experimental -public interface IOConnectionConfig extends ConnectionConfig { - - // TODO: canSend/canReceive? Might be clearer when used with Redstone signals? - - boolean canInsert(); - - boolean canExtract(); - - IOConnectionConfig withInsert(boolean canInsert); - - IOConnectionConfig withExtract(boolean canExtract); - - @Override - default boolean isConnected() { - return canInsert() || canExtract(); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java deleted file mode 100644 index 1ae452f097..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/connection/config/redstone/RedstoneControlledConnection.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.enderio.conduits.api.connection.config.redstone; - -import com.enderio.base.api.misc.RedstoneControl; -import com.enderio.conduits.api.connection.config.ConnectionConfig; -import net.minecraft.core.Direction; -import net.minecraft.world.item.DyeColor; -import org.jetbrains.annotations.ApiStatus; - -/** - * Used to represent a connection that can be controlled by redstone. - * This will cause {@link com.enderio.conduits.api.network.node.ConduitNode#isActive(Direction)} to return false when the redstone condition is not met. - */ -@ApiStatus.Experimental -public interface RedstoneControlledConnection extends ConnectionConfig { - RedstoneControl redstoneControl(); - - DyeColor redstoneChannel(); - - RedstoneControlledConnection withRedstoneControl(RedstoneControl redstoneControl); - - RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel); -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitData.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitData.java index 3b73751691..4ca065c88b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitData.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitData.java @@ -8,6 +8,7 @@ import net.minecraft.network.codec.StreamCodec; import org.jetbrains.annotations.Nullable; +@Deprecated(forRemoval = true, since = "7.2") public interface ConduitData> { Codec> CODEC = EnderIOConduitsRegistries.CONDUIT_DATA_TYPE.byNameCodec() .dispatch(ConduitData::type, ConduitDataType::codec); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataAccessor.java index 5c2d500065..661d073b73 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataAccessor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataAccessor.java @@ -2,6 +2,7 @@ import org.jetbrains.annotations.Nullable; +@Deprecated(forRemoval = true, since = "7.2") public interface ConduitDataAccessor { boolean hasData(ConduitDataType type); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java index 2618efae31..f6e4212223 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/network/node/legacy/ConduitDataType.java @@ -5,6 +5,7 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; +@Deprecated(forRemoval = true, since = "7.2") public record ConduitDataType>(MapCodec codec, StreamCodec streamCodec, Supplier factory) { } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java index 908043aee2..d7d6e5864a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java @@ -1,13 +1,20 @@ package com.enderio.conduits.api.screen; +import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.ConnectionConfig; import java.util.function.Function; + +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @ApiStatus.Experimental public interface ConduitMenuDataAccess { + Conduit conduit(); + + BlockPos getBlockPos(); + T getConnectionConfig(); void updateConnectionConfig(Function configModifier); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java deleted file mode 100644 index 01b11dd406..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenExtension.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.enderio.conduits.api.screen; - -import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; -import java.util.List; -import java.util.function.Supplier; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.core.Direction; -import org.joml.Vector2i; - -/** - * Extend the conduit screen with additional widgets. - */ -@Deprecated(forRemoval = true) -public interface ConduitScreenExtension { - - @FunctionalInterface - interface UpdateDispatcher { - void sendUpdate(); - } - - // TODO: Update Javadocs. - /** - * @param conduitDataAccessor the conduit data the widgets are for, manipulate the state of it in the widgets - * @param updateDispatcher call this to modify the conduit data. - * @param direction the supplier to get the current direction for this extendedconduitdata - * @param widgetsStart the position on which widgets start - * @return Widgets that manipulate the extended ConduitData, these changes are synced back to the server - */ - List createWidgets(Screen screen, ConduitDataAccessor conduitDataAccessor, - UpdateDispatcher updateDispatcher, Supplier direction, Vector2i widgetsStart); -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java deleted file mode 100644 index b92f6af3eb..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/RegisterConduitScreenExtensionsEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.enderio.conduits.api.screen; - -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitType; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import net.neoforged.bus.api.Event; -import net.neoforged.fml.event.IModBusEvent; - -@Deprecated(forRemoval = true) -public class RegisterConduitScreenExtensionsEvent extends Event implements IModBusEvent { - public interface ConduitScreenExtensionFactory { - ConduitScreenExtension createExtension(); - } - - private final Map, ConduitScreenExtensionFactory> extensions = new ConcurrentHashMap<>(); - - public void register(ConduitType> conduitType, - ConduitScreenExtensionFactory extensionFactory) { - extensions.put(conduitType, extensionFactory); - } - - public Map, ConduitScreenExtensionFactory> getExtensions() { - return Map.copyOf(extensions); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java deleted file mode 100644 index c2e2c5700a..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/ChannelIOAwareConduitTicker.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.enderio.conduits.api.ticker; - -import com.enderio.base.api.filter.ResourceFilter; -import com.enderio.conduits.api.ColoredRedstoneProvider; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; -import com.enderio.conduits.api.network.ConduitNetwork; -import com.enderio.conduits.api.network.node.ConduitNode; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ListMultimap; -import java.util.List; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; - -/** - * A channel IO-aware ticker. - * - * This will check {@link ConduitNode#isActive(Direction)} for extraction connections to ensure it has a redstone signal. - * - * @param The conduit type - * @param The type of connection for the ticker implementation - */ -public abstract class ChannelIOAwareConduitTicker, U extends ChannelIOAwareConduitTicker.SimpleConnection> - implements ConduitTicker { - - @Override - public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider) { - ListMultimap extracts = ArrayListMultimap.create(); - ListMultimap inserts = ArrayListMultimap.create(); - for (ConduitNode node : graph.getNodes()) { - // Ensure the node is loaded - if (!node.isLoaded()) { - continue; - } - - for (Direction side : Direction.values()) { - if (node.isConnectedTo(side)) { - var config = node.getConnectionConfig(side, conduit.connectionConfigType()); - - if (config.canExtract()) { - var connection = createConnection(level, node, side); - if (connection != null) { - extracts.get(config.extractChannel()).add(connection); - } - } - - if (config.canInsert()) { - var connection = createConnection(level, node, side); - if (connection != null) { - inserts.get(config.extractChannel()).add(connection); - } - } - } - } - } - - for (DyeColor color : DyeColor.values()) { - List extractList = extracts.get(color); - List insertList = inserts.get(color); - if (shouldSkipColor(extractList, insertList)) { - continue; - } - - tickColoredGraph(level, conduit, insertList, extractList, color, graph, coloredRedstoneProvider); - } - } - - protected boolean shouldSkipColor(List extractList, List insertList) { - return extractList.isEmpty() || insertList.isEmpty(); - } - - @Nullable - protected abstract U createConnection(Level level, ConduitNode node, Direction side); - - protected abstract void tickColoredGraph(ServerLevel level, T conduit, List inserts, List extracts, - DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - - public static class SimpleConnection { - private final ConduitNode node; - private final Direction side; - - public SimpleConnection(ConduitNode node, Direction side) { - this.node = node; - this.side = side; - } - - public ConduitNode node() { - return node; - } - - public BlockPos pos() { - return node.getPos(); - } - - public Direction side() { - return side; - } - - public BlockPos neighborPos() { - return pos().relative(side); - } - - public Direction neighborSide() { - return side.getOpposite(); - } - - @Nullable - public ResourceFilter insertFilter() { - return node.getInsertFilter(side); - } - - @Nullable - public ResourceFilter extractFilter() { - return node.getExtractFilter(side); - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java index 6018b7992a..48b96791a1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/IOAwareConduitTicker.java @@ -1,28 +1,38 @@ package com.enderio.conduits.api.ticker; import com.enderio.base.api.filter.ResourceFilter; -import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.api.connection.config.IOConnectionConfig; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import java.util.ArrayList; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; import java.util.List; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -public abstract class IOAwareConduitTicker, TConnection extends IOAwareConduitTicker.SimpleConnection> - implements ConduitTicker { +/** + * A channel IO-aware ticker. + * + * This will check {@link ConduitNode#isActive(Direction)} for extraction connections to ensure it has a redstone signal. + * + * @param The conduit type + * @param The type of connection for the ticker implementation + */ +public abstract class IOAwareConduitTicker, U extends IOConnectionConfig, V extends IOAwareConduitTicker.SimpleConnection> + implements ConduitTicker { + @Override - public void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, + public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { - List extracts = new ArrayList<>(); - List inserts = new ArrayList<>(); + ListMultimap senders = ArrayListMultimap.create(); + ListMultimap receivers = ArrayListMultimap.create(); + for (ConduitNode node : graph.getNodes()) { // Ensure the node is loaded if (!node.isLoaded()) { @@ -32,77 +42,66 @@ public void tickGraph(ServerLevel level, TConduit conduit, ConduitNetwork graph, for (Direction side : Direction.values()) { if (node.isConnectedTo(side)) { var config = node.getConnectionConfig(side, conduit.connectionConfigType()); - if (config.canExtract() && isActive(level, side, node, coloredRedstoneProvider)) { + + if (canSend(node, config)) { var connection = createConnection(level, node, side); if (connection != null) { - extracts.add(connection); + senders.get(config.sendColor()).add(connection); } } - if (config.canInsert()) { + if (canReceive(node, config)) { var connection = createConnection(level, node, side); if (connection != null) { - inserts.add(connection); + receivers.get(config.receiveColor()).add(connection); } } } } } - if (shouldSkip(extracts, inserts)) { - return; - } + for (DyeColor color : DyeColor.values()) { + List colorSenders = senders.get(color); + List colorReceivers = receivers.get(color); + if (shouldSkipColor(colorSenders, colorReceivers)) { + continue; + } - tickGraph(level, conduit, inserts, extracts, graph, coloredRedstoneProvider); + tickColoredGraph(level, conduit, colorSenders, colorReceivers, color, graph, coloredRedstoneProvider); + } } - protected boolean shouldSkip(List extractList, List insertList) { - return extractList.isEmpty() || insertList.isEmpty(); + protected boolean canSend(ConduitNode node, U config) { + return config.canSend(node::hasRedstoneSignal); } - @Nullable - protected abstract TConnection createConnection(Level level, ConduitNode node, Direction side); - - protected abstract void tickGraph(ServerLevel level, TConduit conduit, List inserts, - List extracts, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - - // TODO: This needs to be factored out... - private boolean isActive(ServerLevel level, Direction side, ConduitNode node, - ColoredRedstoneProvider coloredRedstoneProvider) { - var connectionConfig = node.getConnectionConfig(side); - if (!(connectionConfig instanceof RedstoneControlledConnection redstoneControlledConnection)) { - return true; - } + protected boolean canReceive(ConduitNode node, U config) { + return config.canReceive(node::hasRedstoneSignal); + } - if (redstoneControlledConnection.redstoneControl() == RedstoneControl.ALWAYS_ACTIVE) { - return true; - } + protected boolean shouldSkipColor(List senders, List receivers) { + return senders.isEmpty() || receivers.isEmpty(); + } - if (redstoneControlledConnection.redstoneControl() == RedstoneControl.NEVER_ACTIVE) { - return false; - } + protected void preProcessReceivers(List receivers) { + // Could implement a pre-sort here. + } - boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), - redstoneControlledConnection.redstoneChannel()); - if (!hasRedstone) { - for (Direction direction : Direction.values()) { - if (level.getSignal(node.getPos().relative(direction), direction.getOpposite()) > 0) { - hasRedstone = true; - break; - } - } - } + @Nullable + protected abstract V createConnection(Level level, ConduitNode node, Direction side); - return redstoneControlledConnection.redstoneControl().isActive(hasRedstone); - } + protected abstract void tickColoredGraph(ServerLevel level, T conduit, List senders, List receivers, + DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - public static class SimpleConnection { + public static class SimpleConnection { private final ConduitNode node; private final Direction side; + private final T config; - public SimpleConnection(ConduitNode node, Direction side) { + public SimpleConnection(ConduitNode node, Direction side, T config) { this.node = node; this.side = side; + this.config = config; } public ConduitNode node() { @@ -117,6 +116,10 @@ public Direction side() { return side; } + public T config() { + return config; + } + public BlockPos neighborPos() { return pos().relative(side); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java deleted file mode 100644 index 4ebc138d53..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ticker/NewIOAwareConduitTicker.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.enderio.conduits.api.ticker; - -import com.enderio.base.api.filter.ResourceFilter; -import com.enderio.conduits.api.ColoredRedstoneProvider; -import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; -import com.enderio.conduits.api.network.ConduitNetwork; -import com.enderio.conduits.api.network.node.ConduitNode; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ListMultimap; -import java.util.List; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; - -/** - * A channel IO-aware ticker. - * - * This will check {@link ConduitNode#isActive(Direction)} for extraction connections to ensure it has a redstone signal. - * - * @param The conduit type - * @param The type of connection for the ticker implementation - */ -public abstract class NewIOAwareConduitTicker, U extends NewIOConnectionConfig, V extends NewIOAwareConduitTicker.SimpleConnection> - implements ConduitTicker { - - @Override - public void tickGraph(ServerLevel level, T conduit, ConduitNetwork graph, - ColoredRedstoneProvider coloredRedstoneProvider) { - ListMultimap senders = ArrayListMultimap.create(); - ListMultimap receivers = ArrayListMultimap.create(); - - for (ConduitNode node : graph.getNodes()) { - // Ensure the node is loaded - if (!node.isLoaded()) { - continue; - } - - for (Direction side : Direction.values()) { - if (node.isConnectedTo(side)) { - var config = node.getConnectionConfig(side, conduit.connectionConfigType()); - - if (config.canSend(node::hasRedstoneSignal)) { - var connection = createConnection(level, node, side); - if (connection != null) { - senders.get(config.sendColor()).add(connection); - } - } - - if (config.canReceive(node::hasRedstoneSignal)) { - var connection = createConnection(level, node, side); - if (connection != null) { - receivers.get(config.receiveColor()).add(connection); - } - } - } - } - } - - for (DyeColor color : DyeColor.values()) { - List colorSenders = senders.get(color); - List colorReceivers = receivers.get(color); - if (shouldSkipColor(colorSenders, colorReceivers)) { - continue; - } - - tickColoredGraph(level, conduit, colorSenders, colorReceivers, color, graph, coloredRedstoneProvider); - } - } - - protected boolean shouldSkipColor(List senders, List receivers) { - return senders.isEmpty() || receivers.isEmpty(); - } - - protected void preProcessReceivers(List receivers) { - // Could implement a pre-sort here. - } - - @Nullable - protected abstract V createConnection(Level level, ConduitNode node, Direction side); - - protected abstract void tickColoredGraph(ServerLevel level, T conduit, List senders, List receivers, - DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider); - - public static class SimpleConnection { - private final ConduitNode node; - private final Direction side; - private final T config; - - public SimpleConnection(ConduitNode node, Direction side, T config) { - this.node = node; - this.side = side; - this.config = config; - } - - public ConduitNode node() { - return node; - } - - public BlockPos pos() { - return node.getPos(); - } - - public Direction side() { - return side; - } - - public T config() { - return config; - } - - public BlockPos neighborPos() { - return pos().relative(side); - } - - public Direction neighborSide() { - return side.getOpposite(); - } - - @Nullable - public ResourceFilter insertFilter() { - return node.getInsertFilter(side); - } - - @Nullable - public ResourceFilter extractFilter() { - return node.getExtractFilter(side); - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java index 5d814c7e37..b3a04e35c0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/ConduitClientSetup.java @@ -3,11 +3,10 @@ import com.enderio.base.api.EnderIO; import com.enderio.conduits.EnderIOConduits; import com.enderio.conduits.api.model.RegisterConduitModelModifiersEvent; -import com.enderio.conduits.api.screen.RegisterConduitScreenExtensionsEvent; import com.enderio.conduits.api.screen.RegisterConduitScreenTypesEvent; -import com.enderio.conduits.client.gui.conduit.ConduitScreenExtensions; -import com.enderio.conduits.client.gui.conduit.FluidConduitScreenExtension; import com.enderio.conduits.client.gui.screen.types.ConduitScreenTypes; +import com.enderio.conduits.client.gui.screen.types.EnergyConduitScreenType; +import com.enderio.conduits.client.gui.screen.types.FluidConduitScreenType; import com.enderio.conduits.client.gui.screen.types.ItemConduitScreenType; import com.enderio.conduits.client.gui.screen.types.RedstoneConduitScreenType; import com.enderio.conduits.client.model.conduit.ConduitItemModelLoader; @@ -52,7 +51,6 @@ private ConduitClientSetup() { @SubscribeEvent public static void clientSetup(FMLClientSetupEvent event) { - ConduitScreenExtensions.init(); ConduitScreenTypes.init(); } @@ -61,13 +59,10 @@ public static void registerConduitCoreModelModifiers(RegisterConduitModelModifie event.register(ConduitTypes.FLUID.get(), FluidConduitModelModifier::new); } - @SubscribeEvent - public static void registerConduitScreenExtensions(RegisterConduitScreenExtensionsEvent event) { - event.register(ConduitTypes.FLUID.get(), FluidConduitScreenExtension::new); - } - @SubscribeEvent public static void registerConduitScreenTypes(RegisterConduitScreenTypesEvent event) { + event.register(ConduitTypes.ENERGY.get(), new EnergyConduitScreenType()); + event.register(ConduitTypes.FLUID.get(), new FluidConduitScreenType()); event.register(ConduitTypes.REDSTONE.get(), new RedstoneConduitScreenType()); event.register(ConduitTypes.ITEM.get(), new ItemConduitScreenType()); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java deleted file mode 100644 index 0b847d36a0..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/ConduitScreenExtensions.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.enderio.conduits.client.gui.conduit; - -import com.enderio.conduits.api.ConduitType; -import com.enderio.conduits.api.screen.ConduitScreenExtension; -import com.enderio.conduits.api.screen.RegisterConduitScreenExtensionsEvent; -import java.util.HashMap; -import java.util.Map; -import me.liliandev.ensure.ensures.EnsureSide; -import net.neoforged.fml.ModLoader; -import org.jetbrains.annotations.Nullable; - -@Deprecated(forRemoval = true) -public class ConduitScreenExtensions { - private static Map, ConduitScreenExtension> EXTENSIONS; - - @EnsureSide(EnsureSide.Side.CLIENT) - public static void init() { - var event = new RegisterConduitScreenExtensionsEvent(); - ModLoader.postEvent(event); - var factories = event.getExtensions(); - - EXTENSIONS = new HashMap<>(); - factories.forEach((t, f) -> EXTENSIONS.put(t, f.createExtension())); - } - - @EnsureSide(EnsureSide.Side.CLIENT) - @Nullable - public static ConduitScreenExtension get(ConduitType conduitType) { - return EXTENSIONS.get(conduitType); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java deleted file mode 100644 index be0c0b3a49..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/FluidConduitScreenExtension.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.enderio.conduits.client.gui.conduit; - -import com.enderio.base.api.EnderIO; -import com.enderio.conduits.api.network.node.legacy.ConduitDataAccessor; -import com.enderio.conduits.api.screen.ConduitScreenExtension; -import com.enderio.conduits.common.conduit.legacy.LegacyFluidConduitData; -import com.enderio.conduits.common.init.ConduitLang; -import com.enderio.conduits.common.init.ConduitTypes; -import com.enderio.core.common.util.TooltipUtil; -import com.mojang.blaze3d.systems.RenderSystem; -import java.util.List; -import java.util.function.Supplier; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.components.Tooltip; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.renderer.texture.AbstractTexture; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.FastColor; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.Fluids; -import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; -import org.joml.Vector2i; - -public final class FluidConduitScreenExtension implements ConduitScreenExtension { - - private static final ResourceLocation WIDGET_TEXTURE = EnderIO.loc("textures/gui/fluidbackground.png"); - - @Override - public List createWidgets(Screen screen, ConduitDataAccessor conduitDataAccessor, - UpdateDispatcher updateConduitData, Supplier direction, Vector2i widgetsStart) { - if (conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()).lockedFluid().isSame(Fluids.EMPTY)) { - return List.of(); - } - return List.of(new FluidWidget(widgetsStart.add(0, 20), - () -> conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()).lockedFluid(), () -> { - LegacyFluidConduitData data = conduitDataAccessor.getOrCreateData(ConduitTypes.Data.FLUID.get()); - data.setShouldReset(true); - updateConduitData.sendUpdate(); - })); - } - - private static class FluidWidget extends AbstractWidget { - private final Runnable onPress; - private final Supplier currentFluid; - - FluidWidget(Vector2i pos, Supplier fluid, Runnable onPress) { - super(pos.x(), pos.y(), 14, 14, Component.empty()); - this.onPress = onPress; - this.currentFluid = fluid; - } - - @Override - public void updateWidgetNarration(NarrationElementOutput pNarrationElementOutput) { - } - - @Override - public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, float pPartialTick) { - if (isHoveredOrFocused()) { - MutableComponent tooltip = ConduitLang.FLUID_CONDUIT_CHANGE_FLUID1.copy(); - tooltip.append("\n").append(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID2); - if (!currentFluid.get().isSame(Fluids.EMPTY)) { - tooltip.append("\n") - .append(TooltipUtil.withArgs(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID3, - currentFluid.get().getFluidType().getDescription())); - } - setTooltip(Tooltip.create(TooltipUtil.style(tooltip))); - } - - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.enableDepthTest(); - guiGraphics.blit(WIDGET_TEXTURE, getX(), getY(), 0, 0, this.width, this.height); - if (currentFluid.get().isSame(Fluids.EMPTY)) { - return; - } - - IClientFluidTypeExtensions props = IClientFluidTypeExtensions.of(currentFluid.get()); - ResourceLocation still = props.getStillTexture(); - AbstractTexture texture = Minecraft.getInstance() - .getTextureManager() - .getTexture(TextureAtlas.LOCATION_BLOCKS); - if (texture instanceof TextureAtlas atlas) { - TextureAtlasSprite sprite = atlas.getSprite(still); - - int color = props.getTintColor(); - RenderSystem.setShaderColor(FastColor.ARGB32.red(color) / 255.0F, - FastColor.ARGB32.green(color) / 255.0F, FastColor.ARGB32.blue(color) / 255.0F, - FastColor.ARGB32.alpha(color) / 255.0F); - RenderSystem.enableBlend(); - - int atlasWidth = (int) (sprite.contents().width() / (sprite.getU1() - sprite.getU0())); - int atlasHeight = (int) (sprite.contents().height() / (sprite.getV1() - sprite.getV0())); - - guiGraphics.blit(TextureAtlas.LOCATION_BLOCKS, getX() + 1, getY() + 1, 0, sprite.getU0() * atlasWidth, - sprite.getV0() * atlasHeight, 12, 12, atlasWidth, atlasHeight); - - RenderSystem.setShaderColor(1, 1, 1, 1); - } - - RenderSystem.disableBlend(); - RenderSystem.disableDepthTest(); - } - - @Override - public void onClick(double pMouseX, double pMouseY) { - onPress.run(); - } - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java index d3820f369d..583bc6505e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java @@ -26,6 +26,7 @@ import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -114,7 +115,7 @@ private class ConduitScreenTypeContainer { private final ConduitScreenType screenType; public ConduitScreenTypeContainer(Conduit conduit) { - this.dataAccess = createDataAccess(conduit); + this.dataAccess = createDataAccess(menu.getBlockPos(), conduit); this.screenType = ConduitScreenTypes.get(conduit.type()); } @@ -138,8 +139,18 @@ public void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { } private , U extends ConnectionConfig> ConduitMenuDataAccess createDataAccess( - Conduit conduit) { + BlockPos pos, Conduit conduit) { return new ConduitMenuDataAccess<>() { + @Override + public Conduit conduit() { + return conduit; + } + + @Override + public BlockPos getBlockPos() { + return pos; + } + @Override public U getConnectionConfig() { return menu.connectionConfig(conduit.connectionConfigType()); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/package-info.java new file mode 100644 index 0000000000..33456e90e5 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/filter/package-info.java @@ -0,0 +1,4 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault + +package com.enderio.conduits.client.gui.screen.filter; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java new file mode 100644 index 0000000000..28033ff713 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java @@ -0,0 +1,51 @@ +package com.enderio.conduits.client.gui.screen.types; + +import com.enderio.base.api.EnderIO; +import com.enderio.base.common.lang.EIOLang; +import com.enderio.conduits.api.screen.ConduitMenuDataAccess; +import com.enderio.conduits.api.screen.ConduitScreenHelper; +import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.common.conduit.type.energy.EnergyConduitConnectionConfig; +import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig; +import com.enderio.conduits.common.init.ConduitLang; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; + +public class EnergyConduitScreenType extends ConduitScreenType { + + @Override + public void createWidgets(ConduitScreenHelper screen, + ConduitMenuDataAccess dataAccess) { + // Add insert/extract checkboxes. + screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isSend(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); + + screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isReceive(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + + // Redstone control + var redstoneChannelWidget = screen.addColorPicker(90 + 16 + 4, 20, ConduitLang.REDSTONE_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); + + // Only show the redstone widget when redstone control is sensitive to signals. + screen.addPreRenderAction(() -> redstoneChannelWidget.visible = dataAccess.getConnectionConfig() + .receiveRedstoneControl() + .isRedstoneSensitive()); + + screen.addRedstoneControlPicker(90, 20, EIOLang.REDSTONE_MODE, + () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); + + // TODO: Show redstone signal indicators using the extra NBT payload. + } + + @Override + public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, font, mouseX, mouseY); + + guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, 16 + 2, 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 90 + 16 + 2, 4, 4210752, false); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java new file mode 100644 index 0000000000..a56a62f351 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java @@ -0,0 +1,194 @@ +package com.enderio.conduits.client.gui.screen.types; + +import com.enderio.base.api.EnderIO; +import com.enderio.base.common.lang.EIOLang; +import com.enderio.conduits.api.screen.ConduitMenuDataAccess; +import com.enderio.conduits.api.screen.ConduitScreenHelper; +import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; +import com.enderio.conduits.common.conduit.type.fluid.FluidConduitConnectionConfig; +import com.enderio.conduits.common.init.ConduitLang; +import com.enderio.conduits.common.network.C2SClearLockedFluidPacket; +import com.enderio.core.common.util.TooltipUtil; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.renderer.texture.AbstractTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.FastColor; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; +import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; +import net.neoforged.neoforge.network.PacketDistributor; + +import java.util.function.Supplier; + +public class FluidConduitScreenType extends ConduitScreenType { + + private static final ResourceLocation ICON_ROUND_ROBIN_ENABLED = EnderIO.loc("icon/round_robin_enabled"); + private static final ResourceLocation ICON_ROUND_ROBIN_DISABLED = EnderIO.loc("icon/round_robin_disabled"); + private static final ResourceLocation ICON_SELF_FEED_ENABLED = EnderIO.loc("icon/self_feed_enabled"); + private static final ResourceLocation ICON_SELF_FEED_DISABLED = EnderIO.loc("icon/self_feed_disabled"); + + @Override + public void createWidgets(ConduitScreenHelper screen, + ConduitMenuDataAccess dataAccess) { + + int currentY = 0; + + // Add insert/extract checkboxes. + screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isSend(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); + + screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isReceive(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + + currentY += 20; + + // Locked fluid widget + if (dataAccess.conduit() instanceof FluidConduit fluidConduit && !fluidConduit.isMultiFluid()) { + screen.addRenderableWidget(new FluidWidget(screen.getAreaLeft(), screen.getAreaTop() + currentY, + () -> getLockedFluid(dataAccess), + () -> PacketDistributor.sendToServer(new C2SClearLockedFluidPacket(dataAccess.getBlockPos())))); + } else { + // Channel colors + screen.addColorPicker(0, currentY, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + + screen.addColorPicker(90, currentY, ConduitLang.CONDUIT_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + + currentY += 20; + } + + // TODO: Could be good fluid conduit features? + /*// Round robin + screen.addToggleButton(90 + 16 + 4, 20, 16, 16, ConduitLang.ROUND_ROBIN_ENABLED, + ConduitLang.ROUND_ROBIN_DISABLED, ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, + () -> dataAccess.getConnectionConfig().isRoundRobin(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsRoundRobin(value))); + + // Self feed + screen.addToggleButton(90 + (16 + 4) * 2, 20, 16, 16, ConduitLang.SELF_FEED_ENABLED, + ConduitLang.SELF_FEED_DISABLED, ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, + () -> dataAccess.getConnectionConfig().isSelfFeed(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsSelfFeed(value)));*/ + + // Redstone control + var redstoneChannelWidget = screen.addColorPicker(90 + 16 + 4, currentY, ConduitLang.REDSTONE_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); + + // Only show the redstone widget when redstone control is sensitive to signals. + screen.addPreRenderAction(() -> redstoneChannelWidget.visible = dataAccess.getConnectionConfig() + .receiveRedstoneControl() + .isRedstoneSensitive()); + + screen.addRedstoneControlPicker(90, currentY, EIOLang.REDSTONE_MODE, + () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); + + // TODO: Show redstone signal indicators using the extra NBT payload. + } + + private Fluid getLockedFluid(ConduitMenuDataAccess dataAccess) { + var tag = dataAccess.getExtraGuiData(); + if (tag == null) { + return Fluids.EMPTY; + } + + if (!tag.contains("LockedFluid")) { + return Fluids.EMPTY; + } + + return BuiltInRegistries.FLUID.get(ResourceLocation.parse(tag.getString("LockedFluid"))); + } + + @Override + public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, font, mouseX, mouseY); + + guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, 16 + 2, 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 90 + 16 + 2, 4, 4210752, false); + } + + private static class FluidWidget extends AbstractWidget { + private static final ResourceLocation WIDGET_TEXTURE = EnderIO.loc("textures/gui/fluidbackground.png"); + + private final Runnable onPress; + private final Supplier currentFluid; + + FluidWidget(int x, int y, Supplier fluid, Runnable onPress) { + super(x, y, 14, 14, Component.empty()); + this.onPress = onPress; + this.currentFluid = fluid; + } + + @Override + public void updateWidgetNarration(NarrationElementOutput pNarrationElementOutput) { + } + + @Override + public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, float pPartialTick) { + if (isHoveredOrFocused()) { + MutableComponent tooltip = ConduitLang.FLUID_CONDUIT_CHANGE_FLUID1.copy(); + tooltip.append("\n").append(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID2); + if (!currentFluid.get().isSame(Fluids.EMPTY)) { + tooltip.append("\n") + .append(TooltipUtil.withArgs(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID3, + currentFluid.get().getFluidType().getDescription())); + } + setTooltip(Tooltip.create(TooltipUtil.style(tooltip))); + } + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + guiGraphics.blit(WIDGET_TEXTURE, getX(), getY(), 0, 0, this.width, this.height); + if (currentFluid.get().isSame(Fluids.EMPTY)) { + return; + } + + IClientFluidTypeExtensions props = IClientFluidTypeExtensions.of(currentFluid.get()); + ResourceLocation still = props.getStillTexture(); + AbstractTexture texture = Minecraft.getInstance() + .getTextureManager() + .getTexture(TextureAtlas.LOCATION_BLOCKS); + if (texture instanceof TextureAtlas atlas) { + TextureAtlasSprite sprite = atlas.getSprite(still); + + int color = props.getTintColor(); + RenderSystem.setShaderColor(FastColor.ARGB32.red(color) / 255.0F, + FastColor.ARGB32.green(color) / 255.0F, FastColor.ARGB32.blue(color) / 255.0F, + FastColor.ARGB32.alpha(color) / 255.0F); + RenderSystem.enableBlend(); + + int atlasWidth = (int) (sprite.contents().width() / (sprite.getU1() - sprite.getU0())); + int atlasHeight = (int) (sprite.contents().height() / (sprite.getV1() - sprite.getV0())); + + guiGraphics.blit(TextureAtlas.LOCATION_BLOCKS, getX() + 1, getY() + 1, 0, sprite.getU0() * atlasWidth, + sprite.getV0() * atlasHeight, 12, 12, atlasWidth, atlasHeight); + + RenderSystem.setShaderColor(1, 1, 1, 1); + } + + RenderSystem.disableBlend(); + RenderSystem.disableDepthTest(); + } + + @Override + public void onClick(double pMouseX, double pMouseY) { + onPress.run(); + } + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/package-info.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/package-info.java similarity index 63% rename from enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/package-info.java rename to enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/package-info.java index 05d1ff4ede..d4bb9667bb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/conduit/package-info.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/package-info.java @@ -1,4 +1,4 @@ @javax.annotation.ParametersAreNonnullByDefault @net.minecraft.MethodsReturnNonnullByDefault -package com.enderio.conduits.client.gui.conduit; +package com.enderio.conduits.client.gui.screen.types; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java index 76c134c7f8..f10894f282 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitBundleModel.java @@ -156,7 +156,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction // // quads.addAll(QuadTransformers.applying(transformation) // .andThen(rotationTranslation) -// .andThen(new ColorQuadTransformer(null, connectionState.redstoneChannel())) +// .andThen(new ColorQuadTransformer(null, connectionState.receiveRedstoneChannel())) // .process(modelOf(CONDUIT_IO_REDSTONE).getQuads(state, preRotation, rand, // extraData, renderType))); // diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java index 3540b9c6c6..e584553cfd 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/bundle/ConduitConnectionRenderState.java @@ -2,11 +2,8 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; +import com.enderio.conduits.api.connection.config.IOConnectionConfig; import com.enderio.conduits.api.connection.config.RedstoneSensitiveConnectionConfig; -import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; import me.liliandev.ensure.ensures.EnsureSide; import net.minecraft.core.Holder; import net.minecraft.world.item.DyeColor; @@ -25,14 +22,6 @@ public static ConduitConnectionRenderState of(Holder> conduit, Con DyeColor inputChannel = DyeColor.GREEN; DyeColor outputChannel = DyeColor.GREEN; if (connectionConfig instanceof IOConnectionConfig ioConnectionConfig) { - canInput = ioConnectionConfig.canInsert(); - canOutput = ioConnectionConfig.canExtract(); - - if (ioConnectionConfig instanceof ChanneledIOConnectionConfig channeledIOConnectionConfig) { - inputChannel = channeledIOConnectionConfig.insertChannel(); - outputChannel = channeledIOConnectionConfig.extractChannel(); - } - } else if (connectionConfig instanceof NewIOConnectionConfig ioConnectionConfig) { // TODO: Tidy the language here. canInput = ioConnectionConfig.isSend(); canOutput = ioConnectionConfig.isReceive(); @@ -43,12 +32,7 @@ public static ConduitConnectionRenderState of(Holder> conduit, Con boolean isRedstoneSensitive = false; DyeColor redstoneChannel = DyeColor.RED; - if (connectionConfig instanceof RedstoneControlledConnection redstoneControlledConnection) { - if (redstoneControlledConnection.redstoneControl().isRedstoneSensitive()) { - isRedstoneSensitive = true; - redstoneChannel = redstoneControlledConnection.redstoneChannel(); - } - } else if (connectionConfig instanceof RedstoneSensitiveConnectionConfig redstoneSensitiveConfig) { + if (connectionConfig instanceof RedstoneSensitiveConnectionConfig redstoneSensitiveConfig) { // TODO: Support for multiple colours var channelColors = redstoneSensitiveConfig.getRedstoneSignalColors(); if (!channelColors.isEmpty()) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java index fef248af35..4fe465bfb9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/modifier/FluidConduitModelModifier.java @@ -34,7 +34,11 @@ public class FluidConduitModelModifier implements ConduitModelModifier { @Override public List createConnectionQuads(Holder> conduit, @Nullable CompoundTag extraWorldData, @Nullable Direction facing, Direction connectionDirection, RandomSource rand, @Nullable RenderType type) { - if (!(conduit.value() instanceof FluidConduit fluidConduit && fluidConduit.isMultiFluid())) { + if (!(conduit.value() instanceof FluidConduit fluidConduit)) { + return List.of(); + } + + if (fluidConduit.isMultiFluid()) { return List.of(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java index a89d98a7d5..5b308188f3 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java @@ -231,6 +231,7 @@ public FluidState getFluidState(BlockState state) { @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { + // TODO: Maybe we need to support non-player placement? if (!(placer instanceof Player player)) { return; } @@ -238,7 +239,13 @@ public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable L if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { Holder> conduit = stack.get(ConduitComponents.CONDUIT); if (conduit != null) { - conduitBundle.addConduit(conduit, player); + HitResult hit = player.pick(player.blockInteractionRange() + 5, 1, false); + Direction primaryConnectionSide = null; + if (hit instanceof BlockHitResult blockHitResult) { + primaryConnectionSide = blockHitResult.getDirection().getOpposite(); + } + + conduitBundle.addConduit(conduit, primaryConnectionSide, player); } else { // We might be placed using a facade item. If we are, apply the facade to the var facadeProvider = stack.getCapability(ConduitCapabilities.CONDUIT_FACADE_PROVIDER); @@ -406,7 +413,13 @@ private ItemInteractionResult addConduit(ItemStack stack, Level level, BlockPos } // Attempt to add to the bundle - AddConduitResult addResult = conduitBundle.addConduit(conduit, player); + HitResult hit = player.pick(player.blockInteractionRange() + 5, 1, false); + Direction primaryConnectionSide = null; + if (hit instanceof BlockHitResult blockHitResult) { + primaryConnectionSide = blockHitResult.getDirection().getOpposite(); + } + + AddConduitResult addResult = conduitBundle.addConduit(conduit, primaryConnectionSide, player); if (addResult instanceof AddConduitResult.Upgrade(Holder> replacedConduit)) { if (!player.getAbilities().instabuild) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index 2f814a5603..61a1730577 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -514,7 +514,7 @@ public boolean canAddConduit(Holder> conduit) { } @Override - public AddConduitResult addConduit(Holder> conduit, @Nullable Player player) { + public AddConduitResult addConduit(Holder> conduit, @Nullable Direction primaryConnectionSide, @Nullable Player player) { if (level == null) { return new AddConduitResult.Blocked(); } @@ -607,9 +607,15 @@ public AddConduitResult addConduit(Holder> conduit, @Nullable Play node.attach(new ConnectionHost(this, conduit)); } - // Now attempt to make connections. + // Now attempt to make connections, starting from the "primary" side (clicked or facing direction) + if (primaryConnectionSide != null) { + tryConnectTo(primaryConnectionSide, conduit, false); + } + for (Direction side : Direction.values()) { - tryConnectTo(side, conduit, false); + if (side != primaryConnectionSide) { + tryConnectTo(side, conduit, false); + } } if (level instanceof ServerLevel serverLevel) { @@ -1278,8 +1284,9 @@ protected void saveAdditionalSynced(CompoundTag tag, HolderLookup.Provider regis connectionTag.putString("Side", side.getSerializedName()); connectionTag.putString("Status", getConnectionStatus(side, conduit).getSerializedName()); - var config = getConnectionConfig(side, conduit); - if (!config.equals(config.type().getDefault())) { + // Raw access to ensure we save the true data. + var config = conduitConnections.get(conduit).configs.get(side); + if (config != null && !config.equals(config.type().getDefault())) { connectionTag.put("Config", ConnectionConfig.GENERIC_CODEC .encodeStart(registries.createSerializationContext(NbtOps.INSTANCE), config) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java index 17e86a0f68..5adcab09e9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/graph/ConduitDataContainer.java @@ -18,6 +18,7 @@ /** * A safe way to store conduit data. */ +@Deprecated(forRemoval = true, since = "7.2") public class ConduitDataContainer implements ConduitDataAccessor { public static Codec CODEC = ExtraCodecs.optionalEmptyMap(ConduitData.CODEC) @@ -75,33 +76,6 @@ public > T getOrCreateData(ConduitDataType type) { return (T) data; } - public void handleClientChanges(ConduitDataContainer clientDataContainer) { - // Ensure the type we contain matches the client. - // If it does not, assume the client is out of date and ignore it. - if (data != null && !clientDataContainer.hasData(data.type())) { - return; - } - - if (data != null) { - data = applyClientChanges(data.type(), clientDataContainer); - } else { - data = applyClientChanges(clientDataContainer.data.type(), clientDataContainer); - } - } - - @SuppressWarnings("unchecked") - private > T applyClientChanges(ConduitDataType type, - ConduitDataContainer clientDataContainer) { - T myData = getOrCreateData(type); - T clientData = clientDataContainer.getData(type); - - if (clientData == null) { - return myData; - } - - return myData.withClientChanges(clientData); - } - public Tag save(HolderLookup.Provider lookupProvider) { return CODEC.encodeStart(lookupProvider.createSerializationContext(NbtOps.INSTANCE), this).getPartialOrThrow(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java index a90df1c462..3a34e7bf44 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java @@ -15,6 +15,7 @@ import java.util.Objects; import java.util.Optional; import me.liliandev.ensure.ensures.EnsureSide; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; @@ -39,6 +40,7 @@ public class ConduitMenu extends BaseEnderMenu { public static void openConduitMenu(ServerPlayer serverPlayer, ConduitBundleBlockEntity conduitBundle, Direction side, Holder> conduit) { serverPlayer.openMenu(new MenuProvider(conduitBundle, side, conduit), buf -> { + buf.writeBlockPos(conduitBundle.getBlockPos()); buf.writeEnum(side); Conduit.STREAM_CODEC.encode(buf, conduit); ClientConnectionAccessor.writeStartingSyncData(conduitBundle, side, conduit, buf); @@ -62,10 +64,13 @@ public static void openConduitMenu(ServerPlayer serverPlayer, ConduitBundleBlock @UseOnly(LogicalSide.SERVER) private int conduitListHashCode; + private BlockPos pos; + public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBlockEntity conduitBundle, Direction side, Holder> selectedConduit) { super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory); + this.pos = conduitBundle.getBlockPos(); this.side = side; this.selectedConduit = selectedConduit; this.connectionAccessor = conduitBundle; @@ -81,6 +86,7 @@ public ConduitMenu(int containerId, Inventory playerInventory, ConduitBundleBloc public ConduitMenu(int containerId, Inventory playerInventory, RegistryFriendlyByteBuf buf) { super(ConduitMenus.CONDUIT_MENU.get(), containerId, playerInventory); + pos = buf.readBlockPos(); side = buf.readEnum(Direction.class); selectedConduit = Conduit.STREAM_CODEC.decode(buf); @@ -93,6 +99,10 @@ public ConduitMenu(int containerId, Inventory playerInventory, RegistryFriendlyB addPlayerInventorySlots(23, 113); } + public BlockPos getBlockPos() { + return pos; + } + public Direction getSide() { return side; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index 4d23053b0b..b55fe2897b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -107,15 +107,15 @@ public boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction dir } var config = node.getConnectionConfig(side, connectionConfigType()); - if (!config.isConnected() || !config.canExtract()) { + if (!config.isConnected() || !config.isReceive()) { return null; } - if (config.redstoneControl() == RedstoneControl.NEVER_ACTIVE) { + if (config.receiveRedstoneControl() == RedstoneControl.NEVER_ACTIVE) { isMutable = false; - } else if (config.redstoneControl() != RedstoneControl.ALWAYS_ACTIVE) { + } else if (config.receiveRedstoneControl() != RedstoneControl.ALWAYS_ACTIVE) { boolean hasRedstone = coloredRedstoneProvider.isRedstoneActive(level, node.getPos(), - config.redstoneChannel()); + config.receiveRedstoneChannel()); if (!hasRedstone) { for (Direction direction : Direction.values()) { if (level.getSignal(node.getPos().relative(direction), direction.getOpposite()) > 0) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java index e4f3a27a92..3833186ac0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java @@ -1,10 +1,11 @@ package com.enderio.conduits.common.conduit.type.energy; import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.ConduitRedstoneSignalAware; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.api.connection.config.IOConnectionConfig; +import com.enderio.conduits.api.connection.config.RedstoneSensitiveConnectionConfig; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -13,62 +14,97 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; -public record EnergyConduitConnectionConfig(boolean canInsert, boolean canExtract, RedstoneControl redstoneControl, - DyeColor redstoneChannel) implements IOConnectionConfig, RedstoneControlledConnection { +import java.util.List; + +public record EnergyConduitConnectionConfig(boolean isSend, boolean isReceive, RedstoneControl receiveRedstoneControl, + DyeColor receiveRedstoneChannel) implements IOConnectionConfig, RedstoneSensitiveConnectionConfig { public static EnergyConduitConnectionConfig DEFAULT = new EnergyConduitConnectionConfig(true, true, RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance - .group(Codec.BOOL.fieldOf("can_insert").forGetter(EnergyConduitConnectionConfig::canInsert), - Codec.BOOL.fieldOf("can_extract").forGetter(EnergyConduitConnectionConfig::canExtract), - RedstoneControl.CODEC.fieldOf("redstone_control") - .forGetter(EnergyConduitConnectionConfig::redstoneControl), - DyeColor.CODEC.fieldOf("redstone_channel") - .forGetter(EnergyConduitConnectionConfig::redstoneChannel)) + .group(Codec.BOOL.fieldOf("is_send").forGetter(EnergyConduitConnectionConfig::isSend), + Codec.BOOL.fieldOf("is_receive").forGetter(EnergyConduitConnectionConfig::isReceive), + RedstoneControl.CODEC.fieldOf("receive_redstone_control") + .forGetter(EnergyConduitConnectionConfig::receiveRedstoneControl), + DyeColor.CODEC.fieldOf("receive_redstone_channel") + .forGetter(EnergyConduitConnectionConfig::receiveRedstoneChannel)) .apply(instance, EnergyConduitConnectionConfig::new)); public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.BOOL, EnergyConduitConnectionConfig::canInsert, ByteBufCodecs.BOOL, - EnergyConduitConnectionConfig::canExtract, RedstoneControl.STREAM_CODEC, - EnergyConduitConnectionConfig::redstoneControl, DyeColor.STREAM_CODEC, - EnergyConduitConnectionConfig::redstoneChannel, EnergyConduitConnectionConfig::new); + ByteBufCodecs.BOOL, EnergyConduitConnectionConfig::isSend, ByteBufCodecs.BOOL, + EnergyConduitConnectionConfig::isReceive, RedstoneControl.STREAM_CODEC, + EnergyConduitConnectionConfig::receiveRedstoneControl, DyeColor.STREAM_CODEC, + EnergyConduitConnectionConfig::receiveRedstoneChannel, EnergyConduitConnectionConfig::new); - public static final ConnectionConfigType TYPE = new ConnectionConfigType<>( - EnergyConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + public static final ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { - return new EnergyConduitConnectionConfig(DEFAULT.canInsert, DEFAULT.canExtract, redstoneControl, redstoneChannel); + return new EnergyConduitConnectionConfig(DEFAULT.isSend, DEFAULT.isReceive, receiveRedstoneControl, receiveRedstoneChannel); } @Override public ConnectionConfig disconnected() { - return new EnergyConduitConnectionConfig(false, false, redstoneControl, redstoneChannel); + return new EnergyConduitConnectionConfig(false, false, receiveRedstoneControl, receiveRedstoneChannel); } @Override - public EnergyConduitConnectionConfig withInsert(boolean canInsert) { - return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); + public DyeColor sendColor() { + return DyeColor.RED; } @Override - public EnergyConduitConnectionConfig withExtract(boolean canExtract) { - return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); + public DyeColor receiveColor() { + return DyeColor.RED; } @Override - public ConnectionConfigType type() { - return TYPE; + public boolean canSend(ConduitRedstoneSignalAware signalAware) { + // TODO: sendRedstoneControl + return isSend(); } @Override - public RedstoneControlledConnection withRedstoneControl(RedstoneControl redstoneControl) { - return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); + public boolean canReceive(ConduitRedstoneSignalAware signalAware) { + if (!isReceive()) { + return false; + } + + if (receiveRedstoneControl.isRedstoneSensitive()) { + return receiveRedstoneControl.isActive(signalAware.hasRedstoneSignal(receiveRedstoneChannel)); + } else { + return true; + } + } + + @Override + public List getRedstoneSignalColors() { + if (receiveRedstoneControl.isRedstoneSensitive()) { + return List.of(receiveRedstoneChannel); + } + + return List.of(); + } + + public EnergyConduitConnectionConfig withIsSend(boolean isSend) { + return new EnergyConduitConnectionConfig(isSend, isReceive, receiveRedstoneControl, receiveRedstoneChannel); + } + + public EnergyConduitConnectionConfig withIsReceive(boolean isReceive) { + return new EnergyConduitConnectionConfig(isSend, isReceive, receiveRedstoneControl, receiveRedstoneChannel); + } + + public EnergyConduitConnectionConfig withReceiveRedstoneControl(RedstoneControl receiveRedstoneControl) { + return new EnergyConduitConnectionConfig(isSend, isReceive, receiveRedstoneControl, receiveRedstoneChannel); + } + + public EnergyConduitConnectionConfig withReceiveRedstoneChannel(DyeColor receiveRedstoneChannel) { + return new EnergyConduitConnectionConfig(isSend, isReceive, receiveRedstoneControl, receiveRedstoneChannel); } @Override - public RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel) { - return new EnergyConduitConnectionConfig(canInsert, canExtract, redstoneControl, redstoneChannel); + public ConnectionConfigType type() { + return TYPE; } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java index 75723b3acc..1322d097f9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java @@ -3,27 +3,27 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.ticker.IOAwareConduitTicker; + import java.util.ArrayList; import java.util.List; + +import com.enderio.conduits.api.ticker.IOAwareConduitTicker; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.Level; import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.Nullable; -public class EnergyConduitTicker extends IOAwareConduitTicker { +public class EnergyConduitTicker extends IOAwareConduitTicker { public EnergyConduitTicker() { } - // TODO: Need a way to prevent the extracts list from being built as it is - // unused. - @Override - protected void tickGraph(ServerLevel level, EnergyConduit conduit, List inserts, - List extracts, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + protected void tickColoredGraph(ServerLevel level, EnergyConduit conduit, List senders, List receivers, DyeColor color, + ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { // Adjust for tick rate. Always flow up so we are at minimum meeting the // required rate. @@ -39,9 +39,9 @@ protected void tickGraph(ServerLevel level, EnergyConduit conduit, List storagesForInsert = new ArrayList<>(); - for (var insert : inserts) { - IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, insert.neighborPos(), - insert.neighborSide()); + for (var sender : senders) { + IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, sender.neighborPos(), + sender.neighborSide()); if (capability != null) { storagesForInsert.add(capability); } @@ -75,8 +75,14 @@ protected void tickGraph(ServerLevel level, EnergyConduit conduit, List extractList, List insertList) { - return insertList.isEmpty(); + protected boolean canReceive(ConduitNode node, EnergyConduitConnectionConfig config) { + // We don't require a receive component. + return false; + } + + @Override + protected boolean shouldSkipColor(List senders, List receivers) { + return senders.isEmpty(); } @Override @@ -84,17 +90,17 @@ protected boolean shouldSkip(List extractList, List inse IEnergyStorage energyStorage = level.getCapability(Capabilities.EnergyStorage.BLOCK, node.getPos().relative(side), side.getOpposite()); if (energyStorage != null) { - return new Connection(node, side, energyStorage); + return new Connection(node, side, node.getConnectionConfig(side, EnergyConduitConnectionConfig.TYPE), energyStorage); } return null; } - protected static class Connection extends IOAwareConduitTicker.SimpleConnection { + protected static class Connection extends SimpleConnection { private final IEnergyStorage energyStorage; - public Connection(ConduitNode node, Direction side, IEnergyStorage energyStorage) { - super(node, side); + public Connection(ConduitNode node, Direction side, EnergyConduitConnectionConfig config, IEnergyStorage energyStorage) { + super(node, side, config); this.energyStorage = energyStorage; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index d42ba4bba1..f48d321509 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -87,7 +87,7 @@ public boolean canBeReplacedBy(Holder> otherConduit) { @Override public boolean canConnectConduits(@Nullable CompoundTag selfRenderData, @Nullable CompoundTag otherRenderData) { - // If there's no data for one of the nodes, the network must be fresh or + /*// If there's no data for one of the nodes, the network must be fresh or // uninitialized. if (selfRenderData == null || otherRenderData == null) { return true; @@ -102,7 +102,9 @@ public boolean canConnectConduits(@Nullable CompoundTag selfRenderData, @Nullabl var otherLockedFluid = BuiltInRegistries.FLUID .get(ResourceLocation.parse(selfRenderData.getString("LockedFluid"))); - return selfLockedFluid.isSame(otherLockedFluid); + return selfLockedFluid.isSame(otherLockedFluid);*/ + + return false; } @Override @@ -119,12 +121,15 @@ public boolean canConnectConduits(ConduitNode selfNode, ConduitNode otherNode) { var selfContext = selfNetwork.getContext(FluidConduitNetworkContext.TYPE); var otherContext = otherNetwork.getContext(FluidConduitNetworkContext.TYPE); - // If either is null, it isn't locked. if (selfContext == null || otherContext == null) { return true; } - return selfContext.lockedFluid() == otherContext.lockedFluid(); + if (selfContext.lockedFluid().isSame(Fluids.EMPTY) || otherContext.lockedFluid().isSame(Fluids.EMPTY)) { + return true; + } + + return selfContext.lockedFluid().isSame(otherContext.lockedFluid()); } @Override @@ -168,6 +173,11 @@ public void copyLegacyData(ConduitNode node, ConduitDataAccessor legacyDataAcces context.setLockedFluid(legacyData.lockedFluid()); } + @Override + public @Nullable CompoundTag getExtraGuiData(ConduitBundleReader conduitBundle, ConduitNode node, Direction side) { + return getExtraWorldData(conduitBundle, node); + } + @Override @Nullable public CompoundTag getExtraWorldData(ConduitBundleReader conduitBundle, ConduitNode node) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java index 1c4497ffdd..b22f3f4af8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java @@ -1,11 +1,11 @@ package com.enderio.conduits.common.conduit.type.fluid; import com.enderio.base.api.misc.RedstoneControl; +import com.enderio.conduits.api.ConduitRedstoneSignalAware; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.io.ChanneledIOConnectionConfig; -import com.enderio.conduits.api.connection.config.io.IOConnectionConfig; -import com.enderio.conduits.api.connection.config.redstone.RedstoneControlledConnection; +import com.enderio.conduits.api.connection.config.IOConnectionConfig; +import com.enderio.conduits.api.connection.config.RedstoneSensitiveConnectionConfig; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -14,79 +14,106 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; -public record FluidConduitConnectionConfig(boolean canInsert, DyeColor insertChannel, boolean canExtract, - DyeColor extractChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) - implements ChanneledIOConnectionConfig, RedstoneControlledConnection { +import java.util.List; + +public record FluidConduitConnectionConfig(boolean isSend, DyeColor sendColor, boolean isReceive, + DyeColor receiveColor, RedstoneControl receiveRedstoneControl, DyeColor receiveRedstoneChannel) + implements IOConnectionConfig, RedstoneSensitiveConnectionConfig { public static FluidConduitConnectionConfig DEFAULT = new FluidConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED); public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance - .group(Codec.BOOL.fieldOf("can_insert").forGetter(FluidConduitConnectionConfig::canInsert), - DyeColor.CODEC.fieldOf("insert_channel").forGetter(FluidConduitConnectionConfig::insertChannel), - Codec.BOOL.fieldOf("can_extract").forGetter(FluidConduitConnectionConfig::canExtract), - DyeColor.CODEC.fieldOf("extract_channel").forGetter(FluidConduitConnectionConfig::extractChannel), - RedstoneControl.CODEC.fieldOf("redstone_control") - .forGetter(FluidConduitConnectionConfig::redstoneControl), - DyeColor.CODEC.fieldOf("redstone_channel").forGetter(FluidConduitConnectionConfig::redstoneChannel)) + .group(Codec.BOOL.fieldOf("is_send").forGetter(FluidConduitConnectionConfig::isSend), + DyeColor.CODEC.fieldOf("send_color").forGetter(FluidConduitConnectionConfig::sendColor), + Codec.BOOL.fieldOf("is_receive").forGetter(FluidConduitConnectionConfig::isReceive), + DyeColor.CODEC.fieldOf("receive_channel").forGetter(FluidConduitConnectionConfig::receiveColor), + RedstoneControl.CODEC.fieldOf("receive_redstone_control") + .forGetter(FluidConduitConnectionConfig::receiveRedstoneControl), + DyeColor.CODEC.fieldOf("receive_redstone_channel").forGetter(FluidConduitConnectionConfig::receiveRedstoneChannel)) .apply(instance, FluidConduitConnectionConfig::new)); + // @formatter:off public static StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.BOOL, FluidConduitConnectionConfig::canInsert, DyeColor.STREAM_CODEC, - FluidConduitConnectionConfig::insertChannel, ByteBufCodecs.BOOL, FluidConduitConnectionConfig::canExtract, - DyeColor.STREAM_CODEC, FluidConduitConnectionConfig::extractChannel, RedstoneControl.STREAM_CODEC, - FluidConduitConnectionConfig::redstoneControl, DyeColor.STREAM_CODEC, - FluidConduitConnectionConfig::redstoneChannel, FluidConduitConnectionConfig::new); + ByteBufCodecs.BOOL, + FluidConduitConnectionConfig::isSend, + DyeColor.STREAM_CODEC, + FluidConduitConnectionConfig::sendColor, + ByteBufCodecs.BOOL, + FluidConduitConnectionConfig::isReceive, + DyeColor.STREAM_CODEC, + FluidConduitConnectionConfig::receiveColor, + RedstoneControl.STREAM_CODEC, + FluidConduitConnectionConfig::receiveRedstoneControl, + DyeColor.STREAM_CODEC, + FluidConduitConnectionConfig::receiveRedstoneChannel, + FluidConduitConnectionConfig::new); + // @formatter:on - public static ConnectionConfigType TYPE = new ConnectionConfigType<>( - FluidConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + public static ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { - return new FluidConduitConnectionConfig(DEFAULT.canInsert, insertChannel, DEFAULT.canExtract, - extractChannel, redstoneControl, redstoneChannel); + return new FluidConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, + receiveColor, receiveRedstoneControl, receiveRedstoneChannel); } @Override public ConnectionConfig disconnected() { - return new FluidConduitConnectionConfig(false, insertChannel, false, - extractChannel, redstoneControl, redstoneChannel); + return new FluidConduitConnectionConfig(false, sendColor, false, + receiveColor, receiveRedstoneControl, receiveRedstoneChannel); } @Override - public FluidConduitConnectionConfig withInsert(boolean canInsert) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, - redstoneChannel); + public boolean canSend(ConduitRedstoneSignalAware signalAware) { + // TODO: sendRedstoneControl + return isSend(); } @Override - public FluidConduitConnectionConfig withExtract(boolean canExtract) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, - redstoneChannel); + public boolean canReceive(ConduitRedstoneSignalAware signalAware) { + if (!isReceive()) { + return false; + } + + if (receiveRedstoneControl.isRedstoneSensitive()) { + return receiveRedstoneControl.isActive(signalAware.hasRedstoneSignal(receiveRedstoneChannel)); + } else { + return true; + } } @Override - public FluidConduitConnectionConfig withInputChannel(DyeColor inputChannel) { - return new FluidConduitConnectionConfig(canInsert, inputChannel, canExtract, extractChannel, redstoneControl, - redstoneChannel); + public List getRedstoneSignalColors() { + if (receiveRedstoneControl.isRedstoneSensitive()) { + return List.of(receiveRedstoneChannel); + } + + return List.of(); } - @Override - public FluidConduitConnectionConfig withOutputChannel(DyeColor outputChannel) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, outputChannel, redstoneControl, - redstoneChannel); + public FluidConduitConnectionConfig withIsSend(boolean isSend) { + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); } - @Override - public FluidConduitConnectionConfig withRedstoneControl(RedstoneControl redstoneControl) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, - redstoneChannel); + public FluidConduitConnectionConfig withSendColor(DyeColor sendColor) { + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); } - @Override - public RedstoneControlledConnection withRedstoneChannel(DyeColor redstoneChannel) { - return new FluidConduitConnectionConfig(canInsert, insertChannel, canExtract, extractChannel, redstoneControl, - redstoneChannel); + public FluidConduitConnectionConfig withIsReceive(boolean isReceive) { + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + } + + public FluidConduitConnectionConfig withReceiveColor(DyeColor receiveColor) { + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + } + + public FluidConduitConnectionConfig withReceiveRedstoneControl(RedstoneControl receiveRedstoneControl) { + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + } + + public FluidConduitConnectionConfig withReceiveRedstoneChannel(DyeColor receiveRedstoneChannel) { + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java index 29adf1e4e6..84e8550c95 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java @@ -7,10 +7,13 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; // TODO: packet to clear the fluid lock. public class FluidConduitNetworkContext implements ConduitNetworkContext { + private static final Logger log = LoggerFactory.getLogger(FluidConduitNetworkContext.class); public static Codec CODEC = RecordCodecBuilder.create(instance -> instance .group(BuiltInRegistries.FLUID.byNameCodec() .optionalFieldOf("locked_fluid", Fluids.EMPTY) @@ -21,6 +24,7 @@ public class FluidConduitNetworkContext implements ConduitNetworkContext { +public class FluidConduitTicker extends IOAwareConduitTicker { private int getScaledFluidRate(FluidConduit conduit) { // Adjust for tick rate. Always flow up so we are at minimum meeting the @@ -27,27 +29,27 @@ private int getScaledFluidRate(FluidConduit conduit) { return (int) Math.ceil(conduit.transferRatePerTick() * (20.0 / conduit.graphTickRate())); } - private int doFluidTransfer(FluidStack fluid, Connection extract, List inserts) { - FluidStack extractedFluid = extract.fluidHandler().drain(fluid, IFluidHandler.FluidAction.SIMULATE); + private int doFluidTransfer(FluidStack fluid, Connection receiver, List senders) { + FluidStack extractedFluid = receiver.fluidHandler().drain(fluid, IFluidHandler.FluidAction.SIMULATE); if (extractedFluid.isEmpty()) { return fluid.getAmount(); } - if (extract.extractFilter() instanceof FluidStackFilter fluidStackFilter) { + if (receiver.extractFilter() instanceof FluidStackFilter fluidStackFilter) { if (!fluidStackFilter.test(extractedFluid)) { return fluid.getAmount(); } } - for (Connection insert : inserts) { + for (Connection insert : senders) { if (insert.insertFilter() instanceof FluidStackFilter fluidStackFilter) { if (!fluidStackFilter.test(extractedFluid)) { continue; } } - FluidStack transferredFluid = FluidUtil.tryFluidTransfer(insert.fluidHandler(), extract.fluidHandler(), + FluidStack transferredFluid = FluidUtil.tryFluidTransfer(insert.fluidHandler(), receiver.fluidHandler(), fluid, true); if (!transferredFluid.isEmpty()) { @@ -63,18 +65,34 @@ private int doFluidTransfer(FluidStack fluid, Connection extract, List inserts, - List extracts, DyeColor color, ConduitNetwork graph, + public void tickGraph(ServerLevel level, FluidConduit conduit, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + super.tickGraph(level, conduit, graph, coloredRedstoneProvider); + + // Update if the network is now locked + var context = graph.getOrCreateContext(FluidConduitNetworkContext.TYPE); + if (!context.lockedFluid().equals(context.lastLockedFluid())) { + context.clearLastLockedFluid(); + for (var node : graph.getNodes()) { + if (node.isLoaded()) { + node.markDirty(); + } + } + } + } + + @Override + protected void tickColoredGraph(ServerLevel level, FluidConduit conduit, List senders, + List receivers, DyeColor color, ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { final int fluidRate = getScaledFluidRate(conduit); var context = graph.getOrCreateContext(FluidConduitNetworkContext.TYPE); - for (Connection extract : extracts) { - IFluidHandler extractHandler = extract.fluidHandler(); + for (Connection receiver : receivers) { + IFluidHandler extractHandler = receiver.fluidHandler(); if (!context.lockedFluid().isSame(Fluids.EMPTY)) { - doFluidTransfer(new FluidStack(context.lockedFluid(), fluidRate), extract, inserts); + doFluidTransfer(new FluidStack(context.lockedFluid(), fluidRate), receiver, senders); } else { int remaining = fluidRate; @@ -84,7 +102,7 @@ protected void tickColoredGraph(ServerLevel level, FluidConduit conduit, List { private final IFluidHandler fluidHandler; - public Connection(ConduitNode node, Direction side, IFluidHandler fluidHandler) { - super(node, side); + public Connection(ConduitNode node, Direction side, FluidConduitConnectionConfig config, IFluidHandler fluidHandler) { + super(node, side, config); this.fluidHandler = fluidHandler; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java index f003aac3a6..c7f1280682 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java @@ -5,7 +5,7 @@ import com.enderio.conduits.api.ConduitRedstoneSignalAware; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; +import com.enderio.conduits.api.connection.config.IOConnectionConfig; import com.enderio.conduits.api.connection.config.RedstoneSensitiveConnectionConfig; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; @@ -18,7 +18,7 @@ public record ItemConduitConnectionConfig(boolean isSend, DyeColor sendColor, boolean isReceive, DyeColor receiveColor, RedstoneControl receiveRedstoneControl, DyeColor receiveRedstoneChannel, boolean isRoundRobin, - boolean isSelfFeed, int priority) implements NewIOConnectionConfig, RedstoneSensitiveConnectionConfig { + boolean isSelfFeed, int priority) implements IOConnectionConfig, RedstoneSensitiveConnectionConfig { public static ItemConduitConnectionConfig DEFAULT = new ItemConduitConnectionConfig(false, DyeColor.GREEN, true, @@ -47,8 +47,7 @@ public record ItemConduitConnectionConfig(boolean isSend, DyeColor sendColor, bo ItemConduitConnectionConfig::isRoundRobin, ByteBufCodecs.BOOL, ItemConduitConnectionConfig::isSelfFeed, ByteBufCodecs.INT, ItemConduitConnectionConfig::priority, ItemConduitConnectionConfig::new); - public static ConnectionConfigType TYPE = new ConnectionConfigType<>( - ItemConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + public static ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { @@ -81,6 +80,15 @@ public boolean canReceive(ConduitRedstoneSignalAware signalAware) { } } + @Override + public List getRedstoneSignalColors() { + if (receiveRedstoneControl.isRedstoneSensitive()) { + return List.of(receiveRedstoneChannel); + } + + return List.of(); + } + // Generate with methods for each field public ItemConduitConnectionConfig withIsSend(boolean isSend) { return new ItemConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, @@ -131,13 +139,4 @@ public ItemConduitConnectionConfig withPriority(int priority) { public ConnectionConfigType type() { return TYPE; } - - @Override - public List getRedstoneSignalColors() { - if (receiveRedstoneControl.isRedstoneSensitive()) { - return List.of(receiveRedstoneChannel); - } - - return List.of(); - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java index 491c53af9c..bfa255967c 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitTicker.java @@ -4,7 +4,7 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.ticker.NewIOAwareConduitTicker; +import com.enderio.conduits.api.ticker.IOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitTypes; import java.util.Comparator; import java.util.List; @@ -19,7 +19,7 @@ import org.jetbrains.annotations.Nullable; public class ItemConduitTicker - extends NewIOAwareConduitTicker { + extends IOAwareConduitTicker { @Override protected void tickColoredGraph(ServerLevel level, ItemConduit conduit, List senders, diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java index 3feaa4a5fd..c411de70ed 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java @@ -2,7 +2,7 @@ import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.api.connection.config.NewIOConnectionConfig; +import com.enderio.conduits.api.connection.config.IOConnectionConfig; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -12,7 +12,7 @@ import net.minecraft.world.item.DyeColor; public record RedstoneConduitConnectionConfig(boolean isSend, DyeColor sendColor, boolean isReceive, - DyeColor receiveColor, boolean isStrongOutputSignal) implements NewIOConnectionConfig { + DyeColor receiveColor, boolean isStrongOutputSignal) implements IOConnectionConfig { public static RedstoneConduitConnectionConfig DEFAULT = new RedstoneConduitConnectionConfig(false, DyeColor.GREEN, true, DyeColor.RED, false); @@ -32,8 +32,7 @@ public record RedstoneConduitConnectionConfig(boolean isSend, DyeColor sendColor DyeColor.STREAM_CODEC, RedstoneConduitConnectionConfig::receiveColor, ByteBufCodecs.BOOL, RedstoneConduitConnectionConfig::isStrongOutputSignal, RedstoneConduitConnectionConfig::new); - public static ConnectionConfigType TYPE = new ConnectionConfigType<>( - RedstoneConduitConnectionConfig.class, CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + public static ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java index cc21bc1079..a3cd2c935f 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java @@ -3,7 +3,7 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; -import com.enderio.conduits.api.ticker.NewIOAwareConduitTicker; +import com.enderio.conduits.api.ticker.IOAwareConduitTicker; import com.enderio.conduits.common.init.ConduitBlocks; import com.enderio.conduits.common.redstone.RedstoneExtractFilter; import java.util.List; @@ -14,7 +14,7 @@ import org.jetbrains.annotations.Nullable; public class RedstoneConduitTicker extends - NewIOAwareConduitTicker { + IOAwareConduitTicker { @Override public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork graph, diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SClearLockedFluidPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SClearLockedFluidPacket.java new file mode 100644 index 0000000000..b86cc33558 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SClearLockedFluidPacket.java @@ -0,0 +1,19 @@ +package com.enderio.conduits.common.network; + +import com.enderio.base.api.EnderIO; +import io.netty.buffer.ByteBuf; +import net.minecraft.core.BlockPos; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +public record C2SClearLockedFluidPacket(BlockPos pos) implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(EnderIO.loc("clear_locked_fluid")); + + public static StreamCodec STREAM_CODEC = BlockPos.STREAM_CODEC.map(C2SClearLockedFluidPacket::new, C2SClearLockedFluidPacket::pos); + + @Override + public Type type() { + return TYPE; + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java index 848f5c98e0..2f7e181cf8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitNetwork.java @@ -27,6 +27,9 @@ public static void register(final RegisterPayloadHandlersEvent event) { registrar.playToServer(ConduitMenuSelectionPacket.TYPE, ConduitMenuSelectionPacket.STREAM_CODEC, ConduitServerPayloadHandler.getInstance()::handleConduitMenuSelection); + registrar.playToServer(C2SClearLockedFluidPacket.TYPE, C2SClearLockedFluidPacket.STREAM_CODEC, + ConduitServerPayloadHandler.getInstance()::handle); + registrar.playToClient(S2CConduitExtraGuiDataPacket.TYPE, S2CConduitExtraGuiDataPacket.STREAM_CODEC, ConduitClientPayloadHandler.getInstance()::handle); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java index ca0d58540b..38646a9285 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java @@ -1,10 +1,16 @@ package com.enderio.conduits.common.network; import com.enderio.base.common.init.EIOCapabilities; +import com.enderio.conduits.api.bundle.ConduitBundleAccessor; +import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; +import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; +import com.enderio.conduits.common.conduit.type.fluid.FluidConduitNetworkContext; +import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.redstone.DoubleRedstoneChannel; import com.enderio.conduits.common.redstone.RedstoneCountFilter; import com.enderio.conduits.common.redstone.RedstoneTimerFilter; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.material.Fluids; import net.neoforged.neoforge.network.handling.IPayloadContext; public class ConduitServerPayloadHandler { @@ -51,4 +57,25 @@ public void handleCountFilter(CountFilterPacket packet, IPayloadContext context) } }); } + + public void handle(C2SClearLockedFluidPacket packet, IPayloadContext context) { + context.enqueueWork(() -> { + var level = context.player().level(); + var be = level.getBlockEntity(packet.pos()); + if (be instanceof ConduitBundleAccessor conduitBundle) { + var fluidConduit = conduitBundle.getConduitByType(ConduitTypes.FLUID.get()); + if (fluidConduit != null) { + var node = conduitBundle.getConduitNode(fluidConduit); + + var network = node.getNetwork(); + if (network != null) { + var networkContext = network.getContext(FluidConduitNetworkContext.TYPE); + if (networkContext != null) { + networkContext.setLockedFluid(Fluids.EMPTY); + } + } + } + } + }); + } } From 8e535b8308c3fb88612a5483ab578f8d9832a644 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 12 Jan 2025 16:50:09 +0000 Subject: [PATCH 19/27] chore: more sensible conduit connection checks --- .../com/enderio/conduits/api/Conduit.java | 34 ++++++++-------- .../enderio/conduits/api/ConduitMenuData.java | 26 ------------- .../enderio/conduits/api/bundle/SlotType.java | 10 ----- .../bundle/ConduitBundleBlockEntity.java | 39 +++++-------------- .../conduit/type/energy/EnergyConduit.java | 8 ---- .../conduit/type/fluid/FluidConduit.java | 35 +++-------------- .../common/conduit/type/item/ItemConduit.java | 8 ---- .../type/redstone/RedstoneConduit.java | 7 ---- 8 files changed, 32 insertions(+), 135 deletions(-) delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitMenuData.java diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index ec5fb4823d..f36a10613e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -76,11 +76,7 @@ default int graphTickRate() { * @implNote if a conduit has a menu, you must also register a {@link com.enderio.conduits.api.screen.ConduitScreenType} for it. * @return whether this conduit has a menu. */ -// boolean hasMenu(); - - // TODO: Custom menu data factory? - - ConduitMenuData getMenuData(); + //boolean hasMenu(); // region Conduit Checks @@ -99,29 +95,29 @@ default boolean canConnectToConduit(Holder> other) { return this.equals(other.value()); } - // endregion - - // region Connection Checks - /** - * This can be used to prevent connection between nodes with incompatible data. - * Warning: If you are unable to determine if the conduit is connectable, always return false - otherwise the client visual can desync. - * @apiNote only called on the server side, should mirror the behaviour of {@link #canConnectConduits(ConduitNode, ConduitNode)} for seamless block placement. - * @return true if both nodes are compatible. + * If this conduit overrides {@link #canConnectConduits(ConduitNode, ConduitNode)}, return true. + * This will avoid showing connections between conduits on the client until the server evaluates whether they can connect. + * @apiNote Failing to override this properly could result in connection desyncs. + * @return whether this conduit has additional server-side connection checks. */ - default boolean canConnectConduits(@Nullable CompoundTag selfRenderData, @Nullable CompoundTag otherRenderData) { - return true; + default boolean hasServerConnectionChecks() { + return false; } /** * This can be used to prevent connection between nodes with incompatible data. - * @apiNote only called on the server side. For seamless block placement, implement {@link #canConnectConduits(CompoundTag, CompoundTag)} + * @apiNote Not called by the server if {@link #hasServerConnectionChecks()} does not return true. * @return true if both nodes are compatible. */ default boolean canConnectConduits(ConduitNode selfNode, ConduitNode otherNode) { return true; } + // endregion + + // region Connection Checks + boolean canConnectToBlock(Level level, BlockPos conduitPos, Direction direction); default boolean canForceConnectToBlock(Level level, BlockPos conduitPos, Direction direction) { @@ -186,8 +182,10 @@ default TCapability proxyCapability(Level level, * @deprecated Only for conversion of <7.1 conduit data. Will be removed in Ender IO 8. */ @Deprecated(since = "7.2") - TConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, - DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel); + default TConnectionConfig convertConnection(boolean isInsert, boolean isExtract, DyeColor inputChannel, + DyeColor outputChannel, RedstoneControl redstoneControl, DyeColor redstoneChannel) { + return connectionConfigType().getDefault(); + } /** * Copy legacy data from the old conduit data accessor to the new node however you wish. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitMenuData.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitMenuData.java deleted file mode 100644 index 5c71d826b1..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/ConduitMenuData.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.enderio.conduits.api; - -public interface ConduitMenuData { - boolean hasFilterInsert(); - - boolean hasFilterExtract(); - - boolean hasUpgrade(); - - default boolean showBarSeparator() { - return true; - } - - default boolean showBothEnable() { - return true; - } - - boolean showColorInsert(); - - boolean showColorExtract(); - - boolean showRedstoneExtract(); - - record Simple(boolean hasFilterInsert, boolean hasFilterExtract, boolean hasUpgrade, boolean showColorInsert, boolean showColorExtract, - boolean showRedstoneExtract) implements ConduitMenuData {} -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java index 7da19acbaa..76cde35f40 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/SlotType.java @@ -1,7 +1,5 @@ package com.enderio.conduits.api.bundle; -import com.enderio.conduits.api.ConduitMenuData; - public enum SlotType { FILTER_EXTRACT, FILTER_INSERT, UPGRADE_EXTRACT; @@ -18,12 +16,4 @@ public int getX() { public int getY() { return Y_POSITION; } - - public boolean isAvailableFor(ConduitMenuData data) { - return switch (this) { - case FILTER_INSERT -> data.hasFilterInsert(); - case FILTER_EXTRACT -> data.hasFilterExtract(); - case UPGRADE_EXTRACT -> data.hasUpgrade(); - }; - } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index 61a1730577..afd35a0246 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -843,7 +843,6 @@ public boolean isEndpoint(Direction side) { // TODO: This needs a better name or to handle blocks as well as conduits before // it can be exposed via the interface. - @EnsureSide(EnsureSide.Side.SERVER) public boolean canConnectTo(Direction side, Holder> conduit, ConduitGraphObject otherNode, boolean isForcedConnection) { if (level == null) { @@ -854,25 +853,17 @@ public boolean canConnectTo(Direction side, Holder> conduit, Condu return false; } - if (!conduit.value().canConnectConduits(conduitNodes.get(conduit), otherNode)) { - return false; - } - - return isForcedConnection || conduitConnections.get(conduit).getStatus(side) != ConnectionStatus.DISABLED; - } - - @EnsureSide(EnsureSide.Side.CLIENT) - public boolean canConnectTo(Direction side, Holder> conduit, - @Nullable CompoundTag otherExtraWorldData, boolean isForcedConnection) { - if (level == null) { - return false; - } + if (conduit.value().hasServerConnectionChecks()) { + if (level.isClientSide()) { + // If this has server-side logic, don't continue locally. + return false; + } - if (!doTypesMatch(conduit)) { - return false; - } + // Gated behind hasServerConnectionChecks to ensure conduit devs do not forget to override both. + if (!conduit.value().canConnectConduits(conduitNodes.get(conduit), otherNode)) { + return false; + } - if (!conduit.value().canConnectConduits(getConduitExtraWorldData(conduit), otherExtraWorldData)) { return false; } @@ -908,18 +899,8 @@ public boolean tryConnectTo(Direction side, Holder> conduit, boole getBlockPos().relative(side)) instanceof ConduitBundleBlockEntity neighbourConduitBundle) { var node = conduitNodes.get(conduit); - // TODO: This is really ugly. - boolean canConnectToNeighbour; - if (level.isClientSide()) { - canConnectToNeighbour = neighbourConduitBundle.canConnectTo(side, conduit, - getConduitExtraWorldData(conduit), isForcedConnection); - } else { - canConnectToNeighbour = neighbourConduitBundle.canConnectTo(side.getOpposite(), conduit, node, - isForcedConnection); - } - // Connect to another bundle which has a compatible conduit. - if (canConnectToNeighbour) { + if (neighbourConduitBundle.canConnectTo(side.getOpposite(), conduit, node, isForcedConnection)) { // Make connections to both sides connectConduit(side, conduit); neighbourConduitBundle.connectConduit(side.getOpposite(), conduit); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index b55fe2897b..c28b635788 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -3,7 +3,6 @@ import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.network.node.ConduitNode; @@ -46,8 +45,6 @@ public static EnergyConduit of(ResourceLocation texture, Component description, } private static final EnergyConduitTicker TICKER = new EnergyConduitTicker(); - private static final ConduitMenuData MENU_DATA = new ConduitMenuData.Simple(false, false, false, false, false, - true); // Not configurable - energy is instantaneous @Override @@ -65,11 +62,6 @@ public EnergyConduitTicker getTicker() { return TICKER; } - @Override - public ConduitMenuData getMenuData() { - return MENU_DATA; - } - @Override public boolean canBeInSameBundle(Holder> otherConduit) { return !(otherConduit.value() instanceof EnergyConduit); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index f48d321509..986c7773f8 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -4,7 +4,6 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.SlotType; @@ -50,10 +49,6 @@ public record FluidConduit(ResourceLocation texture, Component description, int Codec.BOOL.fieldOf("is_multi_fluid").forGetter(FluidConduit::isMultiFluid)) .apply(builder, FluidConduit::new)); - public static final ConduitMenuData NORMAL_MENU_DATA = new ConduitMenuData.Simple(true, true, true, false, false, - true); - public static final ConduitMenuData ADVANCED_MENU_DATA = new ConduitMenuData.Simple(true, true, true, true, true, - true); private static final FluidConduitTicker TICKER = new FluidConduitTicker(); @Override @@ -66,11 +61,6 @@ public FluidConduitTicker getTicker() { return TICKER; } - @Override - public ConduitMenuData getMenuData() { - return isMultiFluid ? ADVANCED_MENU_DATA : NORMAL_MENU_DATA; - } - @Override public boolean canBeInSameBundle(Holder> otherConduit) { return !(otherConduit.value() instanceof FluidConduit); @@ -86,29 +76,16 @@ public boolean canBeReplacedBy(Holder> otherConduit) { } @Override - public boolean canConnectConduits(@Nullable CompoundTag selfRenderData, @Nullable CompoundTag otherRenderData) { - /*// If there's no data for one of the nodes, the network must be fresh or - // uninitialized. - if (selfRenderData == null || otherRenderData == null) { - return true; - } - - if (selfRenderData.contains("LockedFluid") || otherRenderData.contains("LockedFluid")) { - return true; - } - - var selfLockedFluid = BuiltInRegistries.FLUID - .get(ResourceLocation.parse(selfRenderData.getString("LockedFluid"))); - var otherLockedFluid = BuiltInRegistries.FLUID - .get(ResourceLocation.parse(selfRenderData.getString("LockedFluid"))); - - return selfLockedFluid.isSame(otherLockedFluid);*/ - - return false; + public boolean hasServerConnectionChecks() { + return !isMultiFluid(); } @Override public boolean canConnectConduits(ConduitNode selfNode, ConduitNode otherNode) { + if (!isMultiFluid()) { + return true; + } + // Ensure the networks are not locked to different fluids before connecting. var selfNetwork = selfNode.getNetwork(); var otherNetwork = otherNode.getNetwork(); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java index 98cc02c948..d020072e3e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java @@ -4,7 +4,6 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.SlotType; @@ -44,8 +43,6 @@ public record ItemConduit(ResourceLocation texture, Component description, int t Codec.intRange(1, 20).optionalFieldOf("ticks_per_cycle", 20).forGetter(ItemConduit::graphTickRate)) .apply(builder, ItemConduit::new)); - private static final ConduitMenuData MENU_DATA = new ConduitMenuData.Simple(true, true, true, true, true, true); - private static final ItemConduitTicker TICKER = new ItemConduitTicker(); @Override @@ -58,11 +55,6 @@ public ItemConduitTicker getTicker() { return TICKER; } - @Override - public ConduitMenuData getMenuData() { - return MENU_DATA; - } - @Override public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { return resourceFilter instanceof ItemStackFilter; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java index 2e67255e42..10d6c50d3a 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java @@ -3,7 +3,6 @@ import com.enderio.base.api.filter.ResourceFilter; import com.enderio.base.api.misc.RedstoneControl; import com.enderio.conduits.api.Conduit; -import com.enderio.conduits.api.ConduitMenuData; import com.enderio.conduits.api.ConduitType; import com.enderio.conduits.api.bundle.ConduitBundleReader; import com.enderio.conduits.api.bundle.SlotType; @@ -38,7 +37,6 @@ public record RedstoneConduit(ResourceLocation texture, ResourceLocation activeT .apply(builder, RedstoneConduit::new)); private static final RedstoneConduitTicker TICKER = new RedstoneConduitTicker(); - private static final ConduitMenuData MENU_DATA = new ConduitMenuData.Simple(true, true, false, true, true, false); @Override public int graphTickRate() { @@ -55,11 +53,6 @@ public RedstoneConduitTicker getTicker() { return TICKER; } - @Override - public ConduitMenuData getMenuData() { - return MENU_DATA; - } - @Override public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { return switch (slotType) { From ba1773c6e10710696c01bf23757d2c6551eb43fe Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 12 Jan 2025 16:50:33 +0000 Subject: [PATCH 20/27] chore: spotlessApply --- .../com/enderio/conduits/api/Conduit.java | 2 +- .../api/bundle/ConduitBundleAccessor.java | 3 +- .../api/bundle/ConduitBundleReader.java | 1 - .../api/screen/ConduitMenuDataAccess.java | 1 - .../client/gui/NewConduitSelectionButton.java | 12 ++--- .../client/gui/screen/ConduitScreen.java | 6 +-- .../screen/types/EnergyConduitScreenType.java | 3 -- .../screen/types/FluidConduitScreenType.java | 54 ++++++++++--------- .../bundle/ConduitBundleBlockEntity.java | 12 +++-- .../common/conduit/menu/ConduitMenu.java | 39 +++++++------- .../energy/EnergyConduitConnectionConfig.java | 11 ++-- .../type/energy/EnergyConduitTicker.java | 20 +++---- .../fluid/FluidConduitConnectionConfig.java | 39 ++++++++------ .../fluid/FluidConduitNetworkContext.java | 3 +- .../type/fluid/FluidConduitTicker.java | 16 +++--- .../item/ItemConduitConnectionConfig.java | 14 ++--- .../RedstoneConduitConnectionConfig.java | 6 +-- .../type/redstone/RedstoneConduitTicker.java | 2 +- .../network/C2SClearLockedFluidPacket.java | 3 +- .../network/ConduitServerPayloadHandler.java | 2 - 20 files changed, 132 insertions(+), 117 deletions(-) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index f36a10613e..5e0c65216e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -76,7 +76,7 @@ default int graphTickRate() { * @implNote if a conduit has a menu, you must also register a {@link com.enderio.conduits.api.screen.ConduitScreenType} for it. * @return whether this conduit has a menu. */ - //boolean hasMenu(); + // boolean hasMenu(); // region Conduit Checks diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java index bb239c4a44..e2d5ceb593 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleAccessor.java @@ -25,7 +25,8 @@ public interface ConduitBundleAccessor extends ConduitBundleReader { * @param player the player adding the conduit, or null if performed from another source. * @return the result of the add operation. */ - AddConduitResult addConduit(Holder> conduit, @Nullable Direction primaryConnectionSide, @Nullable Player player); + AddConduitResult addConduit(Holder> conduit, @Nullable Direction primaryConnectionSide, + @Nullable Player player); /** * Remove a conduit from the bundle. diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java index 865e9d7ef9..a24d54da49 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/bundle/ConduitBundleReader.java @@ -6,7 +6,6 @@ import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; import com.enderio.conduits.api.facade.FacadeType; -import com.enderio.conduits.api.network.node.ConduitNode; import java.util.List; import net.minecraft.core.Direction; import net.minecraft.core.Holder; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java index d7d6e5864a..4b06335e34 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitMenuDataAccess.java @@ -3,7 +3,6 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.ConnectionConfig; import java.util.function.Function; - import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.ApiStatus; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/NewConduitSelectionButton.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/NewConduitSelectionButton.java index e15fff43dc..53f49a0ee1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/NewConduitSelectionButton.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/NewConduitSelectionButton.java @@ -3,6 +3,9 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.client.gui.screen.ConduitScreen; import com.mojang.blaze3d.systems.RenderSystem; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.narration.NarrationElementOutput; @@ -13,18 +16,15 @@ import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Supplier; - public class NewConduitSelectionButton extends AbstractButton { private final int conduitButtonIndex; private final Supplier>> currentConduit; private final Supplier>>> conduitListGetter; private final Consumer onPressed; - public NewConduitSelectionButton(int pX, int pY, int conduitButtonIndex, Supplier>> currentConduit, - Supplier>>> conduitListGetter, Consumer onPressed) { + public NewConduitSelectionButton(int pX, int pY, int conduitButtonIndex, + Supplier>> currentConduit, Supplier>>> conduitListGetter, + Consumer onPressed) { super(pX, pY, 21, 24, Component.empty()); this.conduitButtonIndex = conduitButtonIndex; this.currentConduit = currentConduit; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java index 583bc6505e..88221fdd82 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java @@ -27,7 +27,6 @@ import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -68,8 +67,9 @@ protected void init() { } for (int i = 0; i < 9; i++) { - addRenderableWidget(new NewConduitSelectionButton(getGuiLeft() + 206, getGuiTop() + 4 + 24*i, i, - menu::getSelectedConduit, menu::getConnectedConduits, idx -> handleButtonPress(ConduitMenu.BUTTON_CHANGE_CONDUIT_START_ID + idx))); + addRenderableWidget(new NewConduitSelectionButton(getGuiLeft() + 206, getGuiTop() + 4 + 24 * i, i, + menu::getSelectedConduit, menu::getConnectedConduits, + idx -> handleButtonPress(ConduitMenu.BUTTON_CHANGE_CONDUIT_START_ID + idx))); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java index 28033ff713..245a660ac0 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java @@ -1,16 +1,13 @@ package com.enderio.conduits.client.gui.screen.types; -import com.enderio.base.api.EnderIO; import com.enderio.base.common.lang.EIOLang; import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; import com.enderio.conduits.api.screen.ConduitScreenType; import com.enderio.conduits.common.conduit.type.energy.EnergyConduitConnectionConfig; -import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig; import com.enderio.conduits.common.init.ConduitLang; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.resources.ResourceLocation; public class EnergyConduitScreenType extends ConduitScreenType { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java index a56a62f351..8d6607bdc4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java @@ -11,6 +11,7 @@ import com.enderio.conduits.common.network.C2SClearLockedFluidPacket; import com.enderio.core.common.util.TooltipUtil; import com.mojang.blaze3d.systems.RenderSystem; +import java.util.function.Supplier; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -30,8 +31,6 @@ import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.network.PacketDistributor; -import java.util.function.Supplier; - public class FluidConduitScreenType extends ConduitScreenType { private static final ResourceLocation ICON_ROUND_ROBIN_ENABLED = EnderIO.loc("icon/round_robin_enabled"); @@ -57,32 +56,35 @@ public void createWidgets(ConduitScreenHelper screen, // Locked fluid widget if (dataAccess.conduit() instanceof FluidConduit fluidConduit && !fluidConduit.isMultiFluid()) { screen.addRenderableWidget(new FluidWidget(screen.getAreaLeft(), screen.getAreaTop() + currentY, - () -> getLockedFluid(dataAccess), - () -> PacketDistributor.sendToServer(new C2SClearLockedFluidPacket(dataAccess.getBlockPos())))); + () -> getLockedFluid(dataAccess), + () -> PacketDistributor.sendToServer(new C2SClearLockedFluidPacket(dataAccess.getBlockPos())))); } else { // Channel colors - screen.addColorPicker(0, currentY, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + screen.addColorPicker(0, currentY, ConduitLang.CONDUIT_CHANNEL, + () -> dataAccess.getConnectionConfig().sendColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); screen.addColorPicker(90, currentY, ConduitLang.CONDUIT_CHANNEL, - () -> dataAccess.getConnectionConfig().receiveColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + () -> dataAccess.getConnectionConfig().receiveColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); currentY += 20; } // TODO: Could be good fluid conduit features? - /*// Round robin - screen.addToggleButton(90 + 16 + 4, 20, 16, 16, ConduitLang.ROUND_ROBIN_ENABLED, - ConduitLang.ROUND_ROBIN_DISABLED, ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, - () -> dataAccess.getConnectionConfig().isRoundRobin(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsRoundRobin(value))); - - // Self feed - screen.addToggleButton(90 + (16 + 4) * 2, 20, 16, 16, ConduitLang.SELF_FEED_ENABLED, - ConduitLang.SELF_FEED_DISABLED, ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, - () -> dataAccess.getConnectionConfig().isSelfFeed(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSelfFeed(value)));*/ + /* + * // Round robin screen.addToggleButton(90 + 16 + 4, 20, 16, 16, + * ConduitLang.ROUND_ROBIN_ENABLED, ConduitLang.ROUND_ROBIN_DISABLED, + * ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, () -> + * dataAccess.getConnectionConfig().isRoundRobin(), value -> + * dataAccess.updateConnectionConfig(config -> config.withIsRoundRobin(value))); + * + * // Self feed screen.addToggleButton(90 + (16 + 4) * 2, 20, 16, 16, + * ConduitLang.SELF_FEED_ENABLED, ConduitLang.SELF_FEED_DISABLED, + * ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, () -> + * dataAccess.getConnectionConfig().isSelfFeed(), value -> + * dataAccess.updateConnectionConfig(config -> config.withIsSelfFeed(value))); + */ // Redstone control var redstoneChannelWidget = screen.addColorPicker(90 + 16 + 4, currentY, ConduitLang.REDSTONE_CHANNEL, @@ -145,8 +147,8 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa tooltip.append("\n").append(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID2); if (!currentFluid.get().isSame(Fluids.EMPTY)) { tooltip.append("\n") - .append(TooltipUtil.withArgs(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID3, - currentFluid.get().getFluidType().getDescription())); + .append(TooltipUtil.withArgs(ConduitLang.FLUID_CONDUIT_CHANGE_FLUID3, + currentFluid.get().getFluidType().getDescription())); } setTooltip(Tooltip.create(TooltipUtil.style(tooltip))); } @@ -162,22 +164,22 @@ public void renderWidget(GuiGraphics guiGraphics, int pMouseX, int pMouseY, floa IClientFluidTypeExtensions props = IClientFluidTypeExtensions.of(currentFluid.get()); ResourceLocation still = props.getStillTexture(); AbstractTexture texture = Minecraft.getInstance() - .getTextureManager() - .getTexture(TextureAtlas.LOCATION_BLOCKS); + .getTextureManager() + .getTexture(TextureAtlas.LOCATION_BLOCKS); if (texture instanceof TextureAtlas atlas) { TextureAtlasSprite sprite = atlas.getSprite(still); int color = props.getTintColor(); RenderSystem.setShaderColor(FastColor.ARGB32.red(color) / 255.0F, - FastColor.ARGB32.green(color) / 255.0F, FastColor.ARGB32.blue(color) / 255.0F, - FastColor.ARGB32.alpha(color) / 255.0F); + FastColor.ARGB32.green(color) / 255.0F, FastColor.ARGB32.blue(color) / 255.0F, + FastColor.ARGB32.alpha(color) / 255.0F); RenderSystem.enableBlend(); int atlasWidth = (int) (sprite.contents().width() / (sprite.getU1() - sprite.getU0())); int atlasHeight = (int) (sprite.contents().height() / (sprite.getV1() - sprite.getV0())); guiGraphics.blit(TextureAtlas.LOCATION_BLOCKS, getX() + 1, getY() + 1, 0, sprite.getU0() * atlasWidth, - sprite.getV0() * atlasHeight, 12, 12, atlasWidth, atlasHeight); + sprite.getV0() * atlasHeight, 12, 12, atlasWidth, atlasHeight); RenderSystem.setShaderColor(1, 1, 1, 1); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index afd35a0246..67abba13d1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -514,7 +514,8 @@ public boolean canAddConduit(Holder> conduit) { } @Override - public AddConduitResult addConduit(Holder> conduit, @Nullable Direction primaryConnectionSide, @Nullable Player player) { + public AddConduitResult addConduit(Holder> conduit, @Nullable Direction primaryConnectionSide, + @Nullable Player player) { if (level == null) { return new AddConduitResult.Blocked(); } @@ -607,7 +608,8 @@ public AddConduitResult addConduit(Holder> conduit, @Nullable Dire node.attach(new ConnectionHost(this, conduit)); } - // Now attempt to make connections, starting from the "primary" side (clicked or facing direction) + // Now attempt to make connections, starting from the "primary" side (clicked or + // facing direction) if (primaryConnectionSide != null) { tryConnectTo(primaryConnectionSide, conduit, false); } @@ -859,7 +861,8 @@ public boolean canConnectTo(Direction side, Holder> conduit, Condu return false; } - // Gated behind hasServerConnectionChecks to ensure conduit devs do not forget to override both. + // Gated behind hasServerConnectionChecks to ensure conduit devs do not forget + // to override both. if (!conduit.value().canConnectConduits(conduitNodes.get(conduit), otherNode)) { return false; } @@ -1460,7 +1463,8 @@ public ConnectionConfig getConfig(Direction side) { bundleChanged(); } - // We keep the old state in case the wrench is used, but UI will need to show empty arrows. + // We keep the old state in case the wrench is used, but UI will need to show + // empty arrows. if (statuses.get(side) != ConnectionStatus.CONNECTED_BLOCK && config.isConnected()) { return config.disconnected(); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java index 3a34e7bf44..081870c763 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java @@ -4,7 +4,6 @@ import com.enderio.conduits.api.Conduit; import com.enderio.conduits.api.connection.config.ConnectionConfig; import com.enderio.conduits.api.connection.config.ConnectionConfigType; -import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlock; import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; import com.enderio.conduits.common.init.ConduitMenus; import com.enderio.conduits.common.network.S2CConduitExtraGuiDataPacket; @@ -40,11 +39,11 @@ public class ConduitMenu extends BaseEnderMenu { public static void openConduitMenu(ServerPlayer serverPlayer, ConduitBundleBlockEntity conduitBundle, Direction side, Holder> conduit) { serverPlayer.openMenu(new MenuProvider(conduitBundle, side, conduit), buf -> { - buf.writeBlockPos(conduitBundle.getBlockPos()); - buf.writeEnum(side); - Conduit.STREAM_CODEC.encode(buf, conduit); - ClientConnectionAccessor.writeStartingSyncData(conduitBundle, side, conduit, buf); - }); + buf.writeBlockPos(conduitBundle.getBlockPos()); + buf.writeEnum(side); + Conduit.STREAM_CODEC.encode(buf, conduit); + ClientConnectionAccessor.writeStartingSyncData(conduitBundle, side, conduit, buf); + }); } public static final int BUTTON_CHANGE_CONDUIT_START_ID = 0; @@ -168,7 +167,7 @@ public boolean clickMenuButton(Player player, int id) { if (player instanceof ServerPlayer serverPlayer) { if (id >= BUTTON_CHANGE_CONDUIT_START_ID - && id <= BUTTON_CHANGE_CONDUIT_ID_COUNT + BUTTON_CHANGE_CONDUIT_ID_COUNT) { + && id <= BUTTON_CHANGE_CONDUIT_ID_COUNT + BUTTON_CHANGE_CONDUIT_ID_COUNT) { // TODO: attempt to change to a different conduit on the same face. // var conduitList = getBlockEntity().getConduits(); @@ -177,7 +176,8 @@ public boolean clickMenuButton(Player player, int id) { int conduitIndex = id - BUTTON_CHANGE_CONDUIT_START_ID; var connectedConduits = getConnectedConduits(); if (conduitIndex < connectedConduits.size()) { - openConduitMenu(serverPlayer, (ConduitBundleBlockEntity) connectionAccessor, side, connectedConduits.get(conduitIndex)); + openConduitMenu(serverPlayer, (ConduitBundleBlockEntity) connectionAccessor, side, + connectedConduits.get(conduitIndex)); } } } @@ -211,8 +211,7 @@ public void broadcastChanges() { var conduitList = connectionAccessor.getAllPossibleConnectedCondutis(side); if (conduitListHashCode != conduitList.hashCode()) { - PacketDistributor.sendToPlayer(serverPlayer, - new S2CConduitListPacket(containerId, conduitList)); + PacketDistributor.sendToPlayer(serverPlayer, new S2CConduitListPacket(containerId, conduitList)); conduitListHashCode = conduitList.hashCode(); } } @@ -243,8 +242,9 @@ private static class ClientConnectionAccessor implements ConnectionAccessor { private CompoundTag extraGuiData; public ClientConnectionAccessor(RegistryFriendlyByteBuf buf) { - this.connectedConduits = Conduit.STREAM_CODEC.apply(ByteBufCodecs.list(ConduitBundleBlockEntity.MAX_CONDUITS)) - .decode(buf); + this.connectedConduits = Conduit.STREAM_CODEC + .apply(ByteBufCodecs.list(ConduitBundleBlockEntity.MAX_CONDUITS)) + .decode(buf); this.connectionConfig = ConnectionConfig.STREAM_CODEC.decode(buf); @@ -253,16 +253,17 @@ public ClientConnectionAccessor(RegistryFriendlyByteBuf buf) { .decode(buf); } - private static void writeStartingSyncData(ConduitBundleBlockEntity conduitBundle, Direction side, Holder> conduit, RegistryFriendlyByteBuf buf) { + private static void writeStartingSyncData(ConduitBundleBlockEntity conduitBundle, Direction side, + Holder> conduit, RegistryFriendlyByteBuf buf) { Conduit.STREAM_CODEC.apply(ByteBufCodecs.list(ConduitBundleBlockEntity.MAX_CONDUITS)) - .encode(buf, conduitBundle.getAllPossibleConnectedCondutis(side)); + .encode(buf, conduitBundle.getAllPossibleConnectedCondutis(side)); ConnectionConfig.STREAM_CODEC.encode(buf, conduitBundle.getConnectionConfig(side, conduit)); - //noinspection DataFlowIssue + // noinspection DataFlowIssue ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG) - .map(opt -> opt.orElse(null), Optional::ofNullable) - .encode(buf, conduitBundle.getConduitExtraGuiData(side, conduit)); + .map(opt -> opt.orElse(null), Optional::ofNullable) + .encode(buf, conduitBundle.getConduitExtraGuiData(side, conduit)); } @Override @@ -296,8 +297,8 @@ public boolean stillValid(Player player) { } } - private record MenuProvider(ConduitBundleBlockEntity conduitBundle, Direction side, Holder> conduit) implements - net.minecraft.world.MenuProvider { + private record MenuProvider(ConduitBundleBlockEntity conduitBundle, Direction side, Holder> conduit) + implements net.minecraft.world.MenuProvider { @Override public Component getDisplayName() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java index 3833186ac0..fc9fb29a27 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitConnectionConfig.java @@ -10,14 +10,13 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import io.netty.buffer.ByteBuf; +import java.util.List; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; -import java.util.List; - public record EnergyConduitConnectionConfig(boolean isSend, boolean isReceive, RedstoneControl receiveRedstoneControl, - DyeColor receiveRedstoneChannel) implements IOConnectionConfig, RedstoneSensitiveConnectionConfig { + DyeColor receiveRedstoneChannel) implements IOConnectionConfig, RedstoneSensitiveConnectionConfig { public static EnergyConduitConnectionConfig DEFAULT = new EnergyConduitConnectionConfig(true, true, RedstoneControl.ALWAYS_ACTIVE, DyeColor.RED); @@ -37,11 +36,13 @@ public record EnergyConduitConnectionConfig(boolean isSend, boolean isReceive, R EnergyConduitConnectionConfig::receiveRedstoneControl, DyeColor.STREAM_CODEC, EnergyConduitConnectionConfig::receiveRedstoneChannel, EnergyConduitConnectionConfig::new); - public static final ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + public static final ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, + STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { - return new EnergyConduitConnectionConfig(DEFAULT.isSend, DEFAULT.isReceive, receiveRedstoneControl, receiveRedstoneChannel); + return new EnergyConduitConnectionConfig(DEFAULT.isSend, DEFAULT.isReceive, receiveRedstoneControl, + receiveRedstoneChannel); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java index 1322d097f9..f91f92a0ed 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduitTicker.java @@ -3,11 +3,9 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; - +import com.enderio.conduits.api.ticker.IOAwareConduitTicker; import java.util.ArrayList; import java.util.List; - -import com.enderio.conduits.api.ticker.IOAwareConduitTicker; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.DyeColor; @@ -16,14 +14,16 @@ import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.Nullable; -public class EnergyConduitTicker extends IOAwareConduitTicker { +public class EnergyConduitTicker + extends IOAwareConduitTicker { public EnergyConduitTicker() { } @Override - protected void tickColoredGraph(ServerLevel level, EnergyConduit conduit, List senders, List receivers, DyeColor color, - ConduitNetwork graph, ColoredRedstoneProvider coloredRedstoneProvider) { + protected void tickColoredGraph(ServerLevel level, EnergyConduit conduit, List senders, + List receivers, DyeColor color, ConduitNetwork graph, + ColoredRedstoneProvider coloredRedstoneProvider) { // Adjust for tick rate. Always flow up so we are at minimum meeting the // required rate. @@ -41,7 +41,7 @@ protected void tickColoredGraph(ServerLevel level, EnergyConduit conduit, List storagesForInsert = new ArrayList<>(); for (var sender : senders) { IEnergyStorage capability = level.getCapability(Capabilities.EnergyStorage.BLOCK, sender.neighborPos(), - sender.neighborSide()); + sender.neighborSide()); if (capability != null) { storagesForInsert.add(capability); } @@ -90,7 +90,8 @@ protected boolean shouldSkipColor(List senders, List rec IEnergyStorage energyStorage = level.getCapability(Capabilities.EnergyStorage.BLOCK, node.getPos().relative(side), side.getOpposite()); if (energyStorage != null) { - return new Connection(node, side, node.getConnectionConfig(side, EnergyConduitConnectionConfig.TYPE), energyStorage); + return new Connection(node, side, node.getConnectionConfig(side, EnergyConduitConnectionConfig.TYPE), + energyStorage); } return null; @@ -99,7 +100,8 @@ protected boolean shouldSkipColor(List senders, List rec protected static class Connection extends SimpleConnection { private final IEnergyStorage energyStorage; - public Connection(ConduitNode node, Direction side, EnergyConduitConnectionConfig config, IEnergyStorage energyStorage) { + public Connection(ConduitNode node, Direction side, EnergyConduitConnectionConfig config, + IEnergyStorage energyStorage) { super(node, side, config); this.energyStorage = energyStorage; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java index b22f3f4af8..d0d3d719c4 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitConnectionConfig.java @@ -10,14 +10,13 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import io.netty.buffer.ByteBuf; +import java.util.List; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.DyeColor; -import java.util.List; - -public record FluidConduitConnectionConfig(boolean isSend, DyeColor sendColor, boolean isReceive, - DyeColor receiveColor, RedstoneControl receiveRedstoneControl, DyeColor receiveRedstoneChannel) +public record FluidConduitConnectionConfig(boolean isSend, DyeColor sendColor, boolean isReceive, DyeColor receiveColor, + RedstoneControl receiveRedstoneControl, DyeColor receiveRedstoneChannel) implements IOConnectionConfig, RedstoneSensitiveConnectionConfig { public static FluidConduitConnectionConfig DEFAULT = new FluidConduitConnectionConfig(false, DyeColor.GREEN, true, @@ -30,7 +29,8 @@ public record FluidConduitConnectionConfig(boolean isSend, DyeColor sendColor, b DyeColor.CODEC.fieldOf("receive_channel").forGetter(FluidConduitConnectionConfig::receiveColor), RedstoneControl.CODEC.fieldOf("receive_redstone_control") .forGetter(FluidConduitConnectionConfig::receiveRedstoneControl), - DyeColor.CODEC.fieldOf("receive_redstone_channel").forGetter(FluidConduitConnectionConfig::receiveRedstoneChannel)) + DyeColor.CODEC.fieldOf("receive_redstone_channel") + .forGetter(FluidConduitConnectionConfig::receiveRedstoneChannel)) .apply(instance, FluidConduitConnectionConfig::new)); // @formatter:off @@ -50,18 +50,19 @@ public record FluidConduitConnectionConfig(boolean isSend, DyeColor sendColor, b FluidConduitConnectionConfig::new); // @formatter:on - public static ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + public static ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, + STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { - return new FluidConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, - receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + return new FluidConduitConnectionConfig(DEFAULT.isSend, sendColor, DEFAULT.isReceive, receiveColor, + receiveRedstoneControl, receiveRedstoneChannel); } @Override public ConnectionConfig disconnected() { - return new FluidConduitConnectionConfig(false, sendColor, false, - receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + return new FluidConduitConnectionConfig(false, sendColor, false, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel); } @Override @@ -93,27 +94,33 @@ public List getRedstoneSignalColors() { } public FluidConduitConnectionConfig withIsSend(boolean isSend) { - return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel); } public FluidConduitConnectionConfig withSendColor(DyeColor sendColor) { - return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel); } public FluidConduitConnectionConfig withIsReceive(boolean isReceive) { - return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel); } public FluidConduitConnectionConfig withReceiveColor(DyeColor receiveColor) { - return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel); } public FluidConduitConnectionConfig withReceiveRedstoneControl(RedstoneControl receiveRedstoneControl) { - return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel); } public FluidConduitConnectionConfig withReceiveRedstoneChannel(DyeColor receiveRedstoneChannel) { - return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, receiveRedstoneChannel); + return new FluidConduitConnectionConfig(isSend, sendColor, isReceive, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java index 84e8550c95..e151daedfb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitNetworkContext.java @@ -58,7 +58,8 @@ public void setLockedFluid(Fluid lockedFluid) { @Override public FluidConduitNetworkContext mergeWith(FluidConduitNetworkContext other) { - // Merge with the locked fluid, but set the last to empty so the ticker marks the nodes as dirty. + // Merge with the locked fluid, but set the last to empty so the ticker marks + // the nodes as dirty. if (lockedFluid.equals(Fluids.EMPTY)) { return new FluidConduitNetworkContext(other.lockedFluid, Fluids.EMPTY); } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java index 23ee8b7503..6770f56382 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduitTicker.java @@ -4,10 +4,8 @@ import com.enderio.conduits.api.ColoredRedstoneProvider; import com.enderio.conduits.api.network.ConduitNetwork; import com.enderio.conduits.api.network.node.ConduitNode; - -import java.util.List; - import com.enderio.conduits.api.ticker.IOAwareConduitTicker; +import java.util.List; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.DyeColor; @@ -21,7 +19,8 @@ import net.neoforged.neoforge.fluids.capability.IFluidHandler; import org.jetbrains.annotations.Nullable; -public class FluidConduitTicker extends IOAwareConduitTicker { +public class FluidConduitTicker + extends IOAwareConduitTicker { private int getScaledFluidRate(FluidConduit conduit) { // Adjust for tick rate. Always flow up so we are at minimum meeting the @@ -65,7 +64,8 @@ private int doFluidTransfer(FluidStack fluid, Connection receiver, List { private final IFluidHandler fluidHandler; - public Connection(ConduitNode node, Direction side, FluidConduitConnectionConfig config, IFluidHandler fluidHandler) { + public Connection(ConduitNode node, Direction side, FluidConduitConnectionConfig config, + IFluidHandler fluidHandler) { super(node, side, config); this.fluidHandler = fluidHandler; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java index c7f1280682..0c9334edde 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduitConnectionConfig.java @@ -20,9 +20,8 @@ public record ItemConduitConnectionConfig(boolean isSend, DyeColor sendColor, bo RedstoneControl receiveRedstoneControl, DyeColor receiveRedstoneChannel, boolean isRoundRobin, boolean isSelfFeed, int priority) implements IOConnectionConfig, RedstoneSensitiveConnectionConfig { - public static ItemConduitConnectionConfig DEFAULT = new ItemConduitConnectionConfig(false, DyeColor.GREEN, true, - DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); + DyeColor.GREEN, RedstoneControl.NEVER_ACTIVE, DyeColor.RED, false, false, 0); public static MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance .group(Codec.BOOL.fieldOf("is_send").forGetter(ItemConduitConnectionConfig::isSend), @@ -47,18 +46,19 @@ public record ItemConduitConnectionConfig(boolean isSend, DyeColor sendColor, bo ItemConduitConnectionConfig::isRoundRobin, ByteBufCodecs.BOOL, ItemConduitConnectionConfig::isSelfFeed, ByteBufCodecs.INT, ItemConduitConnectionConfig::priority, ItemConduitConnectionConfig::new); - public static ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + public static ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, + STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { - return new ItemConduitConnectionConfig(false, sendColor, true, receiveColor, - receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(false, sendColor, true, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } @Override public ConnectionConfig disconnected() { - return new ItemConduitConnectionConfig(false, sendColor, false, receiveColor, - receiveRedstoneControl, receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); + return new ItemConduitConnectionConfig(false, sendColor, false, receiveColor, receiveRedstoneControl, + receiveRedstoneChannel, isRoundRobin, isSelfFeed, priority); } @Override diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java index c411de70ed..979805f93b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitConnectionConfig.java @@ -32,7 +32,8 @@ public record RedstoneConduitConnectionConfig(boolean isSend, DyeColor sendColor DyeColor.STREAM_CODEC, RedstoneConduitConnectionConfig::receiveColor, ByteBufCodecs.BOOL, RedstoneConduitConnectionConfig::isStrongOutputSignal, RedstoneConduitConnectionConfig::new); - public static ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, STREAM_CODEC.cast(), () -> DEFAULT); + public static ConnectionConfigType TYPE = new ConnectionConfigType<>(CODEC, + STREAM_CODEC.cast(), () -> DEFAULT); @Override public ConnectionConfig reconnected() { @@ -42,8 +43,7 @@ public ConnectionConfig reconnected() { @Override public ConnectionConfig disconnected() { - return new RedstoneConduitConnectionConfig(false, sendColor, false, receiveColor, - isStrongOutputSignal); + return new RedstoneConduitConnectionConfig(false, sendColor, false, receiveColor, isStrongOutputSignal); } public RedstoneConduitConnectionConfig withIsSend(boolean isSend) { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java index a3cd2c935f..cac5b16af5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduitTicker.java @@ -14,7 +14,7 @@ import org.jetbrains.annotations.Nullable; public class RedstoneConduitTicker extends - IOAwareConduitTicker { + IOAwareConduitTicker { @Override public void tickGraph(ServerLevel level, RedstoneConduit conduit, ConduitNetwork graph, diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SClearLockedFluidPacket.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SClearLockedFluidPacket.java index b86cc33558..2ae96491bd 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SClearLockedFluidPacket.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/C2SClearLockedFluidPacket.java @@ -10,7 +10,8 @@ public record C2SClearLockedFluidPacket(BlockPos pos) implements CustomPacketPay public static final Type TYPE = new Type<>(EnderIO.loc("clear_locked_fluid")); - public static StreamCodec STREAM_CODEC = BlockPos.STREAM_CODEC.map(C2SClearLockedFluidPacket::new, C2SClearLockedFluidPacket::pos); + public static StreamCodec STREAM_CODEC = BlockPos.STREAM_CODEC + .map(C2SClearLockedFluidPacket::new, C2SClearLockedFluidPacket::pos); @Override public Type type() { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java index 38646a9285..77b1b5e8e9 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/network/ConduitServerPayloadHandler.java @@ -2,8 +2,6 @@ import com.enderio.base.common.init.EIOCapabilities; import com.enderio.conduits.api.bundle.ConduitBundleAccessor; -import com.enderio.conduits.common.conduit.bundle.ConduitBundleBlockEntity; -import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; import com.enderio.conduits.common.conduit.type.fluid.FluidConduitNetworkContext; import com.enderio.conduits.common.init.ConduitTypes; import com.enderio.conduits.common.redstone.DoubleRedstoneChannel; From 84136bbc4cf45f280064bca753c4884ac9f0ab7a Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 12 Jan 2025 19:35:53 +0000 Subject: [PATCH 21/27] fix: Fluid conduits not connecting --- .../common/conduit/bundle/ConduitBundleBlockEntity.java | 2 -- .../conduits/common/conduit/type/fluid/FluidConduit.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index 67abba13d1..94cc8ae050 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -866,8 +866,6 @@ public boolean canConnectTo(Direction side, Holder> conduit, Condu if (!conduit.value().canConnectConduits(conduitNodes.get(conduit), otherNode)) { return false; } - - return false; } return isForcedConnection || conduitConnections.get(conduit).getStatus(side) != ConnectionStatus.DISABLED; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index 986c7773f8..3d70bbee34 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -82,7 +82,7 @@ public boolean hasServerConnectionChecks() { @Override public boolean canConnectConduits(ConduitNode selfNode, ConduitNode otherNode) { - if (!isMultiFluid()) { + if (isMultiFluid()) { return true; } From 80b6dac82e56f4bf7b194c1c8aded3d559a7c12b Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sun, 12 Jan 2025 20:35:05 +0000 Subject: [PATCH 22/27] fix: Transparent facades not rendering correctly. Closes: GH-970 --- .../client/model/conduit/facades/FacadeItemModel.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemModel.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemModel.java index b92a92cbaf..ea48d198b6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemModel.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/model/conduit/facades/FacadeItemModel.java @@ -100,10 +100,12 @@ public List getRenderTypes(ItemStack itemStack, boolean fabulous) { if (paintData == null) { return List.of(RenderType.cutout()); } + + var paintStack = paintData.paint().asItem().getDefaultInstance(); return Minecraft.getInstance() .getItemRenderer() - .getModel(paintData.paint().asItem().getDefaultInstance(), null, null, 0) - .getRenderTypes(itemStack, fabulous); + .getModel(paintStack, null, null, 0) + .getRenderTypes(paintStack, fabulous); } @Override From d3eb8ae6f7b014ee8e420eab296ba0916fce16b6 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Mon, 13 Jan 2025 02:39:15 +0000 Subject: [PATCH 23/27] feat: Allow conduits to opt-out of having a menu --- .../java/com/enderio/conduits/api/Conduit.java | 2 +- .../conduit/bundle/ConduitBundleBlock.java | 3 +-- .../conduit/bundle/ConduitBundleBlockEntity.java | 10 +++++++--- .../common/conduit/menu/ConduitMenu.java | 16 ++++++++-------- .../conduit/type/energy/EnergyConduit.java | 5 +++++ .../common/conduit/type/fluid/FluidConduit.java | 5 +++++ .../common/conduit/type/item/ItemConduit.java | 5 +++++ .../conduit/type/redstone/RedstoneConduit.java | 5 +++++ 8 files changed, 37 insertions(+), 14 deletions(-) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java index 5e0c65216e..58e04b8c73 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/Conduit.java @@ -76,7 +76,7 @@ default int graphTickRate() { * @implNote if a conduit has a menu, you must also register a {@link com.enderio.conduits.api.screen.ConduitScreenType} for it. * @return whether this conduit has a menu. */ - // boolean hasMenu(); + boolean hasMenu(); // region Conduit Checks diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java index 5b308188f3..3470c3b318 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java @@ -360,8 +360,7 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP var conduitConnection = conduitBundle.getShape().getConnectionFromHit(pos, hitResult); if (conduitConnection != null) { - if (conduitBundle.getConnectionStatus(conduitConnection.getFirst(), - conduitConnection.getSecond()) == ConnectionStatus.CONNECTED_BLOCK) { + if (conduitBundle.canOpenScreen(conduitConnection.getFirst(), conduitConnection.getSecond())) { if (player instanceof ServerPlayer serverPlayer) { ConduitMenu.openConduitMenu(serverPlayer, conduitBundle, conduitConnection.getFirst(), conduitConnection.getSecond()); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java index 94cc8ae050..bdcf262252 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlockEntity.java @@ -254,15 +254,19 @@ public boolean stillValid(Player player) { } @Override - public List>> getAllPossibleConnectedCondutis(Direction side) { - return conduits.stream().filter(c -> canBeOrIsConnection(side, c)).toList(); + public List>> getAllOpenableConduits(Direction side) { + return conduits.stream().filter(c -> canOpenScreen(side, c)).toList(); } - public boolean canBeOrIsConnection(Direction side, Holder> conduit) { + public boolean canOpenScreen(Direction side, Holder> conduit) { if (level == null) { return false; } + if (!conduit.value().hasMenu()) { + return false; + } + // If we've lost the conduit if (!hasConduitStrict(conduit)) { return false; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java index 081870c763..d1f7c36b75 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/menu/ConduitMenu.java @@ -111,7 +111,7 @@ public Direction getSide() { } public List>> getConnectedConduits() { - return connectionAccessor.getAllPossibleConnectedCondutis(side); + return connectionAccessor.getAllOpenableConduits(side); } @EnsureSide(EnsureSide.Side.CLIENT) @@ -157,7 +157,7 @@ public void setExtraGuiData(CompoundTag extraGuiData) { @Override public boolean stillValid(Player player) { - return connectionAccessor.stillValid(player) && connectionAccessor.canBeOrIsConnection(side, selectedConduit); + return connectionAccessor.stillValid(player) && connectionAccessor.canOpenScreen(side, selectedConduit); } @Override @@ -209,7 +209,7 @@ public void broadcastChanges() { this.remoteExtraGuiData = extraGuiData; } - var conduitList = connectionAccessor.getAllPossibleConnectedCondutis(side); + var conduitList = connectionAccessor.getAllOpenableConduits(side); if (conduitListHashCode != conduitList.hashCode()) { PacketDistributor.sendToPlayer(serverPlayer, new S2CConduitListPacket(containerId, conduitList)); conduitListHashCode = conduitList.hashCode(); @@ -218,13 +218,13 @@ public void broadcastChanges() { } public interface ConnectionAccessor { - List>> getAllPossibleConnectedCondutis(Direction side); + List>> getAllOpenableConduits(Direction side); ConnectionConfig getConnectionConfig(Direction side, Holder> conduit); void setConnectionConfig(Direction side, Holder> conduit, ConnectionConfig config); - boolean canBeOrIsConnection(Direction side, Holder> conduit); + boolean canOpenScreen(Direction side, Holder> conduit); @Nullable CompoundTag getConduitExtraGuiData(Direction side, Holder> conduit); @@ -256,7 +256,7 @@ public ClientConnectionAccessor(RegistryFriendlyByteBuf buf) { private static void writeStartingSyncData(ConduitBundleBlockEntity conduitBundle, Direction side, Holder> conduit, RegistryFriendlyByteBuf buf) { Conduit.STREAM_CODEC.apply(ByteBufCodecs.list(ConduitBundleBlockEntity.MAX_CONDUITS)) - .encode(buf, conduitBundle.getAllPossibleConnectedCondutis(side)); + .encode(buf, conduitBundle.getAllOpenableConduits(side)); ConnectionConfig.STREAM_CODEC.encode(buf, conduitBundle.getConnectionConfig(side, conduit)); @@ -267,7 +267,7 @@ private static void writeStartingSyncData(ConduitBundleBlockEntity conduitBundle } @Override - public List>> getAllPossibleConnectedCondutis(Direction side) { + public List>> getAllOpenableConduits(Direction side) { return connectedConduits; } @@ -282,7 +282,7 @@ public void setConnectionConfig(Direction side, Holder> conduit, C } @Override - public boolean canBeOrIsConnection(Direction side, Holder> conduit) { + public boolean canOpenScreen(Direction side, Holder> conduit) { return true; } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java index c28b635788..fe79788bb1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/energy/EnergyConduit.java @@ -62,6 +62,11 @@ public EnergyConduitTicker getTicker() { return TICKER; } + @Override + public boolean hasMenu() { + return true; + } + @Override public boolean canBeInSameBundle(Holder> otherConduit) { return !(otherConduit.value() instanceof EnergyConduit); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java index 3d70bbee34..9002bfbf53 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/fluid/FluidConduit.java @@ -61,6 +61,11 @@ public FluidConduitTicker getTicker() { return TICKER; } + @Override + public boolean hasMenu() { + return true; + } + @Override public boolean canBeInSameBundle(Holder> otherConduit) { return !(otherConduit.value() instanceof FluidConduit); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java index d020072e3e..c8330da18e 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/item/ItemConduit.java @@ -55,6 +55,11 @@ public ItemConduitTicker getTicker() { return TICKER; } + @Override + public boolean hasMenu() { + return true; + } + @Override public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { return resourceFilter instanceof ItemStackFilter; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java index 10d6c50d3a..d31684a18b 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/type/redstone/RedstoneConduit.java @@ -53,6 +53,11 @@ public RedstoneConduitTicker getTicker() { return TICKER; } + @Override + public boolean hasMenu() { + return true; + } + @Override public boolean canApplyFilter(SlotType slotType, ResourceFilter resourceFilter) { return switch (slotType) { From 99848e5e0957522c0ecdb7c71a51cca326668061 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Thu, 30 Jan 2025 00:38:51 +0000 Subject: [PATCH 24/27] fix: Break sounds double-firing. --- .../conduit/bundle/ConduitBundleBlock.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java index 3470c3b318..27527e50ef 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/common/conduit/bundle/ConduitBundleBlock.java @@ -266,10 +266,6 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, if (level.getBlockEntity(pos) instanceof ConduitBundleBlockEntity conduitBundle) { if (conduitBundle.hasFacade() && FacadeHelper.areFacadesVisible()) { - SoundType soundtype = state.getSoundType(level, pos, player); - level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - if (!level.isClientSide()) { if (!player.getAbilities().instabuild) { conduitBundle.dropFacadeItem(); @@ -288,6 +284,10 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, if (conduitBundle.isEmpty()) { return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); } else { + SoundType soundtype = state.getSoundType(level, pos, player); + level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + level.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(player, state)); return false; } @@ -323,10 +323,6 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); } - SoundType soundtype = state.getSoundType(level, pos, player); - level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - if (level.isClientSide) { ConduitBreakParticle.addDestroyEffects(pos, state, conduit.value()); } @@ -336,6 +332,10 @@ public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, if (conduitBundle.isEmpty()) { return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); } else { + SoundType soundtype = state.getSoundType(level, pos, player); + level.playSound(player, pos, soundtype.getBreakSound(), SoundSource.BLOCKS, + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + level.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(player, state)); return false; } From 20e8ecd90e99ede13e123fc0ebd11c5d01fa23ab Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Thu, 30 Jan 2025 01:53:33 +0000 Subject: [PATCH 25/27] feat: Draft of a new filter menu base class to handle returning to a previously open GUI Untested and not used yet. --- .../base/common/menu/AbstractFilterMenu.java | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 enderio-base/src/main/java/com/enderio/base/common/menu/AbstractFilterMenu.java diff --git a/enderio-base/src/main/java/com/enderio/base/common/menu/AbstractFilterMenu.java b/enderio-base/src/main/java/com/enderio/base/common/menu/AbstractFilterMenu.java new file mode 100644 index 0000000000..92620491e3 --- /dev/null +++ b/enderio-base/src/main/java/com/enderio/base/common/menu/AbstractFilterMenu.java @@ -0,0 +1,140 @@ +package com.enderio.base.common.menu; + +import com.enderio.core.common.menu.BaseEnderMenu; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.items.IItemHandler; +import org.jetbrains.annotations.Nullable; + +// TODO: Test, but should provide everything we need to open the filters from the conduit UI. +public abstract class AbstractFilterMenu extends BaseEnderMenu { + + public static int BACK_BUTTON_ID = 0; + + private final FilterAccess filterAccess; + + /** + * Server menu constructor + */ + protected AbstractFilterMenu(@Nullable MenuType menuType, int containerId, Inventory playerInventory, FilterAccess filterAccess) { + super(menuType, containerId, playerInventory); + this.filterAccess = filterAccess; + } + + /** + * Client menu constructor. + * Filter access should be created from the network buffer available in the client constructors. + */ + protected AbstractFilterMenu(@Nullable MenuType menuType, int containerId, Inventory playerInventory, + ClientFilterAccess filterAccess) { + super(menuType, containerId, playerInventory); + this.filterAccess = filterAccess; + } + + protected ItemStack getFilterStack() { + return filterAccess.getFilterItem(); + } + + @Override + public boolean stillValid(Player player) { + return filterAccess.stillValid(player); + } + + @Override + public boolean clickMenuButton(Player player, int id) { + if (id == BACK_BUTTON_ID) { + if (filterAccess.hasCustomBackDestination()) { + filterAccess.goBack(); + } else { + // Simply close the menu. + this.getPlayerInventory().player.closeContainer(); + } + return true; + } + + return super.clickMenuButton(player, id); + } + + public sealed interface FilterAccess { + ItemStack getFilterItem(); + boolean stillValid(Player player); + boolean hasCustomBackDestination(); + void goBack(); + } + + protected static final class ClientFilterAccess implements FilterAccess { + + public ItemStack stack = ItemStack.EMPTY; + + @Override + public ItemStack getFilterItem() { + return stack; + } + + @Override + public boolean stillValid(Player player) { + // TODO: Some way to verify on the client? + return true; + } + + @Override + public boolean hasCustomBackDestination() { + return false; + } + + @Override + public void goBack() { + } + } + + public record HandFilterAccess(ItemStack stack) implements FilterAccess { + + @Override + public ItemStack getFilterItem() { + return stack; + } + + @Override + public boolean stillValid(Player player) { + return player.getMainHandItem().equals(stack); + } + + @Override + public boolean hasCustomBackDestination() { + return false; + } + + @Override + public void goBack() { + } + } + + public record InventoryFilterAccess(ItemStack stack, IItemHandler itemHandler, int slot, Runnable goBackRunnable) implements FilterAccess { + + @Override + public ItemStack getFilterItem() { + return stack; + } + + @Override + public boolean stillValid(Player player) { + // TODO: Maybe check the position of the container too so we can determine if its in range? + // Assumption is that we are though because we've been opened from another gui. + return itemHandler.getStackInSlot(slot).equals(stack); + } + + @Override + public boolean hasCustomBackDestination() { + return true; + } + + @Override + public void goBack() { + if (hasCustomBackDestination()) { + goBackRunnable.run(); + } + } + } +} From 4697bf083d70d8db94a270947180062dc406b763 Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Thu, 30 Jan 2025 01:54:02 +0000 Subject: [PATCH 26/27] feat: Conduit screen type improvements, WIP. Many screen types render wrongly, working on getting them back up to speed with the new API changes. --- .../api/screen/ConduitScreenHelper.java | 9 --- .../api/screen/ConduitScreenType.java | 36 ++++++++--- .../api/screen/TwoSideConduitScreenType.java | 45 ++++++++++++++ .../client/gui/screen/ConduitScreen.java | 37 ++---------- .../screen/types/EnergyConduitScreenType.java | 18 +++--- .../screen/types/FluidConduitScreenType.java | 20 +++---- .../screen/types/ItemConduitScreenType.java | 26 ++++---- .../types/RedstoneConduitScreenType.java | 60 +++++++++++-------- 8 files changed, 148 insertions(+), 103 deletions(-) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/TwoSideConduitScreenType.java diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java index b1cd431071..2f6f18b578 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenHelper.java @@ -15,15 +15,6 @@ @ApiStatus.Experimental public interface ConduitScreenHelper { - // Positions - int getAreaLeft(); - - int getAreaTop(); - - int getUsableWidth(); - - int getUsableHeight(); - // Built-in widget support AbstractWidget addCheckbox(int x, int y, Supplier getter, Consumer setter); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java index cebf198192..4ab7cec1a1 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/ConduitScreenType.java @@ -7,15 +7,37 @@ @ApiStatus.Experimental public abstract class ConduitScreenType { + // Used for startX, startY + private static final int USABLE_START_X = 22; + private static final int USABLE_START_Y = 7; - // TODO: Other built-in behaviours like this. - // Could also create IOConduitScreenType with automated helpers for adding the - // toggles. - private boolean renderSideSeparator = false; + protected static final int SLOT_SIZE = 16; + protected static final int PADDED_SLOT_SIZE = SLOT_SIZE + 2; - public abstract void createWidgets(ConduitScreenHelper screen, ConduitMenuDataAccess dataAccess); + // All of these are estimates and will change after the GUI rewrite. + // With any luck, most UIs will just work if they rely upon these values. + protected static final int WIDTH = 162; + protected static final int HEIGHT = 100; - // TODO: Wrapper over guiGraphics? Means less breaks in the API? - public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { + @ApiStatus.Internal + public void createScreenWidgets(ConduitScreenHelper screen, int guiLeft, int guiTop, ConduitMenuDataAccess dataAccess) { + createWidgets(screen, guiLeft + USABLE_START_X, guiTop + USABLE_START_Y, dataAccess); + } + + @ApiStatus.Internal + public void renderScreenLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { + renderLabels(guiGraphics, USABLE_START_X, USABLE_START_Y, font, mouseX, mouseY); + } + + protected abstract void createWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess); + + /** + * Already projected into gui space (guiLeft & guiRight in Screen), so only local transformations required. + * @param guiGraphics + * @param font + * @param mouseX + * @param mouseY + */ + protected void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/TwoSideConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/TwoSideConduitScreenType.java new file mode 100644 index 0000000000..fcc510d92b --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/TwoSideConduitScreenType.java @@ -0,0 +1,45 @@ +package com.enderio.conduits.api.screen; + +import com.enderio.conduits.api.connection.config.ConnectionConfig; +import com.enderio.conduits.client.gui.screen.ConduitScreen; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; + +public abstract class TwoSideConduitScreenType extends ConduitScreenType { + + // Rows of 9, counts slot width and it's outline edge. + // TODO: Better name. + protected static final int RIGHT_START_X = PADDED_SLOT_SIZE * 5; + + // Titles default to perfect position to be alongside a checkbox. + protected int leftTitleX = PADDED_SLOT_SIZE; + protected int leftTitleY = 4; + protected Component leftTitle; + + protected int rightTitleX = RIGHT_START_X + PADDED_SLOT_SIZE; + protected int rightTitleY = 4; + protected Component rightTitle; + + @Override + protected void createWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { + createLeftWidgets(screen, startX, startY, dataAccess); + createRightWidgets(screen, startX + RIGHT_START_X, startY, dataAccess); + + // TODO: *could* implement sanity checks to ensure widgets are not outside their bounds? Might be nice static-time check, even if we only do it in dev envs? + } + + public abstract void createLeftWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess); + public abstract void createRightWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess); + + @Override + public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); + + // TODO: This should be a sprite. + guiGraphics.blit(ConduitScreen.TEXTURE, startX + (WIDTH / 2), startY, 255, 0, 1, 97); + + guiGraphics.drawString(font, leftTitle, startX + leftTitleX, startY + leftTitleY, 4210752, false); + guiGraphics.drawString(font, rightTitle, startX + rightTitleX, startY + rightTitleY, 4210752, false); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java index 88221fdd82..f1c2e82667 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/ConduitScreen.java @@ -125,16 +125,13 @@ public boolean hasScreenType() { public void addWidgets(ScreenHelper screenHelper) { if (screenType != null) { - screenType.createWidgets(screenHelper, dataAccess); + screenType.createScreenWidgets(screenHelper, getGuiLeft(), getGuiTop(), dataAccess); } } public void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { if (screenType != null) { - guiGraphics.pose().pushPose(); - guiGraphics.pose().translate(22, 7, 0); - screenType.renderLabels(guiGraphics, font, mouseX, mouseY); - guiGraphics.pose().popPose(); + screenType.renderScreenLabels(guiGraphics, font, mouseX, mouseY); } } @@ -176,31 +173,9 @@ public CompoundTag getExtraGuiData() { private class ScreenHelper implements ConduitScreenHelper { - @Override - public int getAreaLeft() { - return getGuiLeft() + 22; - } - - @Override - public int getAreaTop() { - return getGuiTop() + 7; - } - - @Override - public int getUsableWidth() { - // TODO - return 0; - } - - @Override - public int getUsableHeight() { - // TODO - return 0; - } - @Override public AbstractWidget addCheckbox(int x, int y, Supplier getter, Consumer setter) { - var widget = ToggleIconButton.createCheckbox(getAreaLeft() + x, getAreaTop() + y, getter, setter); + var widget = ToggleIconButton.createCheckbox(x, y, getter, setter); addRenderableWidget(widget); return widget; } @@ -208,7 +183,7 @@ public AbstractWidget addCheckbox(int x, int y, Supplier getter, Consum @Override public AbstractWidget addColorPicker(int x, int y, Component title, Supplier getter, Consumer setter) { - var widget = new DyeColorPickerWidget(getAreaLeft() + x, getAreaTop() + y, getter, setter, title); + var widget = new DyeColorPickerWidget(x, y, getter, setter, title); addRenderableWidget(widget); return widget; } @@ -216,7 +191,7 @@ public AbstractWidget addColorPicker(int x, int y, Component title, Supplier getter, Consumer setter) { - var widget = new RedstoneControlPickerWidget(getAreaLeft() + x, getAreaTop() + y, getter, setter, title); + var widget = new RedstoneControlPickerWidget(x, y, getter, setter, title); addRenderableWidget(widget); return widget; } @@ -226,7 +201,7 @@ public AbstractWidget addToggleButton(int x, int y, int width, int height, Compo Component disabledTitle, ResourceLocation enabledSprite, ResourceLocation disabledSprite, Supplier getter, Consumer setter) { - var widget = ToggleIconButton.of(getAreaLeft() + x, getAreaTop() + y, width, height, enabledSprite, + var widget = ToggleIconButton.of(x, y, width, height, enabledSprite, disabledSprite, enabledTitle, disabledTitle, getter, setter); addRenderableWidget(widget); return widget; diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java index 245a660ac0..b7f5a46259 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java @@ -12,17 +12,17 @@ public class EnergyConduitScreenType extends ConduitScreenType { @Override - public void createWidgets(ConduitScreenHelper screen, + public void createWidgets(ConduitScreenHelper screen, int guiLeft, int guiTop, ConduitMenuDataAccess dataAccess) { // Add insert/extract checkboxes. - screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isSend(), + screen.addCheckbox(guiLeft + 0, guiTop + 0, () -> dataAccess.getConnectionConfig().isSend(), value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); - screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isReceive(), + screen.addCheckbox(guiLeft + 90, guiTop + 0, () -> dataAccess.getConnectionConfig().isReceive(), value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); // Redstone control - var redstoneChannelWidget = screen.addColorPicker(90 + 16 + 4, 20, ConduitLang.REDSTONE_CHANNEL, + var redstoneChannelWidget = screen.addColorPicker(guiLeft + 90 + 16 + 4, guiTop + 20, ConduitLang.REDSTONE_CHANNEL, () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); @@ -31,7 +31,7 @@ public void createWidgets(ConduitScreenHelper screen, .receiveRedstoneControl() .isRedstoneSensitive()); - screen.addRedstoneControlPicker(90, 20, EIOLang.REDSTONE_MODE, + screen.addRedstoneControlPicker(guiLeft + 90, guiTop + 20, EIOLang.REDSTONE_MODE, () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); @@ -39,10 +39,10 @@ public void createWidgets(ConduitScreenHelper screen, } @Override - public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { - super.renderLabels(guiGraphics, font, mouseX, mouseY); + public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); - guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, 16 + 2, 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 90 + 16 + 2, 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, startX + 16 + 2, startY + 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, startY + 90 + 16 + 2, startY + 4, 4210752, false); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java index 8d6607bdc4..744736eaba 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java @@ -39,23 +39,23 @@ public class FluidConduitScreenType extends ConduitScreenType dataAccess) { int currentY = 0; // Add insert/extract checkboxes. - screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isSend(), + screen.addCheckbox(guiLeft + 0, guiTop + 0, () -> dataAccess.getConnectionConfig().isSend(), value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); - screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isReceive(), + screen.addCheckbox(guiLeft + 90, guiTop + 0, () -> dataAccess.getConnectionConfig().isReceive(), value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); currentY += 20; // Locked fluid widget if (dataAccess.conduit() instanceof FluidConduit fluidConduit && !fluidConduit.isMultiFluid()) { - screen.addRenderableWidget(new FluidWidget(screen.getAreaLeft(), screen.getAreaTop() + currentY, + screen.addRenderableWidget(new FluidWidget(guiLeft, guiTop + currentY, () -> getLockedFluid(dataAccess), () -> PacketDistributor.sendToServer(new C2SClearLockedFluidPacket(dataAccess.getBlockPos())))); } else { @@ -87,7 +87,7 @@ public void createWidgets(ConduitScreenHelper screen, */ // Redstone control - var redstoneChannelWidget = screen.addColorPicker(90 + 16 + 4, currentY, ConduitLang.REDSTONE_CHANNEL, + var redstoneChannelWidget = screen.addColorPicker(guiLeft + 90 + 16 + 4, guiTop + currentY, ConduitLang.REDSTONE_CHANNEL, () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); @@ -96,7 +96,7 @@ public void createWidgets(ConduitScreenHelper screen, .receiveRedstoneControl() .isRedstoneSensitive()); - screen.addRedstoneControlPicker(90, currentY, EIOLang.REDSTONE_MODE, + screen.addRedstoneControlPicker(guiLeft + 90, guiTop + currentY, EIOLang.REDSTONE_MODE, () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); @@ -117,11 +117,11 @@ private Fluid getLockedFluid(ConduitMenuDataAccess } @Override - public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { - super.renderLabels(guiGraphics, font, mouseX, mouseY); + public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); - guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, 16 + 2, 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 90 + 16 + 2, 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, startX + 16 + 2, startY + 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, startX + 90 + 16 + 2, startY + 4, 4210752, false); } private static class FluidWidget extends AbstractWidget { diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java index f723fd1403..fa41101471 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java @@ -19,37 +19,37 @@ public class ItemConduitScreenType extends ConduitScreenType dataAccess) { // Add insert/extract checkboxes. - screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isSend(), + screen.addCheckbox(guiLeft + 0, guiTop + 0, () -> dataAccess.getConnectionConfig().isSend(), value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); - screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isReceive(), + screen.addCheckbox(guiLeft + 90, guiTop + 0, () -> dataAccess.getConnectionConfig().isReceive(), value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); // Channel colors - screen.addColorPicker(0, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), + screen.addColorPicker(guiLeft + 0, guiTop + 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); - screen.addColorPicker(90, 20, ConduitLang.CONDUIT_CHANNEL, + screen.addColorPicker(guiLeft + 90, guiTop + 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().receiveColor(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); // Round robin - screen.addToggleButton(90 + 16 + 4, 20, 16, 16, ConduitLang.ROUND_ROBIN_ENABLED, + screen.addToggleButton(guiLeft + 90 + 16 + 4, guiTop + 20, 16, 16, ConduitLang.ROUND_ROBIN_ENABLED, ConduitLang.ROUND_ROBIN_DISABLED, ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, () -> dataAccess.getConnectionConfig().isRoundRobin(), value -> dataAccess.updateConnectionConfig(config -> config.withIsRoundRobin(value))); // Self feed - screen.addToggleButton(90 + (16 + 4) * 2, 20, 16, 16, ConduitLang.SELF_FEED_ENABLED, + screen.addToggleButton(guiLeft + 90 + (16 + 4) * 2, guiTop + 20, 16, 16, ConduitLang.SELF_FEED_ENABLED, ConduitLang.SELF_FEED_DISABLED, ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, () -> dataAccess.getConnectionConfig().isSelfFeed(), value -> dataAccess.updateConnectionConfig(config -> config.withIsSelfFeed(value))); // Redstone control - var redstoneChannelWidget = screen.addColorPicker(90 + 16 + 4, 40, ConduitLang.REDSTONE_CHANNEL, + var redstoneChannelWidget = screen.addColorPicker(guiLeft + 90 + 16 + 4, guiTop + 40, ConduitLang.REDSTONE_CHANNEL, () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); @@ -58,7 +58,7 @@ public void createWidgets(ConduitScreenHelper screen, .receiveRedstoneControl() .isRedstoneSensitive()); - screen.addRedstoneControlPicker(90, 40, EIOLang.REDSTONE_MODE, + screen.addRedstoneControlPicker(guiLeft + 90, guiTop + 40, EIOLang.REDSTONE_MODE, () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); @@ -66,10 +66,10 @@ public void createWidgets(ConduitScreenHelper screen, } @Override - public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { - super.renderLabels(guiGraphics, font, mouseX, mouseY); + public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); - guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, 16 + 2, 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, 90 + 16 + 2, 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, startX + 16 + 2, startY + 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, startX + 90 + 16 + 2, startY + 4, 4210752, false); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java index fc5dcf0c59..9745fa3807 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java @@ -2,45 +2,57 @@ import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; -import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.api.screen.TwoSideConduitScreenType; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; import com.enderio.conduits.common.init.ConduitLang; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; -public class RedstoneConduitScreenType extends ConduitScreenType { +public class RedstoneConduitScreenType extends TwoSideConduitScreenType { + + public RedstoneConduitScreenType() { + // TODO: Should be ctor params. + leftTitle = ConduitLang.CONDUIT_INPUT; + rightTitle = ConduitLang.CONDUIT_OUTPUT; + } + @Override - public void createWidgets(ConduitScreenHelper screen, - ConduitMenuDataAccess dataAccess) { - // Add insert/extract checkboxes. - screen.addCheckbox(0, 0, () -> dataAccess.getConnectionConfig().isReceive(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + public void createLeftWidgets(ConduitScreenHelper screen, int startX, int startY, + ConduitMenuDataAccess dataAccess) { + + // Send checkbox + screen.addCheckbox(startX, startY, () -> dataAccess.getConnectionConfig().isReceive(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); - screen.addCheckbox(90, 0, () -> dataAccess.getConnectionConfig().isSend(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); + // Send channel + screen.addColorPicker(startX, startY + 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().receiveColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + } + + @Override + public void createRightWidgets(ConduitScreenHelper screen, int startX, int startY, + ConduitMenuDataAccess dataAccess) { - // Channel colors - screen.addColorPicker(0, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().receiveColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + // Send checkbox + screen.addCheckbox(startX, startY, () -> dataAccess.getConnectionConfig().isSend(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); - screen.addColorPicker(90, 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + // Send channel + screen.addColorPicker(startX, startY + 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); // Strong signal - screen.addCheckbox(90, 40, () -> dataAccess.getConnectionConfig().isStrongOutputSignal(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsStrongOutputSignal(value))); + screen.addCheckbox(startX, startY + 40, () -> dataAccess.getConnectionConfig().isStrongOutputSignal(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsStrongOutputSignal(value))); } @Override - public void renderLabels(GuiGraphics guiGraphics, Font font, int mouseX, int mouseY) { - super.renderLabels(guiGraphics, font, mouseX, mouseY); - - guiGraphics.drawString(font, ConduitLang.CONDUIT_INPUT, 16 + 2, 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_OUTPUT, 90 + 16 + 2, 4, 4210752, false); + public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); - guiGraphics.drawString(font, ConduitLang.CONDUIT_REDSTONE_SIGNAL_COLOR, 16 + 2, 20 + 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_REDSTONE_SIGNAL_COLOR, 90 + 16 + 2, 20 + 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_REDSTONE_SIGNAL_COLOR, startX + PADDED_SLOT_SIZE, startY + 20 + 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_REDSTONE_SIGNAL_COLOR, startX + RIGHT_START_X + PADDED_SLOT_SIZE, startY + 20 + 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_REDSTONE_STRONG_SIGNAL, 90 + 16 + 2, 40 + 4, 4210752, false); + guiGraphics.drawString(font, ConduitLang.CONDUIT_REDSTONE_STRONG_SIGNAL, startX + RIGHT_START_X + PADDED_SLOT_SIZE, startY + 40 + 4, 4210752, false); } } From a22b9400acf6fbb1f0bb582855d58fe7a7232b0f Mon Sep 17 00:00:00 2001 From: Reece Mackie <20544390+Rover656@users.noreply.github.com> Date: Sat, 1 Feb 2025 02:23:49 +0000 Subject: [PATCH 27/27] feat: Finished base class for common IO conduit screen impl --- .../api/screen/IOConduitScreenType.java | 77 ++++++++++++++++++ .../api/screen/TwoSideConduitScreenType.java | 45 ----------- .../screen/types/EnergyConduitScreenType.java | 39 +++++----- .../screen/types/FluidConduitScreenType.java | 78 +++++++++---------- .../screen/types/ItemConduitScreenType.java | 71 +++++++++-------- .../types/RedstoneConduitScreenType.java | 34 +++++--- 6 files changed, 194 insertions(+), 150 deletions(-) create mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/IOConduitScreenType.java delete mode 100644 enderio-conduits/src/main/java/com/enderio/conduits/api/screen/TwoSideConduitScreenType.java diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/IOConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/IOConduitScreenType.java new file mode 100644 index 0000000000..d845fcee08 --- /dev/null +++ b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/IOConduitScreenType.java @@ -0,0 +1,77 @@ +package com.enderio.conduits.api.screen; + +import com.enderio.conduits.api.connection.config.IOConnectionConfig; +import com.enderio.conduits.client.gui.screen.ConduitScreen; +import com.enderio.conduits.common.init.ConduitLang; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.ApiStatus; + +/** + * Default implementation of a conduit screen type for IO connections. + * Adds checkboxes and sided titles. + */ +@ApiStatus.Experimental +public abstract class IOConduitScreenType extends ConduitScreenType { + + // Rows of 9, counts slot width and it's outline edge. + // TODO: Better name. + protected static final int RIGHT_START_X = PADDED_SLOT_SIZE * 5; + + // Titles default to perfect position to be alongside a checkbox. + protected int leftTitleX = PADDED_SLOT_SIZE; + protected int leftTitleY = 4; + protected Component leftTitle = ConduitLang.CONDUIT_INSERT; + + protected int rightTitleX = RIGHT_START_X + PADDED_SLOT_SIZE; + protected int rightTitleY = 4; + protected Component rightTitle = ConduitLang.CONDUIT_EXTRACT; + + @Override + protected void createWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { + createLeftWidgets(screen, startX, startY, dataAccess); + createRightWidgets(screen, startX + RIGHT_START_X, startY, dataAccess); + + // TODO: *could* implement sanity checks to ensure widgets are not outside their bounds? Might be nice static-time check, even if we only do it in dev envs? + } + + public void createLeftWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { + screen.addCheckbox(startX, startY, () -> getLeftEnabled(dataAccess.getConnectionConfig()), + value -> dataAccess.updateConnectionConfig(config -> setLeftEnabled(config, value))); + } + + public void createRightWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { + screen.addCheckbox(startX, startY, () -> getRightEnabled(dataAccess.getConnectionConfig()), + value -> dataAccess.updateConnectionConfig(config -> setRightEnabled(config, value))); + } + + public boolean getLeftEnabled(U config) { + return config.isSend(); + } + + public boolean getRightEnabled(U config) { + return config.isReceive(); + } + + /** + * Unless you changed the order of the titles, this should edit isSend. + */ + protected abstract U setLeftEnabled(U config, boolean isEnabled); + + /** + * Unless you changed the order of the titles, this should edit isReceive. + */ + protected abstract U setRightEnabled(U config, boolean isEnabled); + + @Override + public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); + + // TODO: This should be a sprite. + guiGraphics.blit(ConduitScreen.TEXTURE, startX + (WIDTH / 2), startY, 255, 0, 1, 97); + + guiGraphics.drawString(font, leftTitle, startX + leftTitleX, startY + leftTitleY, 4210752, false); + guiGraphics.drawString(font, rightTitle, startX + rightTitleX, startY + rightTitleY, 4210752, false); + } +} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/TwoSideConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/TwoSideConduitScreenType.java deleted file mode 100644 index fcc510d92b..0000000000 --- a/enderio-conduits/src/main/java/com/enderio/conduits/api/screen/TwoSideConduitScreenType.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.enderio.conduits.api.screen; - -import com.enderio.conduits.api.connection.config.ConnectionConfig; -import com.enderio.conduits.client.gui.screen.ConduitScreen; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.chat.Component; - -public abstract class TwoSideConduitScreenType extends ConduitScreenType { - - // Rows of 9, counts slot width and it's outline edge. - // TODO: Better name. - protected static final int RIGHT_START_X = PADDED_SLOT_SIZE * 5; - - // Titles default to perfect position to be alongside a checkbox. - protected int leftTitleX = PADDED_SLOT_SIZE; - protected int leftTitleY = 4; - protected Component leftTitle; - - protected int rightTitleX = RIGHT_START_X + PADDED_SLOT_SIZE; - protected int rightTitleY = 4; - protected Component rightTitle; - - @Override - protected void createWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { - createLeftWidgets(screen, startX, startY, dataAccess); - createRightWidgets(screen, startX + RIGHT_START_X, startY, dataAccess); - - // TODO: *could* implement sanity checks to ensure widgets are not outside their bounds? Might be nice static-time check, even if we only do it in dev envs? - } - - public abstract void createLeftWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess); - public abstract void createRightWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess); - - @Override - public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { - super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); - - // TODO: This should be a sprite. - guiGraphics.blit(ConduitScreen.TEXTURE, startX + (WIDTH / 2), startY, 255, 0, 1, 97); - - guiGraphics.drawString(font, leftTitle, startX + leftTitleX, startY + leftTitleY, 4210752, false); - guiGraphics.drawString(font, rightTitle, startX + rightTitleX, startY + rightTitleY, 4210752, false); - } -} diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java index b7f5a46259..53c51ba8eb 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/EnergyConduitScreenType.java @@ -4,45 +4,42 @@ import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.api.screen.IOConduitScreenType; import com.enderio.conduits.common.conduit.type.energy.EnergyConduitConnectionConfig; import com.enderio.conduits.common.init.ConduitLang; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; -public class EnergyConduitScreenType extends ConduitScreenType { +public class EnergyConduitScreenType extends IOConduitScreenType { @Override - public void createWidgets(ConduitScreenHelper screen, int guiLeft, int guiTop, - ConduitMenuDataAccess dataAccess) { - // Add insert/extract checkboxes. - screen.addCheckbox(guiLeft + 0, guiTop + 0, () -> dataAccess.getConnectionConfig().isSend(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); - - screen.addCheckbox(guiLeft + 90, guiTop + 0, () -> dataAccess.getConnectionConfig().isReceive(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + public void createRightWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { + super.createRightWidgets(screen, startX, startY, dataAccess); // Redstone control - var redstoneChannelWidget = screen.addColorPicker(guiLeft + 90 + 16 + 4, guiTop + 20, ConduitLang.REDSTONE_CHANNEL, - () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); + var redstoneChannelWidget = screen.addColorPicker(startX + 16 + 4, startY + 20, ConduitLang.REDSTONE_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); // Only show the redstone widget when redstone control is sensitive to signals. screen.addPreRenderAction(() -> redstoneChannelWidget.visible = dataAccess.getConnectionConfig() - .receiveRedstoneControl() - .isRedstoneSensitive()); + .receiveRedstoneControl() + .isRedstoneSensitive()); - screen.addRedstoneControlPicker(guiLeft + 90, guiTop + 20, EIOLang.REDSTONE_MODE, - () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); + screen.addRedstoneControlPicker(startX, startY + 20, EIOLang.REDSTONE_MODE, + () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); // TODO: Show redstone signal indicators using the extra NBT payload. } @Override - public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { - super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); + protected EnergyConduitConnectionConfig setLeftEnabled(EnergyConduitConnectionConfig config, boolean isEnabled) { + return config.withIsSend(isEnabled); + } - guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, startX + 16 + 2, startY + 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, startY + 90 + 16 + 2, startY + 4, 4210752, false); + @Override + protected EnergyConduitConnectionConfig setRightEnabled(EnergyConduitConnectionConfig config, boolean isEnabled) { + return config.withIsReceive(isEnabled); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java index 744736eaba..973b8830b6 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/FluidConduitScreenType.java @@ -5,6 +5,7 @@ import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.api.screen.IOConduitScreenType; import com.enderio.conduits.common.conduit.type.fluid.FluidConduit; import com.enderio.conduits.common.conduit.type.fluid.FluidConduitConnectionConfig; import com.enderio.conduits.common.init.ConduitLang; @@ -31,7 +32,7 @@ import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.network.PacketDistributor; -public class FluidConduitScreenType extends ConduitScreenType { +public class FluidConduitScreenType extends IOConduitScreenType { private static final ResourceLocation ICON_ROUND_ROBIN_ENABLED = EnderIO.loc("icon/round_robin_enabled"); private static final ResourceLocation ICON_ROUND_ROBIN_DISABLED = EnderIO.loc("icon/round_robin_disabled"); @@ -39,36 +40,31 @@ public class FluidConduitScreenType extends ConduitScreenType dataAccess) { - - int currentY = 0; - - // Add insert/extract checkboxes. - screen.addCheckbox(guiLeft + 0, guiTop + 0, () -> dataAccess.getConnectionConfig().isSend(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); - - screen.addCheckbox(guiLeft + 90, guiTop + 0, () -> dataAccess.getConnectionConfig().isReceive(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); - - currentY += 20; + public void createLeftWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { + super.createLeftWidgets(screen, startX, startY, dataAccess); // Locked fluid widget if (dataAccess.conduit() instanceof FluidConduit fluidConduit && !fluidConduit.isMultiFluid()) { - screen.addRenderableWidget(new FluidWidget(guiLeft, guiTop + currentY, - () -> getLockedFluid(dataAccess), - () -> PacketDistributor.sendToServer(new C2SClearLockedFluidPacket(dataAccess.getBlockPos())))); + screen.addRenderableWidget(new FluidWidget(startX, startY + 20, + () -> getLockedFluid(dataAccess), + () -> PacketDistributor.sendToServer(new C2SClearLockedFluidPacket(dataAccess.getBlockPos())))); } else { // Channel colors - screen.addColorPicker(0, currentY, ConduitLang.CONDUIT_CHANNEL, - () -> dataAccess.getConnectionConfig().sendColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + screen.addColorPicker(startX, startY + 20, ConduitLang.CONDUIT_CHANNEL, + () -> dataAccess.getConnectionConfig().sendColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + } + } - screen.addColorPicker(90, currentY, ConduitLang.CONDUIT_CHANNEL, - () -> dataAccess.getConnectionConfig().receiveColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + @Override + public void createRightWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { + super.createRightWidgets(screen, startX, startY, dataAccess); - currentY += 20; + if (dataAccess.conduit() instanceof FluidConduit fluidConduit && fluidConduit.isMultiFluid()) { + // Channel colors + screen.addColorPicker(startX, startY + 20, ConduitLang.CONDUIT_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); } // TODO: Could be good fluid conduit features? @@ -87,22 +83,32 @@ public void createWidgets(ConduitScreenHelper screen, int guiLeft, int guiTop, */ // Redstone control - var redstoneChannelWidget = screen.addColorPicker(guiLeft + 90 + 16 + 4, guiTop + currentY, ConduitLang.REDSTONE_CHANNEL, - () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); + var redstoneChannelWidget = screen.addColorPicker(startX + 16 + 4, startY + 40, ConduitLang.REDSTONE_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); // Only show the redstone widget when redstone control is sensitive to signals. screen.addPreRenderAction(() -> redstoneChannelWidget.visible = dataAccess.getConnectionConfig() - .receiveRedstoneControl() - .isRedstoneSensitive()); + .receiveRedstoneControl() + .isRedstoneSensitive()); - screen.addRedstoneControlPicker(guiLeft + 90, guiTop + currentY, EIOLang.REDSTONE_MODE, - () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); + screen.addRedstoneControlPicker(startX, startY + 40, EIOLang.REDSTONE_MODE, + () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); // TODO: Show redstone signal indicators using the extra NBT payload. } + @Override + protected FluidConduitConnectionConfig setLeftEnabled(FluidConduitConnectionConfig config, boolean isEnabled) { + return config.withIsSend(isEnabled); + } + + @Override + protected FluidConduitConnectionConfig setRightEnabled(FluidConduitConnectionConfig config, boolean isEnabled) { + return config.withIsReceive(isEnabled); + } + private Fluid getLockedFluid(ConduitMenuDataAccess dataAccess) { var tag = dataAccess.getExtraGuiData(); if (tag == null) { @@ -116,14 +122,6 @@ private Fluid getLockedFluid(ConduitMenuDataAccess return BuiltInRegistries.FLUID.get(ResourceLocation.parse(tag.getString("LockedFluid"))); } - @Override - public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { - super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); - - guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, startX + 16 + 2, startY + 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, startX + 90 + 16 + 2, startY + 4, 4210752, false); - } - private static class FluidWidget extends AbstractWidget { private static final ResourceLocation WIDGET_TEXTURE = EnderIO.loc("textures/gui/fluidbackground.png"); diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java index fa41101471..a28e70b26d 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/ItemConduitScreenType.java @@ -5,13 +5,14 @@ import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; import com.enderio.conduits.api.screen.ConduitScreenType; +import com.enderio.conduits.api.screen.IOConduitScreenType; import com.enderio.conduits.common.conduit.type.item.ItemConduitConnectionConfig; import com.enderio.conduits.common.init.ConduitLang; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; -public class ItemConduitScreenType extends ConduitScreenType { +public class ItemConduitScreenType extends IOConduitScreenType { private static final ResourceLocation ICON_ROUND_ROBIN_ENABLED = EnderIO.loc("icon/round_robin_enabled"); private static final ResourceLocation ICON_ROUND_ROBIN_DISABLED = EnderIO.loc("icon/round_robin_disabled"); @@ -19,57 +20,59 @@ public class ItemConduitScreenType extends ConduitScreenType dataAccess) { - // Add insert/extract checkboxes. - screen.addCheckbox(guiLeft + 0, guiTop + 0, () -> dataAccess.getConnectionConfig().isSend(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); + public void createLeftWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { + super.createLeftWidgets(screen, startX, startY, dataAccess); - screen.addCheckbox(guiLeft + 90, guiTop + 0, () -> dataAccess.getConnectionConfig().isReceive(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + // Channel color + screen.addColorPicker(startX, startY + 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + } - // Channel colors - screen.addColorPicker(guiLeft + 0, guiTop + 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withSendColor(value))); + @Override + public void createRightWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { + super.createRightWidgets(screen, startX, startY, dataAccess); - screen.addColorPicker(guiLeft + 90, guiTop + 20, ConduitLang.CONDUIT_CHANNEL, - () -> dataAccess.getConnectionConfig().receiveColor(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); + // Channel color + screen.addColorPicker(startX, startY + 20, ConduitLang.CONDUIT_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveColor(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveColor(value))); // Round robin - screen.addToggleButton(guiLeft + 90 + 16 + 4, guiTop + 20, 16, 16, ConduitLang.ROUND_ROBIN_ENABLED, - ConduitLang.ROUND_ROBIN_DISABLED, ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, - () -> dataAccess.getConnectionConfig().isRoundRobin(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsRoundRobin(value))); + screen.addToggleButton(startX + 16 + 4, startY + 20, 16, 16, ConduitLang.ROUND_ROBIN_ENABLED, + ConduitLang.ROUND_ROBIN_DISABLED, ICON_ROUND_ROBIN_ENABLED, ICON_ROUND_ROBIN_DISABLED, + () -> dataAccess.getConnectionConfig().isRoundRobin(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsRoundRobin(value))); // Self feed - screen.addToggleButton(guiLeft + 90 + (16 + 4) * 2, guiTop + 20, 16, 16, ConduitLang.SELF_FEED_ENABLED, - ConduitLang.SELF_FEED_DISABLED, ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, - () -> dataAccess.getConnectionConfig().isSelfFeed(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSelfFeed(value))); + screen.addToggleButton(startX + (16 + 4) * 2, startY + 20, 16, 16, ConduitLang.SELF_FEED_ENABLED, + ConduitLang.SELF_FEED_DISABLED, ICON_SELF_FEED_ENABLED, ICON_SELF_FEED_DISABLED, + () -> dataAccess.getConnectionConfig().isSelfFeed(), + value -> dataAccess.updateConnectionConfig(config -> config.withIsSelfFeed(value))); // Redstone control - var redstoneChannelWidget = screen.addColorPicker(guiLeft + 90 + 16 + 4, guiTop + 40, ConduitLang.REDSTONE_CHANNEL, - () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); + var redstoneChannelWidget = screen.addColorPicker(startX + 16 + 4, startY + 40, ConduitLang.REDSTONE_CHANNEL, + () -> dataAccess.getConnectionConfig().receiveRedstoneChannel(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneChannel(value))); // Only show the redstone widget when redstone control is sensitive to signals. screen.addPreRenderAction(() -> redstoneChannelWidget.visible = dataAccess.getConnectionConfig() - .receiveRedstoneControl() - .isRedstoneSensitive()); + .receiveRedstoneControl() + .isRedstoneSensitive()); - screen.addRedstoneControlPicker(guiLeft + 90, guiTop + 40, EIOLang.REDSTONE_MODE, - () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), - value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); + screen.addRedstoneControlPicker(startX, startY + 40, EIOLang.REDSTONE_MODE, + () -> dataAccess.getConnectionConfig().receiveRedstoneControl(), + value -> dataAccess.updateConnectionConfig(config -> config.withReceiveRedstoneControl(value))); // TODO: Show redstone signal indicators using the extra NBT payload. } @Override - public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { - super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY); + protected ItemConduitConnectionConfig setLeftEnabled(ItemConduitConnectionConfig config, boolean isEnabled) { + return config.withIsSend(isEnabled); + } - guiGraphics.drawString(font, ConduitLang.CONDUIT_INSERT, startX + 16 + 2, startY + 4, 4210752, false); - guiGraphics.drawString(font, ConduitLang.CONDUIT_EXTRACT, startX + 90 + 16 + 2, startY + 4, 4210752, false); + @Override + protected ItemConduitConnectionConfig setRightEnabled(ItemConduitConnectionConfig config, boolean isEnabled) { + return config.withIsReceive(isEnabled); } } diff --git a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java index 9745fa3807..342aee92d5 100644 --- a/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java +++ b/enderio-conduits/src/main/java/com/enderio/conduits/client/gui/screen/types/RedstoneConduitScreenType.java @@ -2,13 +2,13 @@ import com.enderio.conduits.api.screen.ConduitMenuDataAccess; import com.enderio.conduits.api.screen.ConduitScreenHelper; -import com.enderio.conduits.api.screen.TwoSideConduitScreenType; +import com.enderio.conduits.api.screen.IOConduitScreenType; import com.enderio.conduits.common.conduit.type.redstone.RedstoneConduitConnectionConfig; import com.enderio.conduits.common.init.ConduitLang; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; -public class RedstoneConduitScreenType extends TwoSideConduitScreenType { +public class RedstoneConduitScreenType extends IOConduitScreenType { public RedstoneConduitScreenType() { // TODO: Should be ctor params. @@ -19,10 +19,7 @@ public RedstoneConduitScreenType() { @Override public void createLeftWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { - - // Send checkbox - screen.addCheckbox(startX, startY, () -> dataAccess.getConnectionConfig().isReceive(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsReceive(value))); + super.createLeftWidgets(screen, startX, startY, dataAccess); // Send channel screen.addColorPicker(startX, startY + 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().receiveColor(), @@ -32,10 +29,7 @@ public void createLeftWidgets(ConduitScreenHelper screen, int startX, int startY @Override public void createRightWidgets(ConduitScreenHelper screen, int startX, int startY, ConduitMenuDataAccess dataAccess) { - - // Send checkbox - screen.addCheckbox(startX, startY, () -> dataAccess.getConnectionConfig().isSend(), - value -> dataAccess.updateConnectionConfig(config -> config.withIsSend(value))); + super.createRightWidgets(screen, startX, startY, dataAccess); // Send channel screen.addColorPicker(startX, startY + 20, ConduitLang.CONDUIT_CHANNEL, () -> dataAccess.getConnectionConfig().sendColor(), @@ -46,6 +40,26 @@ public void createRightWidgets(ConduitScreenHelper screen, int startX, int start value -> dataAccess.updateConnectionConfig(config -> config.withIsStrongOutputSignal(value))); } + @Override + public boolean getLeftEnabled(RedstoneConduitConnectionConfig config) { + return config.isReceive(); + } + + @Override + public boolean getRightEnabled(RedstoneConduitConnectionConfig config) { + return config.isSend(); + } + + @Override + protected RedstoneConduitConnectionConfig setLeftEnabled(RedstoneConduitConnectionConfig config, boolean isEnabled) { + return config.withIsReceive(isEnabled); + } + + @Override + protected RedstoneConduitConnectionConfig setRightEnabled(RedstoneConduitConnectionConfig config, boolean isEnabled) { + return config.withIsSend(isEnabled); + } + @Override public void renderLabels(GuiGraphics guiGraphics, int startX, int startY, Font font, int mouseX, int mouseY) { super.renderLabels(guiGraphics, startX, startY, font, mouseX, mouseY);