59 lines
2.6 KiB
Java
59 lines
2.6 KiB
Java
package carpet.mixins;
|
|
|
|
import carpet.CarpetSettings;
|
|
import carpet.fakes.LevelInterface;
|
|
import net.minecraft.world.level.redstone.CollectingNeighborUpdater;
|
|
import net.minecraft.util.RandomSource;
|
|
import net.minecraft.world.level.redstone.Orientation;
|
|
import org.spongepowered.asm.mixin.Mixin;
|
|
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.server.level.ServerLevel;
|
|
import net.minecraft.world.level.BlockGetter;
|
|
import net.minecraft.world.level.Level;
|
|
import net.minecraft.world.level.block.BarrierBlock;
|
|
import net.minecraft.world.level.block.Block;
|
|
import net.minecraft.world.level.block.Blocks;
|
|
import net.minecraft.world.level.block.PoweredRailBlock;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
|
|
@Mixin(BarrierBlock.class)
|
|
public class BarrierBlock_updateSuppressionBlockMixin extends Block {
|
|
private boolean shouldPower = false;
|
|
|
|
public BarrierBlock_updateSuppressionBlockMixin(Properties settings) { super(settings); }
|
|
|
|
@Override
|
|
public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) {
|
|
return (shouldPower && direction == Direction.DOWN) ? 15 : 0;
|
|
}
|
|
|
|
@Override
|
|
public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, Orientation fromPos, boolean notify) {
|
|
if (CarpetSettings.updateSuppressionBlock != -1) {
|
|
if (true/*fromPos.equals(pos.above())*/) { // todo neighbour updates don't have source
|
|
BlockState stateAbove = level.getBlockState(pos.above());
|
|
if (stateAbove.is(Blocks.ACTIVATOR_RAIL) && !stateAbove.getValue(PoweredRailBlock.POWERED)) {
|
|
level.scheduleTick(pos, this, 1);
|
|
CollectingNeighborUpdater updater = ((LevelInterface)level).getNeighborUpdater();
|
|
if (updater instanceof CollectingNeighborUpdaterAccessor cnua)
|
|
cnua.setCount(cnua.getMaxChainedNeighborUpdates()-CarpetSettings.updateSuppressionBlock);
|
|
}
|
|
}
|
|
}
|
|
super.neighborChanged(state, level, pos, block, fromPos, notify);
|
|
}
|
|
|
|
@Override
|
|
public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
|
|
BlockPos posAbove = pos.above();
|
|
BlockState stateAbove = level.getBlockState(posAbove);
|
|
if (stateAbove.is(Blocks.ACTIVATOR_RAIL) && !stateAbove.getValue(PoweredRailBlock.POWERED)) {
|
|
shouldPower = true;
|
|
level.setBlock(posAbove, stateAbove.setValue(PoweredRailBlock.POWERED, true), Block.UPDATE_CLIENTS | Block.UPDATE_NONE);
|
|
shouldPower = false;
|
|
}
|
|
}
|
|
}
|