mirror of
https://github.com/Xiao-MoMi/Custom-Nameplates.git
synced 2025-12-19 15:09:23 +00:00
2.2.3.13
This commit is contained in:
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
BIN
libs/TrChat-2.0.8.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -34,4 +34,6 @@ public interface NamedEntity {
|
||||
DynamicText getDynamicText();
|
||||
|
||||
int getEntityId();
|
||||
|
||||
void move(Player viewer, short x, short y, short z, boolean onGround);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user