mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 02:45:13 -04:00
refactor weather and time storing, fix some world bugs #59
This commit is contained in:
parent
d4cc972bb2
commit
d9fbee2559
@ -22,6 +22,6 @@ object RainGradientSetGameEventHandler : GameEventHandler {
|
||||
override val RESOURCE_LOCATION: ResourceLocation = "minecraft:rain_gradient_set".toResourceLocation()
|
||||
|
||||
override fun handle(data: Float, connection: PlayConnection) {
|
||||
connection.world.rainGradient = data
|
||||
connection.world.weather.rainGradient = data
|
||||
}
|
||||
}
|
||||
|
@ -22,6 +22,6 @@ object ThunderGradientSetGameEventHandler : GameEventHandler {
|
||||
override val RESOURCE_LOCATION: ResourceLocation = "minecraft:thunder_gradient_set".toResourceLocation()
|
||||
|
||||
override fun handle(data: Float, connection: PlayConnection) {
|
||||
connection.world.thunderGradient = data
|
||||
connection.world.weather.thunderGradient = data
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ object RainStartGameEventHandler : GameEventHandler {
|
||||
override val RESOURCE_LOCATION: ResourceLocation = "minecraft:rain_start".toResourceLocation()
|
||||
|
||||
override fun handle(data: Float, connection: PlayConnection) {
|
||||
connection.world.raining = true
|
||||
connection.world.rainGradient = 1.0f
|
||||
connection.world.weather.raining = true
|
||||
connection.world.weather.rainGradient = 1.0f
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ object RainStopGameEventHandler : GameEventHandler {
|
||||
override val RESOURCE_LOCATION: ResourceLocation = "minecraft:rain_stop".toResourceLocation()
|
||||
|
||||
override fun handle(data: Float, connection: PlayConnection) {
|
||||
connection.world.raining = false
|
||||
connection.world.rainGradient = 0.0f
|
||||
connection.world.weather.raining = false
|
||||
connection.world.weather.rainGradient = 0.0f
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,9 @@ import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock
|
||||
import de.bixilon.minosoft.data.registries.dimension.DimensionProperties
|
||||
import de.bixilon.minosoft.data.world.biome.accessor.BiomeAccessor
|
||||
import de.bixilon.minosoft.data.world.biome.accessor.NoiseBiomeAccessor
|
||||
import de.bixilon.minosoft.data.world.time.WorldTime
|
||||
import de.bixilon.minosoft.data.world.view.WorldView
|
||||
import de.bixilon.minosoft.data.world.weather.WorldWeather
|
||||
import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer
|
||||
import de.bixilon.minosoft.gui.rendering.particle.types.Particle
|
||||
import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition
|
||||
@ -35,10 +37,8 @@ import de.bixilon.minosoft.modding.event.events.BlockSetEvent
|
||||
import de.bixilon.minosoft.modding.event.events.ChunkDataChangeEvent
|
||||
import de.bixilon.minosoft.modding.event.events.ChunkUnloadEvent
|
||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||
import de.bixilon.minosoft.util.KUtil.lockMapOf
|
||||
import de.bixilon.minosoft.util.KUtil.toSynchronizedMap
|
||||
import de.bixilon.minosoft.util.MMath
|
||||
import de.bixilon.minosoft.util.ReadWriteLock
|
||||
import de.bixilon.minosoft.util.chunk.ChunkUtil.canBuildBiomeCache
|
||||
import de.bixilon.minosoft.util.chunk.ChunkUtil.getChunkNeighbourPositions
|
||||
@ -46,13 +46,9 @@ import de.bixilon.minosoft.util.chunk.ChunkUtil.isInViewDistance
|
||||
import de.bixilon.minosoft.util.chunk.ChunkUtil.received
|
||||
import de.bixilon.minosoft.util.collections.LockMap
|
||||
import de.bixilon.minosoft.util.delegate.DelegateManager.delegate
|
||||
import glm_.func.common.clamp
|
||||
import glm_.vec2.Vec2i
|
||||
import glm_.vec3.Vec3
|
||||
import glm_.vec3.Vec3i
|
||||
import kotlin.math.PI
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.cos
|
||||
import kotlin.random.Random
|
||||
|
||||
/**
|
||||
@ -70,11 +66,8 @@ class World(
|
||||
var difficulty: Difficulties? = null
|
||||
var difficultyLocked = false
|
||||
var hashedSeed = 0L
|
||||
var time = 0L
|
||||
var age = 0L
|
||||
var raining = false
|
||||
var rainGradient = 0.0f
|
||||
var thunderGradient = 0.0f
|
||||
val time = WorldTime(this)
|
||||
val weather = WorldWeather()
|
||||
val view = WorldView(connection)
|
||||
private val random = Random
|
||||
|
||||
@ -234,25 +227,6 @@ class World(
|
||||
return get(blockPosition.chunkPosition)?.getLight(blockPosition.inChunkPosition) ?: 0x00
|
||||
}
|
||||
|
||||
val skyAngle: Float
|
||||
get() {
|
||||
val fractionalPath = MMath.fractionalPart(abs(time) / ProtocolDefinition.TICKS_PER_DAYf - 0.25)
|
||||
val angle = 0.5 - cos(fractionalPath * Math.PI) / 2.0
|
||||
return ((fractionalPath * 2.0 + angle) / 3.0).toFloat()
|
||||
}
|
||||
|
||||
val lightBase: Double
|
||||
get() {
|
||||
var base = 1.0f - (cos(skyAngle * 2.0 * PI) * 2.0 + 0.2)
|
||||
base = base.clamp(0.0, 1.0)
|
||||
base = 1.0 - base
|
||||
|
||||
base *= 1.0 - ((rainGradient * 5.0) / 16.0)
|
||||
base *= 1.0 - (((thunderGradient * rainGradient) * 5.0) / 16.0)
|
||||
return base * 0.8 + 0.2
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return All 8 neighbour chunks
|
||||
*/
|
||||
|
@ -0,0 +1,37 @@
|
||||
package de.bixilon.minosoft.data.world.time
|
||||
|
||||
import de.bixilon.minosoft.data.world.World
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||
import de.bixilon.minosoft.util.MMath
|
||||
import glm_.func.common.clamp
|
||||
import kotlin.math.PI
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.cos
|
||||
|
||||
class WorldTime(
|
||||
private val world: World,
|
||||
) {
|
||||
var time = 0L
|
||||
var age = 0L
|
||||
|
||||
|
||||
val skyAngle: Float
|
||||
get() {
|
||||
val fractionalPath = MMath.fractionalPart(abs(time) / ProtocolDefinition.TICKS_PER_DAYf - 0.25)
|
||||
val angle = 0.5 - cos(fractionalPath * Math.PI) / 2.0
|
||||
return ((fractionalPath * 2.0 + angle) / 3.0).toFloat()
|
||||
}
|
||||
|
||||
|
||||
val lightBase: Double
|
||||
get() {
|
||||
var base = 1.0f - (cos(skyAngle * 2.0 * PI) * 2.0 + 0.2)
|
||||
base = base.clamp(0.0, 1.0)
|
||||
base = 1.0 - base
|
||||
|
||||
base *= 1.0 - ((world.weather.rainGradient * 5.0) / 16.0)
|
||||
base *= 1.0 - (((world.weather.thunderGradient * world.weather.rainGradient) * 5.0) / 16.0)
|
||||
return base * 0.8 + 0.2
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package de.bixilon.minosoft.data.world.weather
|
||||
|
||||
class WorldWeather {
|
||||
|
||||
var raining = false
|
||||
var rainGradient = 0.0f
|
||||
var thunderGradient = 0.0f
|
||||
}
|
@ -46,7 +46,7 @@ class SkyRenderer(
|
||||
private val skyboxMesh = SkyboxMesh(renderWindow)
|
||||
private var skySunMesh = SimpleTextureMesh(renderWindow)
|
||||
private lateinit var sunTexture: AbstractTexture
|
||||
private var sunMatrixUpToDate: Boolean = true
|
||||
private var updateSun: Boolean = true
|
||||
var baseColor = RenderConstants.DEFAULT_SKY_COLOR
|
||||
|
||||
|
||||
@ -66,22 +66,21 @@ class SkyRenderer(
|
||||
}
|
||||
})
|
||||
connection.registerEvent(CallbackEventInvoker.of<TimeChangeEvent> {
|
||||
if (connection.world.time != it.time) {
|
||||
sunMatrixUpToDate = true
|
||||
if (connection.world.time.time != it.time) {
|
||||
updateSun = true
|
||||
}
|
||||
})
|
||||
sunTexture = renderWindow.textureManager.staticTextures.createTexture(SUN_TEXTURE_RESOURCE_LOCATION)
|
||||
}
|
||||
|
||||
private fun setSunMatrix(projectionViewMatrix: Mat4) {
|
||||
val timeAngle = (connection.world.skyAngle * 360.0f).rad
|
||||
val timeAngle = (connection.world.time.skyAngle * 360.0f).rad
|
||||
val rotatedMatrix = if (timeAngle == 0.0f) {
|
||||
projectionViewMatrix
|
||||
} else {
|
||||
projectionViewMatrix.rotate(timeAngle, Vec3(0.0f, 0.0f, 1.0f))
|
||||
}
|
||||
skySunShader.use().setMat4("uSkyViewProjectionMatrix", rotatedMatrix)
|
||||
sunMatrixUpToDate = false
|
||||
}
|
||||
|
||||
override fun postInit() {
|
||||
@ -89,7 +88,7 @@ class SkyRenderer(
|
||||
}
|
||||
|
||||
private fun drawSun() {
|
||||
if (sunMatrixUpToDate) {
|
||||
if (updateSun) {
|
||||
setSunMatrix(renderWindow.camera.matrixHandler.projectionMatrix * renderWindow.camera.matrixHandler.viewMatrix.toMat3().toMat4())
|
||||
skySunMesh.unload()
|
||||
|
||||
@ -102,11 +101,12 @@ class SkyRenderer(
|
||||
position = position,
|
||||
texture = sunTexture,
|
||||
uv = uv,
|
||||
tintColor = ChatColors.WHITE.with(alpha = 1.0f - connection.world.rainGradient), // ToDo: Depends on time
|
||||
tintColor = ChatColors.WHITE.with(alpha = 1.0f - connection.world.weather.rainGradient), // ToDo: Depends on time
|
||||
)
|
||||
}
|
||||
)
|
||||
skySunMesh.load()
|
||||
updateSun = false
|
||||
|
||||
}
|
||||
renderSystem.enable(RenderingCapabilities.BLENDING)
|
||||
|
@ -29,7 +29,7 @@ import kotlin.math.max
|
||||
import kotlin.math.pow
|
||||
import kotlin.math.sin
|
||||
|
||||
|
||||
@Deprecated("Needs refactoring")
|
||||
class LightMap(private val connection: PlayConnection) {
|
||||
private val profile = connection.profiles.rendering.light
|
||||
private val nightVisionStatusEffect = connection.registries.statusEffectRegistry[DefaultStatusEffects.NIGHT_VISION]
|
||||
@ -50,7 +50,7 @@ class LightMap(private val connection: PlayConnection) {
|
||||
}
|
||||
|
||||
fun update() {
|
||||
val skyGradient = connection.world.lightBase.toFloat()
|
||||
val skyGradient = connection.world.time.lightBase.toFloat()
|
||||
|
||||
// ToDo: Lightning
|
||||
|
||||
|
@ -16,6 +16,7 @@ import de.bixilon.minosoft.modding.event.EventInitiators
|
||||
import de.bixilon.minosoft.modding.event.events.connection.play.PlayConnectionEvent
|
||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||
import de.bixilon.minosoft.protocol.packets.s2c.play.WorldTimeSetS2CP
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||
|
||||
class TimeChangeEvent(
|
||||
connection: PlayConnection,
|
||||
@ -25,5 +26,5 @@ class TimeChangeEvent(
|
||||
) : PlayConnectionEvent(connection, initiator) {
|
||||
|
||||
|
||||
constructor(connection: PlayConnection, packet: WorldTimeSetS2CP) : this(connection, EventInitiators.SERVER, packet.age, packet.time)
|
||||
constructor(connection: PlayConnection, packet: WorldTimeSetS2CP) : this(connection, EventInitiators.SERVER, packet.age, packet.time % ProtocolDefinition.TICKS_PER_DAY)
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ import de.bixilon.minosoft.modding.event.events.TimeChangeEvent
|
||||
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
|
||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
||||
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.LogLevels
|
||||
import de.bixilon.minosoft.util.logging.LogMessageType
|
||||
@ -25,8 +26,8 @@ class WorldTimeSetS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
|
||||
val time = buffer.readLong()
|
||||
|
||||
override fun handle(connection: PlayConnection) {
|
||||
connection.world.age = age
|
||||
connection.world.time = time
|
||||
connection.world.time.age = age
|
||||
connection.world.time.time = time % ProtocolDefinition.TICKS_PER_DAY
|
||||
|
||||
connection.fireEvent(TimeChangeEvent(connection, this))
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user