From fcc117bf3410cb5468a667b21031e96d2326d129 Mon Sep 17 00:00:00 2001 From: MrTJP Date: Thu, 20 Jun 2024 13:04:28 -0400 Subject: [PATCH] internal: simplify IConnectable mask change events --- .../core/part/IConnectableCenterPart.java | 4 +- .../core/part/IConnectableFacePart.java | 6 +-- .../core/part/IConnectablePart.java | 47 +++++++++------- .../projectred/integration/part/GatePart.java | 10 ++-- .../transmission/part/BaseCenterWirePart.java | 16 +++--- .../transmission/part/BaseFaceWirePart.java | 16 +++--- .../transmission/part/BundledCablePart.java | 42 +++------------ .../transmission/part/FacePowerWire.java | 19 +++---- .../part/FramedBundledCablePart.java | 41 +++----------- .../transmission/part/FramedPowerWire.java | 13 ++--- .../transmission/part/FramedRedwirePart.java | 38 ++----------- .../transmission/part/RedwirePart.java | 53 +++++-------------- 12 files changed, 90 insertions(+), 215 deletions(-) diff --git a/core/src/main/java/mrtjp/projectred/core/part/IConnectableCenterPart.java b/core/src/main/java/mrtjp/projectred/core/part/IConnectableCenterPart.java index bd53742b1..01228449f 100644 --- a/core/src/main/java/mrtjp/projectred/core/part/IConnectableCenterPart.java +++ b/core/src/main/java/mrtjp/projectred/core/part/IConnectableCenterPart.java @@ -58,7 +58,7 @@ default boolean connectStraight(IConnectable part, int s, int edgeRot) { connMap |= 0x01 << s; if (connMap != getConnMap()) { setConnMap(connMap); - onMaskChanged(); + maskChangeEvent(false, true); } return true; } @@ -72,7 +72,7 @@ default boolean connectInternal(IConnectable part, int s) { connMap |= 0x40 << s; if (connMap != getConnMap()) { setConnMap(connMap); - onMaskChanged(); + maskChangeEvent(true, false); } return true; } diff --git a/core/src/main/java/mrtjp/projectred/core/part/IConnectableFacePart.java b/core/src/main/java/mrtjp/projectred/core/part/IConnectableFacePart.java index e86bb0ce9..cda131b6a 100644 --- a/core/src/main/java/mrtjp/projectred/core/part/IConnectableFacePart.java +++ b/core/src/main/java/mrtjp/projectred/core/part/IConnectableFacePart.java @@ -138,7 +138,7 @@ default boolean connectCorner(IConnectable part, int r, int edgeRot) { if (setRenderFlag(part)) connMap |= 0x100000 << r; if (connMap != getConnMap()) { setConnMap(connMap); - onMaskChanged(); + maskChangeEvent(false, true); } return true; } @@ -152,7 +152,7 @@ default boolean connectStraight(IConnectable part, int r, int edgeRot) { connMap |= 0x10 << r; if (connMap != getConnMap()) { setConnMap(connMap); - onMaskChanged(); + maskChangeEvent(false, true); } return true; } @@ -166,7 +166,7 @@ default boolean connectInternal(IConnectable part, int r) { connMap |= 0x100 << r; if (connMap != getConnMap()) { setConnMap(connMap); - onMaskChanged(); + maskChangeEvent(true, false); } return true; } diff --git a/core/src/main/java/mrtjp/projectred/core/part/IConnectablePart.java b/core/src/main/java/mrtjp/projectred/core/part/IConnectablePart.java index ee7abaf7c..8c7864088 100644 --- a/core/src/main/java/mrtjp/projectred/core/part/IConnectablePart.java +++ b/core/src/main/java/mrtjp/projectred/core/part/IConnectablePart.java @@ -44,35 +44,42 @@ public interface IConnectablePart extends IConnectable { boolean updateInternalConns(); /** - * Start update chain starting from an internal change outward + * Updates internal connections first, then updates open conns. + * If open conns change, then external conns are updated. *

- * When using this method be sure to call TConnectableCommons#onMaskChanged() - * as needed as it is not called for you. - * - * @return true if a new connection was added or one was removed + * Use this when an internal part change occurs. */ - default boolean updateOutward() { - boolean changed = updateInternalConns(); - if (updateOpenConns()) changed |= updateExternalConns(); - return changed; + default void updateOutward() { + // Update internal conns first + boolean internal = updateInternalConns(); + // If open conns changed, update external conns as well + boolean external = updateOpenConns() && updateExternalConns(); + maskChangeEvent(internal, external); } /** - * Start update chain starting from an external change inward + * Full update for internal and external connections. *

- * When using this method be sure to call TConnectableCommons#onMaskChanged() - * as needed as it is not called for you. - * - * @return true if a new connection was added or one was removed + * Use when part is added, etc. */ - default boolean updateInward() { + default void updateInsideAndOutside() { updateOpenConns(); - boolean changed = updateInternalConns(); - changed |= updateExternalConns(); - return changed; + boolean internal = updateInternalConns(); + boolean external = updateExternalConns(); + maskChangeEvent(internal, external); } - void notifyAllExternals(); + /** + * Update external connections only. + *

+ * Use when only neighbors have changed and not any other part + */ + default void updateOutside() { + boolean external = updateExternalConns(); + maskChangeEvent(false, external); + } + + void maskChangeEvent(boolean internalChange, boolean externalChange); - void onMaskChanged(); + void notifyAllExternals(); } diff --git a/integration/src/main/java/mrtjp/projectred/integration/part/GatePart.java b/integration/src/main/java/mrtjp/projectred/integration/part/GatePart.java index 8a06e189e..6decd8173 100644 --- a/integration/src/main/java/mrtjp/projectred/integration/part/GatePart.java +++ b/integration/src/main/java/mrtjp/projectred/integration/part/GatePart.java @@ -244,7 +244,7 @@ public void onNeighborBlockChanged(BlockPos from) { if (dropIfCantStay()) { return; } - updateExternalConns(); + updateOutside(); onChange(); } } @@ -254,7 +254,7 @@ public void onAdded() { super.onAdded(); if (!level().isClientSide) { gateLogicSetup(); - updateInward(); + updateInsideAndOutside(); onChange(); } } @@ -290,7 +290,7 @@ protected void onChange() { } @Override - public void onMaskChanged() { + public void maskChangeEvent(boolean internalChange, boolean externalChange) { // Client doesn't need connmap, wont send } //endregion @@ -440,7 +440,7 @@ public InteractionResult activate(Player player, PartRayTraceResult hit, ItemSta protected void configure() { if (gateLogicCycleShape()) { - updateInward(); + updateInsideAndOutside(); tile().setChanged(); tile().notifyPartChange(this); sendShapeUpdate(); @@ -451,7 +451,7 @@ protected void configure() { protected void rotate() { setRotation((getRotation() + 1) % 4); - updateInward(); + updateInsideAndOutside(); tile().setChanged(); tile().notifyPartChange(this); sendOrientationUpdate(); diff --git a/transmission/src/main/java/mrtjp/projectred/transmission/part/BaseCenterWirePart.java b/transmission/src/main/java/mrtjp/projectred/transmission/part/BaseCenterWirePart.java index db2d9cca3..9ce499051 100644 --- a/transmission/src/main/java/mrtjp/projectred/transmission/part/BaseCenterWirePart.java +++ b/transmission/src/main/java/mrtjp/projectred/transmission/part/BaseCenterWirePart.java @@ -180,9 +180,7 @@ public SoundType getPlacementSound(UseOnContext context) { public void onPartChanged(@Nullable MultiPart part) { super.onPartChanged(part); if (!level().isClientSide) { - if (updateOutward()) { - onMaskChanged(); - } + updateOutward(); } } @@ -190,9 +188,7 @@ public void onPartChanged(@Nullable MultiPart part) { public void onNeighborBlockChanged(BlockPos from) { super.onNeighborBlockChanged(from); if (!level().isClientSide) { - if (updateExternalConns()) { - onMaskChanged(); - } + updateOutside(); } } @@ -200,7 +196,7 @@ public void onNeighborBlockChanged(BlockPos from) { public void onAdded() { super.onAdded(); if (!level().isClientSide) { - if (updateInward()) onMaskChanged(); + updateInsideAndOutside(); } } @@ -342,8 +338,10 @@ public boolean discoverOpen(int s) { } @Override - public void onMaskChanged() { - sendConnUpdate(); + public void maskChangeEvent(boolean internalChange, boolean externalChange) { + if (internalChange || externalChange) { + sendConnUpdate(); + } } //endregion } diff --git a/transmission/src/main/java/mrtjp/projectred/transmission/part/BaseFaceWirePart.java b/transmission/src/main/java/mrtjp/projectred/transmission/part/BaseFaceWirePart.java index d72862f2c..3db6966c2 100644 --- a/transmission/src/main/java/mrtjp/projectred/transmission/part/BaseFaceWirePart.java +++ b/transmission/src/main/java/mrtjp/projectred/transmission/part/BaseFaceWirePart.java @@ -136,9 +136,7 @@ public SoundType getPlacementSound(UseOnContext context) { public void onPartChanged(@Nullable MultiPart part) { super.onPartChanged(part); if (!level().isClientSide) { - if (updateOutward()) { - onMaskChanged(); - } + updateOutward(); } } @@ -147,9 +145,7 @@ public void onNeighborBlockChanged(BlockPos from) { super.onNeighborBlockChanged(from); if (!level().isClientSide) { if (dropIfCantStay()) return; - if (updateExternalConns()) { - onMaskChanged(); - } + updateOutside(); } } @@ -157,7 +153,7 @@ public void onNeighborBlockChanged(BlockPos from) { public void onAdded() { super.onAdded(); if (!level().isClientSide) { - if (updateInward()) onMaskChanged(); + updateInsideAndOutside(); } } @@ -260,8 +256,10 @@ public boolean discoverOpen(int r) { } @Override - public void onMaskChanged() { - sendConnUpdate(); + public void maskChangeEvent(boolean internalChange, boolean externalChange) { + if (internalChange || externalChange) { + sendConnUpdate(); + } } //endregion } diff --git a/transmission/src/main/java/mrtjp/projectred/transmission/part/BundledCablePart.java b/transmission/src/main/java/mrtjp/projectred/transmission/part/BundledCablePart.java index 60598a91f..99dd8c0b9 100644 --- a/transmission/src/main/java/mrtjp/projectred/transmission/part/BundledCablePart.java +++ b/transmission/src/main/java/mrtjp/projectred/transmission/part/BundledCablePart.java @@ -1,7 +1,6 @@ package mrtjp.projectred.transmission.part; import codechicken.lib.vec.Rotation; -import codechicken.multipart.api.part.MultiPart; import mrtjp.projectred.api.IBundledEmitter; import mrtjp.projectred.api.IBundledTile; import mrtjp.projectred.api.IConnectable; @@ -11,7 +10,6 @@ import mrtjp.projectred.core.RedstonePropagator; import mrtjp.projectred.core.part.IPropagationFacePart; import mrtjp.projectred.transmission.WireType; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -72,42 +70,14 @@ public void load(CompoundTag tag) { super.load(tag); setSignal(tag.getByteArray("signal")); } + //endregion + //region IConnectableFacePart overrides @Override - public void onPartChanged(@Nullable MultiPart part) { - if (!level().isClientSide) { - RedstonePropagator.logCalculation(); - if (updateOutward()) { - onMaskChanged(); - RedstonePropagator.propagateTo(this, FORCE); - } else { - RedstonePropagator.propagateTo(this, RISING); - } - } - } - - @Override - public void onNeighborBlockChanged(BlockPos from) { - if (!level().isClientSide) { - if (dropIfCantStay()) { - return; - } - RedstonePropagator.logCalculation(); - if (updateExternalConns()) { - onMaskChanged(); - RedstonePropagator.propagateTo(this, FORCE); - } else { - RedstonePropagator.propagateTo(this, RISING); - } - } - } - - @Override - public void onAdded() { - super.onAdded(); - if (!level().isClientSide) { - RedstonePropagator.propagateTo(this, RISING); - } + public void maskChangeEvent(boolean internalChange, boolean externalChange) { + super.maskChangeEvent(internalChange, externalChange); + RedstonePropagator.logCalculation(); + RedstonePropagator.propagateTo(this, internalChange || externalChange ? FORCE : RISING); } //endregion diff --git a/transmission/src/main/java/mrtjp/projectred/transmission/part/FacePowerWire.java b/transmission/src/main/java/mrtjp/projectred/transmission/part/FacePowerWire.java index dce3fdc5c..a3630503a 100644 --- a/transmission/src/main/java/mrtjp/projectred/transmission/part/FacePowerWire.java +++ b/transmission/src/main/java/mrtjp/projectred/transmission/part/FacePowerWire.java @@ -8,7 +8,6 @@ import mrtjp.projectred.core.power.IPowerConnectable; import mrtjp.projectred.core.power.PowerConductor; import mrtjp.projectred.transmission.WireType; -import net.minecraft.core.BlockPos; import javax.annotation.Nullable; import java.util.LinkedList; @@ -37,18 +36,6 @@ public List getConnectedConductors() { return connectedConductors; } - @Override - public void onMaskChanged() { - super.onMaskChanged(); - cacheInvalid = true; - } - - @Override - public void onNeighborBlockChanged(BlockPos from) { - super.onNeighborBlockChanged(from); - cacheInvalid = true; - } - private void recacheConductors() { connectedConductors.clear(); @@ -89,6 +76,12 @@ private void recacheConductors() { } //region Connections + @Override + public void maskChangeEvent(boolean internalChange, boolean externalChange) { + // Invalidate even if conns have not changed (adjacent conductors may have moved, etc) + cacheInvalid = true; + } + @Override public boolean discoverCornerOverride(int absDir) { int r = IConnectableFacePart.absoluteRot(this, absDir); diff --git a/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedBundledCablePart.java b/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedBundledCablePart.java index fe81b1c21..e2307cf18 100644 --- a/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedBundledCablePart.java +++ b/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedBundledCablePart.java @@ -1,6 +1,5 @@ package mrtjp.projectred.transmission.part; -import codechicken.multipart.api.part.MultiPart; import mrtjp.projectred.api.IBundledEmitter; import mrtjp.projectred.api.IBundledTile; import mrtjp.projectred.api.IConnectable; @@ -10,7 +9,6 @@ import mrtjp.projectred.core.RedstonePropagator; import mrtjp.projectred.core.part.IPropagationCenterPart; import mrtjp.projectred.transmission.WireType; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -59,7 +57,7 @@ public void setColorMask(int mask) { } //endregion - //region TMultiPart overrides + //region Save/Load @Override public void save(CompoundTag tag) { super.save(tag); @@ -71,39 +69,14 @@ public void load(CompoundTag tag) { super.load(tag); setSignal(tag.getByteArray("signal")); } + //endregion + //region IConnectableCenterPart overrides @Override - public void onPartChanged(@Nullable MultiPart part) { - if (!level().isClientSide) { - RedstonePropagator.logCalculation(); - if (updateOutward()) { - onMaskChanged(); - RedstonePropagator.propagateTo(this, FORCE); - } else { - RedstonePropagator.propagateTo(this, RISING); - } - } - } - - @Override - public void onNeighborBlockChanged(BlockPos from) { - if (!level().isClientSide) { - RedstonePropagator.logCalculation(); - if (updateExternalConns()) { - onMaskChanged(); - RedstonePropagator.propagateTo(this, FORCE); - } else { - RedstonePropagator.propagateTo(this, RISING); - } - } - } - - @Override - public void onAdded() { - super.onAdded(); - if (!level().isClientSide) { - RedstonePropagator.propagateTo(this, RISING); - } + public void maskChangeEvent(boolean internalChange, boolean externalChange) { + super.maskChangeEvent(internalChange, externalChange); + RedstonePropagator.logCalculation(); + RedstonePropagator.propagateTo(this, internalChange || externalChange ? FORCE : RISING); } //endregion diff --git a/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedPowerWire.java b/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedPowerWire.java index e1c35374e..bb9e2f93b 100644 --- a/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedPowerWire.java +++ b/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedPowerWire.java @@ -6,7 +6,6 @@ import mrtjp.projectred.core.power.IPowerConnectable; import mrtjp.projectred.core.power.PowerConductor; import mrtjp.projectred.transmission.WireType; -import net.minecraft.core.BlockPos; import javax.annotation.Nullable; import java.util.LinkedList; @@ -65,19 +64,13 @@ private void recacheConductors() { return null; } + //region Connections @Override - public void onMaskChanged() { - super.onMaskChanged(); - cacheInvalid = true; - } - - @Override - public void onNeighborBlockChanged(BlockPos from) { - super.onNeighborBlockChanged(from); + public void maskChangeEvent(boolean internalChange, boolean externalChange) { + // Invalidate even if conns have not changed (adjacent conductors may have moved, etc) cacheInvalid = true; } - //region Connections @Override public boolean discoverStraightOverride(int absDir) { CenterLookup lookup = CenterLookup.lookupStraightCenter(level(), pos(), absDir); diff --git a/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedRedwirePart.java b/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedRedwirePart.java index 5649b9b88..a5ef88b36 100644 --- a/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedRedwirePart.java +++ b/transmission/src/main/java/mrtjp/projectred/transmission/part/FramedRedwirePart.java @@ -15,11 +15,8 @@ import mrtjp.projectred.core.part.IRedstonePropagationPart; import mrtjp.projectred.core.part.IRedwirePart; import mrtjp.projectred.transmission.WireType; -import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import javax.annotation.Nullable; - import static mrtjp.projectred.core.RedstonePropagator.FORCE; import static mrtjp.projectred.core.RedstonePropagator.RISING; @@ -74,37 +71,10 @@ protected void sendSignalUpdate() { } @Override - public void onPartChanged(@Nullable MultiPart part) { - if (!level().isClientSide) { - RedstonePropagator.logCalculation(); - if (updateOutward()) { - onMaskChanged(); - RedstonePropagator.propagateTo(this, FORCE); - } else { - RedstonePropagator.propagateTo(this, RISING); - } - } - } - - @Override - public void onNeighborBlockChanged(BlockPos from) { - if (!level().isClientSide) { - RedstonePropagator.logCalculation(); - if (updateExternalConns()) { - onMaskChanged(); - RedstonePropagator.propagateTo(this, FORCE); - } else { - RedstonePropagator.propagateTo(this, RISING); - } - } - } - - @Override - public void onAdded() { - super.onAdded(); - if (!level().isClientSide) { - RedstonePropagator.propagateTo(this, RISING); - } + public void maskChangeEvent(boolean internalChange, boolean externalChange) { + super.maskChangeEvent(internalChange, externalChange); + RedstonePropagator.logCalculation(); + RedstonePropagator.propagateTo(this, internalChange || externalChange ? FORCE : RISING); } protected int redstoneSignalLevel() { diff --git a/transmission/src/main/java/mrtjp/projectred/transmission/part/RedwirePart.java b/transmission/src/main/java/mrtjp/projectred/transmission/part/RedwirePart.java index 3e85201da..c7ad4b16c 100644 --- a/transmission/src/main/java/mrtjp/projectred/transmission/part/RedwirePart.java +++ b/transmission/src/main/java/mrtjp/projectred/transmission/part/RedwirePart.java @@ -15,12 +15,9 @@ import mrtjp.projectred.core.RedstonePropagator; import mrtjp.projectred.core.part.*; import mrtjp.projectred.transmission.WireType; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import javax.annotation.Nullable; - import static mrtjp.projectred.core.RedstonePropagator.FORCE; import static mrtjp.projectred.core.RedstonePropagator.RISING; @@ -34,6 +31,7 @@ public RedwirePart(WireType wireType) { super(wireType); } + //region Save/Load @Override public void save(CompoundTag tag) { super.save(tag); @@ -57,7 +55,9 @@ public void readDesc(MCDataInput packet) { super.readDesc(packet); signal = packet.readByte(); } + //endregion + //region Network @Override protected void read(MCDataInput packet, int key) { switch (key) { @@ -73,43 +73,7 @@ protected void read(MCDataInput packet, int key) { protected void sendSignalUpdate() { sendUpdate(KEY_SIGNAL, p -> p.writeByte(signal)); } - - @Override - public void onPartChanged(@Nullable MultiPart part) { - if (!level().isClientSide) { - RedstonePropagator.logCalculation(); - if (updateOutward()) { - onMaskChanged(); - RedstonePropagator.propagateTo(this, FORCE); - } else { - RedstonePropagator.propagateTo(this, RISING); - } - } - } - - @Override - public void onNeighborBlockChanged(BlockPos from) { - if (!level().isClientSide) { - if (dropIfCantStay()) { - return; - } - RedstonePropagator.logCalculation(); - if (updateExternalConns()) { - onMaskChanged(); - RedstonePropagator.propagateTo(this, FORCE); - } else { - RedstonePropagator.propagateTo(this, RISING); - } - } - } - - @Override - public void onAdded() { - super.onAdded(); - if (!level().isClientSide) { - RedstonePropagator.propagateTo(this, RISING); - } - } + //endregion protected int redstoneSignalLevel() { return RedstonePropagator.canRedwiresProvidePower() ? ((signal & 0xFF) + 16) / 17 : 0; @@ -138,6 +102,15 @@ public int getFace() { } //endregion + //region IConnectableFacePart overrides + @Override + public void maskChangeEvent(boolean internalChange, boolean externalChange) { + super.maskChangeEvent(internalChange, externalChange); + RedstonePropagator.logCalculation(); + RedstonePropagator.propagateTo(this, internalChange || externalChange ? FORCE : RISING); + } + //endregion + //region IConnectable overrides @Override public boolean discoverOpen(int r) {