9
0
mirror of https://github.com/Xiao-MoMi/Custom-Nameplates.git synced 2025-12-19 15:09:23 +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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
libs/TrChat-2.0.8.jar Normal file

Binary file not shown.

Binary file not shown.

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