diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt index 3279b69a3..f71ca7326 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt @@ -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) { diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt index 274d027b0..d70701809 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt @@ -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)) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt index 454948fe1..950ad943e 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt @@ -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) diff --git a/src/main/java/ru/dbotthepony/mc/otm/shapes/BlockShape.java b/src/main/java/ru/dbotthepony/mc/otm/shapes/BlockShape.java index 95590fe3b..a414961ad 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/shapes/BlockShape.java +++ b/src/main/java/ru/dbotthepony/mc/otm/shapes/BlockShape.java @@ -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]; diff --git a/src/main/java/ru/dbotthepony/mc/otm/shapes/BlockShapes.java b/src/main/java/ru/dbotthepony/mc/otm/shapes/BlockShapes.java index 463f9a898..f65311c6b 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/shapes/BlockShapes.java +++ b/src/main/java/ru/dbotthepony/mc/otm/shapes/BlockShapes.java @@ -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) + ); } diff --git a/src/main/java/ru/dbotthepony/mc/otm/shapes/SimpleCuboid.java b/src/main/java/ru/dbotthepony/mc/otm/shapes/SimpleCuboid.java index ff9731889..c42f52a66 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/shapes/SimpleCuboid.java +++ b/src/main/java/ru/dbotthepony/mc/otm/shapes/SimpleCuboid.java @@ -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 + ); + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/PhantomAttractorBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/PhantomAttractorBlock.kt index 2505a2866..a85210898 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/PhantomAttractorBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/PhantomAttractorBlock.kt @@ -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) { + 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()) + } + } + } + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index 9fff3358d..0b32862f5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -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?,