Dust particles when replicating

Fixes #95
This commit is contained in:
DBotThePony 2022-10-06 16:44:46 +07:00
parent ebcc393c3e
commit b09ba07735
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 51 additions and 1 deletions

View File

@ -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")

View File

@ -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<ReplicatorJob?, IdleReason?> {
if (energy.batteryLevel < BASE_CONSUMPTION) {

View File

@ -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<MatterReplicatorBlockEntity> {
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(