make WorldTime values final, calculate moon phases

This commit is contained in:
Bixilon 2022-11-01 18:31:36 +01:00
parent 824065cb9c
commit 05ff4647a2
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
5 changed files with 46 additions and 12 deletions

View File

@ -71,7 +71,7 @@ class World(
var dimension: DimensionProperties? by watched(null) var dimension: DimensionProperties? by watched(null)
var difficulty: WorldDifficulty? by watched(null) var difficulty: WorldDifficulty? by watched(null)
var hashedSeed = 0L var hashedSeed = 0L
val time = WorldTime(this) var time by watched(WorldTime(this))
val weather = WorldWeather() val weather = WorldWeather()
val view = WorldView(connection) val view = WorldView(connection)
val border = WorldBorder() val border = WorldBorder()

View File

@ -0,0 +1,35 @@
/*
* Minosoft
* Copyright (C) 2020-2022 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 <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.data.world.time
import de.bixilon.kutil.enums.EnumUtil
import de.bixilon.kutil.enums.ValuesEnum
// see https://minecraft.fandom.com/wiki/Moon
enum class MoonPhases {
FULL_MOON,
WANING_GIBBOUS,
LAST_QUARTER,
WANING_CRESCENT,
NEW_MOON,
WAXING_CRESCENT,
FIRST_QUARTER,
WAXING_GIBBOUS,
;
companion object : ValuesEnum<MoonPhases> {
override val VALUES = values()
override val NAME_MAP = EnumUtil.getEnumValues(VALUES)
}
}

View File

@ -15,19 +15,21 @@ package de.bixilon.minosoft.data.world.time
import de.bixilon.kotlinglm.func.common.clamp import de.bixilon.kotlinglm.func.common.clamp
import de.bixilon.kutil.math.simple.DoubleMath.fractional import de.bixilon.kutil.math.simple.DoubleMath.fractional
import de.bixilon.kutil.watcher.DataWatcher.Companion.watched
import de.bixilon.minosoft.data.world.World import de.bixilon.minosoft.data.world.World
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import kotlin.math.PI import kotlin.math.PI
import kotlin.math.abs import kotlin.math.abs
import kotlin.math.cos import kotlin.math.cos
@Deprecated("make values final")
class WorldTime( class WorldTime(
private val world: World, private val world: World,
time: Int = 0,
val age: Long = 0L,
) { ) {
var time by watched(0L) val time = abs(time) % ProtocolDefinition.TICKS_PER_DAY
var age by watched(0L) val cycling = time >= 0
val moonPhase = MoonPhases[age % ProtocolDefinition.TICKS_PER_DAY % MoonPhases.VALUES.size] // ToDo: Verify
val skyAngle: Float val skyAngle: Float

View File

@ -174,11 +174,9 @@ class DebugHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Layouted
} }
layout += TextElement(guiRenderer, "Time TBA").apply { layout += TextElement(guiRenderer, "Time TBA").apply {
fun update(time: Long, age: Long) { connection.world::time.observe(this) {
text = BaseComponent("Time ", abs(time % ProtocolDefinition.TICKS_PER_DAY), ", moving=", time >= 0, ", day=", abs(age) / ProtocolDefinition.TICKS_PER_DAY) text = BaseComponent("Time ", abs(it.time % ProtocolDefinition.TICKS_PER_DAY), ", moving=", it.cycling, ", day=", abs(it.age) / ProtocolDefinition.TICKS_PER_DAY)
} }
connection.world.time::time.observe(this) { update(it, connection.world.time.age) }
connection.world.time::age.observe(this) { update(connection.world.time.time, it) }
} }
layout += AutoTextElement(guiRenderer, 1) { "Fun effect: " + renderWindow.framebufferManager.world.`fun`.effect?.resourceLocation.format() } layout += AutoTextElement(guiRenderer, 1) { "Fun effect: " + renderWindow.framebufferManager.world.`fun`.effect?.resourceLocation.format() }

View File

@ -12,11 +12,11 @@
*/ */
package de.bixilon.minosoft.protocol.packets.s2c.play package de.bixilon.minosoft.protocol.packets.s2c.play
import de.bixilon.minosoft.data.world.time.WorldTime
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.factory.LoadPacket import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType import de.bixilon.minosoft.util.logging.LogMessageType
@ -27,8 +27,7 @@ class TimeS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val time = buffer.readLong() val time = buffer.readLong()
override fun handle(connection: PlayConnection) { override fun handle(connection: PlayConnection) {
connection.world.time.age = age connection.world.time = WorldTime(connection.world, time = time.toInt(), age = age)
connection.world.time.time = time % ProtocolDefinition.TICKS_PER_DAY
} }
override fun log(reducedLog: Boolean) { override fun log(reducedLog: Boolean) {