Skip to content

Commit 140a17f

Browse files
committed
treat double slab placements like actual placements rather than interactions, and more build sim cleanup
1 parent c269194 commit 140a17f

File tree

10 files changed

+286
-304
lines changed

10 files changed

+286
-304
lines changed

common/src/main/kotlin/com/lambda/interaction/construction/processing/PlacementProcessor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
package com.lambda.interaction.construction.processing
1919

2020
import net.minecraft.block.BlockState
21+
import net.minecraft.util.math.BlockPos
2122

2223
abstract class PlacementProcessor {
2324
abstract fun acceptsState(state: BlockState): Boolean
24-
abstract fun preProcess(state: BlockState, accumulator: PreProcessingInfoAccumulator)
25+
abstract fun preProcess(state: BlockState, pos: BlockPos, accumulator: PreProcessingInfoAccumulator)
2526
}

common/src/main/kotlin/com/lambda/interaction/construction/processing/ProcessorRegistry.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ import com.lambda.core.Loadable
2121
import com.lambda.interaction.construction.verify.TargetState
2222
import com.lambda.util.reflections.getInstances
2323
import net.minecraft.block.BlockState
24+
import net.minecraft.block.SlabBlock
25+
import net.minecraft.block.enums.SlabType
2426
import net.minecraft.state.property.Properties
27+
import net.minecraft.util.math.BlockPos
2528

2629
object ProcessorRegistry : Loadable {
2730
private val processors = getInstances<PlacementProcessor>()
@@ -104,17 +107,23 @@ object ProcessorRegistry : Loadable {
104107

105108
override fun load() = "Loaded ${processors.size} pre processors"
106109

107-
fun TargetState.getProcessingInfo(): PreProcessingInfo =
110+
fun TargetState.getProcessingInfo(pos: BlockPos): PreProcessingInfo =
108111
(this as? TargetState.State)?.let { state ->
109-
processorCache.getOrPut(state.blockState) {
112+
val get: () -> PreProcessingInfo = {
113+
110114
val infoAccumulator = PreProcessingInfoAccumulator()
111115

112116
processors.forEach {
113117
if (!it.acceptsState(state.blockState)) return@forEach
114-
it.preProcess(state.blockState, infoAccumulator)
118+
it.preProcess(state.blockState, pos, infoAccumulator)
115119
}
116120

117121
infoAccumulator.complete()
118122
}
123+
if (isExemptFromCache(state)) get()
124+
else processorCache.getOrPut(state.blockState, get)
119125
} ?: PreProcessingInfo.DEFAULT
126+
127+
private fun isExemptFromCache(state: TargetState.State) =
128+
state.blockState.block is SlabBlock && state.blockState.get(Properties.SLAB_TYPE) == SlabType.DOUBLE
120129
}

common/src/main/kotlin/com/lambda/interaction/construction/processing/preprocessors/AttachmentPreProcessor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.lambda.interaction.construction.processing.PreProcessingInfoAccumulat
2222
import net.minecraft.block.BlockState
2323
import net.minecraft.block.enums.Attachment
2424
import net.minecraft.state.property.Properties
25+
import net.minecraft.util.math.BlockPos
2526
import net.minecraft.util.math.Direction
2627

2728
// Collected using reflections and then accessed from a collection in ProcessorRegistry
@@ -30,7 +31,7 @@ object AttachmentPreProcessor : PlacementProcessor() {
3031
override fun acceptsState(state: BlockState) =
3132
state.properties.contains(Properties.ATTACHMENT)
3233

33-
override fun preProcess(state: BlockState, accumulator: PreProcessingInfoAccumulator) {
34+
override fun preProcess(state: BlockState, pos: BlockPos, accumulator: PreProcessingInfoAccumulator) {
3435
val attachment = state.get(Properties.ATTACHMENT) ?: return
3536
with (accumulator) {
3637
when (attachment) {

common/src/main/kotlin/com/lambda/interaction/construction/processing/preprocessors/AxisPreProcessor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ import com.lambda.interaction.construction.processing.PlacementProcessor
2121
import com.lambda.interaction.construction.processing.PreProcessingInfoAccumulator
2222
import net.minecraft.block.BlockState
2323
import net.minecraft.state.property.Properties
24+
import net.minecraft.util.math.BlockPos
2425

2526
// Collected using reflections and then accessed from a collection in ProcessorRegistry
2627
@Suppress("unused")
2728
object AxisPreProcessor : PlacementProcessor() {
2829
override fun acceptsState(state: BlockState) =
2930
state.getOrEmpty(Properties.AXIS).isPresent
3031

31-
override fun preProcess(state: BlockState, accumulator: PreProcessingInfoAccumulator) {
32+
override fun preProcess(state: BlockState, pos: BlockPos, accumulator: PreProcessingInfoAccumulator) {
3233
val axis = state.get(Properties.AXIS)
3334
accumulator.retainSides { side ->
3435
side.axis == axis

common/src/main/kotlin/com/lambda/interaction/construction/processing/preprocessors/BlockFacePreProcessor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.lambda.interaction.construction.processing.PreProcessingInfoAccumulat
2222
import net.minecraft.block.BlockState
2323
import net.minecraft.block.enums.BlockFace
2424
import net.minecraft.state.property.Properties
25+
import net.minecraft.util.math.BlockPos
2526
import net.minecraft.util.math.Direction
2627

2728
// Collected using reflections and then accessed from a collection in ProcessorRegistry
@@ -30,7 +31,7 @@ object BlockFacePreProcessor : PlacementProcessor() {
3031
override fun acceptsState(state: BlockState) =
3132
state.getOrEmpty(Properties.BLOCK_FACE).isPresent
3233

33-
override fun preProcess(state: BlockState, accumulator: PreProcessingInfoAccumulator) {
34+
override fun preProcess(state: BlockState, pos: BlockPos, accumulator: PreProcessingInfoAccumulator) {
3435
val property = state.get(Properties.BLOCK_FACE) ?: return
3536
with (accumulator) {
3637
when (property) {

common/src/main/kotlin/com/lambda/interaction/construction/processing/preprocessors/BlockHalfPreProcessor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.lambda.interaction.construction.verify.SurfaceScan
2424
import net.minecraft.block.BlockState
2525
import net.minecraft.block.enums.BlockHalf
2626
import net.minecraft.state.property.Properties
27+
import net.minecraft.util.math.BlockPos
2728
import net.minecraft.util.math.Direction
2829

2930
// Collected using reflections and then accessed from a collection in ProcessorRegistry
@@ -32,7 +33,7 @@ object BlockHalfPreProcessor : PlacementProcessor() {
3233
override fun acceptsState(state: BlockState) =
3334
state.getOrEmpty(Properties.BLOCK_HALF).isPresent
3435

35-
override fun preProcess(state: BlockState, accumulator: PreProcessingInfoAccumulator) {
36+
override fun preProcess(state: BlockState, pos: BlockPos, accumulator: PreProcessingInfoAccumulator) {
3637
val slab = state.get(Properties.BLOCK_HALF) ?: return
3738

3839
val surfaceScan = when (slab) {

common/src/main/kotlin/com/lambda/interaction/construction/processing/preprocessors/DoorHingePreProcessor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.lambda.threading.runSafe
2525
import net.minecraft.block.BlockState
2626
import net.minecraft.block.enums.DoorHinge
2727
import net.minecraft.state.property.Properties
28+
import net.minecraft.util.math.BlockPos
2829
import net.minecraft.util.math.Direction
2930

3031
// Collected using reflections and then accessed from a collection in ProcessorRegistry
@@ -33,7 +34,7 @@ object DoorHingePreProcessor : PlacementProcessor() {
3334
override fun acceptsState(state: BlockState) =
3435
state.properties.contains(Properties.DOOR_HINGE)
3536

36-
override fun preProcess(state: BlockState, accumulator: PreProcessingInfoAccumulator) =
37+
override fun preProcess(state: BlockState, pos: BlockPos, accumulator: PreProcessingInfoAccumulator) =
3738
runSafe {
3839
val side = state.get(Properties.DOOR_HINGE) ?: return@runSafe
3940
val scanner = when (state.get(Properties.HORIZONTAL_FACING) ?: return@runSafe) {

common/src/main/kotlin/com/lambda/interaction/construction/processing/preprocessors/HopperFacingPreProcessor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.lambda.interaction.construction.processing.PlacementProcessor
2121
import com.lambda.interaction.construction.processing.PreProcessingInfoAccumulator
2222
import net.minecraft.block.BlockState
2323
import net.minecraft.state.property.Properties
24+
import net.minecraft.util.math.BlockPos
2425
import net.minecraft.util.math.Direction
2526

2627
// Collected using reflections and then accessed from a collection in ProcessorRegistry
@@ -29,7 +30,7 @@ object HopperFacingPreProcessor : PlacementProcessor() {
2930
override fun acceptsState(state: BlockState) =
3031
state.properties.contains(Properties.HOPPER_FACING)
3132

32-
override fun preProcess(state: BlockState, accumulator: PreProcessingInfoAccumulator) {
33+
override fun preProcess(state: BlockState, pos: BlockPos, accumulator: PreProcessingInfoAccumulator) {
3334
val facing = state.get(Properties.HOPPER_FACING) ?: return
3435
when {
3536
facing.axis == Direction.Axis.Y -> accumulator.retainSides { it.axis == Direction.Axis.Y }

common/src/main/kotlin/com/lambda/interaction/construction/processing/preprocessors/SlabPreProcessor.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,34 @@ import com.lambda.interaction.construction.processing.PlacementProcessor
2121
import com.lambda.interaction.construction.processing.PreProcessingInfoAccumulator
2222
import com.lambda.interaction.construction.verify.ScanMode
2323
import com.lambda.interaction.construction.verify.SurfaceScan
24+
import com.lambda.threading.runSafe
25+
import com.lambda.util.BlockUtils.blockState
2426
import net.minecraft.block.BlockState
2527
import net.minecraft.block.SlabBlock
2628
import net.minecraft.block.enums.SlabType
2729
import net.minecraft.state.property.Properties
30+
import net.minecraft.util.math.BlockPos
2831
import net.minecraft.util.math.Direction
2932

3033
// Collected using reflections and then accessed from a collection in ProcessorRegistry
3134
@Suppress("unused")
3235
object SlabPreProcessor : PlacementProcessor() {
3336
override fun acceptsState(state: BlockState) = state.block is SlabBlock
3437

35-
override fun preProcess(state: BlockState, accumulator: PreProcessingInfoAccumulator) {
38+
override fun preProcess(state: BlockState, pos: BlockPos, accumulator: PreProcessingInfoAccumulator) {
3639
val slab = state.get(Properties.SLAB_TYPE) ?: return
40+
val currentState = runSafe { blockState(pos) } ?: return
3741

3842
val surfaceScan = when (slab) {
3943
SlabType.BOTTOM -> SurfaceScan(ScanMode.LESSER_BLOCK_HALF, Direction.Axis.Y)
4044
SlabType.TOP -> SurfaceScan(ScanMode.GREATER_BLOCK_HALF, Direction.Axis.Y)
4145
SlabType.DOUBLE -> {
4246
accumulator.addIgnores(Properties.SLAB_TYPE)
43-
SurfaceScan(ScanMode.FULL, Direction.Axis.Y)
47+
if (currentState.block !is SlabBlock) SurfaceScan.DEFAULT
48+
else when (currentState.get(Properties.SLAB_TYPE)) {
49+
SlabType.BOTTOM -> SurfaceScan(ScanMode.GREATER_BLOCK_HALF, Direction.Axis.Y)
50+
else -> SurfaceScan(ScanMode.LESSER_BLOCK_HALF, Direction.Axis.Y)
51+
}
4452
}
4553
}
4654

0 commit comments

Comments
 (0)