146 lines
5 KiB
Java
146 lines
5 KiB
Java
package net.minecraft.world.level;
|
|
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.world.level.block.Blocks;
|
|
import net.minecraft.world.level.block.DiodeBlock;
|
|
import net.minecraft.world.level.block.RedStoneWireBlock;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
|
|
public interface SignalGetter extends BlockGetter {
|
|
Direction[] DIRECTIONS = Direction.values();
|
|
|
|
/**
|
|
* Returns the direct redstone signal emitted from the given position in the given direction.
|
|
*
|
|
* <p>
|
|
* NOTE: directions in redstone signal related methods are backwards, so this method
|
|
* checks for the signal emitted in the <i>opposite</i> direction of the one given.
|
|
*/
|
|
default int getDirectSignal(BlockPos pos, Direction direction) {
|
|
return this.getBlockState(pos).getDirectSignal(this, pos, direction);
|
|
}
|
|
|
|
/**
|
|
* Returns the direct redstone signal the given position receives from neighboring blocks.
|
|
*/
|
|
default int getDirectSignalTo(BlockPos pos) {
|
|
int i = 0;
|
|
i = Math.max(i, this.getDirectSignal(pos.below(), Direction.DOWN));
|
|
if (i >= 15) {
|
|
return i;
|
|
} else {
|
|
i = Math.max(i, this.getDirectSignal(pos.above(), Direction.UP));
|
|
if (i >= 15) {
|
|
return i;
|
|
} else {
|
|
i = Math.max(i, this.getDirectSignal(pos.north(), Direction.NORTH));
|
|
if (i >= 15) {
|
|
return i;
|
|
} else {
|
|
i = Math.max(i, this.getDirectSignal(pos.south(), Direction.SOUTH));
|
|
if (i >= 15) {
|
|
return i;
|
|
} else {
|
|
i = Math.max(i, this.getDirectSignal(pos.west(), Direction.WEST));
|
|
if (i >= 15) {
|
|
return i;
|
|
} else {
|
|
i = Math.max(i, this.getDirectSignal(pos.east(), Direction.EAST));
|
|
return i >= 15 ? i : i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the control signal emitted from the given position in the given direction.
|
|
* If {@code diodesOnly} is {@code true}, this method returns the direct signal emitted if
|
|
* and only if this position is occupied by a diode (i.e. a repeater or comparator).
|
|
* Otherwise, if this position is occupied by a
|
|
* {@linkplain net.minecraft.world.level.block.Blocks#REDSTONE_BLOCK redstone block},
|
|
* this method will return the redstone signal emitted by it. If not, this method will
|
|
* return the direct signal emitted from this position in the given direction.
|
|
*
|
|
* <p>
|
|
* NOTE: directions in redstone signal related methods are backwards, so this method
|
|
* checks for the signal emitted in the <i>opposite</i> direction of the one given.
|
|
*/
|
|
default int getControlInputSignal(BlockPos pos, Direction direction, boolean diodesOnly) {
|
|
BlockState blockState = this.getBlockState(pos);
|
|
if (diodesOnly) {
|
|
return DiodeBlock.isDiode(blockState) ? this.getDirectSignal(pos, direction) : 0;
|
|
} else if (blockState.is(Blocks.REDSTONE_BLOCK)) {
|
|
return 15;
|
|
} else if (blockState.is(Blocks.REDSTONE_WIRE)) {
|
|
return (Integer)blockState.getValue(RedStoneWireBlock.POWER);
|
|
} else {
|
|
return blockState.isSignalSource() ? this.getDirectSignal(pos, direction) : 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns whether a redstone signal is emitted from the given position in the given direction.
|
|
*
|
|
* <p>
|
|
* NOTE: directions in redstone signal related methods are backwards, so this method
|
|
* checks for the signal emitted in the <i>opposite</i> direction of the one given.
|
|
*/
|
|
default boolean hasSignal(BlockPos pos, Direction direction) {
|
|
return this.getSignal(pos, direction) > 0;
|
|
}
|
|
|
|
/**
|
|
* Returns the redstone signal emitted from the given position in the given direction.
|
|
* This is the highest value between the signal emitted by the block itself, and the direct signal
|
|
* received from neighboring blocks if the block is a redstone conductor.
|
|
*
|
|
* <p>
|
|
* NOTE: directions in redstone signal related methods are backwards, so this method
|
|
* checks for the signal emitted in the <i>opposite</i> direction of the one given.
|
|
*/
|
|
default int getSignal(BlockPos pos, Direction direction) {
|
|
BlockState blockState = this.getBlockState(pos);
|
|
int i = blockState.getSignal(this, pos, direction);
|
|
return blockState.isRedstoneConductor(this, pos) ? Math.max(i, this.getDirectSignalTo(pos)) : i;
|
|
}
|
|
|
|
/**
|
|
* Returns whether the given position receives any redstone signal from neighboring blocks.
|
|
*/
|
|
default boolean hasNeighborSignal(BlockPos pos) {
|
|
if (this.getSignal(pos.below(), Direction.DOWN) > 0) {
|
|
return true;
|
|
} else if (this.getSignal(pos.above(), Direction.UP) > 0) {
|
|
return true;
|
|
} else if (this.getSignal(pos.north(), Direction.NORTH) > 0) {
|
|
return true;
|
|
} else if (this.getSignal(pos.south(), Direction.SOUTH) > 0) {
|
|
return true;
|
|
} else {
|
|
return this.getSignal(pos.west(), Direction.WEST) > 0 ? true : this.getSignal(pos.east(), Direction.EAST) > 0;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the highest redstone signal the given position receives from neighboring blocks.
|
|
*/
|
|
default int getBestNeighborSignal(BlockPos pos) {
|
|
int i = 0;
|
|
|
|
for (Direction direction : DIRECTIONS) {
|
|
int j = this.getSignal(pos.relative(direction), direction);
|
|
if (j >= 15) {
|
|
return 15;
|
|
}
|
|
|
|
if (j > i) {
|
|
i = j;
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
}
|