From 9acaf9ecc77827c1fc5e6f107508262e2aeb3ca7 Mon Sep 17 00:00:00 2001 From: youhavetrouble Date: Fri, 23 Jun 2023 19:30:51 +0200 Subject: [PATCH] it works \o/ --- .../notjustnameplates/NotJustNameplates.java | 4 +- .../nameplates/Nameplate.java | 38 ++++++++++++++++--- .../TeamManagementListener.java | 30 +++++++++++---- 3 files changed, 56 insertions(+), 16 deletions(-) rename src/main/java/me/youhavetrouble/notjustnameplates/{listeners => nameplates}/TeamManagementListener.java (69%) diff --git a/src/main/java/me/youhavetrouble/notjustnameplates/NotJustNameplates.java b/src/main/java/me/youhavetrouble/notjustnameplates/NotJustNameplates.java index 7eb50d3..edd0543 100644 --- a/src/main/java/me/youhavetrouble/notjustnameplates/NotJustNameplates.java +++ b/src/main/java/me/youhavetrouble/notjustnameplates/NotJustNameplates.java @@ -1,13 +1,13 @@ package me.youhavetrouble.notjustnameplates; -import me.youhavetrouble.notjustnameplates.listeners.TeamManagementListener; +import me.youhavetrouble.notjustnameplates.nameplates.TeamManagementListener; import org.bukkit.plugin.java.JavaPlugin; public final class NotJustNameplates extends JavaPlugin { @Override public void onEnable() { - getServer().getPluginManager().registerEvents(new TeamManagementListener(), this); + getServer().getPluginManager().registerEvents(new TeamManagementListener(this), this); } } diff --git a/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/Nameplate.java b/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/Nameplate.java index f1182dd..af1670c 100644 --- a/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/Nameplate.java +++ b/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/Nameplate.java @@ -3,12 +3,15 @@ package me.youhavetrouble.notjustnameplates.nameplates; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.entity.Display; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.TextDisplay; import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.util.Transformation; import org.jetbrains.annotations.NotNull; +import org.joml.AxisAngle4f; +import org.joml.Vector3f; import java.util.UUID; @@ -16,7 +19,7 @@ public class Nameplate { private Component name; private final UUID playerUuid; - private double heightOffset = 0.5; + private float heightOffset = 0.75f; private TextDisplay textDisplay; @@ -40,7 +43,18 @@ public class Nameplate { textDisplay.setInvulnerable(true); textDisplay.setPersistent(false); textDisplay.text(this.name); + textDisplay.setAlignment(TextDisplay.TextAlignment.CENTER); + textDisplay.setBillboard(Display.Billboard.CENTER); + textDisplay.setInvulnerable(true); + textDisplay.setTransformation( + new Transformation( + new Vector3f(0, heightOffset, 0), // offset + new AxisAngle4f(0, 0, 0, 0), // left rotation + new Vector3f(1, 1, 1), // scale + new AxisAngle4f(0, 0, 0, 0) // right rotation + )); }); + player.addPassenger(textDisplay); } /** @@ -63,7 +77,7 @@ public class Nameplate { /** * Set height offset from the player's eye location */ - public void setHeightOffset(double heightOffset) { + public void setHeightOffset(float heightOffset) { this.heightOffset = heightOffset; } @@ -76,10 +90,22 @@ public class Nameplate { /** * Update the nameplate position */ - public void updatePosition() { + public void update() { + Player player = Bukkit.getPlayer(playerUuid); + if (player == null) return; + if (player.isDead()) { + remove(); + return; + } createDisplayEntity(); - Location location = calculateCurrentLocation(); - this.textDisplay.teleportAsync(location, PlayerTeleportEvent.TeleportCause.PLUGIN); + if (!player.getPassengers().contains(textDisplay)) { + player.addPassenger(textDisplay); + } + } + + protected void remove() { + if (textDisplay == null || textDisplay.isDead()) return; + textDisplay.remove(); } } diff --git a/src/main/java/me/youhavetrouble/notjustnameplates/listeners/TeamManagementListener.java b/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/TeamManagementListener.java similarity index 69% rename from src/main/java/me/youhavetrouble/notjustnameplates/listeners/TeamManagementListener.java rename to src/main/java/me/youhavetrouble/notjustnameplates/nameplates/TeamManagementListener.java index 839019e..d46ba5c 100644 --- a/src/main/java/me/youhavetrouble/notjustnameplates/listeners/TeamManagementListener.java +++ b/src/main/java/me/youhavetrouble/notjustnameplates/nameplates/TeamManagementListener.java @@ -1,8 +1,11 @@ -package me.youhavetrouble.notjustnameplates.listeners; +package me.youhavetrouble.notjustnameplates.nameplates; +import me.youhavetrouble.notjustnameplates.NotJustNameplates; import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Scoreboard; +import net.minecraft.world.scores.Team; +import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -10,25 +13,28 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; import org.jetbrains.annotations.NotNull; -import java.util.HashSet; +import java.util.HashMap; public class TeamManagementListener implements Listener { private final Scoreboard scoreboard = new Scoreboard(); private final PlayerTeam team = new PlayerTeam(scoreboard, "notjustnameplates"); - private final HashSet players = new HashSet<>(); + private final HashMap players = new HashMap<>(); - public TeamManagementListener() { + public TeamManagementListener(NotJustNameplates plugin) { team.setNameTagVisibility(PlayerTeam.Visibility.NEVER); + team.setCollisionRule(PlayerTeam.CollisionRule.ALWAYS); + Bukkit.getScheduler().runTaskTimer(plugin, () -> players.values().forEach(Nameplate::update), 0, 1); } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onPlayerJoin(PlayerJoinEvent event) { Player joiner = event.getPlayer(); + players.put(joiner.getName(), new Nameplate(joiner.getUniqueId(), joiner.displayName())); for (Player player : event.getPlayer().getServer().getOnlinePlayers()) { - if (player.equals(joiner)) continue; addPlayerToTeam(joiner, player); } sendTeamMembers(joiner); @@ -37,14 +43,23 @@ public class TeamManagementListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onPlayerQuit(PlayerQuitEvent event) { Player leaver = event.getPlayer(); + Nameplate nameplate = players.get(leaver.getName()); + nameplate.remove(); + players.remove(leaver.getName()); for (Player player : event.getPlayer().getServer().getOnlinePlayers()) { removePlayerFromTeam(leaver, player); } } + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onPlayerTeleport(PlayerTeleportEvent event) { + Nameplate nameplate = players.get(event.getPlayer().getName()); + if (nameplate == null) return; + nameplate.remove(); + } + private void addPlayerToTeam(@NotNull Player player, @NotNull Player target) { CraftPlayer craftPlayer = (CraftPlayer) target; - players.add(player.getName()); ClientboundSetPlayerTeamPacket teamCreatePacket = ClientboundSetPlayerTeamPacket .createAddOrModifyPacket(team, true); craftPlayer.getHandle().connection.send(teamCreatePacket); @@ -57,13 +72,12 @@ public class TeamManagementListener implements Listener { ClientboundSetPlayerTeamPacket packet = ClientboundSetPlayerTeamPacket .createPlayerPacket(team, player.getName(), ClientboundSetPlayerTeamPacket.Action.REMOVE); CraftPlayer craftPlayer = (CraftPlayer) target; - players.remove(player.getName()); craftPlayer.getHandle().connection.send(packet); } private void sendTeamMembers(@NotNull Player target) { ClientboundSetPlayerTeamPacket packet = ClientboundSetPlayerTeamPacket - .createMultiplePlayerPacket(team, players, ClientboundSetPlayerTeamPacket.Action.ADD); + .createMultiplePlayerPacket(team, players.keySet(), ClientboundSetPlayerTeamPacket.Action.ADD); CraftPlayer craftPlayer = (CraftPlayer) target; craftPlayer.getHandle().connection.send(packet); }