diff --git a/src/main/java/de/bixilon/minosoft/data/bossbar/Bossbar.kt b/src/main/java/de/bixilon/minosoft/data/bossbar/Bossbar.kt
new file mode 100644
index 000000000..7027f64fa
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/data/bossbar/Bossbar.kt
@@ -0,0 +1,26 @@
+/*
+ * Minosoft
+ * Copyright (C) 2021 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.bossbar
+
+import de.bixilon.minosoft.data.text.ChatComponent
+
+data class Bossbar(
+ var title: ChatComponent = ChatComponent.EMPTY,
+ var value: Float = 0.0f,
+ var color: BossbarColors = BossbarColors.PINK,
+ var notches: BossbarNotches = BossbarNotches.NO_NOTCHES,
+ var shouldDarkenSky: Boolean = false,
+ var dragonBar: Boolean = false,
+ var fog: Boolean = false,
+)
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarColors.kt b/src/main/java/de/bixilon/minosoft/data/bossbar/BossbarColors.kt
similarity index 95%
rename from src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarColors.kt
rename to src/main/java/de/bixilon/minosoft/data/bossbar/BossbarColors.kt
index 498da32c6..fe915cd40 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarColors.kt
+++ b/src/main/java/de/bixilon/minosoft/data/bossbar/BossbarColors.kt
@@ -10,7 +10,7 @@
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
-package de.bixilon.minosoft.protocol.packets.s2c.play.bossbar
+package de.bixilon.minosoft.data.bossbar
import de.bixilon.minosoft.util.KUtil
import de.bixilon.minosoft.util.enum.ValuesEnum
diff --git a/src/main/java/de/bixilon/minosoft/data/bossbar/BossbarManager.kt b/src/main/java/de/bixilon/minosoft/data/bossbar/BossbarManager.kt
new file mode 100644
index 000000000..7bb82ed90
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/data/bossbar/BossbarManager.kt
@@ -0,0 +1,21 @@
+/*
+ * Minosoft
+ * Copyright (C) 2021 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.bossbar
+
+import de.bixilon.minosoft.util.KUtil.synchronizedMapOf
+import java.util.*
+
+class BossbarManager {
+ val bossbars: MutableMap = synchronizedMapOf()
+}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarNotches.kt b/src/main/java/de/bixilon/minosoft/data/bossbar/BossbarNotches.kt
similarity index 95%
rename from src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarNotches.kt
rename to src/main/java/de/bixilon/minosoft/data/bossbar/BossbarNotches.kt
index 2cebd51af..38d61fd97 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarNotches.kt
+++ b/src/main/java/de/bixilon/minosoft/data/bossbar/BossbarNotches.kt
@@ -10,7 +10,7 @@
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
-package de.bixilon.minosoft.protocol.packets.s2c.play.bossbar
+package de.bixilon.minosoft.data.bossbar
import de.bixilon.minosoft.util.KUtil
import de.bixilon.minosoft.util.enum.ValuesEnum
diff --git a/src/main/java/de/bixilon/minosoft/data/registries/recipes/Recipes.java b/src/main/java/de/bixilon/minosoft/data/registries/recipes/Recipes.java
index ad438efde..ab33c7f5f 100644
--- a/src/main/java/de/bixilon/minosoft/data/registries/recipes/Recipes.java
+++ b/src/main/java/de/bixilon/minosoft/data/registries/recipes/Recipes.java
@@ -20,6 +20,7 @@ import de.bixilon.minosoft.data.registries.ResourceLocation;
import java.util.Arrays;
import java.util.HashSet;
+@Deprecated
public class Recipes {
private final HashSet recipeList = new HashSet<>();
private final HashBiMap recipeIdMap = HashBiMap.create(); // ids for version <= VERSION_1_12_2
diff --git a/src/main/java/de/bixilon/minosoft/data/scoreboard/ScoreboardManager.kt b/src/main/java/de/bixilon/minosoft/data/scoreboard/ScoreboardManager.kt
index 8a791cfaa..3421468ea 100644
--- a/src/main/java/de/bixilon/minosoft/data/scoreboard/ScoreboardManager.kt
+++ b/src/main/java/de/bixilon/minosoft/data/scoreboard/ScoreboardManager.kt
@@ -12,7 +12,9 @@
*/
package de.bixilon.minosoft.data.scoreboard
+import de.bixilon.minosoft.util.KUtil.synchronizedMapOf
+
class ScoreboardManager {
- val teams: MutableMap = mutableMapOf()
- val objectives: MutableMap = mutableMapOf()
+ val teams: MutableMap = synchronizedMapOf()
+ val objectives: MutableMap = synchronizedMapOf()
}
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarAddEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarAddEvent.kt
new file mode 100644
index 000000000..4b4170020
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarAddEvent.kt
@@ -0,0 +1,25 @@
+/*
+ * Minosoft
+ * Copyright (C) 2020 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.modding.event.events.bossbar
+
+import de.bixilon.minosoft.data.bossbar.Bossbar
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
+import java.util.*
+
+class BossbarAddEvent(
+ connection: PlayConnection,
+ initiator: EventInitiators,
+ uuid: UUID,
+ bossbar: Bossbar,
+) : BossbarEvent(connection, initiator, uuid, bossbar)
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarEvent.kt
new file mode 100644
index 000000000..7e0ad4e9e
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarEvent.kt
@@ -0,0 +1,27 @@
+/*
+ * Minosoft
+ * Copyright (C) 2021 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.modding.event.events.bossbar
+
+import de.bixilon.minosoft.data.bossbar.Bossbar
+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 java.util.*
+
+abstract class BossbarEvent(
+ connection: PlayConnection,
+ initiator: EventInitiators,
+ val uuid: UUID,
+ val bossbar: Bossbar,
+) : PlayConnectionEvent(connection, initiator)
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarFlagsSetEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarFlagsSetEvent.kt
new file mode 100644
index 000000000..471702d0f
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarFlagsSetEvent.kt
@@ -0,0 +1,25 @@
+/*
+ * Minosoft
+ * Copyright (C) 2020 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.modding.event.events.bossbar
+
+import de.bixilon.minosoft.data.bossbar.Bossbar
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
+import java.util.*
+
+class BossbarFlagsSetEvent(
+ connection: PlayConnection,
+ initiator: EventInitiators,
+ uuid: UUID,
+ bossbar: Bossbar,
+) : BossbarEvent(connection, initiator, uuid, bossbar)
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarRemoveEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarRemoveEvent.kt
new file mode 100644
index 000000000..913d9b303
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarRemoveEvent.kt
@@ -0,0 +1,25 @@
+/*
+ * Minosoft
+ * Copyright (C) 2020 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.modding.event.events.bossbar
+
+import de.bixilon.minosoft.data.bossbar.Bossbar
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
+import java.util.*
+
+class BossbarRemoveEvent(
+ connection: PlayConnection,
+ initiator: EventInitiators,
+ uuid: UUID,
+ bossbar: Bossbar,
+) : BossbarEvent(connection, initiator, uuid, bossbar)
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarStyleSetEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarStyleSetEvent.kt
new file mode 100644
index 000000000..ed199256b
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarStyleSetEvent.kt
@@ -0,0 +1,25 @@
+/*
+ * Minosoft
+ * Copyright (C) 2020 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.modding.event.events.bossbar
+
+import de.bixilon.minosoft.data.bossbar.Bossbar
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
+import java.util.*
+
+class BossbarStyleSetEvent(
+ connection: PlayConnection,
+ initiator: EventInitiators,
+ uuid: UUID,
+ bossbar: Bossbar,
+) : BossbarEvent(connection, initiator, uuid, bossbar)
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarTitleSetEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarTitleSetEvent.kt
new file mode 100644
index 000000000..8b67a5dce
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarTitleSetEvent.kt
@@ -0,0 +1,25 @@
+/*
+ * Minosoft
+ * Copyright (C) 2020 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.modding.event.events.bossbar
+
+import de.bixilon.minosoft.data.bossbar.Bossbar
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
+import java.util.*
+
+class BossbarTitleSetEvent(
+ connection: PlayConnection,
+ initiator: EventInitiators,
+ uuid: UUID,
+ bossbar: Bossbar,
+) : BossbarEvent(connection, initiator, uuid, bossbar)
diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarValueSetEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarValueSetEvent.kt
new file mode 100644
index 000000000..c09828a9d
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/modding/event/events/bossbar/BossbarValueSetEvent.kt
@@ -0,0 +1,25 @@
+/*
+ * Minosoft
+ * Copyright (C) 2020 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.modding.event.events.bossbar
+
+import de.bixilon.minosoft.data.bossbar.Bossbar
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
+import java.util.*
+
+class BossbarValueSetEvent(
+ connection: PlayConnection,
+ initiator: EventInitiators,
+ uuid: UUID,
+ bossbar: Bossbar,
+) : BossbarEvent(connection, initiator, uuid, bossbar)
diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt
index 7c313dc2f..e9f89960d 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt
@@ -17,6 +17,7 @@ import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.data.ChatTextPositions
import de.bixilon.minosoft.data.accounts.Account
import de.bixilon.minosoft.data.assets.MultiAssetsManager
+import de.bixilon.minosoft.data.bossbar.BossbarManager
import de.bixilon.minosoft.data.commands.CommandRootNode
import de.bixilon.minosoft.data.physics.CollisionDetector
import de.bixilon.minosoft.data.player.LocalPlayerEntity
@@ -66,11 +67,12 @@ class PlayConnection(
val account: Account,
val version: Version,
) : Connection() {
+ val registries = Registries()
val recipes = Recipes()
val world = World(this)
val tabList = TabList()
val scoreboardManager = ScoreboardManager()
- val registries = Registries()
+ val bossbarManager = BossbarManager()
@Deprecated(message = "PacketSender is deprecated")
val sender = PacketSender(this)
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarAddS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarAddS2CP.kt
index 5ebe26f84..274056c0b 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarAddS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarAddS2CP.kt
@@ -13,8 +13,15 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.bossbar
+import de.bixilon.minosoft.data.bossbar.Bossbar
+import de.bixilon.minosoft.data.bossbar.BossbarColors
+import de.bixilon.minosoft.data.bossbar.BossbarNotches
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.modding.event.events.bossbar.BossbarAddEvent
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.InByteBuffer
+import de.bixilon.minosoft.util.BitByte.isBitMask
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
@@ -24,13 +31,43 @@ class BossbarAddS2CP(
val uuid: UUID,
buffer: InByteBuffer,
) : PlayS2CPacket() {
- val name = buffer.readChatComponent()
- val health = buffer.readFloat()
+ val title = buffer.readChatComponent()
+ val value = buffer.readFloat()
val color = BossbarColors[buffer.readVarInt()]
val notches = BossbarNotches[buffer.readVarInt()]
- val flags = buffer.readUnsignedByte() // ToDo
+ val shouldDarkenSky: Boolean
+ val dragonBar: Boolean
+ val fog: Boolean
+
+ init {
+ val flags = buffer.readUnsignedByte()
+ shouldDarkenSky = flags.isBitMask(BossbarFlags.SHOULD_DARKEN_SKY_MASK)
+ dragonBar = flags.isBitMask(BossbarFlags.DRAGON_BAR_MASK)
+ fog = flags.isBitMask(BossbarFlags.FOG_MASK)
+ }
+
+ override fun check(connection: PlayConnection) {
+ check(value in 0.0f..1.0f) { "Value of of bounds!" }
+ }
+
+ override fun handle(connection: PlayConnection) {
+ val bossbar = Bossbar(
+ title = title,
+ value = value,
+ color = color,
+ notches = notches,
+ shouldDarkenSky = shouldDarkenSky,
+ dragonBar = dragonBar,
+ fog = fog,
+ )
+
+ // ToDo: Check if bossbar is already present
+ connection.bossbarManager.bossbars[uuid] = bossbar
+
+ connection.fireEvent(BossbarAddEvent(connection, EventInitiators.SERVER, uuid, bossbar))
+ }
override fun log() {
- Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar add (uuid=$uuid, name=\"$name\", health=$health, color=$color, notches=$notches, flags=$flags)" }
+ Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar add (uuid=$uuid, title=\"$title\", health=$value, color=$color, notches=$notches, shouldDarkenSky=$shouldDarkenSky, dragonBar=$dragonBar, fog=$fog)" }
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarFlagSetS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarFlagSetS2CP.kt
index f601354d9..fa87be422 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarFlagSetS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarFlagSetS2CP.kt
@@ -13,8 +13,12 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.bossbar
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.modding.event.events.bossbar.BossbarFlagsSetEvent
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.InByteBuffer
+import de.bixilon.minosoft.util.BitByte.isBitMask
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
@@ -24,9 +28,42 @@ class BossbarFlagSetS2CP(
val uuid: UUID,
buffer: InByteBuffer,
) : PlayS2CPacket() {
- val flags = buffer.readUnsignedByte()
+ val shouldDarkenSky: Boolean
+ val dragonBar: Boolean
+ val fog: Boolean
+
+ init {
+ val flags = buffer.readUnsignedByte()
+ shouldDarkenSky = flags.isBitMask(BossbarFlags.SHOULD_DARKEN_SKY_MASK)
+ dragonBar = flags.isBitMask(BossbarFlags.DRAGON_BAR_MASK)
+ fog = flags.isBitMask(BossbarFlags.FOG_MASK)
+ }
+
+ override fun handle(connection: PlayConnection) {
+ val bossbar = connection.bossbarManager.bossbars[uuid] ?: return
+
+ var changes = 0
+
+ if (bossbar.shouldDarkenSky != shouldDarkenSky) {
+ bossbar.shouldDarkenSky = shouldDarkenSky
+ changes++
+ }
+ if (bossbar.dragonBar != dragonBar) {
+ bossbar.dragonBar = dragonBar
+ changes++
+ }
+ if (bossbar.fog != fog) {
+ bossbar.fog = fog
+ changes++
+ }
+ if (changes == 0) {
+ return
+ }
+
+ connection.fireEvent(BossbarFlagsSetEvent(connection, EventInitiators.SERVER, uuid, bossbar))
+ }
override fun log() {
- Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar flags set (uuid=$uuid, flags=$flags)" }
+ Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar flags set (uuid=$uuid, shouldDarkenSky=$shouldDarkenSky, dragonBar=$dragonBar, fog=$fog)" }
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarFlags.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarFlags.kt
new file mode 100644
index 000000000..0b8058e97
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarFlags.kt
@@ -0,0 +1,20 @@
+/*
+ * Minosoft
+ * Copyright (C) 2021 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.protocol.packets.s2c.play.bossbar
+
+object BossbarFlags {
+ const val SHOULD_DARKEN_SKY_MASK = 0x01
+ const val DRAGON_BAR_MASK = 0x02
+ const val FOG_MASK = 0x04
+}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarRemoveS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarRemoveS2CP.kt
index e69a1f8cf..8519911e0 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarRemoveS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarRemoveS2CP.kt
@@ -13,6 +13,9 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.bossbar
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.modding.event.events.bossbar.BossbarRemoveEvent
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
@@ -23,6 +26,11 @@ class BossbarRemoveS2CP(
val uuid: UUID,
) : PlayS2CPacket() {
+ override fun handle(connection: PlayConnection) {
+ val bossbar = connection.bossbarManager.bossbars.remove(uuid) ?: return
+ connection.fireEvent(BossbarRemoveEvent(connection, EventInitiators.SERVER, uuid, bossbar))
+ }
+
override fun log() {
Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar remove (uuid=$uuid)" }
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarS2CPF.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarS2CPF.kt
index 2d792a74f..09d2d4469 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarS2CPF.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarS2CPF.kt
@@ -25,8 +25,8 @@ object BossbarS2CPF {
return when (BossBarActions[buffer.readVarInt()]) {
BossBarActions.ADD -> BossbarAddS2CP(uuid, buffer)
BossBarActions.REMOVE -> BossbarRemoveS2CP(uuid)
- BossBarActions.SET_HEALTH -> BossbarHealthSetS2CP(uuid, buffer)
- BossBarActions.SET_NAME -> BossbarNameSetS2CP(uuid, buffer)
+ BossBarActions.SET_VALUE -> BossbarValueSetS2CP(uuid, buffer)
+ BossBarActions.SET_TITLE -> BossbarTitleSetS2CP(uuid, buffer)
BossBarActions.SET_STYLE -> BossbarStyleSetS2CP(uuid, buffer)
BossBarActions.SET_FLAGS -> BossbarFlagSetS2CP(uuid, buffer)
}
@@ -35,8 +35,8 @@ object BossbarS2CPF {
enum class BossBarActions {
ADD,
REMOVE,
- SET_HEALTH,
- SET_NAME,
+ SET_VALUE,
+ SET_TITLE,
SET_STYLE,
SET_FLAGS,
;
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarStyleSetS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarStyleSetS2CP.kt
index 9744010b3..63e7651ee 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarStyleSetS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarStyleSetS2CP.kt
@@ -13,6 +13,11 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.bossbar
+import de.bixilon.minosoft.data.bossbar.BossbarColors
+import de.bixilon.minosoft.data.bossbar.BossbarNotches
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.modding.event.events.bossbar.BossbarStyleSetEvent
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.InByteBuffer
import de.bixilon.minosoft.util.logging.Log
@@ -27,6 +32,26 @@ class BossbarStyleSetS2CP(
val color = BossbarColors[buffer.readVarInt()]
val notches = BossbarNotches[buffer.readVarInt()]
+ override fun handle(connection: PlayConnection) {
+ val bossbar = connection.bossbarManager.bossbars[uuid] ?: return
+
+ var changes = 0
+
+ if (bossbar.color != color) {
+ bossbar.color = color
+ changes++
+ }
+ if (bossbar.notches != notches) {
+ bossbar.notches = notches
+ changes++
+ }
+ if (changes == 0) {
+ return
+ }
+
+ connection.fireEvent(BossbarStyleSetEvent(connection, EventInitiators.SERVER, uuid, bossbar))
+ }
+
override fun log() {
Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar style set (uuid=$uuid, color=$color, notches=$notches)" }
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarNameSetS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarTitleSetS2CP.kt
similarity index 66%
rename from src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarNameSetS2CP.kt
rename to src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarTitleSetS2CP.kt
index fe046511b..60a241f38 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarNameSetS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarTitleSetS2CP.kt
@@ -14,6 +14,9 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.bossbar
import de.bixilon.minosoft.Minosoft
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.modding.event.events.bossbar.BossbarTitleSetEvent
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.InByteBuffer
import de.bixilon.minosoft.util.logging.Log
@@ -21,16 +24,28 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import java.util.*
-class BossbarNameSetS2CP(
+class BossbarTitleSetS2CP(
val uuid: UUID,
buffer: InByteBuffer,
) : PlayS2CPacket() {
- val name = buffer.readChatComponent()
+ val title = buffer.readChatComponent()
+
+ override fun handle(connection: PlayConnection) {
+ val bossbar = connection.bossbarManager.bossbars[uuid] ?: return
+
+ if (bossbar.title == title) {
+ return
+ }
+ bossbar.title = title
+
+ connection.fireEvent(BossbarTitleSetEvent(connection, EventInitiators.SERVER, uuid, bossbar))
+ }
override fun log() {
if (Minosoft.config.config.general.reduceProtocolLog) {
+ // servers have sometimes "animated" bossbars
return
}
- Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar name set (uuid=$uuid, name=\"$name\")" }
+ Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar name set (uuid=$uuid, title=\"$title\")" }
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarHealthSetS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarValueSetS2CP.kt
similarity index 62%
rename from src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarHealthSetS2CP.kt
rename to src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarValueSetS2CP.kt
index cfe271a6a..61e1797f0 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarHealthSetS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/bossbar/BossbarValueSetS2CP.kt
@@ -13,6 +13,9 @@
package de.bixilon.minosoft.protocol.packets.s2c.play.bossbar
+import de.bixilon.minosoft.modding.event.EventInitiators
+import de.bixilon.minosoft.modding.event.events.bossbar.BossbarValueSetEvent
+import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.InByteBuffer
import de.bixilon.minosoft.util.logging.Log
@@ -20,13 +23,28 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import java.util.*
-class BossbarHealthSetS2CP(
+class BossbarValueSetS2CP(
val uuid: UUID,
buffer: InByteBuffer,
) : PlayS2CPacket() {
- val health = buffer.readFloat()
+ val value = buffer.readFloat()
+
+ override fun handle(connection: PlayConnection) {
+ val bossbar = connection.bossbarManager.bossbars[uuid] ?: return
+
+ if (bossbar.value == value) {
+ return
+ }
+ bossbar.value = value
+
+ connection.fireEvent(BossbarValueSetEvent(connection, EventInitiators.SERVER, uuid, bossbar))
+ }
+
+ override fun check(connection: PlayConnection) {
+ check(value in 0.0f..1.0f) { "Value of of bounds!" }
+ }
override fun log() {
- Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar health set (uuid=$uuid, health=$health)" }
+ Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Bossbar value set (uuid=$uuid, value=$value)" }
}
}