potential feature for per-player hologram names

This commit is contained in:
Gatt
2020-07-16 18:14:23 +10:00
parent e909f28193
commit 4da537e978
33 changed files with 302 additions and 42 deletions
@@ -16,7 +16,8 @@ public enum MinecraftVersion {
V1_13_R1,
V1_13_R2,
V1_14_R1,
V1_15_R1;
V1_15_R1,
V1_16_R1;
public boolean isAboveOrEqual(MinecraftVersion compare) {
return ordinal() >= compare.ordinal();
@@ -49,6 +49,10 @@ public abstract class NPCBase implements NPC, NPCPacketHandler {
protected final Map<NPCSlot, ItemStack> items = new EnumMap<>(NPCSlot.class);
// Storage for per-player text;
protected final Map<UUID, List<String>> uniqueText = new HashMap<>();
protected final Map<UUID, Hologram> textDisplayHolograms = new HashMap<>();
public NPCBase(NPCLib instance, List<String> text) {
this.instance = instance;
this.text = text == null ? Collections.emptyList() : text;
@@ -60,6 +64,42 @@ public abstract class NPCBase implements NPC, NPCPacketHandler {
return instance;
}
@Override
public Hologram getPlayerHologram(Player player){
Hologram playerHologram = textDisplayHolograms.getOrDefault(player.getUniqueId(), null);
return playerHologram;
}
@Override
public NPC setPlayerLines(List<String> uniqueLines, Player targetPlayer) {
uniqueText.put(targetPlayer.getUniqueId(), uniqueLines);
return this;
}
@Override
public NPC setPlayerLines(List<String> uniqueLines, Player targetPlayer, boolean update) {
List<String> originalLines = getPlayerLines(targetPlayer);
setPlayerLines(uniqueLines, targetPlayer);
if (update){
if (originalLines.size() != uniqueLines.size()){ // recreate the entire hologram
Hologram originalhologram = getPlayerHologram(targetPlayer);
originalhologram.hide(targetPlayer); // essentially destroy the hologram
textDisplayHolograms.remove(targetPlayer.getUniqueId()); // remove the old obj
}
Hologram hologram = getPlayerHologram(targetPlayer); //
List<Object> updatePackets = hologram.getUpdatePackets(getPlayerLines(targetPlayer));
hologram.update(targetPlayer, updatePackets);
hologram.show(targetPlayer);
}
return this;
}
@Override
public List<String> getPlayerLines(Player targetPlayer) {
return uniqueText.getOrDefault(targetPlayer.getUniqueId(), text);
}
@Override
public UUID getUniqueId() {
return uuid;
@@ -303,11 +343,16 @@ public abstract class NPCBase implements NPC, NPCPacketHandler {
@Override
public NPC setText(List<String> text) {
List<Object> updatePackets = hologram.getUpdatePackets(text);
uniqueText.clear();
for (UUID shownUuid : shown) {
Player player = Bukkit.getPlayer(shownUuid);
if (player != null && isShown(player)) {
Hologram originalhologram = getPlayerHologram(player);
originalhologram.hide(player); // essentially destroy the hologram
textDisplayHolograms.remove(player.getUniqueId()); // remove the old obj
Hologram hologram = getPlayerHologram(player); // let it regenerate
List<Object> updatePackets = hologram.getUpdatePackets(getPlayerLines(player));
hologram.update(player, updatePackets);
}
}
@@ -15,6 +15,8 @@ interface NPCPacketHandler {
void createPackets();
void createPackets(Player player);
void sendShowPackets(Player player);
void sendHidePackets(Player player);