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 package ru.dbotthepony.mc.otm.datagen.blocks
import net.minecraft.resources.ResourceLocation 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 net.minecraftforge.client.model.generators.ConfiguredModel
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.block.CableBlock 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.entity.WorkerState
import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock
import ru.dbotthepony.mc.otm.core.registryName 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.toXRotBlockstate
import ru.dbotthepony.mc.otm.datagen.toXRotBlockstateInv import ru.dbotthepony.mc.otm.datagen.toXRotBlockstateInv
import ru.dbotthepony.mc.otm.datagen.toYRotBlockstate import ru.dbotthepony.mc.otm.datagen.toYRotBlockstate
import ru.dbotthepony.mc.otm.datagen.toYRotBlockstateInv import ru.dbotthepony.mc.otm.datagen.toYRotBlockstateInv
import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MBlocks
import ru.dbotthepony.mc.otm.registry.MNames
import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MRegistry
fun addBlockStates(provider: MatteryBlockStateProvider) { fun addBlockStates(provider: MatteryBlockStateProvider) {
@ -28,9 +32,18 @@ fun addBlockStates(provider: MatteryBlockStateProvider) {
provider.block(MBlocks.MATTER_SCANNER) provider.block(MBlocks.MATTER_SCANNER)
provider.block(MBlocks.ITEM_MONITOR) provider.block(MBlocks.ITEM_MONITOR)
provider.block(MBlocks.PHANTOM_ATTRACTOR)
provider.exec { 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)) { with(provider.getMultipartBuilder(MBlocks.MATTER_BOTTLER)) {
for (dir in RotatableMatteryBlock.FACING.possibleValues) { for (dir in RotatableMatteryBlock.FACING.possibleValues) {
for (enum in WorkerState.SEMI_WORKER_STATE.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)) 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) { fun provider(provider: LootTableCallback, context: LootContextParamSet) {
providers.add(Pair(Supplier { provider }, context)) providers.add(Pair(Supplier { provider }, context))
} }

View File

@ -1,6 +1,12 @@
package ru.dbotthepony.mc.otm.datagen.loot package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.advancements.critereon.StatePropertiesPredicate
import net.minecraft.data.loot.BlockLoot 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.ChemicalGeneratorBlockEntity
import ru.dbotthepony.mc.otm.block.entity.EnergyCounterBlockEntity import ru.dbotthepony.mc.otm.block.entity.EnergyCounterBlockEntity
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity.Companion.ENERGY_KEY 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.DANGER_STRIPE_BLOCK)
lootTables.dropsSelf(MBlocks.METAL_BEAM) 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) lootTables.tile(MBlocks.ENERGY_SERVO)

View File

@ -11,6 +11,15 @@ import javax.annotation.ParametersAreNonnullByDefault;
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public record BlockShape(SimpleCuboid ...shapes) { 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) { public BlockShape rotateAroundY(double rad) {
var list = new SimpleCuboid[shapes.length]; 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.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.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); 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.server.level.ServerLevel
import net.minecraft.util.RandomSource import net.minecraft.util.RandomSource
import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.MobSpawnType import net.minecraft.world.entity.MobSpawnType
import net.minecraft.world.entity.SpawnGroupData import net.minecraft.world.entity.SpawnGroupData
import net.minecraft.world.entity.monster.Phantom 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.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.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.Material
import net.minecraft.world.level.material.MaterialColor import net.minecraft.world.level.material.MaterialColor
import net.minecraft.world.phys.AABB 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 net.minecraftforge.common.ForgeHooks
import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.minus import ru.dbotthepony.mc.otm.core.minus
import ru.dbotthepony.mc.otm.core.plus 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()) { class PhantomAttractorBlock : RotatableMatteryBlock(Properties.of(Material.METAL, MaterialColor.COLOR_BLUE).destroyTime(3f).explosionResistance(12f).randomTicks()) {
@Suppress("OVERRIDE_DEPRECATION") @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) { 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( override fun appendHoverText(
p_40572_: ItemStack, p_40572_: ItemStack,
p_40573_: Level?, p_40573_: Level?,