Phantom attractor is now two blocks tall

This commit is contained in:
DBotThePony 2022-09-30 11:03:12 +07:00
parent 434164e054
commit cfe4bfb9df
Signed by: DBot
GPG Key ID: DCC23B5715498507
8 changed files with 160 additions and 4 deletions

View File

@ -1,6 +1,8 @@
package ru.dbotthepony.mc.otm.datagen.blocks
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf
import net.minecraftforge.client.model.generators.ConfiguredModel
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.block.CableBlock
@ -9,11 +11,13 @@ import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock
import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.datagen.toXRotBlockstate
import ru.dbotthepony.mc.otm.datagen.toXRotBlockstateInv
import ru.dbotthepony.mc.otm.datagen.toYRotBlockstate
import ru.dbotthepony.mc.otm.datagen.toYRotBlockstateInv
import ru.dbotthepony.mc.otm.registry.MBlocks
import ru.dbotthepony.mc.otm.registry.MNames
import ru.dbotthepony.mc.otm.registry.MRegistry
fun addBlockStates(provider: MatteryBlockStateProvider) {
@ -28,9 +32,18 @@ fun addBlockStates(provider: MatteryBlockStateProvider) {
provider.block(MBlocks.MATTER_SCANNER)
provider.block(MBlocks.ITEM_MONITOR)
provider.block(MBlocks.PHANTOM_ATTRACTOR)
provider.exec {
with(provider.getMultipartBuilder(MBlocks.PHANTOM_ATTRACTOR)) {
for (dir in RotatableMatteryBlock.FACING.possibleValues) {
part().modelFile(provider.models().getExistingFile(modLocation("block/${MNames.PHANTOM_ATTRACTOR}")))
.rotationY(dir.toYRotBlockstate())
.addModel()
.condition(BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.LOWER)
.condition(RotatableMatteryBlock.FACING, dir)
.end()
}
}
with(provider.getMultipartBuilder(MBlocks.MATTER_BOTTLER)) {
for (dir in RotatableMatteryBlock.FACING.possibleValues) {
for (enum in WorkerState.SEMI_WORKER_STATE.possibleValues) {

View File

@ -72,6 +72,12 @@ class LootTables(generator: DataGenerator) : LootTableProvider(generator) {
providers.add(Pair(Supplier { provider }, LootContextParamSets.BLOCK))
}
fun blockSimple(block: Block, provider: (LootPool.Builder) -> Unit) {
block {
it.accept(block.lootTable, singleLootPool(provider::invoke))
}
}
fun provider(provider: LootTableCallback, context: LootContextParamSet) {
providers.add(Pair(Supplier { provider }, context))
}

View File

@ -1,6 +1,12 @@
package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.advancements.critereon.StatePropertiesPredicate
import net.minecraft.data.loot.BlockLoot
import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf
import net.minecraft.world.level.storage.loot.entries.LootItem
import net.minecraft.world.level.storage.loot.entries.LootPoolEntries
import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition
import ru.dbotthepony.mc.otm.block.entity.ChemicalGeneratorBlockEntity
import ru.dbotthepony.mc.otm.block.entity.EnergyCounterBlockEntity
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity.Companion.ENERGY_KEY
@ -38,7 +44,13 @@ fun addLootTables(lootTables: LootTables) {
lootTables.dropsSelf(MBlocks.DANGER_STRIPE_BLOCK)
lootTables.dropsSelf(MBlocks.METAL_BEAM)
lootTables.dropsSelf(MBlocks.PHANTOM_ATTRACTOR)
lootTables.blockSimple(MBlocks.PHANTOM_ATTRACTOR) {
it.add(LootItem.lootTableItem(MBlocks.PHANTOM_ATTRACTOR)
.`when`(LootItemBlockStatePropertyCondition
.hasBlockStateProperties(MBlocks.PHANTOM_ATTRACTOR)
.setProperties(StatePropertiesPredicate.Builder.properties()
.hasProperty(BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.LOWER))))
}
lootTables.tile(MBlocks.ENERGY_SERVO)

View File

@ -11,6 +11,15 @@ import javax.annotation.ParametersAreNonnullByDefault;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public record BlockShape(SimpleCuboid ...shapes) {
public BlockShape moveY(final double value) {
var list = new SimpleCuboid[shapes.length];
for (int i = 0; i < shapes.length; i++)
list[i] = shapes[i].moveY(value);
return new BlockShape(list);
}
public BlockShape rotateAroundY(double rad) {
var list = new SimpleCuboid[shapes.length];

View File

@ -521,4 +521,24 @@ public class BlockShapes {
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)
);
public static final BlockShape PHANTOM_ATTRACTOR_BOTTOM = new BlockShape(
new SimpleCuboid(0d, 0d, 0d, 1d, 0.3125d, 1d),
new SimpleCuboid(0.0625d, 0.3125d, 0.0625d, 0.9375d, 0.375d, 0.9375d),
new SimpleCuboid(0d, 0.375d, 0d, 1d, 0.5625d, 1d),
new SimpleCuboid(0.375d, 0.625d, 0.375d, 0.625d, 1.75d, 0.625d),
new SimpleCuboid(0.0625d, 0.5625d, 0.0625d, 0.9375d, 0.6875d, 0.9375d),
new SimpleCuboid(0.3125d, 0.75d, 0.3125d, 0.6875d, 0.9375d, 0.6875d)
);
public static final BlockShape PHANTOM_ATTRACTOR_TOP = new BlockShape(
new SimpleCuboid(0.625d, 1.3125d, 0.4375d, 0.875d, 1.6875d, 0.5625d),
new SimpleCuboid(0.125d, 1.3125d, 0.4375d, 0.375d, 1.6875d, 0.5625d),
new SimpleCuboid(0.4375d, 1.3125d, 0.625d, 0.5625d, 1.6875d, 0.875d),
new SimpleCuboid(0.4375d, 1.3125d, 0.125d, 0.5625d, 1.6875d, 0.375d),
new SimpleCuboid(0.3125d, 1.25d, 0.875d, 0.6875d, 2d, 1d),
new SimpleCuboid(0.3125d, 1.25d, 0d, 0.6875d, 2d, 0.125d),
new SimpleCuboid(0.875d, 1.25d, 0.3125d, 1d, 2d, 0.6875d),
new SimpleCuboid(0d, 1.25d, 0.3125d, 0.125d, 2d, 0.6875d)
);
}

View File

@ -103,4 +103,15 @@ public record SimpleCuboid(double min_x, double min_y, double min_z, double max_
return new SimpleCuboid(min_x, min_y, min_z, max_x, max_y, max_z);
}
public SimpleCuboid moveY(final double value) {
return new SimpleCuboid(
min_x,
min_y + value,
min_z,
max_x,
max_y + value,
max_z
);
}
}

View File

@ -4,17 +4,34 @@ import net.minecraft.core.BlockPos
import net.minecraft.server.level.ServerLevel
import net.minecraft.util.RandomSource
import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.MobSpawnType
import net.minecraft.world.entity.SpawnGroupData
import net.minecraft.world.entity.monster.Phantom
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.NaturalSpawner
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf
import net.minecraft.world.level.material.Material
import net.minecraft.world.level.material.MaterialColor
import net.minecraft.world.phys.AABB
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.VoxelShape
import net.minecraftforge.common.ForgeHooks
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.minus
import ru.dbotthepony.mc.otm.core.plus
import ru.dbotthepony.mc.otm.once
import ru.dbotthepony.mc.otm.registry.MBlocks
import ru.dbotthepony.mc.otm.shapes.BlockShapes
class PhantomAttractorBlock : RotatableMatteryBlock(Properties.of(Material.METAL, MaterialColor.COLOR_BLUE).destroyTime(3f).explosionResistance(12f).randomTicks()) {
@Suppress("OVERRIDE_DEPRECATION")
@ -54,4 +71,72 @@ class PhantomAttractorBlock : RotatableMatteryBlock(Properties.of(Material.METAL
}
}
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
super.createBlockStateDefinition(builder)
builder.add(BlockStateProperties.DOUBLE_BLOCK_HALF)
}
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
if (context.clickedPos.y < context.level.maxBuildHeight - 1 && context.level.getBlockState(context.clickedPos.above()).canBeReplaced(context)) {
return defaultBlockState().setValue(BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.LOWER)
} else {
return null
}
}
private val shapes by lazy {
getShapeForEachState {
val shape = when (it[BlockStateProperties.DOUBLE_BLOCK_HALF]!!) {
DoubleBlockHalf.UPPER -> BlockShapes.PHANTOM_ATTRACTOR_TOP.moveY(-1.0)
DoubleBlockHalf.LOWER -> BlockShapes.PHANTOM_ATTRACTOR_BOTTOM
}
shape.rotate(it[FACING]!!).computeShape()
}
}
override fun getShape(
p_60555_: BlockState,
p_60556_: BlockGetter,
p_60557_: BlockPos,
p_60558_: CollisionContext
): VoxelShape {
return shapes[p_60555_]!!
}
override fun setPlacedBy(
level: Level,
blockPos: BlockPos,
blockState: BlockState,
entity: LivingEntity?,
itemStack: ItemStack
) {
super.setPlacedBy(level, blockPos, blockState, entity, itemStack)
level.setBlockAndUpdate(blockPos.above(), defaultBlockState().setValue(BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.UPPER))
}
override fun neighborChanged(
state: BlockState,
level: Level,
pos: BlockPos,
neighbour: Block,
neighbourPos: BlockPos,
movedByPiston: Boolean
) {
super.neighborChanged(state, level, pos, neighbour, neighbourPos, movedByPiston)
level.once {
if (state[BlockStateProperties.DOUBLE_BLOCK_HALF] == DoubleBlockHalf.LOWER) {
if (!level.getBlockState(pos.above()).`is`(MBlocks.PHANTOM_ATTRACTOR)) {
dropResources(state, level, pos)
level.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState())
}
} else {
if (!level.getBlockState(pos.below()).`is`(MBlocks.PHANTOM_ATTRACTOR)) {
level.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState())
}
}
}
}
}

View File

@ -78,7 +78,7 @@ object MItems {
}
val PHANTOM_ATTRACTOR: Item by registry.register(MNames.PHANTOM_ATTRACTOR) {
object : BlockItem(MBlocks.PHANTOM_ATTRACTOR, DEFAULT_PROPERTIES) {
object : DoubleHighBlockItem(MBlocks.PHANTOM_ATTRACTOR, DEFAULT_PROPERTIES) {
override fun appendHoverText(
p_40572_: ItemStack,
p_40573_: Level?,