SystemTime class

Fixes #125
This commit is contained in:
DBotThePony 2022-10-19 15:36:28 +07:00
parent ffb7c7b5ae
commit 3535cf95f7
Signed by: DBot
GPG Key ID: DCC23B5715498507
12 changed files with 127 additions and 45 deletions

View File

@ -0,0 +1,77 @@
package ru.dbotthepony.mc.otm
import net.minecraft.util.TimeSource
import ru.dbotthepony.mc.otm.core.formatTickDuration
import java.util.function.LongSupplier
/**
* just to avoid origin in future
*/
val systemTime = SystemTime()
/**
* nanoseconds elapsed
*/
val nanoTime get() = systemTime.nanos
/**
* microseconds elapsed
*/
val microTime get() = systemTime.micros
/**
* milliseconds elapsed
*/
val milliTime get() = systemTime.millis
/**
* seconds elapsed
*/
val secondTime get() = systemTime.seconds
val microTimeD get() = systemTime.microsD
val milliTimeD get() = systemTime.millisD
val secondTimeD get() = systemTime.secondsD
val microTimeF get() = systemTime.microsF
val milliTimeF get() = systemTime.millisF
val secondTimeF get() = systemTime.secondsF
/**
* just to avoid origin in future
*/
class SystemTime : LongSupplier, TimeSource.NanoTimeSource {
private val origin = System.nanoTime()
val nanos get() = System.nanoTime() - origin
val micros get() = (System.nanoTime() - origin) / 1_000L
val millis get() = (System.nanoTime() - origin) / 1_000_000L
val seconds get() = (System.nanoTime() - origin) / 1_000_000_000L
val microsD get() = (System.nanoTime() - origin) / 1_000.0
val millisD get() = (System.nanoTime() - origin) / 1_000_000.0
val secondsD get() = (System.nanoTime() - origin) / 1_000_000_000.0
val microsF get() = (System.nanoTime() - origin) / 1_000f
val millisF get() = (System.nanoTime() - origin) / 1_000_000f
val secondsF get() = (System.nanoTime() - origin) / 1_000_000_000f
override fun getAsLong(): Long {
return nanos
}
fun formatted(longFormat: Boolean = true) = formatTickDuration((millis / 50L).toInt(), longFormat)
override fun equals(other: Any?): Boolean {
return other === this || other is SystemTime && other.origin == origin
}
override fun hashCode(): Int {
return origin.hashCode()
}
override fun toString(): String {
return "SystemTime[at ${origin}ns, ${secondsD}s elapsed]"
}
}

View File

@ -24,6 +24,7 @@ import ru.dbotthepony.mc.otm.core.getCompoundList
import ru.dbotthepony.mc.otm.core.nonEmpty import ru.dbotthepony.mc.otm.core.nonEmpty
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.set
import ru.dbotthepony.mc.otm.nanoTime
import ru.dbotthepony.mc.otm.network.FieldSynchronizer import ru.dbotthepony.mc.otm.network.FieldSynchronizer
import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MRegistry
import ru.dbotthepony.mc.otm.triggers.AndroidResearchTrigger import ru.dbotthepony.mc.otm.triggers.AndroidResearchTrigger
@ -347,7 +348,7 @@ class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlay
} }
} }
val chooseItem = tag.items[((System.nanoTime() / 300_000_000L).absoluteValue % tag.items.size).toInt()] val chooseItem = tag.items[((nanoTime / 300_000_000L).absoluteValue % tag.items.size).toInt()]
val suffix = if (tag.items.size > 1) "_any" else "" val suffix = if (tag.items.size > 1) "_any" else ""
if (required > 0) { if (required > 0) {

View File

@ -9,7 +9,6 @@ import net.minecraft.client.renderer.LevelRenderer
import net.minecraft.core.BlockPos import net.minecraft.core.BlockPos
import net.minecraft.core.Direction import net.minecraft.core.Direction
import net.minecraft.core.Vec3i import net.minecraft.core.Vec3i
import net.minecraft.nbt.CompoundTag
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer
import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundEvents
@ -36,7 +35,6 @@ import ru.dbotthepony.mc.otm.client.render.DynamicBufferSource
import ru.dbotthepony.mc.otm.client.render.ResearchIcons import ru.dbotthepony.mc.otm.client.render.ResearchIcons
import ru.dbotthepony.mc.otm.client.render.element import ru.dbotthepony.mc.otm.client.render.element
import ru.dbotthepony.mc.otm.client.render.linesIgnoreZRenderType import ru.dbotthepony.mc.otm.client.render.linesIgnoreZRenderType
import ru.dbotthepony.mc.otm.core.ImmutableList
import ru.dbotthepony.mc.otm.core.Vector import ru.dbotthepony.mc.otm.core.Vector
import ru.dbotthepony.mc.otm.core.asVector import ru.dbotthepony.mc.otm.core.asVector
import ru.dbotthepony.mc.otm.core.component1 import ru.dbotthepony.mc.otm.core.component1
@ -44,17 +42,14 @@ import ru.dbotthepony.mc.otm.core.component2
import ru.dbotthepony.mc.otm.core.component3 import ru.dbotthepony.mc.otm.core.component3
import ru.dbotthepony.mc.otm.core.formatPower import ru.dbotthepony.mc.otm.core.formatPower
import ru.dbotthepony.mc.otm.core.genericPositions import ru.dbotthepony.mc.otm.core.genericPositions
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.core.set
import ru.dbotthepony.mc.otm.core.shortestDistanceBetween import ru.dbotthepony.mc.otm.core.shortestDistanceBetween
import ru.dbotthepony.mc.otm.core.times import ru.dbotthepony.mc.otm.core.times
import ru.dbotthepony.mc.otm.core.toDoubleVector import ru.dbotthepony.mc.otm.milliTime
import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.AndroidFeatures
import ru.dbotthepony.mc.otm.registry.MNames import ru.dbotthepony.mc.otm.registry.MNames
import ru.dbotthepony.mc.otm.triggers.EnderTeleporterFallDeathTrigger import ru.dbotthepony.mc.otm.triggers.EnderTeleporterFallDeathTrigger
import java.util.LinkedList import java.util.*
import kotlin.math.roundToInt
import kotlin.math.sin import kotlin.math.sin
class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiveFeature(AndroidFeatures.ENDER_TELEPORTER, capability) { class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiveFeature(AndroidFeatures.ENDER_TELEPORTER, capability) {
@ -345,7 +340,7 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
poseStack.mulPose(Vector3f.YP.rotationDegrees(-camera.yRot)) poseStack.mulPose(Vector3f.YP.rotationDegrees(-camera.yRot))
poseStack.mulPose(Vector3f.XP.rotationDegrees(camera.xRot)) poseStack.mulPose(Vector3f.XP.rotationDegrees(camera.xRot))
val size = 1f + sin((System.nanoTime() / 1_000_000) / 250.0).toFloat() * 0.2f val size = 1f + sin(milliTime / 250.0).toFloat() * 0.2f
val half = size / -2f val half = size / -2f
RenderSystem.disableDepthTest() RenderSystem.disableDepthTest()

View File

@ -17,6 +17,7 @@ import ru.dbotthepony.mc.otm.client.render.TextAlign
import ru.dbotthepony.mc.otm.client.render.drawAligned import ru.dbotthepony.mc.otm.client.render.drawAligned
import ru.dbotthepony.mc.otm.client.render.drawArc import ru.dbotthepony.mc.otm.client.render.drawArc
import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.*
import ru.dbotthepony.mc.otm.milliTimeD
import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel
import ru.dbotthepony.mc.otm.network.SwitchAndroidFeaturePacket import ru.dbotthepony.mc.otm.network.SwitchAndroidFeaturePacket
import java.util.stream.Collectors import java.util.stream.Collectors
@ -32,7 +33,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
private var selectedFeature: AndroidSwitchableFeature? = null private var selectedFeature: AndroidSwitchableFeature? = null
private var lastSelectedFeature: AndroidSwitchableFeature? = null private var lastSelectedFeature: AndroidSwitchableFeature? = null
private var lastRender: Long = System.nanoTime() private var lastRender = milliTimeD
private var lastSelectedDegree: Double? = null private var lastSelectedDegree: Double? = null
private val lastSelectProgress = Object2FloatArrayMap<AndroidFeature>() private val lastSelectProgress = Object2FloatArrayMap<AndroidFeature>()
private var lastSelectProgressGlobal = 0f private var lastSelectProgressGlobal = 0f
@ -117,7 +118,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
.collect(Collectors.toList()) as MutableList<AndroidSwitchableFeature> .collect(Collectors.toList()) as MutableList<AndroidSwitchableFeature>
if (features.isEmpty()) { if (features.isEmpty()) {
lastRender = System.nanoTime() lastRender = milliTimeD
return return
} }
@ -125,8 +126,8 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
return@sortWith a.type.registryName!!.compareTo(b.type.registryName!!) return@sortWith a.type.registryName!!.compareTo(b.type.registryName!!)
} }
val delta = (System.nanoTime() - lastRender) / 1_000_000.0 val delta = milliTimeD - lastRender
lastRender = System.nanoTime() lastRender = milliTimeD
RenderSystem.setShaderColor(0f, 0f, 0f, 0.6f) RenderSystem.setShaderColor(0f, 0f, 0f, 0.6f)
@ -290,7 +291,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
fun onRenderGuiEvent(event: RenderGuiEvent.Post) { fun onRenderGuiEvent(event: RenderGuiEvent.Post) {
if (!grabbedInput) { if (!grabbedInput) {
lastRender = System.nanoTime() lastRender = milliTimeD
renderRegular(event) renderRegular(event)
return return
} else { } else {

View File

@ -22,6 +22,7 @@ import ru.dbotthepony.mc.otm.core.component1
import ru.dbotthepony.mc.otm.core.component2 import ru.dbotthepony.mc.otm.core.component2
import ru.dbotthepony.mc.otm.core.component3 import ru.dbotthepony.mc.otm.core.component3
import ru.dbotthepony.mc.otm.core.linearInterpolation import ru.dbotthepony.mc.otm.core.linearInterpolation
import ru.dbotthepony.mc.otm.milliTime
import java.util.stream.Collectors import java.util.stream.Collectors
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
import kotlin.math.ceil import kotlin.math.ceil
@ -479,10 +480,10 @@ object GlitchRenderer {
RenderSystem.setShaderTexture(0, minecraft.mainRenderTarget.colorTextureId) RenderSystem.setShaderTexture(0, minecraft.mainRenderTarget.colorTextureId)
// color perception errors (eye-camera glitch) // color perception errors (eye-camera glitch)
drawVHSLineGap((System.currentTimeMillis() % glitchBuffer.height).toDouble(), glitchBuffer.height * 0.025) drawVHSLineGap((milliTime % glitchBuffer.height).toDouble(), glitchBuffer.height * 0.025)
drawVHSLineGap(((System.currentTimeMillis() + glitchBuffer.height / 2) % glitchBuffer.height).toDouble(), glitchBuffer.height * 0.075) drawVHSLineGap(((milliTime + glitchBuffer.height / 2) % glitchBuffer.height).toDouble(), glitchBuffer.height * 0.075)
drawVHSLineGap(((System.currentTimeMillis() + glitchBuffer.height / 3) % glitchBuffer.height).toDouble(), glitchBuffer.height * 0.04) drawVHSLineGap(((milliTime + glitchBuffer.height / 3) % glitchBuffer.height).toDouble(), glitchBuffer.height * 0.04)
drawVHSLineGap(((-System.currentTimeMillis() - glitchBuffer.height / 3) % glitchBuffer.height).toDouble().absoluteValue, glitchBuffer.height * 0.07) drawVHSLineGap(((-milliTime - glitchBuffer.height / 3) % glitchBuffer.height).toDouble().absoluteValue, glitchBuffer.height * 0.07)
// color encoding errors (encoder/transmission glitch) // color encoding errors (encoder/transmission glitch)
RenderSystem.setShaderColor(1f, 1f, 1f, 1f) RenderSystem.setShaderColor(1f, 1f, 1f, 1f)

View File

@ -8,14 +8,13 @@ import com.mojang.math.Vector3f
import net.minecraft.client.renderer.GameRenderer import net.minecraft.client.renderer.GameRenderer
import net.minecraftforge.client.event.RenderLevelStageEvent import net.minecraftforge.client.event.RenderLevelStageEvent
import org.lwjgl.opengl.GL11.GL_LESS import org.lwjgl.opengl.GL11.GL_LESS
import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.core.Vector import ru.dbotthepony.mc.otm.core.Vector
import ru.dbotthepony.mc.otm.core.component1 import ru.dbotthepony.mc.otm.core.component1
import ru.dbotthepony.mc.otm.core.component2 import ru.dbotthepony.mc.otm.core.component2
import ru.dbotthepony.mc.otm.core.component3 import ru.dbotthepony.mc.otm.core.component3
import ru.dbotthepony.mc.otm.core.linearInterpolation import ru.dbotthepony.mc.otm.core.linearInterpolation
import ru.dbotthepony.mc.otm.core.position
import ru.dbotthepony.mc.otm.network.ShockwaveEffectPacket import ru.dbotthepony.mc.otm.network.ShockwaveEffectPacket
import ru.dbotthepony.mc.otm.secondTimeD
import kotlin.math.PI import kotlin.math.PI
object ShockwaveRenderer { object ShockwaveRenderer {
@ -23,7 +22,7 @@ object ShockwaveRenderer {
private class State(val pos: Vector, val finalRadius: Float = 6f) { private class State(val pos: Vector, val finalRadius: Float = 6f) {
var radius = 0f var radius = 0f
var lastRender = System.nanoTime() var lastRender = secondTimeD
init { init {
synchronized(activeShockwaves) { synchronized(activeShockwaves) {
@ -32,10 +31,10 @@ object ShockwaveRenderer {
} }
fun render(event: RenderLevelStageEvent): Boolean { fun render(event: RenderLevelStageEvent): Boolean {
val diff = System.nanoTime() - lastRender val diff = secondTimeD - lastRender
radius += diff / (1_000_000_000f / EXPANSION_PER_SECOND) radius += (diff * EXPANSION_PER_SECOND).toFloat()
lastRender = System.nanoTime() lastRender = secondTimeD
if (radius <= finalRadius) { if (radius <= finalRadius) {
val builder = tesselator.builder val builder = tesselator.builder

View File

@ -4,6 +4,7 @@ import com.mojang.blaze3d.platform.InputConstants
import com.mojang.blaze3d.vertex.PoseStack import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.client.gui.screens.Screen import net.minecraft.client.gui.screens.Screen
import ru.dbotthepony.mc.otm.core.linearInterpolation import ru.dbotthepony.mc.otm.core.linearInterpolation
import ru.dbotthepony.mc.otm.milliTimeD
import kotlin.math.roundToInt import kotlin.math.roundToInt
open class AnalogScrollBarPanel<out S : Screen>( open class AnalogScrollBarPanel<out S : Screen>(
@ -93,7 +94,7 @@ open class AnalogScrollBarPanel<out S : Screen>(
val scrollButton = Button() val scrollButton = Button()
private var lastRender = System.nanoTime() private var lastRender = milliTimeD
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
if (width == ScrollBarConstants.SLIM_WIDTH) { if (width == ScrollBarConstants.SLIM_WIDTH) {
@ -106,12 +107,12 @@ open class AnalogScrollBarPanel<out S : Screen>(
ScrollBarConstants.BOTTOM.render(stack, y = height - 2f) ScrollBarConstants.BOTTOM.render(stack, y = height - 2f)
} }
val time = System.nanoTime() val time = milliTimeD
val diff = time - lastRender val diff = time - lastRender
lastRender = time lastRender = time
if (scroll != smoothScroll) { if (scroll != smoothScroll) {
smoothScroll = linearInterpolation(diff / 50_000_000.0, smoothScroll.toDouble(), scroll.toDouble()).toFloat() smoothScroll = linearInterpolation(diff / 50.0, smoothScroll.toDouble(), scroll.toDouble()).toFloat()
} }
} }

View File

@ -12,12 +12,14 @@ import net.minecraft.network.chat.Component
import net.minecraft.world.inventory.Slot import net.minecraft.world.inventory.Slot
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
import ru.dbotthepony.mc.otm.SystemTime
import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.client.moveMousePosScaled import ru.dbotthepony.mc.otm.client.moveMousePosScaled
import ru.dbotthepony.mc.otm.client.render.currentScissorRect import ru.dbotthepony.mc.otm.client.render.currentScissorRect
import ru.dbotthepony.mc.otm.client.render.popScissorRect import ru.dbotthepony.mc.otm.client.render.popScissorRect
import ru.dbotthepony.mc.otm.client.render.pushScissorRect import ru.dbotthepony.mc.otm.client.render.pushScissorRect
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import ru.dbotthepony.mc.otm.nanoTime
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -317,16 +319,16 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
return null return null
} }
var flashingSince: Long = Long.MIN_VALUE var flashingSince: SystemTime? = null
private set private set
var isFlashing: Boolean var isFlashing: Boolean
get() = flashingSince != Long.MIN_VALUE && (System.nanoTime() - flashingSince) <= 1_000_000_000 get() = (flashingSince?.seconds ?: Long.MAX_VALUE) <= 1
set(value) { set(value) {
if (value) { if (value) {
flashingSince = System.nanoTime() flashingSince = SystemTime()
} else { } else {
flashingSince = Long.MIN_VALUE flashingSince = null
} }
} }
@ -339,7 +341,7 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
} }
val isFlashFrame: Boolean val isFlashFrame: Boolean
get() = isFlashing && (System.nanoTime() - flashingSince) % 400_000_000 <= 200_000_000 get() = flashingSince != null && flashingSince!!.millis % 400L <= 200L
val isFlashFrameRecursive: Boolean val isFlashFrameRecursive: Boolean
get() { get() {

View File

@ -1,7 +1,9 @@
package ru.dbotthepony.mc.otm.client.screen.panels package ru.dbotthepony.mc.otm.client.screen.panels
import net.minecraft.world.inventory.Slot import net.minecraft.world.inventory.Slot
import ru.dbotthepony.mc.otm.SystemTime
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import ru.dbotthepony.mc.otm.nanoTime
open class FoldableSlotPanel<out S : MatteryScreen<*>, out T : Slot> @JvmOverloads constructor( open class FoldableSlotPanel<out S : MatteryScreen<*>, out T : Slot> @JvmOverloads constructor(
screen: S, screen: S,
@ -70,13 +72,13 @@ open class FoldableSlotPanel<out S : MatteryScreen<*>, out T : Slot> @JvmOverloa
override val slot: T override val slot: T
get() = mainSlot.slot get() = mainSlot.slot
var hoveringSince: Long? = null var hoveringSince: SystemTime? = null
protected set protected set
var hoverPanel: HoverPanel? = null var hoverPanel: HoverPanel? = null
protected set protected set
override fun onHovered() { override fun onHovered() {
hoveringSince = System.nanoTime() hoveringSince = SystemTime()
} }
override fun onUnHovered() { override fun onUnHovered() {
@ -92,7 +94,7 @@ open class FoldableSlotPanel<out S : MatteryScreen<*>, out T : Slot> @JvmOverloa
val hoveringSince = hoveringSince val hoveringSince = hoveringSince
if (hoveringSince != null && System.nanoTime() - hoveringSince >= MAX_HOVER_TIME && hoverPanel == null && extraSlots.isNotEmpty()) { if (hoveringSince != null && hoveringSince.nanos >= MAX_HOVER_TIME && hoverPanel == null && extraSlots.isNotEmpty()) {
hoverPanel = HoverPanel() hoverPanel = HoverPanel()
} }
} }

View File

@ -17,6 +17,7 @@ import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.formatMatterLevel import ru.dbotthepony.mc.otm.core.formatMatterLevel
import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget
import ru.dbotthepony.mc.otm.nanoTime
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
import kotlin.math.cos import kotlin.math.cos
import kotlin.math.pow import kotlin.math.pow
@ -36,7 +37,7 @@ open class MatterGaugePanel<S : Screen> @JvmOverloads constructor(
private var wavesStrength = 0.5f private var wavesStrength = 0.5f
private var lastAbsoluteX = 0f private var lastAbsoluteX = 0f
private var lastAbsoluteY = 0f private var lastAbsoluteY = 0f
private var lastDraw = System.nanoTime() private var lastDraw = nanoTime
private var lastLevel = 0f private var lastLevel = 0f
protected open fun makeTooltip(): MutableList<Component> { protected open fun makeTooltip(): MutableList<Component> {
@ -53,7 +54,7 @@ open class MatterGaugePanel<S : Screen> @JvmOverloads constructor(
if (lastAbsoluteX == 0f && lastAbsoluteY == 0f) { if (lastAbsoluteX == 0f && lastAbsoluteY == 0f) {
lastAbsoluteX = absoluteX lastAbsoluteX = absoluteX
lastAbsoluteY = absoluteY lastAbsoluteY = absoluteY
lastDraw = System.nanoTime() lastDraw = nanoTime
lastLevel = widget.percentage() lastLevel = widget.percentage()
} else { } else {
val diff = ((lastAbsoluteX - absoluteX).pow(2f) + (lastAbsoluteY - absoluteY).pow(2f)).pow(0.5f) / 10f + (lastLevel - widget.percentage()).absoluteValue * 1.5f val diff = ((lastAbsoluteX - absoluteX).pow(2f) + (lastAbsoluteY - absoluteY).pow(2f)).pow(0.5f) / 10f + (lastLevel - widget.percentage()).absoluteValue * 1.5f
@ -61,8 +62,8 @@ open class MatterGaugePanel<S : Screen> @JvmOverloads constructor(
lastAbsoluteX = absoluteX lastAbsoluteX = absoluteX
lastAbsoluteY = absoluteY lastAbsoluteY = absoluteY
wavesStrength = (wavesStrength + diff - (System.nanoTime() - lastDraw) / 400_000_000f).coerceAtLeast(0.5f).coerceAtMost(16f) wavesStrength = (wavesStrength + diff - (nanoTime - lastDraw) / 400_000_000f).coerceAtLeast(0.5f).coerceAtMost(16f)
lastDraw = System.nanoTime() lastDraw = nanoTime
lastLevel = widget.percentage() lastLevel = widget.percentage()
} }

View File

@ -295,7 +295,7 @@ abstract class AbstractWeaponItem<D : WeaponDataTable>(val tables: KClass<D>, ra
val time = System.nanoTime() val time = System.nanoTime()
val diff = abs(lastFovTime - time) val diff = abs(lastFovTime - time)
lastFov = linearInterpolation(diff.coerceAtLeast(0).coerceAtMost(10_000_000L).toDouble() / 10_000_000.0, lastFov, interp).coerceAtLeast(0.001) lastFov = linearInterpolation(diff.coerceIn(0L, 10_000_000L).toDouble() / 10_000_000.0, lastFov, interp).coerceAtLeast(0.001)
lastFovTime = time lastFovTime = time
event.fov /= lastFov event.fov /= lastFov

View File

@ -6,6 +6,8 @@ import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
import it.unimi.dsi.fastutil.objects.ReferenceArraySet import it.unimi.dsi.fastutil.objects.ReferenceArraySet
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.*
import ru.dbotthepony.mc.otm.nanoTime
import ru.dbotthepony.mc.otm.secondTime
import java.io.DataInputStream import java.io.DataInputStream
import java.io.DataOutputStream import java.io.DataOutputStream
import java.io.InputStream import java.io.InputStream
@ -314,7 +316,7 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa
private val endpoints = ArrayList<WeakReference<Endpoint>>(1) private val endpoints = ArrayList<WeakReference<Endpoint>>(1)
val defaultEndpoint = Endpoint() val defaultEndpoint = Endpoint()
private var lastEndpointsCleanup = System.nanoTime() private var nextEndpointsCleanup = secondTime
private fun notifyEndpoints(dirtyField: IField<*>) { private fun notifyEndpoints(dirtyField: IField<*>) {
hasChanges = true hasChanges = true
@ -325,7 +327,7 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa
} }
private inline fun forEachEndpoint(execute: (Endpoint) -> Unit) { private inline fun forEachEndpoint(execute: (Endpoint) -> Unit) {
lastEndpointsCleanup = System.nanoTime() nextEndpointsCleanup = secondTime + 60
synchronized(endpoints) { synchronized(endpoints) {
val iterator = endpoints.listIterator() val iterator = endpoints.listIterator()
@ -353,8 +355,8 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa
endpoints.add(WeakReference(this)) endpoints.add(WeakReference(this))
endpointsMaxCapacity = endpointsMaxCapacity.coerceAtLeast(endpoints.size) endpointsMaxCapacity = endpointsMaxCapacity.coerceAtLeast(endpoints.size)
if (System.nanoTime() - lastEndpointsCleanup >= 60_000_000_000) { if (secondTime >= nextEndpointsCleanup) {
lastEndpointsCleanup = System.nanoTime() nextEndpointsCleanup = secondTime + 60
val iterator = endpoints.listIterator() val iterator = endpoints.listIterator()