More efficient getShapeForEachState

This commit is contained in:
DBotThePony 2023-01-30 16:25:15 +07:00
parent ba90c60cd2
commit 81c773b228
Signed by: DBot
GPG Key ID: DCC23B5715498507
17 changed files with 62 additions and 16 deletions

View File

@ -1,5 +1,8 @@
package ru.dbotthepony.mc.otm.block
import com.google.common.collect.ImmutableMap
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
import it.unimi.dsi.fastutil.objects.Object2ObjectFunction
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.core.particles.DustParticleOptions
@ -15,17 +18,44 @@ import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.EntityBlock
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.properties.Property
import net.minecraft.world.level.material.Material
import net.minecraft.world.level.material.MaterialColor
import net.minecraft.world.phys.BlockHitResult
import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.entity.IRedstoneControlProvider
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom
import ru.dbotthepony.mc.otm.core.math.component1
import ru.dbotthepony.mc.otm.core.math.component2
import ru.dbotthepony.mc.otm.core.math.component3
fun Block.getShapeForEachState(properties: List<Property<*>>, fn: (BlockState) -> VoxelShape): Map<BlockState, VoxelShape> {
val builder = ImmutableMap.Builder<BlockState, VoxelShape>()
if (properties.isEmpty()) {
val shape = fn(stateDefinition.possibleStates.first())
for (state in stateDefinition.possibleStates) {
builder.put(state, shape)
}
} else {
val cache = Object2ObjectArrayMap<List<Any>, VoxelShape>()
for (state in stateDefinition.possibleStates) {
builder.put(state, cache.computeIfAbsent(properties.map { state[it] }, Object2ObjectFunction { fn(state) }))
}
}
return builder.build()
}
fun Block.getShapeForEachState(property: Property<*>, fn: (BlockState) -> VoxelShape): Map<BlockState, VoxelShape> {
return getShapeForEachState(listOf(property), fn)
}
abstract class MatteryBlock @JvmOverloads constructor(
properties: Properties = DEFAULT_PROPERTIES
) : Block(properties) {

View File

@ -18,6 +18,7 @@ import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
import ru.dbotthepony.mc.otm.registry.MBlockEntities
@ -52,7 +53,7 @@ class MatterBottlerBlock : RotatableMatteryBlock(), EntityBlock {
.setValue(SLOT_PROPERTIES[2], false)
}
private val shapes = getShapeForEachState { BlockShapes.MATTER_BOTTLER.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.MATTER_BOTTLER.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -14,6 +14,7 @@ import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.tech.BatteryBankBlock
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.matter.MatterCapacitorBankBlockEntity
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.shapes.BlockShapes
@ -36,7 +37,7 @@ class MatterCapacitorBankBlock : RotatableMatteryBlock(), EntityBlock {
super.createBlockStateDefinition(builder)
}
private val shapes = getShapeForEachState { BlockShapes.MATTER_CAPACITOR_BANK.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.MATTER_CAPACITOR_BANK.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -18,6 +18,7 @@ import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
import ru.dbotthepony.mc.otm.registry.MBlockEntities
@ -46,7 +47,7 @@ class MatterDecomposerBlock : RotatableMatteryBlock(), EntityBlock {
builder.add(WorkerState.WORKER_STATE)
}
private val shapes = getShapeForEachState { BlockShapes.MATTER_DECOMPOSER.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.MATTER_DECOMPOSER.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -16,6 +16,7 @@ import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.matter.MatterRecyclerBlockEntity
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
import ru.dbotthepony.mc.otm.registry.MBlockEntities
@ -42,7 +43,7 @@ class MatterRecyclerBlock : RotatableMatteryBlock(), EntityBlock {
return BlockEntityTicker { _, _, _, tile -> if (tile is MatterRecyclerBlockEntity) tile.tick() }
}
private val shapes = getShapeForEachState { BlockShapes.MATTER_RECYCLER.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.MATTER_RECYCLER.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -16,6 +16,7 @@ import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.matter.MatterReplicatorBlockEntity
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
import ru.dbotthepony.mc.otm.registry.MBlockEntities
@ -42,7 +43,7 @@ class MatterReplicatorBlock : RotatableMatteryBlock(), EntityBlock {
builder.add(WorkerState.WORKER_STATE)
}
private val shapes = getShapeForEachState { BlockShapes.MATTER_REPLICATOR.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.MATTER_REPLICATOR.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -16,6 +16,7 @@ import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.matter.MatterScannerBlockEntity
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
import ru.dbotthepony.mc.otm.registry.MBlockEntities
@ -42,7 +43,7 @@ class MatterScannerBlock : RotatableMatteryBlock(), EntityBlock {
builder.add(WorkerState.WORKER_STATE)
}
private val shapes = getShapeForEachState { BlockShapes.MATTER_SCANNER.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.MATTER_SCANNER.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -16,6 +16,7 @@ import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.matter.PatternStorageBlockEntity
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
import ru.dbotthepony.mc.otm.shapes.BlockShapes
@ -58,7 +59,7 @@ class PatternStorageBlock : RotatableMatteryBlock(), EntityBlock {
super.onRemove(oldBlockState, level, blockPos, newBlockState, movedByPiston)
}
private val shapes = getShapeForEachState { BlockShapes.PATTERN_STORAGE.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.PATTERN_STORAGE.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -17,6 +17,7 @@ import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity
import ru.dbotthepony.mc.otm.block.entity.storage.DriveRackBlockEntity
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
@ -50,7 +51,7 @@ class DriveRackBlock : RotatableMatteryBlock(), EntityBlock {
MatteryPoweredBlockEntity.appendHoverText(p_49816_, p_49817_, p_49818_, p_49819_)
}
private val shapes = getShapeForEachState { BlockShapes.DRIVE_RACK.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.DRIVE_RACK.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -22,6 +22,7 @@ import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity
import ru.dbotthepony.mc.otm.block.entity.storage.DriveViewerBlockEntity
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
@ -65,7 +66,7 @@ class DriveViewerBlock : RotatableMatteryBlock(), EntityBlock {
return super.getStateForPlacement(context)!!.setValue(DRIVE_PRESENT, false)
}
private val shapes = getShapeForEachState { BlockShapes.DRIVE_VIEWER.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.DRIVE_VIEWER.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -17,6 +17,7 @@ import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity
import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorBlockEntity
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
@ -50,7 +51,7 @@ class ItemMonitorBlock : RotatableMatteryBlock(), EntityBlock {
MatteryPoweredBlockEntity.appendHoverText(p_49816_, p_49817_, p_49818_, p_49819_)
}
private val shapes = getShapeForEachState { BlockShapes.ITEM_MONITOR.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.ITEM_MONITOR.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -17,6 +17,7 @@ import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity
import ru.dbotthepony.mc.otm.block.entity.storage.StoragePowerSupplierBlockEntity
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
@ -50,7 +51,7 @@ class StoragePowerSupplierBlock : RotatableMatteryBlock(), EntityBlock {
MatteryPoweredBlockEntity.appendHoverText(p_49816_, p_49817_, p_49818_, p_49819_)
}
private val shapes = getShapeForEachState { BlockShapes.STORAGE_POWER_SUPPLIER.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.STORAGE_POWER_SUPPLIER.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -19,6 +19,7 @@ import net.minecraft.world.level.block.Block
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.oncePre
import ru.dbotthepony.mc.otm.registry.MBlockEntities
@ -56,7 +57,7 @@ class BatteryBankBlock : RotatableMatteryBlock(), EntityBlock {
return BatteryBankBlockEntity(blockPos, blockState)
}
private val shapes = getShapeForEachState { BlockShapes.BATTERY_BANK.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.BATTERY_BANK.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -23,6 +23,7 @@ import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.tech.ChemicalGeneratorBlockEntity
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.capability.energy.GeneratorEnergyStorage
import ru.dbotthepony.mc.otm.capability.energy.ItemEnergyStorageImpl
import ru.dbotthepony.mc.otm.container.MatteryContainer
@ -96,7 +97,7 @@ class ChemicalGeneratorBlock : RotatableMatteryBlock(), EntityBlock {
}
}
private val shapes = getShapeForEachState { BlockShapes.CHEMICAL_GENERATOR.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.CHEMICAL_GENERATOR.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -15,6 +15,7 @@ import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.VoxelShape
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.tech.EnergyServoBlockEntity
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
import ru.dbotthepony.mc.otm.registry.MBlockEntities
@ -37,7 +38,7 @@ class EnergyServoBlock : RotatableMatteryBlock(Properties.of(Material.METAL, Mat
return null
}
private val shapes = getShapeForEachState { BlockShapes.ENERGY_SERVO.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.ENERGY_SERVO.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(

View File

@ -26,6 +26,7 @@ import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.VoxelShape
import net.minecraftforge.common.ForgeHooks
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
import ru.dbotthepony.mc.otm.core.math.minus
@ -87,7 +88,7 @@ class PhantomAttractorBlock : RotatableMatteryBlock(Properties.of(Material.METAL
}
}
private val shapes = getShapeForEachState {
private val shapes = getShapeForEachState(rotationProperty) {
val shape = when (it[BlockStateProperties.DOUBLE_BLOCK_HALF]!!) {
DoubleBlockHalf.UPPER -> BlockShapes.PHANTOM_ATTRACTOR_TOP.moveY(-1.0)
DoubleBlockHalf.LOWER -> BlockShapes.PHANTOM_ATTRACTOR_BOTTOM

View File

@ -20,6 +20,7 @@ import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
import ru.dbotthepony.mc.otm.block.entity.tech.PlatePressBlockEntity
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.getShapeForEachState
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.facingOne
import ru.dbotthepony.mc.otm.registry.MBlockEntities
@ -56,7 +57,7 @@ class PlatePressBlock(properties: Properties = DEFAULT_PROPERTIES) : RotatableMa
MatteryWorkerBlockEntity.appendHoverText(p_49816_, p_49817_, p_49818_, p_49819_)
}
private val shapes = getShapeForEachState { BlockShapes.PLATE_PRESS_IDLE.rotateFromSouth(it[rotationProperty]).computeShape() }
private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.PLATE_PRESS_IDLE.rotateFromSouth(it[rotationProperty]).computeShape() }
@Suppress("override_deprecation")
override fun getShape(