diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/StarChairBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/StarChairBlock.kt new file mode 100644 index 000000000..1620e2966 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/decorative/StarChairBlock.kt @@ -0,0 +1,47 @@ +package ru.dbotthepony.mc.otm.block.decorative + +import net.minecraft.core.BlockPos +import net.minecraft.world.InteractionResult +import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.DyeColor +import net.minecraft.world.level.BlockGetter +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.material.MapColor +import net.minecraft.world.phys.BlockHitResult +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.AABB +import ru.dbotthepony.mc.otm.core.get +import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom +import ru.dbotthepony.mc.otm.core.math.plus +import ru.dbotthepony.mc.otm.entity.RideableDummy +import ru.dbotthepony.mc.otm.shapes.BlockShapes + +class StarChairBlock(val color: DyeColor?) : RotatableMatteryBlock(DEFAULT_PROPERTIES.mapColor(color?.mapColor ?: MapColor.COLOR_LIGHT_BLUE)) { + override fun rotationFreedom(): BlockRotationFreedom = BlockRotationFreedom.HORIZONTAL + + private val shapes = getShapeForEachState(rotationProperty) { BlockShapes.STAR_CHAIR.rotateFromNorth(it[rotationProperty]).computeShape() } + override fun getShape(state: BlockState, blockGetter: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape = shapes[state]!! + + override fun useWithoutItem(blockState: BlockState, level: Level, blockPos: BlockPos, ply: Player, blockHitResult: BlockHitResult): InteractionResult { + if (ply.isCrouching) return super.useWithoutItem(blockState, level, blockPos, ply, blockHitResult) + + val entities = level.getEntitiesOfClass(RideableDummy::class.java, AABB(blockPos, blockPos + BlockPos(1, 1, 1))) + if (entities.isNotEmpty()) return InteractionResult.FAIL + + val entity = RideableDummy(level) + entity.blockPos = blockPos + entity.blockState = blockState + + entity.yRot = blockState[rotationFreedom()].front.toYRot() + entity.setPos(blockPos.x + 0.5, blockPos.y.toDouble(), blockPos.z + 0.5) + + level.addFreshEntity(entity) + ply.startRiding(entity) + + return InteractionResult.SUCCESS + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/RideableDummy.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/RideableDummy.kt new file mode 100644 index 000000000..8f12bba1a --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/RideableDummy.kt @@ -0,0 +1,46 @@ +package ru.dbotthepony.mc.otm.entity + +import net.minecraft.core.BlockPos +import net.minecraft.core.registries.Registries +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.NbtUtils +import net.minecraft.network.syncher.SynchedEntityData +import net.minecraft.world.entity.Entity +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Blocks +import net.minecraft.world.level.block.state.BlockState +import ru.dbotthepony.mc.otm.registry.MEntityTypes + +class RideableDummy(level: Level) : Entity(MEntityTypes.RIDEABLE_DUMMY, level) { + var blockPos: BlockPos = BlockPos.ZERO + var blockState: BlockState = Blocks.AIR.defaultBlockState() + + init { + isNoGravity = true + noPhysics = true + } + + override fun tick() { + super.tick() + + if (level().getBlockState(blockPos) != blockState || passengers.isEmpty()) { + discard() + + return + } + } + + override fun defineSynchedData(tag: SynchedEntityData.Builder) { + // none + } + + override fun readAdditionalSaveData(tag: CompoundTag) { + blockPos = NbtUtils.readBlockPos(tag, "block_pos").orElse(BlockPos.ZERO) + blockState = NbtUtils.readBlockState(this.level().holderLookup(Registries.BLOCK), tag.getCompound("block_state")) + } + + override fun addAdditionalSaveData(tag: CompoundTag) { + tag.put("block_pos", NbtUtils.writeBlockPos(blockPos)) + tag.put("block_state", NbtUtils.writeBlockState(blockState)) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt index 149e14f7e..18a2a378f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MEntityTypes.kt @@ -4,6 +4,7 @@ import net.minecraft.client.model.geom.ModelLayers import net.minecraft.client.renderer.entity.EntityRenderer import net.minecraft.client.renderer.entity.EntityRenderers import net.minecraft.client.renderer.entity.MinecartRenderer +import net.minecraft.client.renderer.entity.NoopRenderer import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.world.entity.Entity import net.minecraft.world.entity.EntityType @@ -14,6 +15,7 @@ import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent import ru.dbotthepony.mc.otm.client.render.entity.PlasmaProjectileRenderer import ru.dbotthepony.mc.otm.entity.MinecartCargoCrate import ru.dbotthepony.mc.otm.entity.PlasmaProjectile +import ru.dbotthepony.mc.otm.entity.RideableDummy object MEntityTypes { private val registry = MDeferredRegister(BuiltInRegistries.ENTITY_TYPE) @@ -26,6 +28,10 @@ object MEntityTypes { EntityType.Builder.of({ it, level -> MinecartCargoCrate(it, color, level)}, MobCategory.MISC).sized(0.98F, 0.7F).clientTrackingRange(8).build("dfu doesn't works ✅") } + val RIDEABLE_DUMMY: EntityType by registry.register(MNames.RIDEABLE_DUMMY) { + EntityType.Builder.of({ _, level -> RideableDummy(level)}, MobCategory.MISC).sized(0.5f, 0.5f).build(MNames.RIDEABLE_DUMMY) + } + fun register(bus: IEventBus) { registry.register(bus) bus.addListener(this::registerClient) @@ -39,6 +45,8 @@ object MEntityTypes { for (type in CARGO_CRATE_MINECARTS.values) { EntityRenderers.register(type) { MinecartRenderer(it, ModelLayers.CHEST_MINECART) as EntityRenderer } } + + EntityRenderers.register(RIDEABLE_DUMMY, ::NoopRenderer) } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt index d884f51ee..9ac45681a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt @@ -284,6 +284,7 @@ object MNames { // entities const val PLASMA = "plasma_projectile" + const val RIDEABLE_DUMMY = "rideable_dummy" const val PHANTOM_ATTRACTOR = "phantom_attractor" const val JUMP_BOOST = "jump_boost" diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt index 94a743924..cad7fa32b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt @@ -32,6 +32,7 @@ import ru.dbotthepony.mc.otm.android.AndroidFeatureType import ru.dbotthepony.mc.otm.android.feature.EnderTeleporterFeature import ru.dbotthepony.mc.otm.android.feature.NanobotsArmorFeature import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock +import ru.dbotthepony.mc.otm.block.decorative.StarChairBlock import ru.dbotthepony.mc.otm.block.decorative.TritaniumPressurePlate import ru.dbotthepony.mc.otm.capability.matteryEnergy import ru.dbotthepony.mc.otm.client.MatteryGUI @@ -110,13 +111,7 @@ object MRegistry : IBlockItemRegistryAcceptor { .destroyTime(1.5f) }.also { decorativeBlocks.add(it) } - val STAR_CHAIR = DecorativeBlock.rotatable("star_chair", BlockShapes.STAR_CHAIR, BlockRotationFreedom.HORIZONTAL) { - BlockBehaviour.Properties.of() - .mapColor(it?.mapColor ?: MapColor.COLOR_LIGHT_BLUE) - .sound(SoundType.METAL) - .explosionResistance(15f) - .destroyTime(1.5f) - }.also { decorativeBlocks.add(it) } + val STAR_CHAIR = DecorativeBlock("star_chair", ::StarChairBlock).also { decorativeBlocks.add(it) } val TRITANIUM_STAIRS = DecorativeBlock(MNames.TRITANIUM_STAIRS) { StairBlock(