package dev.celestialfox.spectrumsurvival.utils.classes; import net.kyori.adventure.text.Component; import net.minestom.server.entity.*; import net.minestom.server.entity.metadata.PlayerMeta; import net.minestom.server.network.packet.server.play.EntityMetaDataPacket; import net.minestom.server.network.packet.server.play.PlayerInfoRemovePacket; import net.minestom.server.network.packet.server.play.PlayerInfoUpdatePacket; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Map; @SuppressWarnings("UnstableApiUsage") public class NPC extends Entity { private final String username; private final String skinTexture; private final String skinSignature; public NPC(@NotNull String username, @Nullable String skinTexture, @Nullable String skinSignature) { super(EntityType.PLAYER); this.username = username; setCustomName(Component.text(username)); this.skinTexture = skinTexture; this.skinSignature = skinSignature; setNoGravity(true); } @Override public void updateNewViewer(@NotNull Player player) { var properties = new ArrayList(); if (skinTexture != null && skinSignature != null) { properties.add(new PlayerInfoUpdatePacket.Property("textures", skinTexture, skinSignature)); } var entry = new PlayerInfoUpdatePacket.Entry(getUuid(), username, properties, false, 0, GameMode.SURVIVAL, null, null); player.sendPacket(new PlayerInfoUpdatePacket(PlayerInfoUpdatePacket.Action.ADD_PLAYER, entry)); // Spawn the player entity super.updateNewViewer(player); setSkin(); player.sendPackets(new EntityMetaDataPacket(getEntityId(), Map.of(17, Metadata.Byte((byte) 127)))); } @Override public void updateOldViewer(@NotNull Player player) { super.updateOldViewer(player); player.sendPacket(new PlayerInfoRemovePacket(getUuid())); } public void setSkin() { PlayerMeta meta = (PlayerMeta) this.entityMeta; // Nice and pretty second layer meta.setNotifyAboutChanges(false); meta.setCapeEnabled(true); meta.setHatEnabled(true); meta.setJacketEnabled(true); meta.setLeftLegEnabled(true); meta.setRightLegEnabled(true); meta.setLeftSleeveEnabled(true); meta.setRightSleeveEnabled(true); meta.setNotifyAboutChanges(true); } }