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