From ffe27ee24c5e60ed9c642892b139c4c7dff32812 Mon Sep 17 00:00:00 2001 From: LabodiDavid Date: Mon, 16 Dec 2024 23:40:26 +0100 Subject: [PATCH] v1.2.3 --- README.md | 10 +- docs/ChangeLog.md | 18 ++- docs/img/ST.png | Bin 0 -> 3813 bytes docs/img/SimplifyTools.png | Bin 0 -> 19063 bytes .../hu/ditservices/handlers/TabHandler.java | 125 +++++------------- .../utils/reflection/ClazzContainer.java | 2 + .../utils/reflection/Reflection.java | 8 +- src/main/resources/plugin.yml | 2 +- 8 files changed, 64 insertions(+), 101 deletions(-) create mode 100644 docs/img/ST.png create mode 100644 docs/img/SimplifyTools.png diff --git a/README.md b/README.md index bd48dd5..98d3bf3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# SimplifyTools +![SimplifyTools logo](docs/img/SimplifyTools.png) ### An 'All-in-one' plugin for MC servers. #### TabList Customizing, Custom Advancement, Connect messages, AutoSave, Logger - [![Build Status](https://ci.ditservices.hu/job/SimplifyTools/badge/icon)](https://ci.ditservices.hu/job/SimplifyTools/) ![ MC Version](https://ci.ditservices.hu/job/SimplifyTools/badge/icon?subject=MC&status=1.12%20-%201.20.1&color=darkblue) ![Git latest release](https://img.shields.io/github/v/release/LabodiDavid/SimplifyTools) [![bStats](https://ci.ditservices.hu/job/SimplifyTools/badge/icon?subject=bStats&status=3.0&color=brightgreen)](https://bstats.org/plugin/bukkit/SimplifyTools/15108) ![Lines of code](https://tokei.rs/b1/github/LabodiDavid/SimplifyTools?category=code) + [![Build Status](https://ci.ditservices.hu/job/SimplifyTools/badge/icon)](https://ci.ditservices.hu/job/SimplifyTools/) ![ MC Version](https://ci.ditservices.hu/job/SimplifyTools/badge/icon?subject=MC&status=1.12%20-%201.21.4&color=darkblue) ![Git latest release](https://img.shields.io/github/v/release/LabodiDavid/SimplifyTools) [![bStats](https://ci.ditservices.hu/job/SimplifyTools/badge/icon?subject=bStats&status=3.0&color=brightgreen)](https://bstats.org/plugin/bukkit/SimplifyTools/15108) ![Lines of code](https://tokei.rs/b1/github/LabodiDavid/SimplifyTools?category=code)
[Changelog](docs/ChangeLog.md)
@@ -23,6 +23,11 @@ (Note: The advancement names are currently only can be displayed in english. In future versions there will be a feature to translate to any languages.) ![Advancement Messages preview](docs/img/4.gif) - **Logging** - A logger with fully customizable format for dis/connect, chat, commands actions. +_________________ +### Dependencies +#### From version [v1.2.3](https://github.com/LabodiDavid/SimplifyTools/releases/tag/1.2.3) the plugin requires [ProtocolLib](https://github.com/dmulloy2/ProtocolLib/) +_________________ + ### [Check the config file for more explanation and examples](https://github.com/LabodiDavid/SimplifyTools/blob/main/src/main/resources/config.yml) _________________ ### [Commands & Permissions](docs/cmd_perms.md) @@ -35,5 +40,6 @@ _________________ My main goal is to create a single plugin that has many features, so it's can replace plugins that i often use on my servers while lowering the plugins count. _________________ ## 3rd party libraries used by this plugin +### [ProtocolLib by dmulloy2](https://github.com/dmulloy2/ProtocolLib/) ### [Config-Updater by tchristofferson](https://github.com/tchristofferson/Config-Updater) ### [SpigotUpdateChecker by JEFF-Media-GbR](https://github.com/JEFF-Media-GbR/Spigot-UpdateChecker) \ No newline at end of file diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index dd6917f..22fe3ab 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -1,21 +1,29 @@ # SimplifyTools - Changelog -- 1.2.1 +- **1.2.3** + - Added support for version up to 1.21.4 + - The plugin now depends on, requires ProtocolLib (https://github.com/dmulloy2/ProtocolLib/) + - Tab feature adjustments, refactor for ProtocolLib + - Removed Reflection (~300 lines of code) + - Showing more feature setting statuses in `/st settings` +- **1.2.2** + - Added support for version up to 1.20.2 +- **1.2.1** - Added support for version up to 1.20.1 - Plugin manager added setting, now disabled by default in the config. - Removed coloring of the logs in the server console - TPS number displayed in the TAB now rounded to the nearest integer. - Minor code refactors - - 1.2.0 + - **1.2.0** - Added TPS command `/st tps` - Added `{MOTD}`, `{TPS}` variable for TAB customization in the config - Refactored code for multi version support (1.12 - 1.19.3) - Fixes [#1](https://github.com/LabodiDavid/SimplifyTools/issues/1) - - 1.1.0 + - **1.1.0** - Updated to 1.18.2 - Minor changes - Temporarily reworked Plugin Manager - Added Update Checker (https://github.com/JEFF-Media-GbR/Spigot-UpdateChecker) - Implemented Metrics (bStats) - - 1.0.0 - First Release - - Notice: If the /st reload command not reloading the new settings, you need to restart your MC server. + - **1.0.0** - First Release + - Notice: If the `/st reload` command not reloading the new settings, you need to restart your MC server. diff --git a/docs/img/ST.png b/docs/img/ST.png new file mode 100644 index 0000000000000000000000000000000000000000..633a95d751d640826c551be66cb00220c2f4f86c GIT binary patch literal 3813 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 E0IoYV`Tzg` literal 0 HcmV?d00001 diff --git a/docs/img/SimplifyTools.png b/docs/img/SimplifyTools.png new file mode 100644 index 0000000000000000000000000000000000000000..c05072771dbf25c253ea3a4269584fbab15daba2 GIT binary patch literal 19063 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 headers = new ArrayList<>(); - public final List footers = new ArrayList<>(); - public final List headerComponents = new ArrayList<>(); public final List footerComponents = new ArrayList<>(); @@ -37,31 +33,20 @@ public class TabHandler { private int count2 = 0; //footers private Object packet; - private boolean isNewerThan1_20_2; - - public TabHandler() throws Exception { + public TabHandler() { this.plugin = STPlugin.getInstance(); - this.isNewerThan1_20_2 = Version.ServerVersion.isCurrentHigher(Version.ServerVersion.v1_20_R2); + if(this.init()){ - if ((headers.isEmpty() && footers.isEmpty() && !isNewerThan1_20_2) - || (headerComponents.isEmpty() && footerComponents.isEmpty() && isNewerThan1_20_2)){ - plugin.getLogger().warning(plugin.getPrefix()+"TAB customization disabled because empty customization config!"); + if (headerComponents.isEmpty() && footerComponents.isEmpty()){ + plugin.getLogger().warning(plugin.getPrefix()+"TAB customization disabled because empty customization config or feature related errors!"); return; } this.updateTab(); - /*packet = plugin.getProtocolManager().createPacket(PacketType.Play.Server.PLAYER_LIST_HEADER_FOOTER); - boolean both = headers.size() > 0 && footers.size() > 0; - boolean header = !both && headers.size() > 0; - boolean footer = !both && footers.size() > 0;*/ - - //scheduleSyncRepeatingTask - //Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new TabRunnable(this),20, Math.convert(Math.Convert.SECONDS,Math.Convert.TICKS,this.refreshRate)); } } - - private boolean init() throws Exception { + private boolean init() { if (plugin.getConfig().getBoolean("Tab.enabled")){ int availProcessors = Server.getCpuCores(); @@ -124,20 +109,12 @@ public class TabHandler { if (Bukkit.getOnlinePlayers().isEmpty()){ return; } - if (isNewerThan1_20_2) { - if (count1 >= headerComponents.size()) { - count1 = 0; - } - if (count2 >= footerComponents.size()) { - count2 = 0; - } - } else { - if (count1 >= headers.size()) { - count1 = 0; - } - if (count2 >= footers.size()) { - count2 = 0; - } + + if (count1 >= headerComponents.size()) { + count1 = 0; + } + if (count2 >= footerComponents.size()) { + count2 = 0; } //Re adding all lines where we replaced something like the RAM usage to every refresh @@ -153,36 +130,21 @@ public class TabHandler { } } - if (Version.ServerVersion.isCurrentEqualOrLower(Version.ServerVersion.v1_12_R1)) { - packet = ClazzContainer.buildPacketPlayOutPlayerListHeaderFooter(headers.get(count1),footers.get(count2)); - for (Player player : Bukkit.getOnlinePlayers()){ - Reflection.sendPacket(player,packet); - } - } else if (Version.ServerVersion.isCurrentHigher(Version.ServerVersion.v1_20_R2)) { - // Use ProtocolLib for versions higher than 1.20.2 - ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); - PacketContainer packet = protocolManager.createPacket(com.comphenix.protocol.PacketType.Play.Server.PLAYER_LIST_HEADER_FOOTER); + ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + PacketContainer packet = protocolManager.createPacket(com.comphenix.protocol.PacketType.Play.Server.PLAYER_LIST_HEADER_FOOTER); - // Set header and footer - packet.getChatComponents().write(0, headerComponents.get(count1)); - packet.getChatComponents().write(1, footerComponents.get(count2)); + packet.getChatComponents().write(0, headerComponents.get(count1)); + packet.getChatComponents().write(1, footerComponents.get(count2)); - // Send the packet to all players - for (Player player : Bukkit.getOnlinePlayers()) { - protocolManager.sendServerPacket(player, packet); - } - } else { - // Use the built-in Spigot API for versions between 1.13 and 1.20.1 - for (Player player : Bukkit.getOnlinePlayers()) { - player.setPlayerListHeaderFooter(headers.get(count1), footers.get(count2)); - } + for (Player player : Bukkit.getOnlinePlayers()) { + protocolManager.sendServerPacket(player, packet); } - if (headers.size() > 1 || headerComponents.size() > 1) { + if (headerComponents.size() > 1) { count1++; } - if (footers.size() > 1 || footerComponents.size() > 1) { + if (footerComponents.size() > 1) { count2++; } @@ -199,47 +161,28 @@ public class TabHandler { * Manages the adding of the tab line and the final formatting of the text. * @param header If true the text will be added to the header, otherwise to the footer. * @param text The formatted tab line text. - * @param dynamic If the text contains a replace which need to run every tab refresh then it's true. + * @param dynamic If the text contains a replacement which need to run every tab refresh then it's true. * @param index Index of the 'dynamic' line. This is an overloading so there we need the index[0] element. */ private void addHeaderFooter(boolean header,String text,boolean dynamic,int... index) { try { String Json = "{\"text\": \""+format(text)+"\"}"; - boolean isNewerThan1202 = Version.ServerVersion.isCurrentHigher(Version.ServerVersion.v1_20_R2); + WrappedChatComponent tabText = WrappedChatComponent.fromJson(Json); - if (isNewerThan1202) { - WrappedChatComponent tabText = WrappedChatComponent.fromJson(Json); - - if (header){ - if (dynamic){ - headerComponents.set(index[0], tabText); - }else { - headerComponents.add(tabText); - } - }else{ - if (dynamic){ - footerComponents.set(index[0], tabText); - }else { - footerComponents.add(tabText); - } + if (header){ + if (dynamic){ + headerComponents.set(index[0], tabText); + }else { + headerComponents.add(tabText); } - } else { - Object tabText = Reflection.asChatSerializer(Json); - - if (header){ - if (dynamic){ - headers.set(index[0], Reflection.getChatSerializerString(tabText)); - }else { - headers.add(Reflection.getChatSerializerString(tabText)); - } - }else{ - if (dynamic){ - footers.set(index[0], Reflection.getChatSerializerString(tabText)); - }else { - footers.add(Reflection.getChatSerializerString(tabText)); - } + }else{ + if (dynamic){ + footerComponents.set(index[0], tabText); + } else { + footerComponents.add(tabText); } } + } catch (Exception e){ e.printStackTrace(); } diff --git a/src/main/java/hu/ditservices/utils/reflection/ClazzContainer.java b/src/main/java/hu/ditservices/utils/reflection/ClazzContainer.java index 0177100..79527d0 100644 --- a/src/main/java/hu/ditservices/utils/reflection/ClazzContainer.java +++ b/src/main/java/hu/ditservices/utils/reflection/ClazzContainer.java @@ -1,3 +1,4 @@ +/* package hu.ditservices.utils.reflection; import hu.ditservices.utils.Version; @@ -91,3 +92,4 @@ public final class ClazzContainer { return packet; } } +*/ diff --git a/src/main/java/hu/ditservices/utils/reflection/Reflection.java b/src/main/java/hu/ditservices/utils/reflection/Reflection.java index f24f188..3a424fa 100644 --- a/src/main/java/hu/ditservices/utils/reflection/Reflection.java +++ b/src/main/java/hu/ditservices/utils/reflection/Reflection.java @@ -1,3 +1,4 @@ +/* package hu.ditservices.utils.reflection; import hu.ditservices.utils.Version; @@ -100,7 +101,8 @@ public class Reflection { //return ClazzContainer.getIChatBaseComponent().cast(chatSerializerMethodA.invoke(chatSerializer, json)); } - /*public static Class getNMSClassRegex(String nmsClass) { + */ +/*public static Class getNMSClassRegex(String nmsClass) { String version = null; Pattern pat = Pattern.compile("net\\.minecraft\\.(?:server)?\\.(v(?:\\d_)+R\\d)"); @@ -118,5 +120,7 @@ public class Reflection { return null; } - }*/ + }*//* + } +*/ diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c83934b..2bab73d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -7,7 +7,7 @@ load: POSTWORLD description: SimplifyTools - An All-in-one helper plugin. author: SimplifyDave website: https://ditservices.hu -#depend: [ProtocolLib] +depend: [ ProtocolLib ] commands: st: description: The default command for the plugin.