diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt index 6e93d2fe6..aeae414e3 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt @@ -12,7 +12,6 @@ */ package de.bixilon.minosoft.data.registries.blocks.types -import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.kutil.cast.CastUtil.unsafeNull import de.bixilon.minosoft.data.language.LanguageUtil.translation import de.bixilon.minosoft.data.language.translate.Translatable @@ -28,8 +27,6 @@ import de.bixilon.minosoft.data.registries.blocks.types.properties.physics.Pushi import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.registry.RegistryItem import de.bixilon.minosoft.gui.rendering.tint.TintProvider -import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection -import java.util.* import kotlin.reflect.jvm.javaField abstract class Block( @@ -49,9 +46,6 @@ abstract class Block( return identifier.toString() } - @Deprecated("Interface") - open fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) = Unit - @Deprecated("Interface") open fun canCull(blockState: BlockState, other: BlockState): Boolean = true diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/FluidBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/FluidBlock.kt index a44822928..86e651344 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/FluidBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/FluidBlock.kt @@ -14,22 +14,23 @@ package de.bixilon.minosoft.data.registries.blocks.types.fluid import de.bixilon.kotlinglm.vec3.Vec3 -import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.kutil.exception.Broken import de.bixilon.minosoft.data.registries.blocks.light.CustomLightProperties import de.bixilon.minosoft.data.registries.blocks.settings.BlockSettings import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.types.Block import de.bixilon.minosoft.data.registries.blocks.types.properties.LightedBlock +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.blocks.types.properties.shape.outline.OutlinedBlock import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.shapes.aabb.AABB import de.bixilon.minosoft.data.registries.shapes.voxel.VoxelShape +import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* -abstract class FluidBlock(identifier: ResourceLocation, settings: BlockSettings) : Block(identifier, settings), FluidHolder, OutlinedBlock, LightedBlock { +abstract class FluidBlock(identifier: ResourceLocation, settings: BlockSettings) : Block(identifier, settings), FluidHolder, OutlinedBlock, LightedBlock, RandomDisplayTickable { override val hardness: Float get() = Broken("Fluid is kind of unbreakable?") override fun getOutlineShape(connection: PlayConnection, blockState: BlockState): VoxelShape { @@ -38,8 +39,8 @@ abstract class FluidBlock(identifier: ResourceLocation, settings: BlockSettings) override fun getLightProperties(blockState: BlockState) = LIGHT_PROPERTIES - override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { - fluid.randomTick(connection, blockState, blockPosition, random) + override fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) { + fluid.randomTick(connection, state, position, random) } companion object { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/water/BubbleColumnBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/water/BubbleColumnBlock.kt index 9ecfe5cf2..7b434c371 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/water/BubbleColumnBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/water/BubbleColumnBlock.kt @@ -29,16 +29,18 @@ import de.bixilon.minosoft.data.registries.blocks.types.fluid.FluidBlock import de.bixilon.minosoft.data.registries.blocks.types.fluid.FluidFilled import de.bixilon.minosoft.data.registries.blocks.types.properties.LightedBlock import de.bixilon.minosoft.data.registries.blocks.types.properties.physics.VelocityBlock +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.fluid.fluids.WaterFluid import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus import de.bixilon.minosoft.physics.entities.EntityPhysics import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* -class BubbleColumnBlock(identifier: ResourceLocation = Companion.identifier, settings: BlockSettings) : Block(identifier, settings), VelocityBlock, EntityCollisionHandler, FluidFilled, LightedBlock { +class BubbleColumnBlock(identifier: ResourceLocation = Companion.identifier, settings: BlockSettings) : Block(identifier, settings), VelocityBlock, EntityCollisionHandler, FluidFilled, LightedBlock, RandomDisplayTickable { override val hardness: Float get() = Broken("Fluid!") override val fluid: WaterFluid = unsafeNull() override val velocity: Float get() = 1.0f @@ -73,8 +75,8 @@ class BubbleColumnBlock(identifier: ResourceLocation = Companion.identifier, set override fun getLightProperties(blockState: BlockState) = FluidBlock.LIGHT_PROPERTIES - override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { - fluid.randomTick(connection, blockState, blockPosition, random) + override fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) { + fluid.randomTick(connection, state, position, random) } companion object : BlockFactory { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/RedstoneTorchBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/RedstoneTorchBlock.kt index a3282c59f..c46dfb9d5 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/RedstoneTorchBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/RedstoneTorchBlock.kt @@ -14,29 +14,30 @@ package de.bixilon.minosoft.data.registries.blocks.types.pixlyzer import de.bixilon.kotlinglm.vec3.Vec3d -import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactory import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.isLit import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.particle.data.DustParticleData import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.text.formatting.color.Colors +import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.dust.DustParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.of import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* -open class RedstoneTorchBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : TorchBlock(resourceLocation, registries, data) { +open class RedstoneTorchBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : TorchBlock(resourceLocation, registries, data), RandomDisplayTickable { private val redstoneDustParticle = registries.particleType[DustParticle] - override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { - if (!blockState.isLit()) { + override fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) { + if (!state.isLit()) { return } - (flameParticle ?: redstoneDustParticle)?.let { connection.world += it.factory?.build(connection, Vec3d(blockPosition) + Vec3d(0.5, 0.7, 0.5) + (Vec3d.of { random.nextDouble() - 0.5 } * 0.2), Vec3d.EMPTY, DustParticleData(Colors.TRUE_RED, 1.0f, it)) } + (flameParticle ?: redstoneDustParticle)?.let { connection.world += it.factory?.build(connection, Vec3d(position) + Vec3d(0.5, 0.7, 0.5) + (Vec3d.of { random.nextDouble() - 0.5 } * 0.2), Vec3d.EMPTY, DustParticleData(Colors.TRUE_RED, 1.0f, it)) } } companion object : PixLyzerBlockFactory { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/TorchBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/TorchBlock.kt index 39a4f586c..725986d62 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/TorchBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/TorchBlock.kt @@ -17,14 +17,16 @@ import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactory import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.fire.SmokeParticle import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* -open class TorchBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data) { +open class TorchBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data), RandomDisplayTickable { protected val smokeParticle = registries.particleType[SmokeParticle] protected val flameParticle = registries.particleType[data["flame_particle"]] @@ -35,8 +37,8 @@ open class TorchBlock(resourceLocation: ResourceLocation, registries: Registries flameParticle?.let { connection.world += it.factory?.build(connection, Vec3d(particlePosition), Vec3d.EMPTY) } } - override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { - spawnSmokeParticles(connection, blockPosition) + override fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) { + spawnSmokeParticles(connection, position) } companion object : PixLyzerBlockFactory { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/CampfireBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/CampfireBlock.kt index 069230067..ba912c9a5 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/CampfireBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/CampfireBlock.kt @@ -25,6 +25,7 @@ import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Com import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState import de.bixilon.minosoft.data.registries.blocks.types.properties.LitBlock +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.world.positions.BlockPosition @@ -37,7 +38,7 @@ import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.util.KUtil.toResourceLocation import java.util.* -open class CampfireBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : BlockWithEntity(resourceLocation, registries, data), LitBlock { +open class CampfireBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : BlockWithEntity(resourceLocation, registries, data), LitBlock, RandomDisplayTickable { val lavaParticles = data["lava_particles"]?.toBoolean() ?: true private val cosySmokeParticle = registries.particleType[CampfireSmokeParticle.CosyFactory]!! @@ -76,16 +77,16 @@ open class CampfireBlock(resourceLocation: ResourceLocation, registries: Registr } } - override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { - if (!blockState.isLit()) { + override fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) { + if (!state.isLit()) { return } if (random.chance(10)) { - connection.world.playSoundEvent(CAMPFIRE_CRACKLE_SOUND, blockPosition + Vec3(0.5f), 0.5f + random.nextFloat(), 0.6f + random.nextFloat() * 0.7f) + connection.world.playSoundEvent(CAMPFIRE_CRACKLE_SOUND, position + Vec3(0.5f), 0.5f + random.nextFloat(), 0.6f + random.nextFloat() * 0.7f) } if (lavaParticles && random.chance(20)) { - val position = Vec3d(blockPosition) + 0.5 + val position = Vec3d(position) + 0.5 for (i in 0 until random.nextInt(1) + 1) { connection.world += LavaParticle(connection, position, lavaParticle.default()) } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/container/processing/BrewingStandBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/container/processing/BrewingStandBlock.kt index a865b56c5..b8d5aed93 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/container/processing/BrewingStandBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/container/processing/BrewingStandBlock.kt @@ -14,12 +14,13 @@ package de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.entity.container.processing import de.bixilon.kotlinglm.vec3.Vec3d -import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.minosoft.data.entities.block.container.processing.BrewingStandBlockEntity import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactory import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.fire.SmokeParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.horizontal import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d @@ -27,16 +28,14 @@ import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* -open class BrewingStandBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : ProcessingBlock(resourceLocation, registries, data) { +open class BrewingStandBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : ProcessingBlock(resourceLocation, registries, data), RandomDisplayTickable { private val smokeParticle = registries.particleType[SmokeParticle] - override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { - super.randomTick(connection, blockState, blockPosition, random) - + override fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) { smokeParticle?.let { connection.world += SmokeParticle( connection, - blockPosition.toVec3d + Vec3d(0.4, 0.7, 0.4) + Vec3d.horizontal({ random.nextDouble() * 0.2 }, random.nextDouble() * 0.3), + position.toVec3d + Vec3d(0.4, 0.7, 0.4) + Vec3d.horizontal({ random.nextDouble() * 0.2 }, random.nextDouble() * 0.3), Vec3d.EMPTY, it.default(), ) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/container/storage/EnderChestBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/container/storage/EnderChestBlock.kt index f0b083940..d4c145424 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/container/storage/EnderChestBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/container/storage/EnderChestBlock.kt @@ -14,27 +14,28 @@ package de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.entity.container.storage import de.bixilon.kotlinglm.vec3.Vec3d -import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.minosoft.data.entities.block.container.storage.EnderChestBlockEntity import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactory import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.PortalParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* -open class EnderChestBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : StorageBlock(resourceLocation, registries, data) { +open class EnderChestBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : StorageBlock(resourceLocation, registries, data), RandomDisplayTickable { private val portalParticle = registries.particleType[PortalParticle] - override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { + override fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) { portalParticle ?: return for (i in 0 until 3) { val xFactor = random.nextInt(2) * 2 - 1 val zFactor = random.nextInt(2) * 2 - 1 - val position = blockPosition.toVec3d + Vec3d( + val position = position.toVec3d + Vec3d( 0.5 + 0.25 * xFactor, random.nextDouble(), 0.5 + 0.25 * zFactor, diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/portal/NetherPortalBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/portal/NetherPortalBlock.kt index a2bff2fef..9abd70c21 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/portal/NetherPortalBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/portal/NetherPortalBlock.kt @@ -14,42 +14,41 @@ package de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.portal import de.bixilon.kotlinglm.vec3.Vec3d -import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactory import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.PixLyzerBlock +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.PortalParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.of import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* -open class NetherPortalBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data) { +open class NetherPortalBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data), RandomDisplayTickable { private val portalParticleType = registries.particleType[PortalParticle] - override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { - super.randomTick(connection, blockState, blockPosition, random) - + override fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) { portalParticleType?.let { for (i in 0 until 4) { - val position = Vec3d(blockPosition) + { random.nextDouble() } + val particlePosition = Vec3d(position) + { random.nextDouble() } val velocity = Vec3d.of { (random.nextDouble() - 0.5) * 0.5 } val factor = (random.nextInt(2) * 2 + 1).toDouble() - if (connection.world[blockPosition + Directions.WEST]?.block != this && connection.world[blockPosition + Directions.EAST]?.block != this) { - position.x = blockPosition.x + 0.5 + 0.25 * factor + if (connection.world[position + Directions.WEST]?.block != this && connection.world[position + Directions.EAST]?.block != this) { + particlePosition.x = position.x + 0.5 + 0.25 * factor velocity.x = random.nextDouble() * 2.0 * factor } else { - position.z = blockPosition.z + 0.5 + 0.25 * factor + particlePosition.z = position.z + 0.5 + 0.25 * factor velocity.z = random.nextDouble() * 2.0 * factor } connection.world += PortalParticle( connection, - position, + particlePosition, velocity, it.default(), ) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/LeverBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/LeverBlock.kt index 0454c76d0..3bccf1c81 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/LeverBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/LeverBlock.kt @@ -25,17 +25,19 @@ import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Com import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.isPowered import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.types.properties.InteractBlockHandler +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.particle.data.DustParticleData import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.text.formatting.color.Colors +import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.dust.DustParticle import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* -open class LeverBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : WallMountedBlock(resourceLocation, registries, data), InteractBlockHandler { +open class LeverBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : WallMountedBlock(resourceLocation, registries, data), InteractBlockHandler, RandomDisplayTickable { private val dustParticleType = registries.particleType[DustParticle] private fun spawnParticles(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, scale: Float) { @@ -48,12 +50,12 @@ open class LeverBlock(resourceLocation: ResourceLocation, registries: Registries connection.world += DustParticle(connection, position, Vec3d.EMPTY, DustParticleData(Colors.TRUE_RED, scale, dustParticleType)) } - override fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) { - if (!blockState.isPowered()) { + override fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) { + if (!state.isPowered()) { return } if (random.chance(25)) { - spawnParticles(connection, blockState, blockPosition, 0.5f) + spawnParticles(connection, state, position, 0.5f) } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/rendering/RandomDisplayTickable.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/rendering/RandomDisplayTickable.kt new file mode 100644 index 000000000..5dd57d093 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/rendering/RandomDisplayTickable.kt @@ -0,0 +1,24 @@ +/* + * Minosoft + * Copyright (C) 2020-2023 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.registries.blocks.types.properties.rendering + +import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.world.positions.BlockPosition +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection +import java.util.* + +interface RandomDisplayTickable { + + fun randomDisplayTick(connection: PlayConnection, state: BlockState, position: BlockPosition, random: Random) +} diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.kt b/src/main/java/de/bixilon/minosoft/data/world/World.kt index 1a8879b2e..8e46b16ef 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/World.kt @@ -22,6 +22,7 @@ import de.bixilon.minosoft.data.entities.block.BlockEntity import de.bixilon.minosoft.data.entities.entities.Entity import de.bixilon.minosoft.data.registries.biomes.Biome import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.dimension.DimensionProperties import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.shapes.aabb.AABB @@ -165,7 +166,7 @@ class World( border.tick() } - fun randomTick() { + fun randomDisplayTick() { val origin = connection.player.physics.positionInfo.blockPosition val chunk = this.chunks[origin.chunkPosition] ?: return @@ -173,12 +174,12 @@ class World( val chunkDelta = Vec2i.EMPTY for (i in 0 until 667) { - randomTick(16, origin, position, chunkDelta, chunk) - randomTick(32, origin, position, chunkDelta, chunk) + randomDisplayTick(16, origin, position, chunkDelta, chunk) + randomDisplayTick(32, origin, position, chunkDelta, chunk) } } - private fun randomTick(radius: Int, origin: BlockPosition, position: BlockPosition, chunkDelta: Vec2i, chunk: Chunk) { + private fun randomDisplayTick(radius: Int, origin: BlockPosition, position: BlockPosition, chunkDelta: Vec2i, chunk: Chunk) { position.x = origin.x + random.nextInt(-radius, radius) position.y = origin.x + random.nextInt(-radius, radius) position.z = origin.x + random.nextInt(-radius, radius) @@ -187,8 +188,9 @@ class World( chunkDelta.y = (origin.z - position.z) shr 4 val state = chunk.traceBlock(position.x and 0x0F, position.y, position.z and 0x0F, chunkDelta) ?: return + if (state.block !is RandomDisplayTickable) return - state.block.randomTick(connection, state, position, random) + state.block.randomDisplayTick(connection, state, position, random) } operator fun get(aabb: AABB): WorldIterator { diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/tick/ConnectionTicker.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/tick/ConnectionTicker.kt index e2a193cc3..dd94d6361 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/tick/ConnectionTicker.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/tick/ConnectionTicker.kt @@ -60,7 +60,7 @@ class ConnectionTicker(private val connection: PlayConnection) { connection.world.tick() } tasks += RepeatedTask(INTERVAL, maxDelay = MAX_DELAY) { - connection.world.randomTick() + connection.world.randomDisplayTick() } if (DebugOptions.LIGHT_DEBUG_MODE || DebugOptions.INFINITE_TORCHES) {