Physical models for bus/i/o
This commit is contained in:
parent
8cabf8d295
commit
ccb8c24ee9
@ -51,6 +51,12 @@ public record BlockShape(SimpleCuboid ...shapes) {
|
||||
if (dir == Direction.EAST)
|
||||
return rotateAroundY(Math.PI / 2d);
|
||||
|
||||
if (dir == Direction.UP)
|
||||
return rotateAroundX(Math.PI / 2d);
|
||||
|
||||
if (dir == Direction.DOWN)
|
||||
return rotateAroundX(-Math.PI / 2d);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -67,6 +73,12 @@ public record BlockShape(SimpleCuboid ...shapes) {
|
||||
if (dir == Direction.EAST)
|
||||
return rotateAroundY(Math.PI / 2d);
|
||||
|
||||
if (dir == Direction.UP)
|
||||
return rotateAroundX(-Math.PI / 2d);
|
||||
|
||||
if (dir == Direction.DOWN)
|
||||
return rotateAroundX(Math.PI / 2d);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -475,4 +475,26 @@ public class BlockShapes {
|
||||
new SimpleCuboid(0.96875d, 0.0625d, 0.9375d, 1d, 0.3125d, 1d),
|
||||
new SimpleCuboid(0.0625d, 0.0625d, 0.6875d, 0.9375d, 0.3125d, 0.9375d)
|
||||
);
|
||||
|
||||
public static final BlockShape STORAGE_BUS = new BlockShape(
|
||||
new SimpleCuboid(0.125d, 0.125d, 0d, 0.875d, 0.875d, 0.125d),
|
||||
new SimpleCuboid(0.25d, 0.25d, 0.125d, 0.75d, 0.75d, 0.3125d),
|
||||
new SimpleCuboid(0.3125d, 0.3125d, 0.25d, 0.6875d, 0.6875d, 0.5d),
|
||||
new SimpleCuboid(0.4375d, 0.6875d, 0.125d, 0.5625d, 0.8125d, 0.375d),
|
||||
new SimpleCuboid(0.4375d, 0.1875d, 0.125d, 0.5625d, 0.3125d, 0.375d),
|
||||
new SimpleCuboid(0.1875d, 0.4375d, 0.125d, 0.3125d, 0.5625d, 0.375d),
|
||||
new SimpleCuboid(0.6875d, 0.4375d, 0.125d, 0.8125d, 0.5625d, 0.375d)
|
||||
);
|
||||
|
||||
public static final BlockShape STORAGE_IMPORTER = new BlockShape(
|
||||
new SimpleCuboid(0.125d, 0.125d, 0d, 0.875d, 0.875d, 0.125d),
|
||||
new SimpleCuboid(0.25d, 0.25d, 0.125d, 0.75d, 0.75d, 0.3125d),
|
||||
new SimpleCuboid(0.3125d, 0.3125d, 0.25d, 0.6875d, 0.6875d, 0.5d)
|
||||
);
|
||||
|
||||
public static final BlockShape STORAGE_EXPORTER = new BlockShape(
|
||||
new SimpleCuboid(0.1875d, 0.1875d, 0d, 0.8125d, 0.8125d, 0.125d),
|
||||
new SimpleCuboid(0.25d, 0.25d, 0.125d, 0.75d, 0.75d, 0.3125d),
|
||||
new SimpleCuboid(0.3125d, 0.3125d, 0.25d, 0.6875d, 0.6875d, 0.5d)
|
||||
);
|
||||
}
|
||||
|
@ -184,101 +184,111 @@ class MatterCableBlock : CableBlock(
|
||||
class StorageCableBlock : CableBlock(
|
||||
Properties.of(Material.STONE, MaterialColor.METAL).requiresCorrectToolForDrops().strength(1.0f, 6.0f)),
|
||||
EntityBlock {
|
||||
private val CORE_SHAPE: VoxelShape = Shapes.box(
|
||||
0.5 - 0.185,
|
||||
0.5 - 0.185,
|
||||
0.5 - 0.185,
|
||||
0.5 + 0.185,
|
||||
0.5 + 0.185,
|
||||
0.5 + 0.185
|
||||
)
|
||||
|
||||
companion object {
|
||||
val CORE_SHAPE: VoxelShape = Shapes.box(
|
||||
0.5 - 0.185,
|
||||
0.5 - 0.185,
|
||||
0.5 - 0.185,
|
||||
0.5 + 0.185,
|
||||
0.5 + 0.185,
|
||||
0.5 + 0.185
|
||||
)
|
||||
|
||||
private const val width = 0.185
|
||||
|
||||
fun getShapeFor(it: BlockState): MutableList<VoxelShape> {
|
||||
val shapes = ArrayList<VoxelShape>()
|
||||
|
||||
if (it.getValue(CONNECTION_SOUTH)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 + width,
|
||||
0.5 + width,
|
||||
0.5 + width,
|
||||
1.0
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_NORTH)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.0,
|
||||
0.5 + width,
|
||||
0.5 + width,
|
||||
0.5 - width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_DOWN)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 - width,
|
||||
0.0,
|
||||
0.5 - width,
|
||||
0.5 + width,
|
||||
0.5 - width,
|
||||
0.5 + width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_UP)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 + width,
|
||||
1.0,
|
||||
0.5 + width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_EAST)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 + width,
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
1.0,
|
||||
0.5 + width,
|
||||
0.5 + width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_WEST)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.0,
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 + width,
|
||||
0.5 + width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
shapes.add(CORE_SHAPE)
|
||||
return shapes
|
||||
}
|
||||
}
|
||||
|
||||
private val shapes = getShapeForEachState {
|
||||
val shapes = ArrayList<VoxelShape>()
|
||||
val width = 0.185
|
||||
val shapes = getShapeFor(it)
|
||||
var finalShape = shapes[0]
|
||||
|
||||
if (it.getValue(CONNECTION_SOUTH)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 + width,
|
||||
0.5 + width,
|
||||
0.5 + width,
|
||||
1.0
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_NORTH)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.0,
|
||||
0.5 + width,
|
||||
0.5 + width,
|
||||
0.5 - width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_DOWN)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 - width,
|
||||
0.0,
|
||||
0.5 - width,
|
||||
0.5 + width,
|
||||
0.5 - width,
|
||||
0.5 + width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_UP)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 + width,
|
||||
1.0,
|
||||
0.5 + width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_EAST)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.5 + width,
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
1.0,
|
||||
0.5 + width,
|
||||
0.5 + width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (it.getValue(CONNECTION_WEST)) {
|
||||
shapes.add(
|
||||
Shapes.box(
|
||||
0.0,
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 - width,
|
||||
0.5 + width,
|
||||
0.5 + width
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
var finalShape = CORE_SHAPE
|
||||
|
||||
for (add_shape in shapes) {
|
||||
finalShape = Shapes.joinUnoptimized(finalShape, add_shape, BooleanOp.OR)
|
||||
for (i in 1 until shapes.size) {
|
||||
finalShape = Shapes.joinUnoptimized(finalShape, shapes[i], BooleanOp.OR)
|
||||
}
|
||||
|
||||
return@getShapeForEachState finalShape
|
||||
|
@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.block
|
||||
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.world.item.context.BlockPlaceContext
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.EntityBlock
|
||||
@ -10,9 +11,14 @@ import net.minecraft.world.level.block.entity.BlockEntityTicker
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.level.block.state.StateDefinition
|
||||
import net.minecraft.world.phys.shapes.BooleanOp
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
import ru.dbotthepony.mc.otm.addPreWorldTickerOnce
|
||||
import ru.dbotthepony.mc.otm.block.entity.StorageBusBlockEntity
|
||||
import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import ru.dbotthepony.mc.otm.shapes.BlockShapes
|
||||
import ru.dbotthepony.mc.otm.unaryMinus
|
||||
|
||||
class StorageBusBlock : RotatableMatteryBlock(), EntityBlock {
|
||||
@ -58,6 +64,30 @@ class StorageBusBlock : RotatableMatteryBlock(), EntityBlock {
|
||||
return BlockEntityTicker { _, _, _, tile -> if (tile is StorageBusBlockEntity) tile.tick() }
|
||||
}
|
||||
|
||||
private val shapes = getShapeForEachState {
|
||||
val shapes = StorageCableBlock.getShapeFor(it)
|
||||
var finalShape = shapes[0]
|
||||
|
||||
for (i in 1 until shapes.size) {
|
||||
finalShape = Shapes.joinUnoptimized(finalShape, shapes[i], BooleanOp.OR)
|
||||
}
|
||||
|
||||
finalShape = Shapes.joinUnoptimized(finalShape, BlockShapes.STORAGE_BUS.rotateInv(it.getValue(FACING_FULL)).computeShape(), BooleanOp.OR)
|
||||
|
||||
return@getShapeForEachState finalShape
|
||||
}
|
||||
|
||||
@Suppress("OVERRIDE_DEPRECATION")
|
||||
override fun getShape(
|
||||
p_60555_: BlockState,
|
||||
p_60556_: BlockGetter,
|
||||
p_60557_: BlockPos,
|
||||
p_60558_: CollisionContext
|
||||
): VoxelShape {
|
||||
return shapes[p_60555_] ?: BlockShapes.STORAGE_BUS.computeShape()
|
||||
}
|
||||
|
||||
@Suppress("OVERRIDE_DEPRECATION")
|
||||
override fun neighborChanged(
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
|
@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.block
|
||||
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.world.item.context.BlockPlaceContext
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.EntityBlock
|
||||
@ -10,10 +11,15 @@ import net.minecraft.world.level.block.entity.BlockEntityTicker
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.level.block.state.StateDefinition
|
||||
import net.minecraft.world.phys.shapes.BooleanOp
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
import ru.dbotthepony.mc.otm.addPreWorldTickerOnce
|
||||
import ru.dbotthepony.mc.otm.block.entity.StorageExporterBlockEntity
|
||||
import ru.dbotthepony.mc.otm.block.entity.StorageImporterBlockEntity
|
||||
import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import ru.dbotthepony.mc.otm.shapes.BlockShapes
|
||||
import ru.dbotthepony.mc.otm.unaryMinus
|
||||
|
||||
class StorageImporterBlock : RotatableMatteryBlock(), EntityBlock {
|
||||
@ -59,6 +65,30 @@ class StorageImporterBlock : RotatableMatteryBlock(), EntityBlock {
|
||||
return super.getStateForPlacement(context)?.setValue(FACING_FULL, -context.clickedFace)
|
||||
}
|
||||
|
||||
private val shapes = getShapeForEachState {
|
||||
val shapes = StorageCableBlock.getShapeFor(it)
|
||||
var finalShape = shapes[0]
|
||||
|
||||
for (i in 1 until shapes.size) {
|
||||
finalShape = Shapes.joinUnoptimized(finalShape, shapes[i], BooleanOp.OR)
|
||||
}
|
||||
|
||||
finalShape = Shapes.joinUnoptimized(finalShape, BlockShapes.STORAGE_IMPORTER.rotateInv(it.getValue(FACING_FULL)).computeShape(), BooleanOp.OR)
|
||||
|
||||
return@getShapeForEachState finalShape
|
||||
}
|
||||
|
||||
@Suppress("OVERRIDE_DEPRECATION")
|
||||
override fun getShape(
|
||||
p_60555_: BlockState,
|
||||
p_60556_: BlockGetter,
|
||||
p_60557_: BlockPos,
|
||||
p_60558_: CollisionContext
|
||||
): VoxelShape {
|
||||
return shapes[p_60555_] ?: BlockShapes.STORAGE_BUS.computeShape()
|
||||
}
|
||||
|
||||
@Suppress("OVERRIDE_DEPRECATION")
|
||||
override fun neighborChanged(
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
@ -124,6 +154,30 @@ class StorageExporterBlock : RotatableMatteryBlock(), EntityBlock {
|
||||
return super.getStateForPlacement(context)?.setValue(FACING_FULL, -context.clickedFace)
|
||||
}
|
||||
|
||||
private val shapes = getShapeForEachState {
|
||||
val shapes = StorageCableBlock.getShapeFor(it)
|
||||
var finalShape = shapes[0]
|
||||
|
||||
for (i in 1 until shapes.size) {
|
||||
finalShape = Shapes.joinUnoptimized(finalShape, shapes[i], BooleanOp.OR)
|
||||
}
|
||||
|
||||
finalShape = Shapes.joinUnoptimized(finalShape, BlockShapes.STORAGE_EXPORTER.rotateInv(it.getValue(FACING_FULL)).computeShape(), BooleanOp.OR)
|
||||
|
||||
return@getShapeForEachState finalShape
|
||||
}
|
||||
|
||||
@Suppress("OVERRIDE_DEPRECATION")
|
||||
override fun getShape(
|
||||
p_60555_: BlockState,
|
||||
p_60556_: BlockGetter,
|
||||
p_60557_: BlockPos,
|
||||
p_60558_: CollisionContext
|
||||
): VoxelShape {
|
||||
return shapes[p_60555_] ?: BlockShapes.STORAGE_BUS.computeShape()
|
||||
}
|
||||
|
||||
@Suppress("OVERRIDE_DEPRECATION")
|
||||
override fun neighborChanged(
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
|
Loading…
Reference in New Issue
Block a user