wip world border #65

This commit is contained in:
Bixilon 2022-04-24 02:03:46 +02:00
parent 2adad42f7e
commit 4f329768ca
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
11 changed files with 111 additions and 7 deletions

View File

@ -29,6 +29,7 @@ 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.border.WorldBorder
import de.bixilon.minosoft.data.world.time.WorldTime
import de.bixilon.minosoft.data.world.view.WorldView
import de.bixilon.minosoft.data.world.weather.WorldWeather
@ -68,6 +69,7 @@ class World(
val time = WorldTime(this)
val weather = WorldWeather()
val view = WorldView(connection)
val border = WorldBorder()
private val random = Random
var audioPlayer: AbstractAudioPlayer? = null
@ -117,7 +119,9 @@ class World(
}
fun isPositionChangeable(blockPosition: Vec3i): Boolean {
// ToDo: World border
if (border.isOutside(blockPosition)) {
return false
}
val dimension = connection.world.dimension!!
return (blockPosition.y >= dimension.minY || blockPosition.y < dimension.height)
}

View File

@ -0,0 +1,55 @@
/*
* 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.border
import de.bixilon.kotlinglm.vec2.Vec2d
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kotlinglm.vec3.Vec3d
import de.bixilon.kotlinglm.vec3.Vec3i
import de.bixilon.minosoft.data.world.World
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2dUtil.EMPTY
class WorldBorder {
var center = Vec2d.EMPTY
var radius = World.MAX_SIZE.toDouble()
var warningTime = 0
var warningBlocks = 0
var portalBound = 0
fun isOutside(blockPosition: Vec3i): Boolean {
return isOutside(blockPosition.x.toDouble(), blockPosition.z.toDouble())
}
fun isOutside(position: Vec3): Boolean {
return isOutside(position.x.toDouble(), position.z.toDouble())
}
fun isOutside(position: Vec3d): Boolean {
return isOutside(position.x, position.z)
}
fun isOutside(x: Double, z: Double): Boolean {
if (x !in radius - center.x..radius + center.x) {
return false
}
if (z !in radius - center.y..radius + center.y) {
return false
}
return true
}
fun lerp(oldRadius: Double, newRadius: Double, speed: Long) {
}
}

View File

@ -111,6 +111,11 @@ class BreakInteractionHandler(
return false
}
if (!connection.world.isPositionChangeable(target.blockPosition)) {
cancelDigging()
return false
}
// check if we look at another block or our inventory changed
if (breakPosition != target.blockPosition || breakBlockState != target.blockState || breakSelectedSlot != connection.player.selectedHotbarSlot) {
cancelDigging()

View File

@ -75,6 +75,9 @@ class InteractInteractionHandler(
if (target.distance >= connection.player.reachDistance) {
return InteractionResults.PASS
}
if (connection.world.border.isOutside(target.blockPosition)) {
return InteractionResults.CONSUME
}
// if out of world (border): return CONSUME
try {

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.border
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.util.logging.Log
@ -21,10 +22,13 @@ import de.bixilon.minosoft.util.logging.LogMessageType
@LoadPacket(parent = true)
class CenterWorldBorderS2CP(buffer: PlayInByteBuffer) : WorldBorderS2CP {
val x = buffer.readDouble()
val z = buffer.readDouble()
val center = buffer.readVec2d()
override fun handle(connection: PlayConnection) {
connection.world.border.center = center
}
override fun log(reducedLog: Boolean) {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Center set world border (x=$x, z=$z)" }
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Center set world border (center=$center)" }
}
}

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.border
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.util.logging.Log
@ -21,8 +22,7 @@ import de.bixilon.minosoft.util.logging.LogMessageType
@LoadPacket(parent = true)
class InitializeWorldBorderS2CP(buffer: PlayInByteBuffer) : WorldBorderS2CP {
val x = buffer.readDouble()
val z = buffer.readDouble()
val center = buffer.readVec2d()
val oldRadius = buffer.readDouble()
val newRadius = buffer.readDouble()
val speed = buffer.readVarLong()
@ -30,7 +30,15 @@ class InitializeWorldBorderS2CP(buffer: PlayInByteBuffer) : WorldBorderS2CP {
val warningTime = buffer.readVarInt()
val warningBlocks = buffer.readVarInt()
override fun handle(connection: PlayConnection) {
connection.world.border.center = center
connection.world.border.lerp(oldRadius, newRadius, speed)
connection.world.border.portalBound = portalBound
connection.world.border.warningTime = warningTime
connection.world.border.warningBlocks = warningBlocks
}
override fun log(reducedLog: Boolean) {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Initialize world border (x=$x, z=$z, oldRadius=$oldRadius, newRadius=$newRadius, speed=$speed, portalBound=$portalBound, warningTime=$warningTime, warningBlocks=$warningBlocks)" }
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Initialize world border (center=$center, oldRadius=$oldRadius, newRadius=$newRadius, speed=$speed, portalBound=$portalBound, warningTime=$warningTime, warningBlocks=$warningBlocks)" }
}
}

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.border
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.util.logging.Log
@ -25,6 +26,10 @@ class LerpWorldBorderS2CP(buffer: PlayInByteBuffer) : WorldBorderS2CP {
val newRadius = buffer.readDouble()
val speed = buffer.readVarLong()
override fun handle(connection: PlayConnection) {
connection.world.border.lerp(oldRadius, newRadius, speed)
}
override fun log(reducedLog: Boolean) {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Lerp size world border (oldRadius=$oldRadius, newRadius=$newRadius, speed=$speed)" }
}

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.border
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.util.logging.Log
@ -23,6 +24,10 @@ import de.bixilon.minosoft.util.logging.LogMessageType
class SizeWorldBorderS2CP(buffer: PlayInByteBuffer) : WorldBorderS2CP {
val radius = buffer.readDouble()
override fun handle(connection: PlayConnection) {
connection.world.border.radius = radius
}
override fun log(reducedLog: Boolean) {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Size set world border (radius=$radius)" }
}

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.border
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.util.logging.Log
@ -23,6 +24,10 @@ import de.bixilon.minosoft.util.logging.LogMessageType
class WarnBlocksWorldBorderS2CP(buffer: PlayInByteBuffer) : WorldBorderS2CP {
val warningBlocks = buffer.readVarInt()
override fun handle(connection: PlayConnection) {
connection.world.border.warningBlocks = warningBlocks
}
override fun log(reducedLog: Boolean) {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Warning blocks set world border (warningBlocks=$warningBlocks)" }
}

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.border
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.util.logging.Log
@ -24,6 +25,10 @@ import de.bixilon.minosoft.util.logging.LogMessageType
class WarnTimeWorldBorderS2CP(buffer: PlayInByteBuffer) : WorldBorderS2CP {
val warningTime = buffer.readVarInt()
override fun handle(connection: PlayConnection) {
connection.world.border.warningTime = warningTime
}
override fun log(reducedLog: Boolean) {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Warning time set world border (warningTime=$warningTime)" }
}

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.protocol.protocol
import de.bixilon.kotlinglm.vec2.Vec2
import de.bixilon.kotlinglm.vec2.Vec2d
import de.bixilon.kotlinglm.vec2.Vec2i
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kotlinglm.vec3.Vec3d
@ -308,6 +309,10 @@ open class InByteBuffer {
return Vec2(readFloat(), readFloat())
}
fun readVec2d(): Vec2d {
return Vec2d(readDouble(), readDouble())
}
fun readVec3f(): Vec3 {
return Vec3(readFloat(), readFloat(), readFloat())
}