From b09ba0773514c84aa7a276480917bbf65c08e6cb Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 6 Oct 2022 16:44:46 +0700 Subject: [PATCH] Dust particles when replicating Fixes #95 --- .../dbotthepony/mc/otm/GlobalEventHandler.kt | 20 ++++++++++++ .../matter/MatterReplicatorBlockEntity.kt | 1 + .../blockentity/MatterReplicatorRenderer.kt | 31 ++++++++++++++++++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt index f9102a0f6..f8224a4ac 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt @@ -3,6 +3,7 @@ package ru.dbotthepony.mc.otm +import net.minecraft.client.server.IntegratedServer import net.minecraft.server.MinecraftServer import net.minecraft.world.level.Level import net.minecraftforge.event.TickEvent @@ -12,6 +13,7 @@ import net.minecraftforge.event.server.ServerAboutToStartEvent import net.minecraftforge.event.server.ServerStoppedEvent import net.minecraftforge.event.server.ServerStoppingEvent import org.apache.logging.log4j.LogManager +import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.core.IConditionalTickable import ru.dbotthepony.mc.otm.core.ITickable import ru.dbotthepony.mc.otm.core.TickList @@ -50,6 +52,24 @@ private var _clientThread: Thread? = null val isClient: Boolean get() = _clientThread !== null +private val isPausedImpl: Boolean get() { + val server = _server + + if (server is IntegratedServer) { + return !server.isPublished && minecraft.isPaused + } + + return false +} + +val isPaused: Boolean get() { + if (_clientThread === null) { + return false + } + + return isPausedImpl +} + fun recordClientThread() { if (_clientThread != null) { throw IllegalStateException("Already have client channel") diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt index 818090380..bed287e47 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt @@ -186,6 +186,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : var renderRotation = 0f var lastRender = 0L + var particleRenderScore = 0L override fun computeNextJob(): Pair { if (energy.batteryLevel < BASE_CONSUMPTION) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/MatterReplicatorRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/MatterReplicatorRenderer.kt index ec5703a84..0032621da 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/MatterReplicatorRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/MatterReplicatorRenderer.kt @@ -10,20 +10,35 @@ import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.block.model.ItemTransforms import net.minecraft.client.renderer.blockentity.BlockEntityRenderer import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider +import net.minecraft.client.server.IntegratedServer +import net.minecraft.core.particles.DustParticleOptions +import net.minecraft.world.level.levelgen.XoroshiroRandomSource import org.lwjgl.opengl.GL14 import org.lwjgl.opengl.GL14.GL_ADD import org.lwjgl.opengl.GL14.GL_FUNC_ADD import org.lwjgl.opengl.GL14.GL_MIN import org.lwjgl.opengl.GL14.glBlendColor +import ru.dbotthepony.mc.otm.NULLABLE_MINECRAFT_SERVER +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.block.entity.matter.MatterReplicatorBlockEntity import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.render.lockBlendFunc import ru.dbotthepony.mc.otm.client.render.popScissorRect import ru.dbotthepony.mc.otm.client.render.pushScissorRect import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel +import ru.dbotthepony.mc.otm.core.component1 +import ru.dbotthepony.mc.otm.core.component2 +import ru.dbotthepony.mc.otm.core.component3 +import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.normalizeAngleDeg +import ru.dbotthepony.mc.otm.isPaused class MatterReplicatorRenderer(private val context: BlockEntityRendererProvider.Context) : BlockEntityRenderer { + companion object { + private val smoke = DustParticleOptions(Vector3f(1f, 1f, 1f), 1f) + private val rand = XoroshiroRandomSource(System.nanoTime(), System.currentTimeMillis()) + } + override fun render( tile: MatterReplicatorBlockEntity, partialTick: Float, @@ -46,7 +61,21 @@ class MatterReplicatorRenderer(private val context: BlockEntityRendererProvider. val diff = System.nanoTime() - tile.lastRender tile.lastRender = System.nanoTime() - tile.renderRotation = normalizeAngleDeg(tile.renderRotation + diff / 10_000_000f) + if (!isPaused) + tile.particleRenderScore += diff + + if (tile.particleRenderScore > 30_000_000L) { + tile.particleRenderScore = tile.particleRenderScore % 30_000_000L + + if (rand.nextDouble() > 0.75 && !isPaused && tile.blockState[WorkerState.WORKER_STATE] == WorkerState.WORKING) { + val (x, y, z) = tile.blockPos + tile.level?.addParticle(smoke, 0.3 + x + rand.nextDouble() * 0.4, 0.1 + y + rand.nextDouble() * 0.2, 0.3 + z + rand.nextDouble() * 0.4, 0.0, 0.0, 0.0) + } + } + + if (!isPaused) + tile.renderRotation = normalizeAngleDeg(tile.renderRotation + diff / 10_000_000f) + pose.mulPose(Vector3f.YP.rotationDegrees(tile.renderRotation)) val model = context.itemRenderer.getModel(