From 4f329768ca971611f6fc3707a6cf77f42f52f21c Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sun, 24 Apr 2022 02:03:46 +0200 Subject: [PATCH] wip world border #65 --- .../de/bixilon/minosoft/data/world/World.kt | 6 +- .../minosoft/data/world/border/WorldBorder.kt | 55 +++++++++++++++++++ .../interaction/BreakInteractionHandler.kt | 5 ++ .../interaction/InteractInteractionHandler.kt | 3 + .../s2c/play/border/CenterWorldBorderS2CP.kt | 10 +++- .../play/border/InitializeWorldBorderS2CP.kt | 14 ++++- .../s2c/play/border/LerpWorldBorderS2CP.kt | 5 ++ .../s2c/play/border/SizeWorldBorderS2CP.kt | 5 ++ .../play/border/WarnBlocksWorldBorderS2CP.kt | 5 ++ .../play/border/WarnTimeWorldBorderS2CP.kt | 5 ++ .../protocol/protocol/InByteBuffer.kt | 5 ++ 11 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/data/world/border/WorldBorder.kt diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.kt b/src/main/java/de/bixilon/minosoft/data/world/World.kt index ff4729a35..af6ae07a8 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/World.kt @@ -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) } diff --git a/src/main/java/de/bixilon/minosoft/data/world/border/WorldBorder.kt b/src/main/java/de/bixilon/minosoft/data/world/border/WorldBorder.kt new file mode 100644 index 000000000..d11428533 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/world/border/WorldBorder.kt @@ -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 . + * + * 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) { + + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/BreakInteractionHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/BreakInteractionHandler.kt index db44d9416..2c78fc211 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/BreakInteractionHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/BreakInteractionHandler.kt @@ -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() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/InteractInteractionHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/InteractInteractionHandler.kt index c4ac5696e..013ee729b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/InteractInteractionHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/InteractInteractionHandler.kt @@ -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 { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/CenterWorldBorderS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/CenterWorldBorderS2CP.kt index fec4f3416..8df5de278 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/CenterWorldBorderS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/CenterWorldBorderS2CP.kt @@ -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)" } } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/InitializeWorldBorderS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/InitializeWorldBorderS2CP.kt index 52ff4e848..7b71bea68 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/InitializeWorldBorderS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/InitializeWorldBorderS2CP.kt @@ -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)" } } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/LerpWorldBorderS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/LerpWorldBorderS2CP.kt index a2296ae46..405932ac8 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/LerpWorldBorderS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/LerpWorldBorderS2CP.kt @@ -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)" } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/SizeWorldBorderS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/SizeWorldBorderS2CP.kt index 515c0c3d9..aa758895c 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/SizeWorldBorderS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/SizeWorldBorderS2CP.kt @@ -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)" } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/WarnBlocksWorldBorderS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/WarnBlocksWorldBorderS2CP.kt index 98648872e..5f6018c60 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/WarnBlocksWorldBorderS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/WarnBlocksWorldBorderS2CP.kt @@ -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)" } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/WarnTimeWorldBorderS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/WarnTimeWorldBorderS2CP.kt index c44811d72..7ca999de8 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/WarnTimeWorldBorderS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/border/WarnTimeWorldBorderS2CP.kt @@ -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)" } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt index 0aac35403..620e1c011 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt @@ -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()) }