it works \o/

This commit is contained in:
2023-06-23 19:30:51 +02:00
parent 35c6176035
commit 9acaf9ecc7
3 changed files with 56 additions and 16 deletions
@@ -1,13 +1,13 @@
package me.youhavetrouble.notjustnameplates; package me.youhavetrouble.notjustnameplates;
import me.youhavetrouble.notjustnameplates.listeners.TeamManagementListener; import me.youhavetrouble.notjustnameplates.nameplates.TeamManagementListener;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
public final class NotJustNameplates extends JavaPlugin { public final class NotJustNameplates extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
getServer().getPluginManager().registerEvents(new TeamManagementListener(), this); getServer().getPluginManager().registerEvents(new TeamManagementListener(this), this);
} }
} }
@@ -3,12 +3,15 @@ package me.youhavetrouble.notjustnameplates.nameplates;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Display;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.TextDisplay; import org.bukkit.entity.TextDisplay;
import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.util.Transformation;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.joml.AxisAngle4f;
import org.joml.Vector3f;
import java.util.UUID; import java.util.UUID;
@@ -16,7 +19,7 @@ public class Nameplate {
private Component name; private Component name;
private final UUID playerUuid; private final UUID playerUuid;
private double heightOffset = 0.5; private float heightOffset = 0.75f;
private TextDisplay textDisplay; private TextDisplay textDisplay;
@@ -40,7 +43,18 @@ public class Nameplate {
textDisplay.setInvulnerable(true); textDisplay.setInvulnerable(true);
textDisplay.setPersistent(false); textDisplay.setPersistent(false);
textDisplay.text(this.name); 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 * Set height offset from the player's eye location
*/ */
public void setHeightOffset(double heightOffset) { public void setHeightOffset(float heightOffset) {
this.heightOffset = heightOffset; this.heightOffset = heightOffset;
} }
@@ -76,10 +90,22 @@ public class Nameplate {
/** /**
* Update the nameplate position * 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(); createDisplayEntity();
Location location = calculateCurrentLocation(); if (!player.getPassengers().contains(textDisplay)) {
this.textDisplay.teleportAsync(location, PlayerTeleportEvent.TeleportCause.PLUGIN); player.addPassenger(textDisplay);
}
}
protected void remove() {
if (textDisplay == null || textDisplay.isDead()) return;
textDisplay.remove();
} }
} }
@@ -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.network.protocol.game.ClientboundSetPlayerTeamPacket;
import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.PlayerTeam;
import net.minecraft.world.scores.Scoreboard; 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.craftbukkit.v1_20_R1.entity.CraftPlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@@ -10,25 +13,28 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.HashSet; import java.util.HashMap;
public class TeamManagementListener implements Listener { public class TeamManagementListener implements Listener {
private final Scoreboard scoreboard = new Scoreboard(); private final Scoreboard scoreboard = new Scoreboard();
private final PlayerTeam team = new PlayerTeam(scoreboard, "notjustnameplates"); private final PlayerTeam team = new PlayerTeam(scoreboard, "notjustnameplates");
private final HashSet<String> players = new HashSet<>(); private final HashMap<String, Nameplate> players = new HashMap<>();
public TeamManagementListener() { public TeamManagementListener(NotJustNameplates plugin) {
team.setNameTagVisibility(PlayerTeam.Visibility.NEVER); 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) @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
Player joiner = event.getPlayer(); Player joiner = event.getPlayer();
players.put(joiner.getName(), new Nameplate(joiner.getUniqueId(), joiner.displayName()));
for (Player player : event.getPlayer().getServer().getOnlinePlayers()) { for (Player player : event.getPlayer().getServer().getOnlinePlayers()) {
if (player.equals(joiner)) continue;
addPlayerToTeam(joiner, player); addPlayerToTeam(joiner, player);
} }
sendTeamMembers(joiner); sendTeamMembers(joiner);
@@ -37,14 +43,23 @@ public class TeamManagementListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerQuit(PlayerQuitEvent event) { public void onPlayerQuit(PlayerQuitEvent event) {
Player leaver = event.getPlayer(); Player leaver = event.getPlayer();
Nameplate nameplate = players.get(leaver.getName());
nameplate.remove();
players.remove(leaver.getName());
for (Player player : event.getPlayer().getServer().getOnlinePlayers()) { for (Player player : event.getPlayer().getServer().getOnlinePlayers()) {
removePlayerFromTeam(leaver, player); 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) { private void addPlayerToTeam(@NotNull Player player, @NotNull Player target) {
CraftPlayer craftPlayer = (CraftPlayer) target; CraftPlayer craftPlayer = (CraftPlayer) target;
players.add(player.getName());
ClientboundSetPlayerTeamPacket teamCreatePacket = ClientboundSetPlayerTeamPacket ClientboundSetPlayerTeamPacket teamCreatePacket = ClientboundSetPlayerTeamPacket
.createAddOrModifyPacket(team, true); .createAddOrModifyPacket(team, true);
craftPlayer.getHandle().connection.send(teamCreatePacket); craftPlayer.getHandle().connection.send(teamCreatePacket);
@@ -57,13 +72,12 @@ public class TeamManagementListener implements Listener {
ClientboundSetPlayerTeamPacket packet = ClientboundSetPlayerTeamPacket ClientboundSetPlayerTeamPacket packet = ClientboundSetPlayerTeamPacket
.createPlayerPacket(team, player.getName(), ClientboundSetPlayerTeamPacket.Action.REMOVE); .createPlayerPacket(team, player.getName(), ClientboundSetPlayerTeamPacket.Action.REMOVE);
CraftPlayer craftPlayer = (CraftPlayer) target; CraftPlayer craftPlayer = (CraftPlayer) target;
players.remove(player.getName());
craftPlayer.getHandle().connection.send(packet); craftPlayer.getHandle().connection.send(packet);
} }
private void sendTeamMembers(@NotNull Player target) { private void sendTeamMembers(@NotNull Player target) {
ClientboundSetPlayerTeamPacket packet = ClientboundSetPlayerTeamPacket ClientboundSetPlayerTeamPacket packet = ClientboundSetPlayerTeamPacket
.createMultiplePlayerPacket(team, players, ClientboundSetPlayerTeamPacket.Action.ADD); .createMultiplePlayerPacket(team, players.keySet(), ClientboundSetPlayerTeamPacket.Action.ADD);
CraftPlayer craftPlayer = (CraftPlayer) target; CraftPlayer craftPlayer = (CraftPlayer) target;
craftPlayer.getHandle().connection.send(packet); craftPlayer.getHandle().connection.send(packet);
} }