Skip to content

Commit 290b290

Browse files
committed
Chain conveyors now detach on assembly
Closes #183
1 parent a1b8a4b commit 290b290

3 files changed

Lines changed: 69 additions & 0 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package dev.ryanhcode.sable.neoforge.mixin.compatibility.create.chain_conveyor;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity;
5+
import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage;
6+
import net.minecraft.core.BlockPos;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.Shadow;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
13+
import java.util.List;
14+
import java.util.Map;
15+
16+
@Mixin(ChainConveyorBlockEntity.class)
17+
public abstract class ChainConveyorBlockEntityMixin {
18+
19+
@Shadow
20+
public Map<BlockPos, ChainConveyorBlockEntity.ConnectionStats> connectionStats;
21+
22+
@Shadow
23+
Map<BlockPos, List<ChainConveyorPackage>> travellingPackages;
24+
25+
@Shadow
26+
protected abstract void drop(ChainConveyorPackage box);
27+
28+
@Inject(method = "removeInvalidConnections", at = @At(value = "INVOKE", target = "Ljava/util/Iterator;remove()V"))
29+
public void dropInvalidPackages(final CallbackInfo ci, @Local(name = "next") final BlockPos next) {
30+
this.connectionStats.remove(next);
31+
32+
final List<ChainConveyorPackage> packages = this.travellingPackages.remove(next);
33+
if (packages != null && !packages.isEmpty()) {
34+
for (final ChainConveyorPackage box : packages) {
35+
this.drop(box);
36+
}
37+
}
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package dev.ryanhcode.sable.neoforge.mixin.compatibility.create.chain_conveyor;
2+
3+
import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlock;
4+
import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity;
5+
import dev.ryanhcode.sable.api.block.BlockSubLevelAssemblyListener;
6+
import net.minecraft.core.BlockPos;
7+
import net.minecraft.server.level.ServerLevel;
8+
import net.minecraft.world.level.block.state.BlockState;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
11+
@Mixin(ChainConveyorBlock.class)
12+
public class ChainConveyorBlockMixin implements BlockSubLevelAssemblyListener {
13+
14+
@Override
15+
public void beforeMove(final ServerLevel originLevel, final ServerLevel resultingLevel, final BlockState newState, final BlockPos oldPos, final BlockPos newPos) {
16+
if (originLevel.getBlockEntity(oldPos) instanceof final ChainConveyorBlockEntity be) {
17+
// This tells all connected conveyors to re-check and detach if necessary next tick
18+
be.notifyConnectedToValidate();
19+
}
20+
}
21+
22+
@Override
23+
public void afterMove(final ServerLevel originLevel, final ServerLevel resultingLevel, final BlockState newState, final BlockPos oldPos, final BlockPos newPos) {
24+
if (resultingLevel.getBlockEntity(newPos) instanceof final ChainConveyorBlockEntity be) {
25+
be.checkInvalid = true;
26+
}
27+
}
28+
}

neoforge/src/main/resources/sable-neoforge.mixins.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@
8282
"compatibility.create.block_breakers.BlockBreakingKineticBlockEntityDamageMixin",
8383
"compatibility.create.block_breakers.BlockBreakingKineticBlockEntityMixin",
8484
"compatibility.create.block_entity_config.BlockEntityConfigurationPacketMixin",
85+
"compatibility.create.chain_conveyor.ChainConveyorBlockEntityMixin",
86+
"compatibility.create.chain_conveyor.ChainConveyorBlockMixin",
8587
"compatibility.create.contraptions.AbstractContraptionEntityMixin",
8688
"compatibility.create.contraptions.ContraptionColliderMixin",
8789
"compatibility.create.contraptions.Matrix3dAccessor",

0 commit comments

Comments
 (0)