diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/EntityScoreboardFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/EntityScoreboardFeature.kt
new file mode 100644
index 000000000..eb2fd6812
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/EntityScoreboardFeature.kt
@@ -0,0 +1,46 @@
+/*
+ * Minosoft
+ * Copyright (C) 2020-2023 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.gui.rendering.entities.feature.text
+
+import de.bixilon.kutil.cast.CastUtil.unsafeCast
+import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity
+import de.bixilon.minosoft.data.scoreboard.ScoreboardPositions
+import de.bixilon.minosoft.data.text.BaseComponent
+import de.bixilon.minosoft.data.text.ChatComponent
+import de.bixilon.minosoft.data.text.TextComponent
+import de.bixilon.minosoft.gui.rendering.entities.renderer.living.player.PlayerRenderer
+
+class EntityScoreboardFeature(renderer: PlayerRenderer<*>) : BillboardTextFeature(renderer, null) {
+
+ override fun update(millis: Long, delta: Float) {
+ updateScore()
+ super.update(millis, delta)
+ }
+
+ private fun updateScore() {
+ // TODO: self, offset name, render distance (10), performance
+ this.text = getScore()
+ }
+
+ private fun getScore(): ChatComponent? {
+ val objective = renderer.renderer.connection.scoreboard.positions[ScoreboardPositions.BELOW_NAME] ?: return null
+ val score = objective.scores[renderer.entity.unsafeCast().additional.name] ?: return null
+ val text = BaseComponent()
+ text += TextComponent(score.value)
+ text += " "
+ text += objective.displayName
+
+ return text
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt
index 7f4d26deb..9960b00e0 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/living/player/PlayerRenderer.kt
@@ -22,6 +22,7 @@ import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft
import de.bixilon.minosoft.gui.rendering.RenderContext
import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer
import de.bixilon.minosoft.gui.rendering.entities.factory.RegisteredEntityModelFactory
+import de.bixilon.minosoft.gui.rendering.entities.feature.text.EntityScoreboardFeature
import de.bixilon.minosoft.gui.rendering.entities.model.human.PlayerModel
import de.bixilon.minosoft.gui.rendering.entities.renderer.living.LivingEntityRenderer
import de.bixilon.minosoft.gui.rendering.models.loader.ModelLoader
@@ -38,6 +39,8 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity:
var skin: DynamicTexture? = null
private var refresh = true
+ val scoreboard = EntityScoreboardFeature(this).register()
+
init {
entity.additional::properties.observe(this) { refresh = true }
}
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 8669f17db..e4cc2253e 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
@@ -85,7 +85,7 @@ class PlayConnection(
val registries = Registries().apply { updateFlattened(version.flattened) }
val world = World(this)
val tabList = TabList()
- val scoreboardManager = ScoreboardManager(this)
+ val scoreboard = ScoreboardManager(this)
val bossbarManager = BossbarManager()
val util = ConnectionUtil(this)
val ticker = ConnectionTicker(this)
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/ObjectivePositionS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/ObjectivePositionS2CP.kt
index 876358544..67dcf8fe2 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/ObjectivePositionS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/ObjectivePositionS2CP.kt
@@ -26,7 +26,7 @@ class ObjectivePositionS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
private val name: String? = buffer.readNullString()
override fun handle(connection: PlayConnection) {
- val scoreboardManager = connection.scoreboardManager
+ val scoreboardManager = connection.scoreboard
if (name == null) {
scoreboardManager.positions -= position
connection.events.fire(ObjectivePositionSetEvent(connection, position, null))
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/CreateObjectiveS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/CreateObjectiveS2CP.kt
index e3dc34037..6696427df 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/CreateObjectiveS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/CreateObjectiveS2CP.kt
@@ -60,7 +60,7 @@ class CreateObjectiveS2CP(
override fun handle(connection: PlayConnection) {
val objective = ScoreboardObjective(name, displayName, unit)
- connection.scoreboardManager.objectives[name] = objective
+ connection.scoreboard.objectives[name] = objective
connection.events.fire(ScoreboardObjectiveCreateEvent(connection, objective))
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/RemoveObjectiveS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/RemoveObjectiveS2CP.kt
index 7a8d02ce5..fd684a2b2 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/RemoveObjectiveS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/RemoveObjectiveS2CP.kt
@@ -31,13 +31,13 @@ class RemoveObjectiveS2CP(
}
override fun handle(connection: PlayConnection) {
- connection.scoreboardManager.objectives.remove(objective)
+ connection.scoreboard.objectives.remove(objective)
- for ((position, objective) in connection.scoreboardManager.positions.toSynchronizedMap()) {
+ for ((position, objective) in connection.scoreboard.positions.toSynchronizedMap()) {
if (objective.name != this.objective) {
continue
}
- connection.scoreboardManager.positions -= position
+ connection.scoreboard.positions -= position
connection.events.fire(ObjectivePositionSetEvent(connection, position, null))
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/UpdateObjectiveS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/UpdateObjectiveS2CP.kt
index 54d6decd8..8cb295251 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/UpdateObjectiveS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/objective/UpdateObjectiveS2CP.kt
@@ -58,7 +58,7 @@ class UpdateObjectiveS2CP(
}
override fun handle(connection: PlayConnection) {
- val objective = connection.scoreboardManager.objectives[objective] ?: return
+ val objective = connection.scoreboard.objectives[objective] ?: return
objective.displayName = displayName
objective.unit = unit
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/score/PutScoreboardScoreS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/score/PutScoreboardScoreS2CP.kt
index a6db1d756..6973bd2da 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/score/PutScoreboardScoreS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/score/PutScoreboardScoreS2CP.kt
@@ -35,8 +35,8 @@ class PutScoreboardScoreS2CP(
override fun handle(connection: PlayConnection) {
check(objective != null) { "Can not update null objective!" }
- val objective = connection.scoreboardManager.objectives[objective] ?: return
- val score = ScoreboardScore(entity, objective, connection.scoreboardManager.getTeam(entity), value)
+ val objective = connection.scoreboard.objectives[objective] ?: return
+ val score = ScoreboardScore(entity, objective, connection.scoreboard.getTeam(entity), value)
objective.scores[entity] = score
connection.events.fire(ScoreboardScorePutEvent(connection, score))
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/score/RemoveScoreboardScoreS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/score/RemoveScoreboardScoreS2CP.kt
index d03810e98..1a97e83b9 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/score/RemoveScoreboardScoreS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/score/RemoveScoreboardScoreS2CP.kt
@@ -28,8 +28,8 @@ class RemoveScoreboardScoreS2CP(
) : ScoreboardScoreS2CP {
override fun handle(connection: PlayConnection) {
- val objective = connection.scoreboardManager.objectives[objective] ?: let {
- for ((_, objective) in connection.scoreboardManager.objectives.toSynchronizedMap()) {
+ val objective = connection.scoreboard.objectives[objective] ?: let {
+ for ((_, objective) in connection.scoreboard.objectives.toSynchronizedMap()) {
val score = objective.scores.remove(entity) ?: continue
connection.events.fire(ScoreboardScoreRemoveEvent(connection, score))
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/AddTeamMemberS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/AddTeamMemberS2CP.kt
index 8954aed1e..5873f8352 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/AddTeamMemberS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/AddTeamMemberS2CP.kt
@@ -35,14 +35,14 @@ class AddTeamMemberS2CP(
override fun handle(connection: PlayConnection) {
- val team = connection.scoreboardManager.teams[name] ?: return
+ val team = connection.scoreboard.teams[name] ?: return
team.members += members
for (member in members) {
connection.tabList.name[member]?.team = team
}
- connection.scoreboardManager.updateScoreTeams(team, members)
+ connection.scoreboard.updateScoreTeams(team, members)
connection.events.fire(TeamMemberAddEvent(connection, team, members))
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/CreateTeamS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/CreateTeamS2CP.kt
index f4acfbf32..004e1316a 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/CreateTeamS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/CreateTeamS2CP.kt
@@ -118,13 +118,13 @@ class CreateTeamS2CP(
color = color,
members = members.toSynchronizedSet(),
)
- connection.scoreboardManager.teams[name] = team
+ connection.scoreboard.teams[name] = team
for (member in members) {
connection.tabList.name[member]?.team = team
}
- connection.scoreboardManager.updateScoreTeams(team, members)
+ connection.scoreboard.updateScoreTeams(team, members)
connection.events.fire(TeamCreateEvent(connection, team))
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/RemoveTeamMemberS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/RemoveTeamMemberS2CP.kt
index d1f785f99..83e665b4f 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/RemoveTeamMemberS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/RemoveTeamMemberS2CP.kt
@@ -35,7 +35,7 @@ class RemoveTeamMemberS2CP(
override fun handle(connection: PlayConnection) {
- val team = connection.scoreboardManager.teams[name] ?: return
+ val team = connection.scoreboard.teams[name] ?: return
team.members -= members
for (member in members) {
@@ -46,7 +46,7 @@ class RemoveTeamMemberS2CP(
item.team = team
}
- connection.scoreboardManager.updateScoreTeams(team, members, true)
+ connection.scoreboard.updateScoreTeams(team, members, true)
connection.events.fire(TeamMemberRemoveEvent(connection, team, members))
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/RemoveTeamS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/RemoveTeamS2CP.kt
index 9c1c86127..6f8989516 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/RemoveTeamS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/RemoveTeamS2CP.kt
@@ -22,9 +22,9 @@ import de.bixilon.minosoft.util.logging.LogMessageType
class RemoveTeamS2CP(val name: String) : TeamsS2CP {
override fun handle(connection: PlayConnection) {
- val team = connection.scoreboardManager.teams.remove(name) ?: return
+ val team = connection.scoreboard.teams.remove(name) ?: return
- connection.scoreboardManager.updateScoreTeams(team, team.members, true)
+ connection.scoreboard.updateScoreTeams(team, team.members, true)
connection.events.fire(ScoreboardTeamRemoveEvent(connection, team))
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/UpdateTeamS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/UpdateTeamS2CP.kt
index d7ba83288..a57751716 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/UpdateTeamS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/scoreboard/teams/UpdateTeamS2CP.kt
@@ -94,7 +94,7 @@ class UpdateTeamS2CP(
override fun handle(connection: PlayConnection) {
- val team = connection.scoreboardManager.teams[name] ?: return
+ val team = connection.scoreboard.teams[name] ?: return
team.displayName = displayName
team.prefix = prefix
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/tab/TabListS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/tab/TabListS2CP.kt
index d6afe213f..c396d26d9 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/tab/TabListS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/tab/TabListS2CP.kt
@@ -77,7 +77,7 @@ class TabListS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
connection.tabList.uuid[uuid] = item
connection.tabList.name[name] = item
- for (team in connection.scoreboardManager.teams.toSynchronizedMap().values) {
+ for (team in connection.scoreboard.teams.toSynchronizedMap().values) {
if (team.members.contains(data.name)) {
item.team = team
break