9
0
mirror of https://github.com/Xiao-MoMi/Custom-Nameplates.git synced 2026-01-04 15:31:47 +00:00
This commit is contained in:
Xiao-MoMi
2022-08-08 04:56:23 +08:00
parent 9c696a9578
commit 3183a14ce4
11 changed files with 153 additions and 87 deletions

View File

@@ -70,7 +70,6 @@ public class ConfigManager {
public static void loadWidth(){
fontWidth.clear();
YamlConfiguration config = getConfig("char-width.yml");
config.getConfigurationSection("").getKeys(false).forEach(key -> {
fontWidth.put(key.charAt(0), config.getInt(key));

View File

@@ -29,6 +29,7 @@ import net.momirealms.customnameplates.data.DataManager;
import net.momirealms.customnameplates.data.SqlHandler;
import net.momirealms.customnameplates.helper.LibraryLoader;
import net.momirealms.customnameplates.hook.Placeholders;
import net.momirealms.customnameplates.listener.PacketsListener;
import net.momirealms.customnameplates.listener.PlayerListener;
import net.momirealms.customnameplates.resource.ResourceManager;
import net.momirealms.customnameplates.scoreboard.ScoreBoardManager;
@@ -49,6 +50,7 @@ public final class CustomNameplates extends JavaPlugin {
private ScoreBoardManager scoreBoardManager;
private Placeholders placeholders;
private Timer timer;
private PacketsListener packetsListener;
public ResourceManager getResourceManager() {return this.resourceManager;}
public DataManager getDataManager() { return this.dataManager; }
@@ -88,6 +90,8 @@ public final class CustomNameplates extends JavaPlugin {
if (ConfigManager.nameplate){
ConfigManager.DatabaseConfig.LoadConfig();
Bukkit.getPluginManager().registerEvents(new PlayerListener(this),this);
packetsListener = new PacketsListener(this);
protocolManager.addPacketListener(packetsListener);
}
if (ConfigManager.MainConfig.placeholderAPI){
placeholders = new Placeholders();
@@ -125,7 +129,8 @@ public final class CustomNameplates extends JavaPlugin {
adventure.close();
adventure = null;
}
if (protocolManager != null){
if (packetsListener != null && protocolManager != null){
protocolManager.removePacketListener(this.packetsListener);
protocolManager = null;
}
if (placeholders != null){

View File

@@ -81,7 +81,6 @@ public class Execute implements CommandExecutor {
if (sender.hasPermission("customnameplates.reload") || sender.isOp()) {
ConfigManager.MainConfig.ReloadConfig();
ConfigManager.Message.ReloadConfig();
ConfigManager.loadWidth();
if (ConfigManager.actionbar){
ConfigManager.ActionbarConfig.LoadConfig();
}
@@ -347,7 +346,7 @@ public class Execute implements CommandExecutor {
AdventureManager.playerMessage(player,"<color:#87CEFA>/nameplates preview - <color:#7FFFAA>preview your nameplate");
AdventureManager.playerMessage(player,"<color:#87CEFA>/nameplates forcepreview <player> <nameplate> - <color:#7FFFAA>force a player to preview a nameplate");
AdventureManager.playerMessage(player,"<color:#87CEFA>/nameplates list - <color:#7FFFAA>list your available nameplates");
AdventureManager.playerMessage(player,"<color:#87CEFA>/nameplates generate - <color:#7FFFAA>generate the RP");
AdventureManager.playerMessage(player,"<color:#87CEFA>/nameplates generate - <color:#7FFFAA>generate the resource pack");
}
}else {
AdventureManager.consoleMessage("<color:#87CEFA>/nameplates help - <color:#7FFFAA>show the command list");
@@ -359,7 +358,7 @@ public class Execute implements CommandExecutor {
AdventureManager.consoleMessage("<color:#87CEFA>/nameplates preview - <color:#7FFFAA>preview your nameplate");
AdventureManager.consoleMessage("<color:#87CEFA>/nameplates forcepreview <player> <nameplate> - <color:#7FFFAA>force a player to preview a nameplate");
AdventureManager.consoleMessage("<color:#87CEFA>/nameplates list - <color:#7FFFAA>list your available nameplates");
AdventureManager.consoleMessage("<color:#87CEFA>/nameplates generate - <color:#7FFFAA>generate the RP");
AdventureManager.consoleMessage("<color:#87CEFA>/nameplates generate - <color:#7FFFAA>generate the resource pack");
}
return true;
}
@@ -368,7 +367,6 @@ public class Execute implements CommandExecutor {
}
private void showNameplate(Player player, Component component) {
ArmorStand entity = player.getWorld().spawn(player.getLocation().add(0,0.8,0), ArmorStand.class, a -> {
a.setInvisible(true);
a.setCollidable(false);

View File

@@ -19,6 +19,8 @@ package net.momirealms.customnameplates.font;
import net.momirealms.customnameplates.ConfigManager;
import java.util.Objects;
public enum FontWidth {
A('A', 5), a('a', 5), B('B', 5), b('b', 5),
@@ -80,12 +82,8 @@ public enum FontWidth {
return minecraftFontWidth.length;
}
}
int custom = ConfigManager.fontWidth.get(c);
if (custom != 0){
return custom;
}else {
return 8;
}
Integer custom = ConfigManager.fontWidth.get(c);
return Objects.requireNonNullElse(custom, 8);
}
/*

View File

@@ -19,6 +19,8 @@ package net.momirealms.customnameplates.font;
import net.momirealms.customnameplates.ConfigManager;
import java.util.Objects;
public enum FontWidthThin {
A('A', 3), a('a', 3), B('B', 3), b('b', 3),
@@ -81,11 +83,7 @@ public enum FontWidthThin {
}
}
int custom = ConfigManager.fontWidth.get(c);
if (custom != 0){
return custom;
}else {
return 8;
}
return Objects.requireNonNullElse(custom, 8);
}
/*

View File

@@ -0,0 +1,82 @@
/*
* 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.listener;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.InternalStructure;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.utility.MinecraftReflection;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.momirealms.customnameplates.ConfigManager;
import net.momirealms.customnameplates.CustomNameplates;
import net.momirealms.customnameplates.data.DataManager;
import net.momirealms.customnameplates.scoreboard.NameplatesTeam;
import net.momirealms.customnameplates.scoreboard.ScoreBoardManager;
import org.bukkit.ChatColor;
import java.util.Optional;
public class PacketsListener extends PacketAdapter {
private final CustomNameplates plugin;
public PacketsListener(CustomNameplates plugin) {
super(plugin, ListenerPriority.HIGHEST, PacketType.Play.Server.SCOREBOARD_TEAM);
this.plugin = plugin;
}
public void onPacketSending(PacketEvent event) {
Integer n = event.getPacket().getIntegers().read(0);
if (n != 2) {
return;
}
//if (n == 0) System.out.println("对玩家" + event.getPlayer().getName() + "发送team创建包");
//if (n == 2) System.out.println("对玩家"+ event.getPlayer().getName() + "发送team更新包");
Optional<InternalStructure> optional = event.getPacket().getOptionalStructures().read(0);
if (optional.isEmpty()) {
return;
}
InternalStructure internalStructure = optional.get();
String teamName = event.getPacket().getStrings().read(0);
//System.out.println("本次创建/更新的队伍名是" + teamName);
NameplatesTeam team = ScoreBoardManager.teams.get(teamName);
if (team == null) {
//System.out.println("但是这个队伍不存在于缓存中哦,说明那个玩家还没上线");
return;
}
//System.out.println("这个队伍确实存在于缓存中呢!");
if (ConfigManager.MainConfig.show_after && (DataManager.cache.get(event.getPlayer().getUniqueId()) == null || DataManager.cache.get(event.getPlayer().getUniqueId()).getAccepted() == 0)) {
//System.out.println("玩家" +event.getPlayer().getName() +"因为没有接受资源包所以没有被显示铭牌");
internalStructure.getChatComponents().write(1, WrappedChatComponent.fromJson("{\"text\":\"\"}"));
internalStructure.getChatComponents().write(2, WrappedChatComponent.fromJson("{\"text\":\"\"}"));
internalStructure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0,ChatColor.WHITE);
return;
}
//System.out.println("玩家" +event.getPlayer().getName() +"可以看见队伍" + teamName + "的铭牌");
if (team.getPrefix() != null) {
internalStructure.getChatComponents().write(1, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(team.getPrefix())));
}
if (team.getSuffix() != null) {
internalStructure.getChatComponents().write(2, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(team.getSuffix())));
}
internalStructure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0,team.getColor());
}
}

View File

@@ -17,31 +17,20 @@
package net.momirealms.customnameplates.listener;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.InternalStructure;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.utility.MinecraftReflection;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.momirealms.customnameplates.ConfigManager;
import net.momirealms.customnameplates.CustomNameplates;
import net.momirealms.customnameplates.data.DataManager;
import net.momirealms.customnameplates.data.PlayerData;
import net.momirealms.customnameplates.hook.TABHook;
import net.momirealms.customnameplates.scoreboard.NameplatesTeam;
import net.momirealms.customnameplates.scoreboard.ScoreBoardManager;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerResourcePackStatusEvent;
import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.Optional;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
public record PlayerListener(CustomNameplates plugin) implements Listener {
@@ -49,20 +38,30 @@ public record PlayerListener(CustomNameplates plugin) implements Listener {
public void onJoin(PlayerJoinEvent event) {
this.plugin.getDataManager().loadData(event.getPlayer());
Bukkit.getScheduler().runTaskLaterAsynchronously(CustomNameplates.instance, ()-> {
sendPacketsToPlayer(event.getPlayer());
}, 40);
if (ConfigManager.MainConfig.tab){
Bukkit.getOnlinePlayers().forEach(player -> ScoreBoardManager.teams.get(TABHook.getTABTeam(player.getName())).updateNameplates());
}else {
Bukkit.getOnlinePlayers().forEach(player -> ScoreBoardManager.teams.get(player.getName()).updateNameplates());
}
}, 50);
}
@EventHandler
public void onQuit(PlayerQuitEvent event) {
this.plugin.getDataManager().unloadPlayer(event.getPlayer().getUniqueId());
Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
Team team;
String teamName;
if (ConfigManager.MainConfig.tab){
teamName = TABHook.getTABTeam(event.getPlayer().getName());
}else {
teamName = event.getPlayer().getName();
}
team = scoreboard.getTeam(teamName);
ScoreBoardManager.teams.remove(teamName);
if (team != null){
team.unregister();
}
}
@EventHandler
@@ -74,58 +73,19 @@ public record PlayerListener(CustomNameplates plugin) implements Listener {
}
if (event.getStatus() == PlayerResourcePackStatusEvent.Status.SUCCESSFULLY_LOADED) {
playerData.setAccepted(1);
}
else if(event.getStatus() == PlayerResourcePackStatusEvent.Status.DECLINED || event.getStatus() == PlayerResourcePackStatusEvent.Status.FAILED_DOWNLOAD) {
if (ConfigManager.MainConfig.tab){
Bukkit.getOnlinePlayers().forEach(player -> ScoreBoardManager.teams.get(TABHook.getTABTeam(player.getName())).updateNameplates());
}else {
Bukkit.getOnlinePlayers().forEach(player -> ScoreBoardManager.teams.get(player.getName()).updateNameplates());
}
} else if(event.getStatus() == PlayerResourcePackStatusEvent.Status.DECLINED || event.getStatus() == PlayerResourcePackStatusEvent.Status.FAILED_DOWNLOAD) {
playerData.setAccepted(0);
if (ConfigManager.MainConfig.tab){
Bukkit.getOnlinePlayers().forEach(player -> ScoreBoardManager.teams.get(TABHook.getTABTeam(player.getName())).updateNameplates());
}else {
Bukkit.getOnlinePlayers().forEach(player -> ScoreBoardManager.teams.get(player.getName()).updateNameplates());
}
}
sendPacketsToPlayer(event.getPlayer());
}, 20);
}
private void sendPacketsToPlayer(Player player){
if (ConfigManager.MainConfig.show_after && DataManager.cache.get(player.getUniqueId()).getAccepted() != 1) return;
Bukkit.getOnlinePlayers().forEach(onlinePlayer -> {
String teamName;
if (ConfigManager.MainConfig.tab){
teamName = TABHook.getTABTeam(onlinePlayer.getName());
}else {
teamName = onlinePlayer.getName();
}
NameplatesTeam team = ScoreBoardManager.teams.get(teamName);
if (team == null) return;
PacketContainer packetContainer = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM);
packetContainer.getStrings().write(0, teamName);
Optional<InternalStructure> optional = packetContainer.getOptionalStructures().read(0);
if (optional.isEmpty()) {
return;
}
InternalStructure internalStructure1 = optional.get();
internalStructure1.getChatComponents().write(0, WrappedChatComponent.fromJson("{\"text\":\" "+ onlinePlayer.getName() +" \"}"));
if (team.getPrefix() != null){
internalStructure1.getChatComponents().write(1, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(team.getPrefix())));
}
if (team.getSuffix() != null){
internalStructure1.getChatComponents().write(2, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(team.getSuffix())));
}
internalStructure1.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0,team.getColor());
packetContainer.getModifier().write(2, Collections.singletonList(onlinePlayer.getName()));
try {
CustomNameplates.protocolManager.sendServerPacket(player, packetContainer);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
});
}
}

View File

@@ -27,8 +27,11 @@ import net.momirealms.customnameplates.font.FontCache;
import net.momirealms.customnameplates.hook.PapiHook;
import net.momirealms.customnameplates.hook.TABHook;
import net.momirealms.customnameplates.nameplates.NameplateUtil;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
import java.util.Optional;
@@ -36,6 +39,7 @@ public class NameplatesTeam {
private final CustomNameplates plugin;
private final Player player;
private final Team team;
private Component prefix;
private Component suffix;
private String prefixText;
@@ -54,11 +58,16 @@ public class NameplatesTeam {
this.color = ChatColor.WHITE;
this.plugin = plugin;
this.player = player;
Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
String name = player.getName();
if (ConfigManager.MainConfig.tab){
this.teamName = TABHook.getTABTeam(name);
this.team = Optional.ofNullable(Bukkit.getScoreboardManager().getMainScoreboard().getTeam(teamName)).orElseGet(() -> scoreboard.registerNewTeam(teamName));
team.addEntry(player.getName());
}else {
this.teamName = name;
this.team = Optional.ofNullable(Bukkit.getScoreboardManager().getMainScoreboard().getTeam(name)).orElseGet(() -> scoreboard.registerNewTeam(name));
team.addEntry(player.getName());
}
}
@@ -83,6 +92,7 @@ public class NameplatesTeam {
this.suffixText = "";
}
this.color = ChatColor.WHITE;
this.team.setPrefix("");
return;
}
FontCache fontCache = this.plugin.getResourceManager().getNameplateInfo(nameplate);
@@ -90,6 +100,7 @@ public class NameplatesTeam {
this.prefix = Component.text("");
this.suffix = Component.text("");
this.color = ChatColor.WHITE;
this.team.setPrefix("");
DataManager.cache.get(player.getUniqueId()).equipNameplate("none");
return;
}
@@ -108,8 +119,7 @@ public class NameplatesTeam {
}else {
playerSuffix = "";
}
}
else {
}else {
if (!ConfigManager.MainConfig.hidePrefix){
playerPrefix = ConfigManager.MainConfig.player_prefix;
}else {
@@ -126,5 +136,6 @@ public class NameplatesTeam {
this.prefix = Component.text(nameplateUtil.makeCustomNameplate(MiniMessage.miniMessage().stripTags(playerPrefix), name, MiniMessage.miniMessage().stripTags(playerSuffix))).font(ConfigManager.MainConfig.key).append(MiniMessage.miniMessage().deserialize(playerPrefix));
this.suffix = MiniMessage.miniMessage().deserialize(playerSuffix).append(Component.text(nameplateUtil.getSuffixLength(MiniMessage.miniMessage().stripTags(playerPrefix) + name + MiniMessage.miniMessage().stripTags(playerSuffix))).font(ConfigManager.MainConfig.key));
this.color = nameplateUtil.getColor();
this.team.setPrefix("");
}
}

View File

@@ -37,8 +37,7 @@ public record ScoreBoardManager(CustomNameplates plugin) {
}
teams.get(tabTeamName).updateNameplates();
return teams.get(tabTeamName);
}
else {
} else {
if (!teams.containsKey(player.getName())) {
teams.put(player.getName(), new NameplatesTeam(this.plugin, player));
}

View File

@@ -1,6 +1,6 @@
config:
# Language
# en/cn
# en/cn/es
lang: en
# Should the plugin hook into other plugins

View File

@@ -0,0 +1,16 @@
messages:
prefix: '<gradient:#2E8B57:#48D1CC>[CustomNameplates] </gradient>'
no-perm: '<red>¡No tienes permisos!</red>'
lack-args: '<white>¡Parámetros insuficientes!</white>'
reload: '<white>¡Recargado!</white>'
equip: '<white>Nameplate equipada con éxito {Nameplate}. </white><yellow><click:run_command:/nameplates preview>[click to preview]'
force-equip: '<white>Nameplate equipada con éxito {Nameplate} to {Player}.</white>'
unequip: '<white>¡Has quitado tu Nameplate!</white>'
force-unequip: '<white>Eliminado con éxito {Player}''s nameplate!</white>'
preview: '<white>¡Ahora, la vista previa de su placa de identificación (ir a la tercera persona para ver)!</white>'
not-exist: '<white>Este Nameplate no existe.</white>'
not-online: '<white>Player {Player} ¡no está en línea!</white>'
no-console: '<white>Este comando sólo puede ser ejecutado por el jugador.</white>'
not-available: '<white>Esta placa no está disponible actualmente.</white>'
available: '<white>Nameplates disponibles: {Nameplates}.</white>'
cooldown: '<white>¡El preestreno sigue en curso!</white>'