9
0
mirror of https://github.com/Xiao-MoMi/Custom-Nameplates.git synced 2025-12-31 04:36:29 +00:00

1.8.0-SNAPSHOT

This commit is contained in:
Xiao-MoMi
2022-07-27 21:16:20 +08:00
parent 87a4b9c0c9
commit 43dccebb26
51 changed files with 1378 additions and 250 deletions

View File

@@ -1,24 +1,66 @@
/*
* 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;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.sound.Sound;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.title.Title;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.time.Duration;
public class AdventureManager {
//发送控制台消息
public static void consoleMessage(String s) {
Audience au = CustomNameplates.adventure.sender(Bukkit.getConsoleSender());
MiniMessage mm = MiniMessage.miniMessage();
Component parsed = mm.deserialize(s);
au.sendMessage(parsed);
}
//发送玩家消息
public static void playerMessage(Player player, String s){
Audience au = CustomNameplates.adventure.player(player);
MiniMessage mm = MiniMessage.miniMessage();
Component parsed = mm.deserialize(s);
au.sendMessage(parsed);
}
public static void playerTitle(Player player, String s1, String s2, int in, int duration, int out) {
Audience au = CustomNameplates.adventure.player(player);
MiniMessage mm = MiniMessage.miniMessage();
Title.Times times = Title.Times.times(Duration.ofMillis(in), Duration.ofMillis(duration), Duration.ofMillis(out));
Title title = Title.title(mm.deserialize(s1), mm.deserialize(s2), times);
au.showTitle(title);
}
public static void playerActionbar(Player player, String s) {
Audience au = CustomNameplates.adventure.player(player);
MiniMessage mm = MiniMessage.miniMessage();
au.sendActionBar(mm.deserialize(s));
}
public static void playerSound(Player player, Sound.Source source, Key key) {
Sound sound = Sound.sound(key, source, 1, 1);
Audience au = CustomNameplates.adventure.player(player);
au.playSound(sound);
}
}

View File

@@ -1,30 +1,70 @@
/*
* 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;
import net.kyori.adventure.bossbar.BossBar;
import net.kyori.adventure.key.Key;
import net.momirealms.customnameplates.background.BackGround;
import net.momirealms.customnameplates.bossbar.BossbarConfig;
import net.momirealms.customnameplates.utils.BGInfo;
import net.momirealms.customnameplates.utils.NPInfo;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.util.HashMap;
import java.util.TreeMap;
public class ConfigManager {
//根据文件名获取配置文件
public static TreeMap<String, BackGround> backgrounds = new TreeMap<>();
public static TreeMap<String, BossbarConfig> bossbars = new TreeMap<>();
public static HashMap<String, BGInfo> papiBG = new HashMap<>();
public static HashMap<String, NPInfo> papiNP = new HashMap<>();
public static YamlConfiguration getConfig(String configName) {
File file = new File(CustomNameplates.instance.getDataFolder(), configName);
//文件不存在则生成默认配置
if (!file.exists()) {
CustomNameplates.instance.saveResource(configName, false);
}
return YamlConfiguration.loadConfiguration(file);
}
//主配置文件
public static class MainConfig{
public static boolean nameplate;
public static boolean background;
public static boolean bossbar;
public static boolean actionbar;
public static void loadModule(){
YamlConfiguration module = getConfig("module.yml");
nameplate = module.getBoolean("nameplate");
background = module.getBoolean("background");
bossbar = module.getBoolean("bossbar");
actionbar = module.getBoolean("actionbar");
}
public static class MainConfig{
public static String namespace;
public static String fontName;
public static String start_char;
public static char start;
public static String folder_path;
public static String bg_folder_path;
public static String font;
public static String default_nameplate;
public static String player_prefix;
@@ -38,23 +78,37 @@ public class ConfigManager {
public static boolean thin_font;
public static boolean hidePrefix;
public static boolean hideSuffix;
public static void ReloadConfig(){
CustomNameplates.instance.saveDefaultConfig();
CustomNameplates.instance.reloadConfig();
FileConfiguration config = CustomNameplates.instance.getConfig();
lang = config.getString("config.lang");
namespace = config.getString("config.namespace");
font = config.getString("config.font");
fontName = namespace + ":" + font;
start_char = config.getString("config.start-char");
folder_path = config.getString("config.folder-path");
start = start_char.charAt(0);
folder_path = config.getString("config.nameplate-folder-path","font\\nameplates\\");
bg_folder_path = config.getString("config.background-folder-path","font\\backgrounds\\");
default_nameplate = config.getString("config.default-nameplate");
player_prefix = config.getString("config.prefix");
player_suffix = config.getString("config.suffix");
itemsAdder =config.getBoolean("config.integrations.ItemsAdder");
if (itemsAdder){
if(CustomNameplates.instance.getServer().getPluginManager().getPlugin("ItemsAdder") == null){
CustomNameplates.instance.getLogger().warning("Failed to initialize ItemsAdder!");
itemsAdder = false;
}
}
placeholderAPI = config.getBoolean("config.integrations.PlaceholderAPI");
if (placeholderAPI){
if(CustomNameplates.instance.getServer().getPluginManager().getPlugin("PlaceholderAPI") != null){
loadPapi();
}else {
CustomNameplates.instance.getLogger().warning("Failed to initialize PlaceholderAPI!");
placeholderAPI = false;
}
}
show_after = config.getBoolean("config.show-after-load-resourcepack");
key = Key.key(fontName);
preview = config.getLong("config.preview-duration");
@@ -63,9 +117,8 @@ public class ConfigManager {
hideSuffix = config.getBoolean("config.hide-suffix-when-equipped",false);
}
}
//消息文件
public static class Message{
public static class Message{
public static String noPerm;
public static String prefix;
public static String lackArgs;
@@ -81,7 +134,7 @@ public class ConfigManager {
public static String available;
public static String cooldown;
public static String preview;
public static String generate;
public static void ReloadConfig(){
YamlConfiguration messagesConfig = getConfig("messages/messages_" + MainConfig.lang +".yml");
noPerm = messagesConfig.getString("messages.no-perm");
@@ -99,11 +152,67 @@ public class ConfigManager {
available = messagesConfig.getString("messages.available");
cooldown = messagesConfig.getString("messages.cooldown");
preview = messagesConfig.getString("messages.preview");
generate = messagesConfig.getString("messages.generate");
}
}
//数据库配置
public static class DatabaseConfig{
public static void loadBGConfig(){
backgrounds.clear();
YamlConfiguration bgConfig = getConfig("background.yml");
bgConfig.getConfigurationSection("background").getKeys(false).forEach(key -> {
backgrounds.put(key, new BackGround(bgConfig.getString("background." + key + ".start"),bgConfig.getString("background." + key + ".offset_1"),
bgConfig.getString("background." + key + ".offset_2"),bgConfig.getString("background." + key + ".offset_4"),bgConfig.getString("background." + key + ".offset_8"),
bgConfig.getString("background." + key + ".offset_16"),bgConfig.getString("background." + key + ".offset_32"),bgConfig.getString("background." + key + ".offset_64"),
bgConfig.getString("background." + key + ".offset_128"),bgConfig.getString("background." + key + ".end"),bgConfig.getInt("background." + key + ".y-offset"),bgConfig.getInt("background." + key + ".x-offset")
));
});
}
public static void loadBossBar(){
YamlConfiguration bossbarConfig = getConfig("bossbar.yml");
bossbarConfig.getConfigurationSection("bossbar").getKeys(false).forEach(key -> {
BossbarConfig bossbarConfig1 = ConfigManager.bossbars.get(key);
if (bossbarConfig1 != null){
bossbarConfig1.setColor(BossBar.Color.valueOf(bossbarConfig.getString("bossbar." + key + ".color").toUpperCase()));
bossbarConfig1.setOverlay(BossBar.Overlay.valueOf(bossbarConfig.getString("bossbar." + key + ".overlay").toUpperCase()));
bossbarConfig1.setRate(bossbarConfig.getInt("bossbar." + key + ".refresh-rate") - 1);
bossbarConfig1.setText(bossbarConfig.getString("bossbar." + key + ".text"));
}else {
bossbars.put(key, new BossbarConfig(
bossbarConfig.getString("bossbar." + key + ".text"),
BossBar.Overlay.valueOf(bossbarConfig.getString("bossbar." + key + ".overlay").toUpperCase()),
BossBar.Color.valueOf(bossbarConfig.getString("bossbar." + key + ".color").toUpperCase()),
bossbarConfig.getInt("bossbar." + key + ".refresh-rate") - 1
));
}
});
}
public static void loadPapi(){
papiBG.clear();
papiNP.clear();
YamlConfiguration papiInfo = getConfig("custom-papi.yml");
papiInfo.getConfigurationSection("papi").getKeys(false).forEach(key -> {
if (papiInfo.contains("papi." + key + ".background")){
papiBG.put(key, new BGInfo(papiInfo.getString("papi."+key+".text"), papiInfo.getString("papi." + key + ".background")));
}
if (papiInfo.contains("papi." + key + ".nameplate")){
papiNP.put(key, new NPInfo(papiInfo.getString("papi."+key+".text"), papiInfo.getString("papi." + key + ".nameplate")));
}
});
}
public static class ActionbarConfig{
public static int rate;
public static String text;
public static void LoadConfig(){
YamlConfiguration actionbarConfig = getConfig("actionbar.yml");
rate = actionbarConfig.getInt("refresh-rate") - 1;
text = actionbarConfig.getString("text");
}
}
public static class DatabaseConfig{
public static String user;
public static String password;
public static String url;
@@ -116,27 +225,21 @@ public class ConfigManager {
public static int minimum_idle;
public static int maximum_lifetime;
public static int idle_timeout;
public static void LoadConfig(){
YamlConfiguration databaseConfig = getConfig("database.yml");
String storage_mode = databaseConfig.getString("settings.storage-mode");
async = !databaseConfig.getBoolean("settings.disable-async", true);
//使用SQLite
if(storage_mode.equals("SQLite")){
enable_pool = false;
use_mysql = false;
tableName = "nameplates";
}
//使用MYSQL
else if(storage_mode.equals("MYSQL")){
use_mysql = true;
ENCODING = databaseConfig.getString("MySQL.property.encoding");
tableName = databaseConfig.getString("MySQL.table-name");
user = databaseConfig.getString("MySQL.user");
password = databaseConfig.getString("MySQL.password");
url = "jdbc:mysql://" + databaseConfig.getString("MySQL.host")
+ ":" + databaseConfig.getString("MySQL.port") + "/"
+ databaseConfig.getString("MySQL.database") + "?characterEncoding="
@@ -162,4 +265,4 @@ public class ConfigManager {
}
}
}
}
}

View File

@@ -1,13 +1,32 @@
/*
* 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;
import com.comphenix.protocol.ProtocolLibrary;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.momirealms.customnameplates.actionbar.Timer;
import net.momirealms.customnameplates.bossbar.QuitAndJoin;
import net.momirealms.customnameplates.commands.Execute;
import net.momirealms.customnameplates.commands.TabComplete;
import net.momirealms.customnameplates.data.DataManager;
import net.momirealms.customnameplates.data.SqlHandler;
import net.momirealms.customnameplates.helper.LibraryLoader;
import net.momirealms.customnameplates.hook.HookManager;
import net.momirealms.customnameplates.hook.Placeholders;
import net.momirealms.customnameplates.listener.PlayerListener;
import net.momirealms.customnameplates.listener.PacketsListener;
import net.momirealms.customnameplates.resource.ResourceManager;
@@ -25,19 +44,17 @@ public final class CustomNameplates extends JavaPlugin {
private ResourceManager resourceManager;
private DataManager dataManager;
private HookManager hookManager;
private ScoreBoardManager scoreBoardManager;
private Timer timer;
public ResourceManager getResourceManager() {
return this.resourceManager;
}
public DataManager getDataManager() { return this.dataManager; }
public HookManager getHookManager() { return this.hookManager; }
public ScoreBoardManager getScoreBoardManager() { return this.scoreBoardManager; }
@Override
public void onLoad(){
instance = this;
LibraryLoader.load("commons-io","commons-io","2.11.0","https://repo.maven.apache.org/maven2/");
LibraryLoader.load("com.zaxxer","HikariCP","5.0.1","https://repo.maven.apache.org/maven2/");
@@ -45,42 +62,55 @@ public final class CustomNameplates extends JavaPlugin {
@Override
public void onEnable() {
adventure = BukkitAudiences.create(this);
AdventureManager.consoleMessage("<gradient:#2E8B57:#48D1CC>[CustomNameplates] </gradient><color:#baffd1>Running on " + Bukkit.getVersion());
//重载插件
ConfigManager.loadModule();
ConfigManager.MainConfig.ReloadConfig();
ConfigManager.Message.ReloadConfig();
ConfigManager.DatabaseConfig.LoadConfig();
//指令注册
if (ConfigManager.bossbar){
ConfigManager.loadBossBar();
Bukkit.getPluginManager().registerEvents(new QuitAndJoin(),this);
}
if (ConfigManager.actionbar){
ConfigManager.ActionbarConfig.LoadConfig();
timer = new Timer();
}
if (ConfigManager.background){
ConfigManager.loadBGConfig();
}
if (ConfigManager.nameplate){
ConfigManager.DatabaseConfig.LoadConfig();
Bukkit.getPluginManager().registerEvents(new PlayerListener(this),this);
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketsListener(this));
}
if (ConfigManager.MainConfig.placeholderAPI){
new Placeholders().register();
AdventureManager.consoleMessage("<gradient:#2E8B57:#48D1CC>[CustomNameplates]</gradient> <color:#baffd1>PlaceholderAPI Hooked!");
}
Objects.requireNonNull(Bukkit.getPluginCommand("customnameplates")).setExecutor(new Execute(this));
Objects.requireNonNull(Bukkit.getPluginCommand("customnameplates")).setTabCompleter(new TabComplete(this));
//事件注册
Bukkit.getPluginManager().registerEvents(new PlayerListener(this),this);
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketsListener(this));
//新建单例
this.resourceManager = new ResourceManager(this);
this.dataManager = new DataManager(this);
this.hookManager = new HookManager(this);
this.scoreBoardManager = new ScoreBoardManager(this);
//生成资源包
resourceManager.generateResourcePack();
if (!DataManager.create()) {
AdventureManager.consoleMessage("<red>[CustomNameplates] Error! Failed to enable Data Manager! Disabling plugin...</red>");
instance.getPluginLoader().disablePlugin(instance);
return;
}
//启动完成
AdventureManager.consoleMessage("<gradient:#2E8B57:#48D1CC>[CustomNameplates]</gradient> <color:#baffd1>Plugin Enabled!");
}
@Override
public void onDisable() {
SqlHandler.saveAll();
SqlHandler.close();
//清除缓存实体
if (ConfigManager.nameplate){
SqlHandler.saveAll();
SqlHandler.close();
}
Execute.pCache.forEach(Entity::remove);
//关闭adventure
if (timer != null){
timer.stopTimer(timer.getTaskID());
}
if(adventure != null) {
adventure.close();
adventure = null;

View File

@@ -0,0 +1,49 @@
/*
* 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.actionbar;
import me.clip.placeholderapi.PlaceholderAPI;
import net.momirealms.customnameplates.AdventureManager;
import net.momirealms.customnameplates.ConfigManager;
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitRunnable;
public class ActionbarSender extends BukkitRunnable {
private int timer;
public ActionbarSender(){
this.timer = 0;
}
@Override
public void run() {
if (timer < ConfigManager.ActionbarConfig.rate){
timer++;
}else {
Bukkit.getOnlinePlayers().forEach(player -> {
if (ConfigManager.MainConfig.placeholderAPI){
AdventureManager.playerActionbar(player, PlaceholderAPI.setPlaceholders(player, ConfigManager.ActionbarConfig.text));
}else {
AdventureManager.playerActionbar(player, ConfigManager.ActionbarConfig.text);
}
});
timer = 0;
}
}
}

View File

@@ -0,0 +1,41 @@
/*
* 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.actionbar;
import net.momirealms.customnameplates.CustomNameplates;
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitTask;
public class Timer {
private final int taskID;
public void stopTimer(int ID) {
Bukkit.getScheduler().cancelTask(ID);
}
public Timer() {
ActionbarSender actionbarSender = new ActionbarSender();
BukkitTask task = actionbarSender.runTaskTimerAsynchronously(CustomNameplates.instance, 1,1);
this.taskID = task.getTaskId();
}
public int getTaskID() {
return this.taskID;
}
}

View File

@@ -0,0 +1,141 @@
/*
* 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.background;
import net.momirealms.customnameplates.font.FontNegative;
import net.momirealms.customnameplates.resource.ResourceManager;
public class BackGround {
private final String start;
private final String offset_1;
private final String offset_2;
private final String offset_4;
private final String offset_8;
private final String offset_16;
private final String offset_32;
private final String offset_64;
private final String offset_128;
private final String end;
private final int offset_y;
private final int offset_x;
public BackGround(String start, String offset_1, String offset_2,
String offset_4, String offset_8, String offset_16,
String offset_32, String offset_64, String offset_128, String end, int offset_y, int offset_x){
this.start = start; this.offset_1 = offset_1; this.offset_2 = offset_2;
this.end = end; this.offset_4 = offset_4; this.offset_8 = offset_8;
this.offset_16 = offset_16; this.offset_32 = offset_32; this.offset_64 = offset_64;
this.offset_128 = offset_128;
this.offset_y = offset_y;
this.offset_x = offset_x;
}
public String getBackGround(int n) {
n += offset_x;
String offset = FontNegative.getShortestNegChars(n);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(ResourceManager.bgCaches.get(start));
if (n > 128) {
stringBuilder.append(FontNegative.NEG_1.getCharacter());
stringBuilder.append(ResourceManager.bgCaches.get(offset_128));
n -= 128;
}
if (n - 64 > 0) {
stringBuilder.append(FontNegative.NEG_1.getCharacter());
stringBuilder.append(ResourceManager.bgCaches.get(offset_64));
n -= 64;
}
if (n - 32 > 0) {
stringBuilder.append(FontNegative.NEG_1.getCharacter());
stringBuilder.append(ResourceManager.bgCaches.get(offset_32));
n -= 32;
}
if (n - 16 > 0) {
stringBuilder.append(FontNegative.NEG_1.getCharacter());
stringBuilder.append(ResourceManager.bgCaches.get(offset_16));
n -= 16;
}
if (n - 8 > 0) {
stringBuilder.append(FontNegative.NEG_1.getCharacter());
stringBuilder.append(ResourceManager.bgCaches.get(offset_8));
n -= 8;
}
if (n - 4 > 0) {
stringBuilder.append(FontNegative.NEG_1.getCharacter());
stringBuilder.append(ResourceManager.bgCaches.get(offset_4));
n -= 4;
}
if (n - 2 > 0) {
stringBuilder.append(FontNegative.NEG_1.getCharacter());
stringBuilder.append(ResourceManager.bgCaches.get(offset_2));
n -= 2;
}
if (n - 1 > 0) {
stringBuilder.append(FontNegative.NEG_1.getCharacter());
stringBuilder.append(ResourceManager.bgCaches.get(offset_1));
}
stringBuilder.append(FontNegative.NEG_1.getCharacter());
stringBuilder.append(ResourceManager.bgCaches.get(end)).append(offset);
return stringBuilder.toString();
}
public String getStart() {
return start;
}
public String getEnd() {
return end;
}
public int getOffset_y() {
return offset_y;
}
public String getOffset_1() {
return offset_1;
}
public String getOffset_2() {
return offset_2;
}
public String getOffset_4() {
return offset_4;
}
public String getOffset_8() {
return offset_8;
}
public String getOffset_16() {
return offset_16;
}
public String getOffset_32() {
return offset_32;
}
public String getOffset_64() {
return offset_64;
}
public String getOffset_128() {
return offset_128;
}
}

View File

@@ -0,0 +1,65 @@
/*
* 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.bossbar;
import net.kyori.adventure.bossbar.BossBar;
public class BossbarConfig {
private String text;
private BossBar.Overlay overlay;
private BossBar.Color color;
private int rate;
public BossbarConfig(String text, BossBar.Overlay overlay,
BossBar.Color color, int rate){
this.text = text;
this.rate = rate;
this.overlay = overlay;
this.color = color;
}
public BossBar.Color getColor() {
return color;
}
public int getRate() {
return rate;
}
public BossBar.Overlay getOverlay() {
return overlay;
}
public String getText() {
return text;
}
public void setColor(BossBar.Color color) {
this.color = color;
}
public void setOverlay(BossBar.Overlay overlay) {
this.overlay = overlay;
}
public void setRate(int rate) {
this.rate = rate;
}
public void setText(String text) {
this.text = text;
}
}

View File

@@ -0,0 +1,77 @@
/*
* 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.bossbar;
import me.clip.placeholderapi.PlaceholderAPI;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.bossbar.BossBar;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.momirealms.customnameplates.ConfigManager;
import net.momirealms.customnameplates.CustomNameplates;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
public class BossbarSender extends BukkitRunnable {
private final Player player;
private final Audience audience;
private BossBar bossBar;
private int timer;
private final BossbarConfig bossbarConfig;
public BossbarSender(Player player, BossbarConfig bossbarConfig){
this.player = player;
this.bossbarConfig = bossbarConfig;
audience = CustomNameplates.adventure.player(player);
this.timer = 0;
}
public void hideBossbar(){
audience.hideBossBar(bossBar);
}
public void showBossbar(){
if (ConfigManager.MainConfig.placeholderAPI){
String s = PlaceholderAPI.setPlaceholders(player, bossbarConfig.getText());
Component component = MiniMessage.miniMessage().deserialize(s);
bossBar = BossBar.bossBar(component,1,bossbarConfig.getColor(),bossbarConfig.getOverlay());
audience.showBossBar(bossBar);
}else {
Component component = MiniMessage.miniMessage().deserialize(bossbarConfig.getText());
bossBar = BossBar.bossBar(component,1,bossbarConfig.getColor(),bossbarConfig.getOverlay());
audience.showBossBar(bossBar);
}
}
@Override
public void run() {
if (timer < bossbarConfig.getRate()){
timer++;
}else {
if (ConfigManager.MainConfig.placeholderAPI){
bossBar.name(MiniMessage.miniMessage().deserialize(PlaceholderAPI.setPlaceholders(player, bossbarConfig.getText())));
}else {
bossBar.name(MiniMessage.miniMessage().deserialize(bossbarConfig.getText()));
}
bossBar.color(bossbarConfig.getColor());
bossBar.overlay(bossbarConfig.getOverlay());
timer = 0;
}
}
}

View File

@@ -0,0 +1,48 @@
/*
* 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.bossbar;
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 java.util.HashMap;
public class QuitAndJoin implements Listener {
public static HashMap<Player, TimerTask> cache = new HashMap<>();
@EventHandler
public void onJoin(PlayerJoinEvent event){
Player player = event.getPlayer();
TimerTask timerTask = new TimerTask(player);
cache.put(player, timerTask);
}
@EventHandler
public void onQuit(PlayerQuitEvent event){
Player player = event.getPlayer();
TimerTask timerTask = cache.get(player);
if (timerTask != null){
timerTask.stopTimer();
}
cache.remove(player);
}
}

View File

@@ -0,0 +1,47 @@
/*
* 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.bossbar;
import net.momirealms.customnameplates.ConfigManager;
import net.momirealms.customnameplates.CustomNameplates;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import java.util.HashMap;
public class TimerTask {
private final HashMap<Integer, BossbarSender> bossbarCache = new HashMap<>();
public TimerTask(Player player){
ConfigManager.bossbars.forEach((key, bossbarConfig) -> {
BossbarSender bossbar = new BossbarSender(player, bossbarConfig);
bossbar.showBossbar();
BukkitTask task = bossbar.runTaskTimerAsynchronously(CustomNameplates.instance, 1,1);
bossbarCache.put(task.getTaskId(), bossbar);
});
}
public void stopTimer(){
bossbarCache.forEach((key,value)-> {
value.hideBossbar();
Bukkit.getScheduler().cancelTask(key);
});
}
}

View File

@@ -1,3 +1,20 @@
/*
* 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.commands;
import com.comphenix.protocol.PacketType;
@@ -62,6 +79,12 @@ public class Execute implements CommandExecutor {
if (sender.hasPermission("customnameplates.reload") || sender.isOp()) {
ConfigManager.MainConfig.ReloadConfig();
ConfigManager.Message.ReloadConfig();
if (ConfigManager.actionbar){
ConfigManager.ActionbarConfig.LoadConfig();
}
if (ConfigManager.bossbar){
ConfigManager.loadBossBar();
}
if (sender instanceof Player) {
AdventureManager.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.reload);
} else {
@@ -72,6 +95,20 @@ public class Execute implements CommandExecutor {
}
return true;
}
case "generate" -> {
if (sender.hasPermission("customnameplates.generate") || sender.isOp()) {
ConfigManager.MainConfig.ReloadConfig();
plugin.getResourceManager().generateResourcePack();
if (sender instanceof Player) {
AdventureManager.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.generate);
}else {
AdventureManager.consoleMessage(ConfigManager.Message.prefix + ConfigManager.Message.generate);
}
} else {
AdventureManager.playerMessage((Player) sender, ConfigManager.Message.prefix + ConfigManager.Message.noPerm);
}
return true;
}
case "equip" -> {
if (sender instanceof Player player) {
if (args.length < 2) {
@@ -238,7 +275,7 @@ public class Execute implements CommandExecutor {
NameplateUtil nameplateUtil = new NameplateUtil(fontCache);
String playerPrefix;
String playerSuffix;
if (plugin.getHookManager().hasPlaceholderAPI()) {
if (ConfigManager.MainConfig.placeholderAPI) {
playerPrefix = ParsePapi.parsePlaceholders(player, ConfigManager.MainConfig.player_prefix);
playerSuffix = ParsePapi.parsePlaceholders(player, ConfigManager.MainConfig.player_suffix);
}else {

View File

@@ -1,3 +1,20 @@
/*
* 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.commands;
import net.momirealms.customnameplates.CustomNameplates;
@@ -37,6 +54,7 @@ public class TabComplete implements TabCompleter {
if (sender.hasPermission("customnameplates.forcepreview")) tab.add("forcepreview");
if (sender.hasPermission("customnameplates.preview")) tab.add("preview");
if (sender.hasPermission("customnameplates.list")) tab.add("list");
if (sender.hasPermission("customnameplates.generate")) tab.add("generate");
return tab;
}
if(2 == args.length){

View File

@@ -1,3 +1,20 @@
/*
* 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.data;
import net.momirealms.customnameplates.AdventureManager;
@@ -13,7 +30,7 @@ import java.util.UUID;
public class DataManager {
public static Map<UUID, PlayerData> cache;
private CustomNameplates plugin;
private final CustomNameplates plugin;
public DataManager(CustomNameplates plugin) {
this.plugin = plugin;

View File

@@ -1,3 +1,20 @@
/*
* 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.data;
public class PlayerData {

View File

@@ -1,3 +1,20 @@
/*
* 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.data;
import net.momirealms.customnameplates.AdventureManager;

View File

@@ -1,3 +1,20 @@
/*
* 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.font;
import net.momirealms.customnameplates.nameplates.NameplateConfig;

View File

@@ -1,5 +1,21 @@
package net.momirealms.customnameplates.font;
/*
* 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.font;
public record FontChar(char left, char middle, char right) {

View File

@@ -1,3 +1,20 @@
/*
* 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.font;
public enum FontNegative {

View File

@@ -1,3 +1,20 @@
/*
* 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.font;
public enum FontWidth {

View File

@@ -1,3 +1,20 @@
/*
* 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.font;
public enum FontWidthThin {

View File

@@ -1,44 +0,0 @@
package net.momirealms.customnameplates.hook;
import net.momirealms.customnameplates.AdventureManager;
import net.momirealms.customnameplates.ConfigManager;
import net.momirealms.customnameplates.CustomNameplates;
public class HookManager {
private boolean placeholderAPI;
private boolean itemsAdder;
public boolean hasPlaceholderAPI() {
return this.placeholderAPI;
}
public boolean hasItemsAdder() {
return this.itemsAdder;
}
public HookManager(CustomNameplates plugin) {
this.initializePlaceholderAPI();
this.initializeItemsAdder();
}
private void initializePlaceholderAPI() {
if(!ConfigManager.MainConfig.placeholderAPI){
this.placeholderAPI = false;
return;
}
if(CustomNameplates.instance.getServer().getPluginManager().getPlugin("PlaceholderAPI") != null){
AdventureManager.consoleMessage("<gradient:#2E8B57:#48D1CC>[CustomNameplates]</gradient> <color:#baffd1>PlaceholderAPI Hooked!");
this.placeholderAPI = true;
new Placeholders().register();
}
}
private void initializeItemsAdder() {
if (!ConfigManager.MainConfig.itemsAdder) {
this.itemsAdder = false;
}
if(CustomNameplates.instance.getServer().getPluginManager().getPlugin("ItemsAdder") != null){
this.itemsAdder = true;
}
}
}

View File

@@ -1,15 +1,30 @@
/*
* 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.hook;
import me.clip.placeholderapi.PlaceholderAPI;
import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
public class ParsePapi {
public static String parsePlaceholders(Player player, String papi) {
String s = StringUtils.replace(StringUtils.replace(papi, "%player_name%", player.getName()), "%player_displayname%", player.getDisplayName());
s = PlaceholderAPI.setPlaceholders(player, s);
return ChatColor.translateAlternateColorCodes('&', s);
return PlaceholderAPI.setPlaceholders(player, s);
}
}

View File

@@ -1,7 +1,34 @@
/*
* 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.hook;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import net.momirealms.customnameplates.ConfigManager;
import net.momirealms.customnameplates.background.BackGround;
import net.momirealms.customnameplates.font.FontCache;
import net.momirealms.customnameplates.font.FontWidth;
import net.momirealms.customnameplates.font.FontWidthThin;
import net.momirealms.customnameplates.nameplates.NameplateUtil;
import net.momirealms.customnameplates.resource.ResourceManager;
import net.momirealms.customnameplates.scoreboard.ScoreBoardManager;
import net.momirealms.customnameplates.utils.BGInfo;
import net.momirealms.customnameplates.utils.NPInfo;
import org.bukkit.OfflinePlayer;
import org.jetbrains.annotations.NotNull;
@@ -34,6 +61,54 @@ public class Placeholders extends PlaceholderExpansion {
return ScoreBoardManager.teams.get(player.getName()).getSuffixText();
}
}
if (params.startsWith("bg_")){
String bg = params.substring(3);
BGInfo bgInfo = ConfigManager.papiBG.get(bg);
if (bgInfo != null){
BackGround backGround = ConfigManager.backgrounds.get(bgInfo.getBackground());
if (backGround != null){
String text;
if (ConfigManager.MainConfig.placeholderAPI){
text = PlaceholderAPI.setPlaceholders(player, bgInfo.getText());
}else {
text = bgInfo.getText();
}
if (ConfigManager.MainConfig.thin_font){
return backGround.getBackGround(FontWidthThin.getTotalWidth(text));
}else {
return backGround.getBackGround(FontWidth.getTotalWidth(text));
}
}
}
}
if (params.startsWith("npp_")){
String np = params.substring(4);
NPInfo npInfo = ConfigManager.papiNP.get(np);
if (npInfo != null){
FontCache fontCache = ResourceManager.caches.get(npInfo.getNameplate());
if (fontCache != null){
if (ConfigManager.MainConfig.placeholderAPI){
return new NameplateUtil(fontCache).makeCustomNameplate("", PlaceholderAPI.setPlaceholders(player, npInfo.getText()),"");
}else {
return new NameplateUtil(fontCache).makeCustomNameplate("", npInfo.getText(),"");
}
}
}
}
if (params.startsWith("nps_")){
String np = params.substring(4);
NPInfo npInfo = ConfigManager.papiNP.get(np);
if (npInfo != null){
FontCache fontCache = ResourceManager.caches.get(npInfo.getNameplate());
if (fontCache != null){
if (ConfigManager.MainConfig.placeholderAPI){
return new NameplateUtil(fontCache).getSuffixLength(PlaceholderAPI.setPlaceholders(player, npInfo.getText()));
}else {
return new NameplateUtil(fontCache).getSuffixLength(npInfo.getText());
}
}
}
}
return null;
}
}

View File

@@ -1,3 +1,20 @@
/*
* 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;
@@ -27,7 +44,6 @@ public class PacketsListener extends PacketAdapter {
public void onPacketSending(PacketEvent event) {
Integer n = event.getPacket().getIntegers().read(0);
//create team && update team info
if (n != 0 && n != 2) {
return;
}
@@ -47,7 +63,6 @@ public class PacketsListener extends PacketAdapter {
internalStructure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0,ChatColor.WHITE);
return;
}
//在新建队伍名字的时候其实就是以玩家名命名,所以获得的teamName=playerName
if (team.getPrefix() != null){
internalStructure.getChatComponents().write(1, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(team.getPrefix())));
}

View File

@@ -1,3 +1,20 @@
/*
* 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 net.momirealms.customnameplates.CustomNameplates;

View File

@@ -1,29 +1,30 @@
/*
* 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.nameplates;
import org.bukkit.ChatColor;
public record NameplateConfig(ChatColor color, int height, String name, int yoffset) {
public static NameplateConfig EMPTY;
static {
EMPTY = new NameplateConfig(ChatColor.WHITE, 16, "none", 12);
}
//获取Team颜色
public ChatColor getColor() {
return this.color;
}
//获取自定义font大小
public int getHeight() {
return this.height;
}
//获取铭牌名
public String getName() {
return this.name;
}
public static NameplateConfig EMPTY = new NameplateConfig(ChatColor.WHITE, 16, "none", 12);
public ChatColor getColor() {return this.color;}
public int getHeight() {return this.height;}
public String getName() {return this.name;}
public int getyoffset() {return this.yoffset; }
}

View File

@@ -1,3 +1,20 @@
/*
* 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.nameplates;
import net.momirealms.customnameplates.ConfigManager;
@@ -15,10 +32,6 @@ public class NameplateUtil {
this.fontcache = font;
}
/*
根据玩家名构造长度适合的铭牌字符
当然这个玩家名是带上前缀与后缀的
*/
public String makeCustomNameplate(String prefix, String name, String suffix) {
int totalWidth;
if (ConfigManager.MainConfig.thin_font){
@@ -26,30 +39,26 @@ public class NameplateUtil {
}else {
totalWidth = FontWidth.getTotalWidth(ChatColor.stripColor(prefix + name + suffix));
}
boolean isEven = totalWidth % 2 == 0; //奇偶判断
boolean isEven = totalWidth % 2 == 0;
char left = this.fontcache.getChar().getLeft();
char middle = this.fontcache.getChar().getMiddle();
char right = this.fontcache.getChar().getRight();
char neg_1 = FontNegative.NEG_1.getCharacter();
int left_offset = totalWidth + 16 + 1;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(FontNegative.getShortestNegChars(isEven ? left_offset : left_offset + 1)); //先向左平移一个正方形的距离
stringBuilder.append(left).append(neg_1); //将铭牌的左部分拼接
int mid_amount = (totalWidth + 1) / 16; //显示名称的总长,如果超过一个正方形则多复制几个正方形
stringBuilder.append(FontNegative.getShortestNegChars(isEven ? left_offset : left_offset + 1));
stringBuilder.append(left).append(neg_1);
int mid_amount = (totalWidth + 1) / 16;
for (int i = 0; i < (mid_amount == 0 ? 1 : mid_amount); i++) {
stringBuilder.append(middle).append(neg_1); //减一是字符之间的间距3
stringBuilder.append(middle).append(neg_1);
}
stringBuilder.append(FontNegative.getShortestNegChars(16 - ((totalWidth + 1) % 16 + (isEven ? 0 : 1))));
stringBuilder.append(middle).append(neg_1);
stringBuilder.append(right).append(neg_1); //将铭牌的右部分拼接
stringBuilder.append(FontNegative.getShortestNegChars(isEven ? left_offset : left_offset + 1)); //首尾对称处理,保证铭牌位于正中央
stringBuilder.append(right).append(neg_1);
stringBuilder.append(FontNegative.getShortestNegChars(isEven ? left_offset : left_offset + 1));
return stringBuilder.toString();
}
/*
用于为增加了后缀的玩家名计算负空格
保证铭牌总是位于玩家头顶中央的位置
*/
public String getSuffixLength(String name) {
int totalWidth;
if (ConfigManager.MainConfig.thin_font){
@@ -60,9 +69,6 @@ public class NameplateUtil {
return FontNegative.getShortestNegChars(totalWidth + totalWidth % 2 + 1);
}
/*
获取铭牌上玩家名的颜色
*/
public ChatColor getColor() {
return this.fontcache.getConfig().getColor();
}

View File

@@ -1,3 +1,20 @@
/*
* 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.resource;
import com.google.gson.JsonArray;
@@ -6,6 +23,7 @@ import com.google.gson.JsonPrimitive;
import net.momirealms.customnameplates.ConfigManager;
import net.momirealms.customnameplates.CustomNameplates;
import net.momirealms.customnameplates.AdventureManager;
import net.momirealms.customnameplates.background.BackGround;
import net.momirealms.customnameplates.font.FontCache;
import net.momirealms.customnameplates.font.FontChar;
import net.momirealms.customnameplates.font.FontNegative;
@@ -20,40 +38,49 @@ import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
import static net.momirealms.customnameplates.ConfigManager.MainConfig.start;
public class ResourceManager {
public final HashMap<String, FontCache> caches;
public static HashMap<String, FontCache> caches = new HashMap<>();
public static HashMap<String, Character> bgCaches = new HashMap<>();
private final CustomNameplates plugin;
public ResourceManager(CustomNameplates plugin) {
this.caches = new HashMap<>();
this.plugin = plugin;
}
/*
此方法用于生成资源包
*/
public void generateResourcePack() {
File r_file = new File(CustomNameplates.instance.getDataFolder() + File.separator + "resources");
File b_file = new File(CustomNameplates.instance.getDataFolder() + File.separator + "backgrounds");
File g_file = new File(CustomNameplates.instance.getDataFolder() + File.separator + "generated");
//如果资源文件夹不存在则创建
if (!r_file.exists()) {
AdventureManager.consoleMessage("<gradient:#2E8B57:#48D1CC>[CustomNameplates]</gradient> <color:#F5F5F5>Failed to detect resources folder! Generating default resources...");
if (!r_file.mkdir()) {
AdventureManager.consoleMessage("<red>[CustomNameplates] Error! Failed to create resources folder...</red>");
return;
}
saveDefaultResources();
}
//获取资源文件夹下的所有png文件
if (!b_file.exists()) {
if (!b_file.mkdir()) {
AdventureManager.consoleMessage("<red>[CustomNameplates] Error! Failed to create resources folder...</red>");
return;
}
saveDefaultBGResources();
}
File[] pngFiles = r_file.listFiles(file -> file.getName().endsWith(".png"));
if (pngFiles == null) {
AdventureManager.consoleMessage("<red>[CustomNameplates] Error! No png files detected in resource folder...</red>");
return;
}
Arrays.sort(pngFiles); //将png文件按照首字母进行排序
deleteDirectory(g_file); //删除文件夹以重置自动生成的资源
Arrays.sort(pngFiles);
deleteDirectory(g_file);
File f_file = new File(CustomNameplates.instance.getDataFolder() + File.separator + "generated" + File.separatorChar + ConfigManager.MainConfig.namespace + File.separatorChar + "font");
File t_file = new File(CustomNameplates.instance.getDataFolder() + File.separator + "generated" + File.separatorChar + ConfigManager.MainConfig.namespace + File.separatorChar + "textures");
@@ -62,36 +89,49 @@ public class ResourceManager {
AdventureManager.consoleMessage("<red>[CustomNameplates] Error! Failed to generate resource pack folders...</red>");
return;
}
char start = ConfigManager.MainConfig.start_char.charAt(0); //获取起始字符
JsonObject jsonObject_1 = new JsonObject(); //新建json对象
JsonObject jsonObject_1 = new JsonObject();
JsonArray jsonArray_1 = new JsonArray();
jsonObject_1.add("providers", jsonArray_1);
for (File png : pngFiles) {
JsonObject jsonObject_2 = new JsonObject();
char left = start;
char middle;
char right;
start = (char)((right = (char)((middle = (char)(start + '\u0001')) + '\u0001')) + '\u0001'); //依次+1
FontChar fontChar = new FontChar(left, middle, right);
String pngName = png.getName().substring(0, png.getName().length() - 4); //删除.png后缀
NameplateConfig config = this.getConfiguration(pngName);
caches.put(pngName, new FontCache(pngName, fontChar, config));
jsonObject_2.add("type", new JsonPrimitive("bitmap"));
jsonObject_2.add("file", new JsonPrimitive(ConfigManager.MainConfig.namespace + ":" + ConfigManager.MainConfig.folder_path.replaceAll("\\\\","/") + png.getName().toLowerCase()));
jsonObject_2.add("ascent", new JsonPrimitive(config.getyoffset()));
jsonObject_2.add("height", new JsonPrimitive(config.getHeight()));
JsonArray jsonArray_2 = new JsonArray();
jsonArray_2.add(native2ascii(fontChar.getLeft()) + native2ascii(fontChar.getMiddle()) + native2ascii(fontChar.getRight()));
jsonObject_2.add("chars", jsonArray_2);
jsonArray_1.add(jsonObject_2);
try{
FileUtils.copyFile(png, new File(t_file.getPath() + File.separatorChar + ConfigManager.MainConfig.folder_path + png.getName()));
}catch (IOException e){
e.printStackTrace();
AdventureManager.consoleMessage("<red>[CustomNameplates] Error! Failed to copy png files to resource pack...</red>");
if (ConfigManager.nameplate){
for (File png : pngFiles) {
JsonObject jsonObject_2 = new JsonObject();
char left = start;
char middle;
char right;
start = (char)((right = (char)((middle = (char)(start + '\u0001')) + '\u0001')) + '\u0001');
FontChar fontChar = new FontChar(left, middle, right);
String pngName = png.getName().substring(0, png.getName().length() - 4);
NameplateConfig config = this.getConfiguration(pngName);
caches.put(pngName, new FontCache(pngName, fontChar, config));
jsonObject_2.add("type", new JsonPrimitive("bitmap"));
jsonObject_2.add("file", new JsonPrimitive(ConfigManager.MainConfig.namespace + ":" + ConfigManager.MainConfig.folder_path.replaceAll("\\\\","/") + png.getName().toLowerCase()));
jsonObject_2.add("ascent", new JsonPrimitive(config.getyoffset()));
jsonObject_2.add("height", new JsonPrimitive(config.getHeight()));
JsonArray jsonArray_2 = new JsonArray();
jsonArray_2.add(native2ascii(fontChar.getLeft()) + native2ascii(fontChar.getMiddle()) + native2ascii(fontChar.getRight()));
jsonObject_2.add("chars", jsonArray_2);
jsonArray_1.add(jsonObject_2);
try{
FileUtils.copyFile(png, new File(t_file.getPath() + File.separatorChar + ConfigManager.MainConfig.folder_path + png.getName()));
}catch (IOException e){
e.printStackTrace();
AdventureManager.consoleMessage("<red>[CustomNameplates] Error! Failed to copy png files to resource pack...</red>");
}
}
caches.put("none", FontCache.EMPTY);
}
caches.put("none", FontCache.EMPTY);
if (ConfigManager.background){
ConfigManager.backgrounds.forEach((key, backGround) -> {
getBackgrounds(backGround).forEach(jsonArray_1::add);
});
}
getNegativeFontEnums().forEach(jsonArray_1::add);
CustomNameplates.instance.saveResource("space_split.png", false); //复制space_split.png
try{
FileUtils.copyFile(new File(CustomNameplates.instance.getDataFolder(),"space_split.png"), new File(t_file.getPath() + File.separatorChar + ConfigManager.MainConfig.folder_path + "space_split.png"));
@@ -101,18 +141,17 @@ public class ResourceManager {
return;
}
new File(CustomNameplates.instance.getDataFolder(),"space_split.png").delete(); //删除拷贝出的默认文件
this.getNegativeFontEnums().forEach(jsonArray_1::add); //添加负空格
//存储default.json
try (FileWriter fileWriter = new FileWriter(f_file.getPath() + File.separatorChar + ConfigManager.MainConfig.font + ".json")) {
try (FileWriter fileWriter = new FileWriter(CustomNameplates.instance.getDataFolder() + File.separator + "generated" + File.separatorChar + ConfigManager.MainConfig.namespace + File.separatorChar + "font" + File.separatorChar + ConfigManager.MainConfig.font + ".json")) {
fileWriter.write(jsonObject_1.toString().replace("\\\\", "\\"));
} catch (IOException e) {
e.printStackTrace();
AdventureManager.consoleMessage("<red>[CustomNameplates] Error! Failed to generate font json...</red>");
return;
}
//资源包生成成功提示
AdventureManager.consoleMessage("<gradient:#2E8B57:#48D1CC>[CustomNameplates]</gradient> <color:#baffd1>ResourcePack has been generated! <white>" + (this.caches.size() -1) + " <color:#baffd1>nameplates loaded!");
if (this.plugin.getHookManager().hasItemsAdder()){
if (ConfigManager.MainConfig.itemsAdder){
try{
FileUtils.copyDirectory(g_file, new File(Bukkit.getPluginManager().getPlugin("ItemsAdder").getDataFolder() + File.separator + "data"+ File.separator + "resource_pack" + File.separator + "assets") );
AdventureManager.consoleMessage("<gradient:#2E8B57:#48D1CC>[CustomNameplates]</gradient> <color:#baffd1>Detected <color:#90EE90>ItemsAdder!<color:#baffd1> Automatically sent rp to ItemsAdder folder!");
@@ -123,17 +162,15 @@ public class ResourceManager {
}
}
/*
保存插件预设资源
*/
private void saveDefaultResources() {
List<String> list = Arrays.asList("cat", "egg", "cheems", "wither", "xmas", "halloween","hutao","starsky","trident","rabbit");
list.forEach(name -> CustomNameplates.instance.saveResource("resources" + File.separatorChar + name + ".png", false));
}
private void saveDefaultBGResources() {
List<String> list = Arrays.asList("b0", "b1", "b2", "b4", "b8", "b16","b32","b64","b128");
list.forEach(name -> CustomNameplates.instance.saveResource("backgrounds" + File.separatorChar + name + ".png", false));
}
/*
删除文件夹
*/
private void deleteDirectory(File file){
if(file.exists()){
try{
@@ -145,9 +182,6 @@ public class ResourceManager {
}
}
/*
获取铭牌的config
*/
private NameplateConfig getConfiguration(String nameplate) {
try {
File file = new File(CustomNameplates.instance.getDataFolder().getPath() + File.separator + "resources" + File.separator + nameplate + ".yml");
@@ -191,9 +225,6 @@ public class ResourceManager {
}
}
/*
获取负空格并返回list
*/
private List<JsonObject> getNegativeFontEnums() {
ArrayList<JsonObject> list = new ArrayList<>();
for (FontNegative negativeFont : FontNegative.values()) {
@@ -201,6 +232,7 @@ public class ResourceManager {
}
return list;
}
private JsonObject getNegativeFontChar(int height, char character) {
JsonObject jsonObject = new JsonObject();
jsonObject.add("type", new JsonPrimitive("bitmap"));
@@ -213,16 +245,10 @@ public class ResourceManager {
return jsonObject;
}
/*
根据铭牌名获取铭牌的FontCache
*/
public FontCache getNameplateInfo(String nameplate) {
return caches.get(nameplate);
}
/*
字符转换
*/
private String native2ascii(char ch) {
if (ch > '\u007f') {
StringBuilder stringBuilder_1 = new StringBuilder("\\u");
@@ -238,4 +264,41 @@ public class ResourceManager {
}
return Character.toString(ch);
}
private List<JsonObject> getBackgrounds(BackGround backGround) {
ArrayList<JsonObject> list = new ArrayList<>();
int y_offset = backGround.getOffset_y();
list.add(setBackgrounds(backGround.getStart(),y_offset));
list.add(setBackgrounds(backGround.getOffset_1(),y_offset));
list.add(setBackgrounds(backGround.getOffset_2(),y_offset));
list.add(setBackgrounds(backGround.getOffset_4(),y_offset));
list.add(setBackgrounds(backGround.getOffset_8(),y_offset));
list.add(setBackgrounds(backGround.getOffset_16(),y_offset));
list.add(setBackgrounds(backGround.getOffset_32(),y_offset));
list.add(setBackgrounds(backGround.getOffset_64(),y_offset));
list.add(setBackgrounds(backGround.getOffset_128(),y_offset));
list.add(setBackgrounds(backGround.getEnd(),y_offset));
return list;
}
private JsonObject setBackgrounds(String name, int y_offset){
JsonObject jsonObject_2 = new JsonObject();
jsonObject_2.add("type", new JsonPrimitive("bitmap"));
jsonObject_2.add("file", new JsonPrimitive(ConfigManager.MainConfig.namespace + ":" + ConfigManager.MainConfig.bg_folder_path.replaceAll("\\\\","/") + name.toLowerCase() + ".png"));
jsonObject_2.add("ascent", new JsonPrimitive(y_offset));
jsonObject_2.add("height", new JsonPrimitive(14));
JsonArray jsonArray_2 = new JsonArray();
char character = start;
jsonArray_2.add(native2ascii(character));
jsonObject_2.add("chars", jsonArray_2);
start = (char)(start + '\u0001');
bgCaches.put(name, character);
try{
FileUtils.copyFile(new File(CustomNameplates.instance.getDataFolder() + File.separator + "backgrounds" + File.separator + name + ".png"), new File(CustomNameplates.instance.getDataFolder() + File.separator + "generated" + File.separator + ConfigManager.MainConfig.namespace + File.separatorChar + "textures" + File.separator + ConfigManager.MainConfig.bg_folder_path + name + ".png"));
}catch (IOException e){
e.printStackTrace();
AdventureManager.consoleMessage("<red>[CustomNameplates] Error! Failed to copy background png files to resource pack...</red>");
}
return jsonObject_2;
}
}

View File

@@ -1,8 +1,26 @@
/*
* 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.scoreboard;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.momirealms.customnameplates.ConfigManager;
import net.momirealms.customnameplates.CustomNameplates;
import net.momirealms.customnameplates.data.DataManager;
@@ -27,32 +45,13 @@ public class NameplatesTeam {
private Component suffix;
private String prefixText;
private String suffixText;
private ChatColor color;
public void hideNameplate() {
this.team.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER);
}
public void showNameplate() {
this.team.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.ALWAYS);
}
public Component getPrefix() {
return this.prefix;
}
public Component getSuffix() {
return this.suffix;
}
public ChatColor getColor() {
return this.color;
}
public String getPrefixText() {
return prefixText;
}
public String getSuffixText() {
return suffixText;
}
public Component getPrefix() {return this.prefix;}
public Component getSuffix() {return this.suffix;}
public ChatColor getColor() {return this.color;}
public String getPrefixText() {return prefixText;}
public String getSuffixText() {return suffixText;}
public NameplatesTeam(CustomNameplates plugin, Player player) {
this.color = ChatColor.WHITE;
@@ -72,9 +71,8 @@ public class NameplatesTeam {
}else {
nameplate = "none";
}
//如果是空铭牌直接飞机票送走
if (nameplate.equals("none")) {
if (plugin.getHookManager().hasPlaceholderAPI()) {
if (ConfigManager.MainConfig.placeholderAPI) {
this.prefix = Component.text(ParsePapi.parsePlaceholders(this.player, ConfigManager.MainConfig.player_prefix));
this.suffix = Component.text(ParsePapi.parsePlaceholders(this.player, ConfigManager.MainConfig.player_suffix));
this.prefixText = ParsePapi.parsePlaceholders(this.player, ConfigManager.MainConfig.player_prefix);
@@ -89,7 +87,6 @@ public class NameplatesTeam {
this.team.setPrefix("");
return;
}
//根据铭牌名获取FontCache
FontCache fontCache = this.plugin.getResourceManager().getNameplateInfo(nameplate);
if (fontCache == null){
this.prefix = Component.text("");
@@ -103,8 +100,7 @@ public class NameplatesTeam {
String name = this.player.getName();
String playerPrefix;
String playerSuffix;
//有Papi才解析
if (plugin.getHookManager().hasPlaceholderAPI()) {
if (ConfigManager.MainConfig.placeholderAPI) {
if (!ConfigManager.MainConfig.hidePrefix){
playerPrefix = ParsePapi.parsePlaceholders(this.player, ConfigManager.MainConfig.player_prefix);
}else {
@@ -127,12 +123,14 @@ public class NameplatesTeam {
playerSuffix = "";
}
}
//最终prefix: 偏移 + 铭牌左 + 偏移 + 铭牌中 + 偏移 + 铭牌右 + 偏移 + 前缀
//最终suffix: 偏移 + 后缀
this.prefix = Component.text(nameplateUtil.makeCustomNameplate(playerPrefix, name, playerSuffix)).color(TextColor.color(255, 255, 255)).font(ConfigManager.MainConfig.key).append(Component.text(playerPrefix).font(Key.key("default")));
this.suffix = Component.text(playerSuffix).append(Component.text(nameplateUtil.getSuffixLength(playerPrefix + name + playerSuffix)).font(ConfigManager.MainConfig.key));
this.prefixText = nameplateUtil.makeCustomNameplate(playerPrefix, name, playerSuffix) + playerPrefix;
this.suffixText = playerSuffix + nameplateUtil.getSuffixLength(playerPrefix + name + playerSuffix);
this.prefixText = nameplateUtil.makeCustomNameplate(MiniMessage.miniMessage().stripTags(playerPrefix), name, MiniMessage.miniMessage().stripTags(playerSuffix));
this.suffixText = nameplateUtil.getSuffixLength(MiniMessage.miniMessage().stripTags(playerPrefix) + name + MiniMessage.miniMessage().stripTags(playerSuffix));
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.prefixText = nameplateUtil.makeCustomNameplate(playerPrefix, name, playerSuffix) + playerPrefix;
// this.suffixText = playerSuffix + nameplateUtil.getSuffixLength(playerPrefix + name + playerSuffix);
// this.prefix = Component.text(nameplateUtil.makeCustomNameplate(playerPrefix, name, playerSuffix)).font(ConfigManager.MainConfig.key).append(Component.text(playerPrefix).font(Key.key("default")));
// this.suffix = Component.text(playerSuffix).append(Component.text(nameplateUtil.getSuffixLength(playerPrefix + name + playerSuffix)).font(ConfigManager.MainConfig.key));
this.color = nameplateUtil.getColor();
this.team.setPrefix("");
}

View File

@@ -1,21 +1,32 @@
/*
* 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.scoreboard;
import net.momirealms.customnameplates.CustomNameplates;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map;
public class ScoreBoardManager {
public record ScoreBoardManager(CustomNameplates plugin) {
private final CustomNameplates plugin;
public static Map<String, NameplatesTeam> teams = new HashMap<>();
public ScoreBoardManager(CustomNameplates plugin) {
this.plugin = plugin;
}
public NameplatesTeam getOrCreateTeam(Player player) {
if (!teams.containsKey(player.getName())) {
teams.put(player.getName(), new NameplatesTeam(this.plugin, player));

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.utils;
public record BGInfo(String text, String background) {
public String getText() {
return text;
}
public String getBackground() {
return background;
}
}

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.utils;
public record NPInfo(String text, String nameplate) {
public String getText() {
return text;
}
public String getNameplate() {
return nameplate;
}
}

View File

@@ -1,3 +1,20 @@
/*
* 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.utils;
import com.zaxxer.hikari.HikariDataSource;

View File

@@ -0,0 +1,2 @@
text: '<font:nameplates:default>%nameplates_bg_player%</font>Hello! %player_name% <font:nameplates:default>%nameplates_bg_season%</font>Current Season: %customcrops_season%'
refresh-rate: 1

View File

@@ -0,0 +1,14 @@
background:
bedrock:
x-offset: 5
y-offset: 10
start: b0
offset_1: b1
offset_2: b2
offset_4: b4
offset_8: b8
offset_16: b16
offset_32: b32
offset_64: b64
offset_128: b128
end: b0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,13 @@
# You need a restart when you add/remove a bossbar
# There's a bug that font can't be applied to bossbar. This is an Adventure API bug that I can't fix for the moment.
bossbar:
example_1:
text: '<rainbow>Hi %player_name%! This is you nameplate!</rainbow>'
color: YELLOW
refresh-rate: 1
overlay: PROGRESS
example_2:
text: '<font:nameplates:default>%nameplates_prefix%</font><rainbow>Hello!</rainbow> %player_name%<red> %player_health_rounded%❤<font:nameplates:default>%nameplates_suffix%</font>'
color: WHITE
refresh-rate: 1
overlay: PROGRESS

View File

@@ -3,17 +3,28 @@ config:
# en/cn
lang: en
# Should the plugin hook into other plugins
integrations:
# When enabled, the plugin will be able to parse prefix and suffix
# Require restart to register papi
PlaceholderAPI: true
# When enabled, the plugin will automatically place the nameplates
# folder into the resource pack generated by ItemsAdder.
ItemsAdder: false
# Your namespace
# If you don't know how font works, don't change this
# Don't use minecraft:default or you will get no support
namespace: "nameplates"
# Font Name
# Recommended not to set "default" when you are using "minecraft" as your namespace.
# You can use font like "nameplate" instead.
# If you don't know how font works, don't change this
font: "default"
# Customize the folder where png files should be generated.
# This is useful for those who want to keep their resource pack structure in order.
folder-path: 'font\nameplates\'
nameplate-folder-path: 'font\nameplates\'
background-folder-path: 'font\backgrounds\'
# The initial character of all nameplates.
# 뀁 is the first character of Korean \ub001.
@@ -35,20 +46,12 @@ config:
# Placeholder based prefix and suffix system. When enabled, it is recommended
# to use PlaceholderAPI to be able to use this feature to the fullest extent.
# keep it empty if you don't want to enable this feature.
prefix: ''
suffix: ''
prefix: '<font:default>%vault_prefix%</font>'
suffix: '<font:default><red> %player_health_rounded%❤</font>'
# should prefix/suffix be hidden when player is equipping a nameplate
hide-prefix-when-equipped: false
hide-suffix-when-equipped: false
# Thin-font support
use-thin-font: false
# Should the plugin hook into other plugins
integrations:
# When enabled, the plugin will be able to parse prefix and suffix
PlaceholderAPI: false
# When enabled, the plugin will automatically place the nameplates
# folder into the resource pack generated by ItemsAdder.
ItemsAdder: false
use-thin-font: false

View File

@@ -0,0 +1,23 @@
# %nameplates_bg_xx% BackGround
# %nameplates_npp_xx% NamePlatePrefix
# %nameplates_nps_xx% NamePlateSuffix
papi:
#This papi will not return text with background
#It will only return the background
#So you need to do something like this in your bossbar/actionbar plugin:
#<font:nameplate:default>%nameplates_bg_player%<font:minecraft:default>Hello! %player_name%
player:
text: 'Hello! %player_name%'
background: bedrock
season:
text: 'Current Season: %customcrops_season%'
background: bedrock
#This papi will not return text with nameplate
#It will only return the nameplate
#So you need to do something like this in your bossbar/actionbar plugin:
#<font:nameplates:default>%nameplates_npp_halloween%</font>%player_name% Trick or Treat!<font:nameplates:default>%nameplates_nps_halloween%</font>
halloween:
text: '%player_name% Trick or Treat!'
nameplate: halloween

View File

@@ -13,4 +13,5 @@ messages:
no-console: '<white>这个指令不能由控制台执行!</white>'
not-available: '<white>你还未拥有这个铭牌!</white>'
available: '<white>可用铭牌: {Nameplates}</white>'
cooldown: '<white>上一个预览还没结束!</white>'
cooldown: '<white>上一个预览还没结束!</white>'
generate: '<white>正在生成资源包...</white>'

View File

@@ -13,4 +13,5 @@ messages:
no-console: '<white>This command can be only executed by player!</white>'
not-available: '<white>This nameplate is currently not available!</white>'
available: '<white>Available nameplates: {Nameplates}.</white>'
cooldown: '<white>Previewing is still Ongoing!</white>'
cooldown: '<white>Previewing is still Ongoing!</white>'
generate: '<white>Resource Pack is generating..</white>'

View File

@@ -0,0 +1,5 @@
#Modules require a restart
nameplate: true
background: true
bossbar: true
actionbar: true