PerPlayerHologram.java (2063B)
1 package me.night.nullvalkyrie.entities.holograms; 2 3 import me.night.nullvalkyrie.packets.protocol.PacketPlayOutEntityMetadata; 4 import me.night.nullvalkyrie.packets.protocol.PacketPlayOutSpawnEntity; 5 import net.minecraft.network.chat.Component; 6 import net.minecraft.network.syncher.EntityDataAccessor; 7 import net.minecraft.network.syncher.EntityDataSerializers; 8 import net.minecraft.network.syncher.SynchedEntityData; 9 import net.minecraft.server.level.ServerPlayer; 10 import net.minecraft.world.entity.decoration.ArmorStand; 11 import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; 12 import org.bukkit.entity.Player; 13 14 import java.util.HashMap; 15 import java.util.Optional; 16 17 public class PerPlayerHologram { 18 public static HashMap<Integer, ArmorStand[]> holograms = new HashMap<>(); 19 20 public PerPlayerHologram(Player player, String[] lines) { 21 spawnLine(player, lines); 22 } 23 24 private void spawnLine(Player player, String[] lines) { 25 double c = (lines.length) * 0.3 - 0.8; 26 ArmorStand[] stands = new ArmorStand[lines.length]; 27 for (int i = 0; i < lines.length; i++) { 28 ServerPlayer p = ((CraftPlayer) player).getHandle(); 29 ArmorStand stand = new ArmorStand(p.getLevel(), player.getLocation().getX(), player.getLocation().getY() + c, player.getLocation().getZ()); 30 stand.setInvisible(true); 31 new PacketPlayOutSpawnEntity(player, stand); 32 stands[i] = stand; 33 SynchedEntityData watcher = stand.getEntityData(); 34 watcher.set(new EntityDataAccessor<>(2, EntityDataSerializers.OPTIONAL_COMPONENT), Optional.of(Component.nullToEmpty(lines[i]))); 35 watcher.set(new EntityDataAccessor<>(3, EntityDataSerializers.BOOLEAN), true); 36 new PacketPlayOutEntityMetadata(player, stand, watcher); 37 c -= 0.3; 38 if (lines.length == i + 1) 39 holograms.put(stand.getBukkitEntity().getEntityId(), stands); 40 } 41 } 42 43 public static HashMap<Integer, ArmorStand[]> getHolograms() { 44 return holograms; 45 } 46 }