Skip to content

Commit

Permalink
internal: simplify IConnectable mask change events
Browse files Browse the repository at this point in the history
  • Loading branch information
MrTJP committed Jun 22, 2024
1 parent 87aa5d8 commit fcc117b
Show file tree
Hide file tree
Showing 12 changed files with 90 additions and 215 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand Down
47 changes: 27 additions & 20 deletions core/src/main/java/mrtjp/projectred/core/part/IConnectablePart.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
* <p>
* 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.
* <p>
* 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.
* <p>
* 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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ public void onNeighborBlockChanged(BlockPos from) {
if (dropIfCantStay()) {
return;
}
updateExternalConns();
updateOutside();
onChange();
}
}
Expand All @@ -254,7 +254,7 @@ public void onAdded() {
super.onAdded();
if (!level().isClientSide) {
gateLogicSetup();
updateInward();
updateInsideAndOutside();
onChange();
}
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand All @@ -451,7 +451,7 @@ protected void configure() {

protected void rotate() {
setRotation((getRotation() + 1) % 4);
updateInward();
updateInsideAndOutside();
tile().setChanged();
tile().notifyPartChange(this);
sendOrientationUpdate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,27 +180,23 @@ public SoundType getPlacementSound(UseOnContext context) {
public void onPartChanged(@Nullable MultiPart part) {
super.onPartChanged(part);
if (!level().isClientSide) {
if (updateOutward()) {
onMaskChanged();
}
updateOutward();
}
}

@Override
public void onNeighborBlockChanged(BlockPos from) {
super.onNeighborBlockChanged(from);
if (!level().isClientSide) {
if (updateExternalConns()) {
onMaskChanged();
}
updateOutside();
}
}

@Override
public void onAdded() {
super.onAdded();
if (!level().isClientSide) {
if (updateInward()) onMaskChanged();
updateInsideAndOutside();
}
}

Expand Down Expand Up @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}

Expand All @@ -147,17 +145,15 @@ public void onNeighborBlockChanged(BlockPos from) {
super.onNeighborBlockChanged(from);
if (!level().isClientSide) {
if (dropIfCantStay()) return;
if (updateExternalConns()) {
onMaskChanged();
}
updateOutside();
}
}

@Override
public void onAdded() {
super.onAdded();
if (!level().isClientSide) {
if (updateInward()) onMaskChanged();
updateInsideAndOutside();
}
}

Expand Down Expand Up @@ -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
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -37,18 +36,6 @@ public List<PowerConductor> 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();

Expand Down Expand Up @@ -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);
Expand Down
Loading

0 comments on commit fcc117b

Please sign in to comment.