Phantom attractor is now two blocks tall
This commit is contained in:
parent
434164e054
commit
cfe4bfb9df
@ -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) {
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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];
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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?,
|
||||||
|
Loading…
Reference in New Issue
Block a user