9
0
mirror of https://github.com/Xiao-MoMi/Custom-Nameplates.git synced 2025-12-30 12:19:12 +00:00
This commit is contained in:
XiaoMoMi
2023-10-26 21:15:41 +08:00
parent 495c313266
commit 0d12fc116a
32 changed files with 250 additions and 105 deletions

View File

@@ -20,9 +20,9 @@ package net.momirealms.customnameplates.bungeecord;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import me.neznamy.tab.api.TabAPI;
import me.neznamy.tab.api.TabPlayer;
import me.neznamy.tab.api.tablist.SortingManager;
import me.neznamy.tab.shared.TAB;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.api.plugin.Listener;
@@ -37,7 +37,7 @@ public class BungeeEventListener implements Listener {
public BungeeEventListener (CustomNameplatesBC plugin) {
this.plugin = plugin;
this.sortingManager = TAB.getInstance().getSortingManager();
this.sortingManager = TabAPI.getInstance().getSortingManager();
}
@EventHandler
@@ -56,7 +56,7 @@ public class BungeeEventListener implements Listener {
String playerName = dataInput.readUTF();
String teamName = playerName;
if (plugin.getBungeeConfig().isTab()) {
TabPlayer tabPlayer = TAB.getInstance().getPlayer(playerName);
TabPlayer tabPlayer = TabAPI.getInstance().getPlayer(playerName);
if (tabPlayer == null) return;
teamName = sortingManager.getOriginalTeamName(tabPlayer);
}

View File

@@ -32,6 +32,7 @@ import java.net.URLConnection;
public class VersionHelper {
private boolean isNewerThan1_19_R2;
private boolean isNewerThan1_20_R2;
private boolean isNewerThan1_19;
private boolean isNewerThan1_20;
private String serverVersion;
@@ -40,10 +41,12 @@ public class VersionHelper {
private boolean isLatest;
private final int pack_format;
private boolean isFolia;
private boolean hasGeyser;
public VersionHelper(CustomNameplates plugin) {
this.plugin = plugin;
this.pluginVersion = plugin.getDescription().getVersion();
this.hasGeyser = Bukkit.getPluginManager().getPlugin("Geyser-Spigot") != null;
this.initialize();
this.pack_format = getPack_format(serverVersion);
try {
@@ -59,11 +62,18 @@ public class VersionHelper {
this.serverVersion = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
String[] split = serverVersion.split("_");
int main_ver = Integer.parseInt(split[1]);
if (main_ver >= 20) isNewerThan1_19_R2 = true;
else if (main_ver == 19) isNewerThan1_19_R2 = Integer.parseInt(split[2].substring(1)) >= 2;
else isNewerThan1_19_R2 = false;
isNewerThan1_19 = main_ver >= 19;
isNewerThan1_20 = main_ver >= 20;
if (main_ver >= 20) {
isNewerThan1_20 = true;
isNewerThan1_19_R2 = true;
isNewerThan1_19 = true;
isNewerThan1_20_R2 = Integer.parseInt(split[2].substring(1)) >= 2;
} else if (main_ver == 19) {
isNewerThan1_19_R2 = Integer.parseInt(split[2].substring(1)) >= 2;
isNewerThan1_19 = true;
} else {
isNewerThan1_19_R2 = false;
isNewerThan1_19 = false;
}
}
}
@@ -79,13 +89,17 @@ public class VersionHelper {
return isNewerThan1_20;
}
public boolean isVersionNewerThan1_20_R2() {
return isNewerThan1_20_R2;
}
public void checkUpdate() {
plugin.getScheduler().runTaskAsync(() -> {
try {
URL url = new URL("https://api.polymart.org/v1/getResourceInfoSimple/?resource_id=2543&key=version");
URLConnection conn = url.openConnection();
conn.setConnectTimeout(10000);
conn.setReadTimeout(60000);
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
InputStream inputStream = conn.getInputStream();
String newest = new BufferedReader(new InputStreamReader(inputStream)).readLine();
String current = plugin.getDescription().getVersion();
@@ -202,4 +216,8 @@ public class VersionHelper {
public boolean isFolia() {
return isFolia;
}
public boolean isGeyser() {
return hasGeyser;
}
}

View File

@@ -26,9 +26,9 @@ public class MagicCosmeticsListener implements Listener {
final Cosmetic cosmetic = event.getNewCosmetic();
final Player player = event.getPlayer();
if (cosmetic instanceof Hat hat) {
NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player);
if (asm != null) {
asm.setHatOffset(hat.getOffSetY());
NamedEntityManager nem = namedEntityCarrier.getNamedEntityManager(player);
if (nem != null) {
nem.setHatOffset(hat.getOffSetY());
}
}
}
@@ -38,9 +38,9 @@ public class MagicCosmeticsListener implements Listener {
final Cosmetic cosmetic = event.getCosmetic();
final Player player = event.getPlayer();
if (cosmetic instanceof Hat hat) {
NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player);
if (asm != null) {
asm.setHatOffset(hat.getOffSetY());
NamedEntityManager nem = namedEntityCarrier.getNamedEntityManager(player);
if (nem != null) {
nem.setHatOffset(hat.getOffSetY());
}
}
}
@@ -49,9 +49,9 @@ public class MagicCosmeticsListener implements Listener {
public void onUnEquip(CosmeticUnEquipEvent event) {
final Player player = event.getPlayer();
if (event.getCosmeticType() == CosmeticType.HAT) {
NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player);
if (asm != null) {
asm.setHatOffset(0);
NamedEntityManager nem = namedEntityCarrier.getNamedEntityManager(player);
if (nem != null) {
nem.setHatOffset(0);
}
}
}
@@ -60,9 +60,9 @@ public class MagicCosmeticsListener implements Listener {
public void onDataLoaded(PlayerDataLoadEvent event) {
for (Cosmetic cosmetic : event.getEquippedCosmetics()) {
if (cosmetic instanceof Hat hat) {
NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(event.getPlayerData().getOfflinePlayer().getPlayer());
if (asm != null) {
asm.setHatOffset(hat.getOffSetY());
NamedEntityManager nem = namedEntityCarrier.getNamedEntityManager(event.getPlayerData().getOfflinePlayer().getPlayer());
if (nem != null) {
nem.setHatOffset(hat.getOffSetY());
}
}
}

View File

@@ -36,6 +36,12 @@ public class EntityLookListener extends PacketAdapter {
public void onPacketSending(PacketEvent event) {
PacketContainer packet = event.getPacket();
handler.onEntityMove(event.getPlayer(), packet.getIntegers().read(0));
handler.onEntityMove(event.getPlayer(),
packet.getIntegers().read(0),
packet.getShorts().read(0),
packet.getShorts().read(1),
packet.getShorts().read(2),
packet.getBooleans().read(0)
);
}
}

View File

@@ -36,6 +36,12 @@ public class EntityMoveListener extends PacketAdapter {
public void onPacketSending(PacketEvent event) {
PacketContainer packet = event.getPacket();
handler.onEntityMove(event.getPlayer(), packet.getIntegers().read(0));
handler.onEntityMove(event.getPlayer(),
packet.getIntegers().read(0),
packet.getShorts().read(0),
packet.getShorts().read(1),
packet.getShorts().read(2),
packet.getBooleans().read(0)
);
}
}

View File

@@ -29,11 +29,11 @@ public class EntitySpawnListener extends PacketAdapter {
private final AbstractPacketsHandler handler;
public EntitySpawnListener(AbstractPacketsHandler handler) {
super(CustomNameplates.getInstance(), ListenerPriority.HIGHEST, PacketType.Play.Server.NAMED_ENTITY_SPAWN);
super(CustomNameplates.getInstance(), ListenerPriority.HIGHEST, CustomNameplates.getInstance().getVersionHelper().isVersionNewerThan1_20_R2() ? PacketType.Play.Server.SPAWN_ENTITY : PacketType.Play.Server.NAMED_ENTITY_SPAWN);
this.handler = handler;
}
public synchronized void onPacketSending(PacketEvent event) {
handler.onEntitySpawn(event.getPlayer(), event.getPacket().getIntegers().read(0));
handler.onEntitySpawn(event.getPlayer(), event.getPacket().getIntegers().read(0), event);
}
}

View File

@@ -36,6 +36,6 @@ public class EntityTeleportListener extends PacketAdapter {
public void onPacketSending(PacketEvent event) {
PacketContainer packet = event.getPacket();
handler.onEntityMove(event.getPlayer(), packet.getIntegers().read(0));
handler.onEntityTeleport(event.getPlayer(), packet.getIntegers().read(0));
}
}

View File

@@ -35,6 +35,7 @@ import net.momirealms.customnameplates.object.actionbar.ActionBarConfig;
import net.momirealms.customnameplates.object.actionbar.ActionBarTask;
import net.momirealms.customnameplates.utils.AdventureUtils;
import net.momirealms.customnameplates.utils.ConfigUtils;
import net.momirealms.customnameplates.utils.GeyserUtils;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -97,6 +98,8 @@ public class ActionBarManager extends Function {
@Override
public void onJoin(Player player) {
if (ConfigManager.disableForBedrock && plugin.getVersionHelper().isGeyser() && GeyserUtils.isBedrockPlayer(player.getUniqueId()))
return;
ActionBarTask actionBarTask = new ActionBarTask(player, actionBarConfigMap.values().toArray(new ActionBarConfig[0]));
actionBarTaskMap.put(player.getUniqueId(), actionBarTask);
actionBarTask.start();
@@ -134,6 +137,7 @@ public class ActionBarManager extends Function {
ActionBarTask actionBarTask = getActionBarTask(event.getPlayer().getUniqueId());
if (actionBarTask != null) {
String strJson = wrappedChatComponent.getJson();
// for better performance
if (strJson.endsWith("\"objective\":\"actionbar\"}}")) {
return;
}

View File

@@ -25,6 +25,7 @@ import net.momirealms.customnameplates.object.bossbar.BossBarTask;
import net.momirealms.customnameplates.object.bossbar.Overlay;
import net.momirealms.customnameplates.utils.AdventureUtils;
import net.momirealms.customnameplates.utils.ConfigUtils;
import net.momirealms.customnameplates.utils.GeyserUtils;
import org.bukkit.Bukkit;
import org.bukkit.boss.BarColor;
import org.bukkit.configuration.ConfigurationSection;
@@ -72,6 +73,8 @@ public class BossBarManager extends Function {
}
public void onJoin(Player player) {
if (ConfigManager.disableForBedrock && plugin.getVersionHelper().isGeyser() && GeyserUtils.isBedrockPlayer(player.getUniqueId()))
return;
BossBarTask bossBarTask = new BossBarTask(player, bossBars.values().toArray(new BossBarConfig[0]));
bossBarTaskMap.put(player.getUniqueId(), bossBarTask);
bossBarTask.start();

View File

@@ -289,22 +289,22 @@ public class ChatBubblesManager extends Function {
String finalStr = ConfigManager.surroundWithFont(bubbleImage) + bubbleConfig.startFormat() + parsedPrefix + text + parsedSuffix + bubbleConfig.endFormat() + ConfigManager.surroundWithFont(suffixImage);
json = GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(finalStr));
}
NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player);
if (asm != null) {
NamedEntityManager nem = namedEntityCarrier.getNamedEntityManager(player);
if (nem != null) {
double offset = yOffset;
DisplayMode nameplateMode = plugin.getNameplateManager().getMode();
if (nameplateMode == DisplayMode.ARMOR_STAND || nameplateMode == DisplayMode.TEXT_DISPLAY) {
NamedEntityCarrier carrier = (NamedEntityCarrier) plugin.getNameplateManager().getTextCarrier();
NamedEntityManager nem = carrier.getNamedEntityManager(player);
if (nem != null) {
offset += nem.getHighestTextHeight();
NamedEntityManager nameplatesNem = carrier.getNamedEntityManager(player);
if (nameplatesNem != null) {
offset += nameplatesNem.getHighestTextHeight();
}
}
UUID uuid = UUID.randomUUID();
asm.ascent(lineSpace);
asm.addNamedEntity(uuid, new NamedEntityImpl(asm, player, json, offset, textDisplayMeta));
plugin.getScheduler().runTaskAsyncLater(() -> asm.removeArmorStand(uuid), stayTime * 20L);
nem.ascent(lineSpace);
nem.addNamedEntity(uuid, new NamedEntityImpl(nem, player, json, offset, textDisplayMeta));
plugin.getScheduler().runTaskAsyncLater(() -> nem.removeArmorStand(uuid), stayTime * 20L);
}
}

View File

@@ -60,6 +60,7 @@ public class ConfigManager extends Function {
public static boolean hideScoreboardNumber;
public static boolean iaShaderSupport;
public static boolean generatePackOnStart;
public static boolean disableForBedrock;
@Override
public void load(){
@@ -124,7 +125,7 @@ public class ConfigManager extends Function {
ConfigurationSection section = config.getConfigurationSection("other-settings");
if (section != null) {
default_width = section.getInt("default-character-width", 8);
disableForBedrock = section.getBoolean("disable-for-bedrock-players", false);
}
if (enableNameplates) {
YamlConfiguration np_config = ConfigUtils.getConfig("configs" + File.separator + "nameplate.yml");

View File

@@ -234,14 +234,14 @@ public class NameplateManager extends Function {
public void showPlayerArmorStandTags(Player player) {
NamedEntityCarrier namedEntityCarrier = (NamedEntityCarrier) this.getTextCarrier();
NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player);
asm.spawn(player);
NamedEntityManager nem = namedEntityCarrier.getNamedEntityManager(player);
nem.spawn(player);
for (int i = 1; i <= this.getPreview_time() * 20; i++) {
plugin.getScheduler().runTaskAsyncLater(()-> {
asm.teleport(player);
nem.teleport(player);
}, i);
}
plugin.getScheduler().runTaskAsyncLater(()-> asm.destroy(player), this.getPreview_time() * 20);
plugin.getScheduler().runTaskAsyncLater(()-> nem.destroy(player), this.getPreview_time() * 20);
}
public void showPlayerArmorStandTags(Player player, String nameplate) {

View File

@@ -17,6 +17,7 @@
package net.momirealms.customnameplates.object.carrier;
import com.comphenix.protocol.events.PacketEvent;
import net.momirealms.customnameplates.object.Function;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -50,10 +51,10 @@ public abstract class AbstractPacketsHandler extends Function {
entityIdMap.remove(player.getEntityId());
}
public void onEntityMove(Player receiver, int entityId) {
public void onEntityMove(Player receiver, int entityId, short x, short y, short z, boolean onGround) {
}
public void onEntitySpawn(Player receiver, int entityId) {
public void onEntitySpawn(Player receiver, int entityId, PacketEvent event) {
}
public void onEntityDestroy(Player receiver, List<Integer> entities) {
@@ -62,6 +63,9 @@ public abstract class AbstractPacketsHandler extends Function {
public void onEntityDestroy(Player receiver, int entity) {
}
public void onEntityTeleport(Player player, int entityId) {
}
public Player getPlayerFromMap(int entityID) {
return entityIdMap.get(entityID);
}

View File

@@ -34,4 +34,6 @@ public interface NamedEntity {
DynamicText getDynamicText();
int getEntityId();
void move(Player viewer, short x, short y, short z, boolean onGround);
}

View File

@@ -65,8 +65,8 @@ public class NamedEntityCarrier extends AbstractTextCarrier {
public void unload(){
super.unload();
handler.unload();
for (NamedEntityManager asm : namedEntityManagerMap.values()) {
asm.destroy();
for (NamedEntityManager nem : namedEntityManagerMap.values()) {
nem.destroy();
}
namedEntityManagerMap.clear();
HandlerList.unregisterAll(entityTagListener);
@@ -87,9 +87,12 @@ public class NamedEntityCarrier extends AbstractTextCarrier {
@Override
public void onQuit(Player player) {
handler.onQuit(player);
NamedEntityManager asm = namedEntityManagerMap.remove(player);
if (asm != null) {
asm.destroy();
NamedEntityManager nem = namedEntityManagerMap.remove(player);
if (nem != null) {
nem.destroy();
}
for (NamedEntityManager all : namedEntityManagerMap.values()) {
all.unregisterPlayer(player);
}
}
@@ -104,12 +107,14 @@ public class NamedEntityCarrier extends AbstractTextCarrier {
}
public NamedEntityManager createNamedEntityManager(Player player) {
NamedEntityManager asm = new NamedEntityManager(this, player);
namedEntityManagerMap.put(player, asm);
return asm;
NamedEntityManager nem = new NamedEntityManager(this, player);
namedEntityManagerMap.put(player, nem);
return nem;
}
public void onSneak(Player player, boolean isSneaking) {
if (player.isFlying())
return;
NamedEntityManager nem = getNamedEntityManager(player);
if (nem != null) {
nem.setSneak(isSneaking, true);
@@ -123,8 +128,8 @@ public class NamedEntityCarrier extends AbstractTextCarrier {
@Override
public void arrangeRefreshTask() {
refreshTask = plugin.getScheduler().runTaskAsyncTimer(() -> {
for (NamedEntityManager asm : namedEntityManagerMap.values()) {
asm.refresh(false);
for (NamedEntityManager nem : namedEntityManagerMap.values()) {
nem.refresh(false);
}
}, 1, 1);
}
@@ -136,8 +141,8 @@ public class NamedEntityCarrier extends AbstractTextCarrier {
protected void spawnNamedEntity(Player viewer, Player target) {
if (target == viewer || target.getGameMode() == GameMode.SPECTATOR || viewer.getWorld() != target.getWorld()) return;
if (getDistance(target, viewer) < 48 && viewer.canSee(target)) {
NamedEntityManager asm = getNamedEntityManager(target);
asm.spawn(viewer);
NamedEntityManager nem = getNamedEntityManager(target);
nem.spawn(viewer);
}
}

View File

@@ -39,7 +39,7 @@ import java.util.*;
public class NamedEntityImpl implements NamedEntity {
private final NamedEntityManager asm;
private final NamedEntityManager nem;
private final Player owner;
private double yOffset;
private final int entityId;
@@ -52,8 +52,8 @@ public class NamedEntityImpl implements NamedEntity {
private final TextDisplayMeta textDisplayMeta;
//dynamic value
public NamedEntityImpl(NamedEntityManager asm, Player owner, DynamicText text, double yOffset, @NotNull Requirement[] requirements, @Nullable TextDisplayMeta textDisplayMeta) {
this.asm = asm;
public NamedEntityImpl(NamedEntityManager nem, Player owner, DynamicText text, double yOffset, @NotNull Requirement[] requirements, @Nullable TextDisplayMeta textDisplayMeta) {
this.nem = nem;
this.entityId = new Random().nextInt(Integer.MAX_VALUE);
this.owner = owner;
this.yOffset = yOffset;
@@ -66,8 +66,8 @@ public class NamedEntityImpl implements NamedEntity {
}
//constant value
public NamedEntityImpl(NamedEntityManager asm, Player owner, String textJson, double yOffset, @Nullable TextDisplayMeta textDisplayMeta) {
this.asm = asm;
public NamedEntityImpl(NamedEntityManager nem, Player owner, String textJson, double yOffset, @Nullable TextDisplayMeta textDisplayMeta) {
this.nem = nem;
this.entityId = new Random().nextInt(Integer.MAX_VALUE);
this.owner = owner;
this.yOffset = yOffset;
@@ -105,7 +105,7 @@ public class NamedEntityImpl implements NamedEntity {
public void setOffset(double offset) {
if (yOffset == offset) return;
yOffset = offset;
for (Player all : asm.getNearbyPlayers()) {
for (Player all : nem.getNearbyPlayers()) {
CustomNameplates.getProtocolManager().sendServerPacket(all, getTeleportPacket());
}
}
@@ -119,7 +119,7 @@ public class NamedEntityImpl implements NamedEntity {
@Override
public void spawn() {
for (Player all : asm.getNearbyPlayers()) {
for (Player all : nem.getNearbyPlayers()) {
spawn(all);
}
isShown = true;
@@ -129,7 +129,7 @@ public class NamedEntityImpl implements NamedEntity {
public void destroy() {
PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY);
destroyPacket.getIntLists().write(0, List.of(entityId));
for (Player all : asm.getNearbyPlayers()) {
for (Player all : nem.getNearbyPlayers()) {
CustomNameplates.getProtocolManager().sendServerPacket(all, destroyPacket);
}
isShown = false;
@@ -145,15 +145,15 @@ public class NamedEntityImpl implements NamedEntity {
@Override
public void teleport() {
PacketContainer packet = getTeleportPacket();
for (Player all : asm.getNearbyPlayers()) {
for (Player all : nem.getNearbyPlayers()) {
CustomNameplates.getProtocolManager().sendServerPacket(all, packet);
}
}
@Override
public void teleport(Player viewer) {
if (!asm.isNearby(viewer) && viewer != owner) {
asm.spawn(viewer);
if (!nem.isNearby(viewer) && viewer != owner) {
nem.spawn(viewer);
} else {
CustomNameplates.getProtocolManager().sendServerPacket(viewer, getTeleportPacket());
}
@@ -163,7 +163,7 @@ public class NamedEntityImpl implements NamedEntity {
public void setSneak(boolean isSneaking, boolean respawn) {
this.sneaking = isSneaking;
if (respawn) {
for (Player viewer : asm.getNearbyPlayers()) {
for (Player viewer : nem.getNearbyPlayers()) {
respawn(viewer);
}
} else {
@@ -186,12 +186,30 @@ public class NamedEntityImpl implements NamedEntity {
return entityId;
}
@Override
public void move(Player viewer, short x, short y, short z, boolean onGround) {
PacketContainer packet = getMovePacket(x, y, z, onGround);
for (Player all : nem.getNearbyPlayers()) {
CustomNameplates.getProtocolManager().sendServerPacket(all, packet);
}
}
@Override
public void respawn(Player viewer) {
destroy(viewer);
spawn(viewer);
}
public PacketContainer getMovePacket(short x, short y, short z, boolean onGround) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE);
packet.getIntegers().write(0, entityId);
packet.getShorts().write(0, x);
packet.getShorts().write(1, y);
packet.getShorts().write(2, z);
packet.getBooleans().write(0, onGround);
return packet;
}
public PacketContainer getTeleportPacket() {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT);
packet.getIntegers().write(0, entityId);
@@ -204,7 +222,7 @@ public class NamedEntityImpl implements NamedEntity {
public void updateMetadata() {
PacketContainer metaPacket = getMetaPacket();
for (Player viewer : asm.getNearbyPlayers()) {
for (Player viewer : nem.getNearbyPlayers()) {
CustomNameplates.getProtocolManager().sendServerPacket(viewer, metaPacket);
}
}
@@ -214,7 +232,7 @@ public class NamedEntityImpl implements NamedEntity {
metaPacket.getIntegers().write(0, entityId);
if (CustomNameplates.getInstance().getVersionHelper().isVersionNewerThan1_19_R2()) {
WrappedDataWatcher wrappedDataWatcher =
asm.getDisplayMode() == DisplayMode.ARMOR_STAND ?
nem.getDisplayMode() == DisplayMode.ARMOR_STAND ?
createArmorStandDataWatcher(textJson) : createTextDisplayDataWatcher(textJson, textDisplayMeta);
List<WrappedDataValue> wrappedDataValueList = Lists.newArrayList();
wrappedDataWatcher.getWatchableObjects().stream().filter(Objects::nonNull).forEach(entry -> wrappedDataValueList.add(new WrappedDataValue(entry.getWatcherObject().getIndex(), entry.getWatcherObject().getSerializer(), entry.getRawValue())));
@@ -234,7 +252,7 @@ public class NamedEntityImpl implements NamedEntity {
else y += 1.8;
}
else y += 0.2;
y += asm.getHatOffset();
y += nem.getHatOffset();
return new Location(null, x, y, z);
}
@@ -299,7 +317,7 @@ public class NamedEntityImpl implements NamedEntity {
PacketContainer entityPacket = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY);
entityPacket.getModifier().write(0, entityId);
entityPacket.getModifier().write(1, uuid);
entityPacket.getEntityTypeModifier().write(0, asm.getDisplayMode() == DisplayMode.ARMOR_STAND ? EntityType.ARMOR_STAND : EntityType.TEXT_DISPLAY);
entityPacket.getEntityTypeModifier().write(0, nem.getDisplayMode() == DisplayMode.ARMOR_STAND ? EntityType.ARMOR_STAND : EntityType.TEXT_DISPLAY);
Location location = getEntityLocation();
entityPacket.getDoubles().write(0, location.getX());
entityPacket.getDoubles().write(1, location.getY());

View File

@@ -17,23 +17,24 @@
package net.momirealms.customnameplates.object.carrier;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer;
import net.momirealms.customnameplates.CustomNameplates;
import net.momirealms.customnameplates.object.ConditionalText;
import net.momirealms.customnameplates.object.DisplayMode;
import net.momirealms.customnameplates.object.DynamicText;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.Vector;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class NamedEntityManager {
private final ConcurrentHashMap<UUID, NamedEntity> namedEntities = new ConcurrentHashMap<>();
private NamedEntity[] namedEntityArray;
private final Vector<Player> nearbyPlayers;
private Player[] nearbyPlayerArray ;
private final Set<Player> nearbyPlayers;
private final Player owner;
private double hatOffset;
private final NamedEntityCarrier namedEntityCarrier;
@@ -41,9 +42,8 @@ public class NamedEntityManager {
public NamedEntityManager(NamedEntityCarrier namedEntityCarrier, Player owner) {
this.owner = owner;
this.nearbyPlayers = new Vector<>();
this.nearbyPlayers = Collections.synchronizedSet(new HashSet<>());
this.namedEntityArray = new NamedEntityImpl[0];
this.nearbyPlayerArray = new Player[0];
this.namedEntityCarrier = namedEntityCarrier;
this.init();
}
@@ -65,11 +65,7 @@ public class NamedEntityManager {
public void addNamedEntity(UUID uuid, NamedEntity namedEntity) {
this.namedEntities.put(uuid, namedEntity);
this.namedEntityArray = namedEntities.values().toArray(new NamedEntity[0]);
for (Player p : nearbyPlayerArray) namedEntity.spawn(p);
}
public Player[] getNearbyPlayers(){
return nearbyPlayerArray;
for (Player p : nearbyPlayers) namedEntity.spawn(p);
}
public boolean isNearby(Player viewer) {
@@ -78,7 +74,6 @@ public class NamedEntityManager {
public void spawn(Player viewer) {
nearbyPlayers.add(viewer);
nearbyPlayerArray = nearbyPlayers.toArray(new Player[0]);
for (NamedEntity fakeArmorStand : namedEntityArray)
if (fakeArmorStand.canShow())
fakeArmorStand.spawn(viewer);
@@ -109,7 +104,6 @@ public class NamedEntityManager {
entity.destroy();
}
nearbyPlayers.clear();
nearbyPlayerArray = new Player[0];
}
public void teleport(Player viewer) {
@@ -119,6 +113,13 @@ public class NamedEntityManager {
}
}
public void move(Player viewer, short x, short y, short z, boolean onGround) {
for (NamedEntity entity : namedEntityArray) {
if (entity.isShown())
entity.move(viewer, x, y, z, onGround);
}
}
public void teleport() {
for (NamedEntity entity : namedEntityArray) {
if (entity.isShown())
@@ -136,7 +137,7 @@ public class NamedEntityManager {
public void respawn() {
for (NamedEntity entity : namedEntityArray) {
if (entity.isShown())
for (Player viewer : nearbyPlayerArray)
for (Player viewer : nearbyPlayers)
entity.respawn(viewer);
}
}
@@ -149,9 +150,7 @@ public class NamedEntityManager {
}
public void unregisterPlayer(Player viewer) {
if (nearbyPlayers.remove(viewer)) {
nearbyPlayerArray = nearbyPlayers.toArray(new Player[0]);
}
nearbyPlayers.remove(viewer);
}
public void removeArmorStand(UUID uuid) {
@@ -185,4 +184,8 @@ public class NamedEntityManager {
public double getHighestTextHeight() {
return highestTextHeight;
}
public Collection<Player> getNearbyPlayers() {
return nearbyPlayers;
}
}

View File

@@ -17,8 +17,13 @@
package net.momirealms.customnameplates.object.carrier;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import net.momirealms.customnameplates.CustomNameplates;
import net.momirealms.customnameplates.listener.packet.*;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import java.util.List;
@@ -63,18 +68,29 @@ public class NamedEntityPacketsHandler extends AbstractPacketsHandler {
}
@Override
public void onEntityMove(Player receiver, int entityId) {
public void onEntityMove(Player receiver, int entityId, short x, short y, short z, boolean onGround) {
Player mover = super.getPlayerFromMap(entityId);
if (mover != null) {
namedEntityCarrier.getNamedEntityManager(mover).teleport(receiver);
namedEntityCarrier.getNamedEntityManager(mover).move(receiver, x, y, z, onGround);
}
}
@Override
public void onEntitySpawn(Player receiver, int entityId) {
public void onEntityTeleport(Player receiver, int entityId) {
Player teleporter = super.getPlayerFromMap(entityId);
if (teleporter != null) {
namedEntityCarrier.getNamedEntityManager(teleporter).teleport(receiver);
}
}
@Override
public void onEntitySpawn(Player receiver, int entityId, PacketEvent event) {
Player spawnedPlayer = super.getPlayerFromMap(entityId);
if (spawnedPlayer != null) {
namedEntityCarrier.getNamedEntityManager(spawnedPlayer).spawn(receiver);
NamedEntityManager nem = namedEntityCarrier.getNamedEntityManager(spawnedPlayer);
if (nem != null) {
nem.spawn(receiver);
}
}
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customnameplates.object.requirements;
import net.momirealms.customnameplates.utils.GeyserUtils;
import org.bukkit.entity.Player;
public record GeyserImpl(boolean is) implements Requirement {
@Override
public boolean isConditionMet(Player player) {
return GeyserUtils.isBedrockPlayer(player.getUniqueId()) == is;
}
}

View File

@@ -17,9 +17,9 @@
package net.momirealms.customnameplates.object.team.name;
import me.neznamy.tab.api.TabAPI;
import me.neznamy.tab.api.TabPlayer;
import me.neznamy.tab.api.tablist.SortingManager;
import me.neznamy.tab.shared.TAB;
import net.momirealms.customnameplates.object.team.TeamNameInterface;
import org.bukkit.entity.Player;
@@ -28,12 +28,12 @@ public class TABImpl implements TeamNameInterface {
private final SortingManager sortingManager;
public TABImpl() {
sortingManager = TAB.getInstance().getSortingManager();
sortingManager = TabAPI.getInstance().getSortingManager();
}
@Override
public String getTeamName(Player player) {
TabPlayer tabPlayer = TAB.getInstance().getPlayer(player.getUniqueId());
TabPlayer tabPlayer = TabAPI.getInstance().getPlayer(player.getUniqueId());
if (tabPlayer == null) return player.getName();
return sortingManager.getOriginalTeamName(tabPlayer);
}

View File

@@ -87,6 +87,7 @@ public class ConfigUtils {
case "permission" -> requirements.add(new PermissionImpl(section.getString(type)));
case "time" -> requirements.add(new TimeImpl(section.getStringList(type)));
case "date" -> requirements.add(new DateImpl(new HashSet<>(section.getStringList(type))));
case "geyser" -> requirements.add(new GeyserImpl(section.getBoolean(type)));
case "papi-condition" -> requirements.add(new CustomPapiImpl(Objects.requireNonNull(section.getConfigurationSection(type)).getValues(false)));
}
}

View File

@@ -0,0 +1,12 @@
package net.momirealms.customnameplates.utils;
import org.geysermc.api.Geyser;
import java.util.UUID;
public class GeyserUtils {
public static boolean isBedrockPlayer(UUID uuid) {
return Geyser.api().isBedrockPlayer(uuid);
}
}

View File

@@ -15,8 +15,10 @@ import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier;
import net.william278.velocitab.Velocitab;
import net.william278.velocitab.api.VelocitabAPI;
import org.slf4j.Logger;
import java.time.Duration;
import java.util.Optional;
@Plugin(id = "customnameplates", name = "CustomNameplates", version = "2.2", authors = {"XiaoMoMi"},
@@ -72,13 +74,14 @@ public class CustomNameplatesVC {
String playerName = dataInput.readUTF();
Optional<Player> optPlayer = server.getPlayer(playerName);
if (optPlayer.isEmpty()) return;
var player = tab.getTabPlayer(optPlayer.get());
player.getTeamName(tab).thenAccept(team -> {
ByteArrayDataOutput byteArrayDataOutput = ByteStreams.newDataOutput();
byteArrayDataOutput.writeUTF(playerName);
byteArrayDataOutput.writeUTF(team);
optPlayer.get().getCurrentServer().ifPresent(it -> it.sendPluginMessage(MinecraftChannelIdentifier.from("customnameplates:cnp"), byteArrayDataOutput.toByteArray()));
});
var player = VelocitabAPI.getInstance().getUser(optPlayer.get());
player.ifPresent(presentPlayer -> presentPlayer.getTeamName(tab).thenAccept(team -> {
server.getScheduler().buildTask(this, () -> {
ByteArrayDataOutput byteArrayDataOutput = ByteStreams.newDataOutput();
byteArrayDataOutput.writeUTF(playerName);
byteArrayDataOutput.writeUTF(team);
optPlayer.get().getCurrentServer().ifPresent(it -> it.sendPluginMessage(MinecraftChannelIdentifier.from("customnameplates:cnp"), byteArrayDataOutput.toByteArray()));
}).delay(Duration.ofSeconds(1)).schedule();
}));
}
}

View File

@@ -1,5 +1,5 @@
# Do not change
config-version: '20'
config-version: '21'
# bStats
metrics: true
@@ -80,3 +80,5 @@ other-settings:
# default width
# 默认文字宽度
default-character-width: 8
# disable bossbar/actionbar for bedrock players
disable-for-bedrock-players: false

View File

@@ -11,6 +11,18 @@ basic_info_hud:
refresh-rate: 1
conditions:
permission: bossbar.show
geyser: false
another_hud:
color: YELLOW
overlay: PROGRESS
dynamic-text:
- 'For bedrock players'
- '%nameplates_background_time% %nameplates_background_hello%'
refresh-rate: 1
conditions:
geyser: true
update_info:
color: YELLOW