From 65c43dfd82d91dc1c6473ad7ba139d09cab7cfa8 Mon Sep 17 00:00:00 2001 From: JaTiTV Date: Sun, 28 Nov 2021 02:13:21 +0100 Subject: [PATCH] Initial Commit --- .idea/.gitignore | 3 + .idea/artifacts/T2CodeLib.xml | 8 + .idea/artifacts/T2CodeLib_1_0_0_32.xml | 8 + .idea/artifacts/T2CodeLib_7_3.xml | 8 + .idea/compiler.xml | 16 + .idea/discord.xml | 7 + .idea/encodings.xml | 7 + .idea/jarRepositories.xml | 45 + .idea/libraries/1_13_R2.xml | 11 + ...aven__com_github_MilkBowl_VaultAPI_1_7.xml | 13 + ...Maven__com_google_code_gson_gson_2_8_0.xml | 13 + .../Maven__com_google_guava_guava_21_0.xml | 13 + ...oglecode_json_simple_json_simple_1_1_1.xml | 13 + .../Maven__commons_lang_commons_lang_2_6.xml | 13 + ...en__io_netty_netty_buffer_4_1_65_Final.xml | 13 + ...ven__io_netty_netty_codec_4_1_65_Final.xml | 13 + ...en__io_netty_netty_common_4_1_65_Final.xml | 13 + ...__io_netty_netty_resolver_4_1_65_Final.xml | 13 + ..._io_netty_netty_transport_4_1_65_Final.xml | 13 + ...nsport_native_unix_common_4_1_65_Final.xml | 13 + .idea/libraries/Maven__junit_junit_4_10.xml | 13 + .../Maven__me_clip_placeholderapi_2_9_2.xml | 13 + ...en__net_md_5_brigadier_1_0_16_SNAPSHOT.xml | 13 + ...md_5_bungeecord_api_1_17_R0_1_SNAPSHOT.xml | 13 + ...en__net_md_5_bungeecord_chat_1_16_R0_4.xml | 13 + ...5_bungeecord_config_1_17_R0_1_SNAPSHOT.xml | 13 + ..._5_bungeecord_event_1_17_R0_1_SNAPSHOT.xml | 13 + ...bungeecord_protocol_1_17_R0_1_SNAPSHOT.xml | 13 + .../Maven__net_sf_trove4j_core_3_1_0.xml | 13 + .../Maven__org_hamcrest_hamcrest_core_1_1.xml | 13 + .../Maven__org_yaml_snakeyaml_1_28.xml | 13 + .../Maven__se_llbit_jo_nbt_1_3_0.xml | 13 + .idea/misc.xml | 19 + .idea/modules.xml | 8 + .idea/runConfigurations.xml | 10 + .idea/uiDesigner.xml | 124 +++ .idea/vcs.xml | 6 + T2CodeLib.iml | 52 ++ pom.xml | 114 +++ .../java/net/t2code/lib/Bungee/BMain.java | 42 + .../t2code/lib/Bungee/Lib/commands/BTab.java | 66 ++ .../t2code/lib/Bungee/Lib/commands/Bcmd.java | 13 + .../Bungee/Lib/messages/BT2CodeTemplate.java | 38 + .../t2code/lib/Bungee/Lib/messages/Bsend.java | 61 ++ .../lib/Bungee/Lib/replace/BReplace.java | 36 + .../lib/Bungee/Lib/update/BUpdateAPI.java | 104 +++ .../lib/Bungee/Lib/update/BUpdateObject.java | 12 + .../net/t2code/lib/Bungee/system/BLoad.java | 26 + .../t2code/lib/Bungee/system/BMetrics.java | 851 ++++++++++++++++++ .../t2code/lib/Spigot/Lib/commands/Cmd.java | 14 + .../t2code/lib/Spigot/Lib/commands/Tab.java | 104 +++ .../lib/Spigot/Lib/items/ItemVersion.java | 15 + .../Spigot/Lib/messages/T2CodeTemplate.java | 89 ++ .../lib/Spigot/Lib/messages/TextBuilder.java | 45 + .../t2code/lib/Spigot/Lib/messages/send.java | 64 ++ .../Lib/minecraftVersion/MCVersion.java | 34 + .../Lib/minecraftVersion/NMSVersion.java | 47 + .../lib/Spigot/Lib/plugins/PluginCheck.java | 77 ++ .../lib/Spigot/Lib/register/Register.java | 38 + .../lib/Spigot/Lib/replace/Replace.java | 90 ++ .../lib/Spigot/Lib/update/UpdateAPI.java | 167 ++++ .../lib/Spigot/Lib/update/UpdateObject.java | 14 + .../t2code/lib/Spigot/Lib/vault/Vault.java | 68 ++ .../Spigot/Lib/yamlConfiguration/Config.java | 189 ++++ .../t2code/lib/Spigot/system/CmdExecuter.java | 110 +++ .../lib/Spigot/system/CreateReportLog.java | 179 ++++ .../t2code/lib/Spigot/system/JoinEvent.java | 19 + .../net/t2code/lib/Spigot/system/Main.java | 109 +++ .../net/t2code/lib/Spigot/system/Metrics.java | 851 ++++++++++++++++++ .../Spigot/system/config/ConfigCreate.java | 67 ++ .../Spigot/system/config/SelectLibConfig.java | 24 + .../system/languages/LanguagesCreate.java | 78 ++ .../lib/Spigot/system/languages/MSG.java | 22 + .../Spigot/system/languages/SelectLibMsg.java | 48 + src/main/java/net/t2code/lib/Util.java | 9 + src/main/resources/bungee.yml | 5 + src/main/resources/plugin.yml | 18 + target/classes/bungee.yml | 5 + .../classes/net/t2code/lib/Bungee/BMain.class | Bin 0 -> 2248 bytes .../t2code/lib/Bungee/Lib/commands/BTab.class | Bin 0 -> 3803 bytes .../t2code/lib/Bungee/Lib/commands/Bcmd.class | Bin 0 -> 1037 bytes .../Bungee/Lib/messages/BT2CodeTemplate.class | Bin 0 -> 2492 bytes .../lib/Bungee/Lib/messages/Bsend.class | Bin 0 -> 2798 bytes .../lib/Bungee/Lib/replace/BReplace.class | Bin 0 -> 2138 bytes .../lib/Bungee/Lib/update/BUpdateAPI$1.class | Bin 0 -> 3802 bytes .../lib/Bungee/Lib/update/BUpdateAPI.class | Bin 0 -> 6356 bytes .../lib/Bungee/Lib/update/BUpdateObject.class | Bin 0 -> 571 bytes .../net/t2code/lib/Bungee/system/BLoad.class | Bin 0 -> 2257 bytes .../t2code/lib/Bungee/system/BMetrics$1.class | Bin 0 -> 230 bytes .../system/BMetrics$AdvancedBarChart.class | Bin 0 -> 2562 bytes .../Bungee/system/BMetrics$AdvancedPie.class | Bin 0 -> 2661 bytes .../Bungee/system/BMetrics$CustomChart.class | Bin 0 -> 2588 bytes .../Bungee/system/BMetrics$DrilldownPie.class | Bin 0 -> 3142 bytes ...Metrics$JsonObjectBuilder$JsonObject.class | Bin 0 -> 994 bytes .../system/BMetrics$JsonObjectBuilder.class | Bin 0 -> 5794 bytes .../Bungee/system/BMetrics$MetricsBase.class | Bin 0 -> 12722 bytes .../system/BMetrics$MultiLineChart.class | Bin 0 -> 2670 bytes .../system/BMetrics$SimpleBarChart.class | Bin 0 -> 2586 bytes .../Bungee/system/BMetrics$SimplePie.class | Bin 0 -> 1629 bytes .../system/BMetrics$SingleLineChart.class | Bin 0 -> 1631 bytes .../t2code/lib/Bungee/system/BMetrics.class | Bin 0 -> 8577 bytes .../t2code/lib/Spigot/Lib/commands/Cmd.class | Bin 0 -> 1080 bytes .../t2code/lib/Spigot/Lib/commands/Tab.class | Bin 0 -> 4965 bytes .../lib/Spigot/Lib/items/ItemVersion.class | Bin 0 -> 812 bytes .../Spigot/Lib/messages/T2CodeTemplate.class | Bin 0 -> 4318 bytes .../messages/TextBuilder$ClickEventType.class | Bin 0 -> 1574 bytes .../lib/Spigot/Lib/messages/TextBuilder.class | Bin 0 -> 2174 bytes .../t2code/lib/Spigot/Lib/messages/send.class | Bin 0 -> 3357 bytes .../Lib/minecraftVersion/MCVersion.class | Bin 0 -> 1646 bytes .../Lib/minecraftVersion/NMSVersion.class | Bin 0 -> 1957 bytes .../lib/Spigot/Lib/plugins/PluginCheck.class | Bin 0 -> 3820 bytes .../lib/Spigot/Lib/register/Register.class | Bin 0 -> 2276 bytes .../lib/Spigot/Lib/replace/Replace.class | Bin 0 -> 4242 bytes .../lib/Spigot/Lib/update/UpdateAPI$1.class | Bin 0 -> 986 bytes .../lib/Spigot/Lib/update/UpdateAPI$2.class | Bin 0 -> 1417 bytes .../lib/Spigot/Lib/update/UpdateAPI$3$1.class | Bin 0 -> 1412 bytes .../lib/Spigot/Lib/update/UpdateAPI$3.class | Bin 0 -> 3727 bytes .../lib/Spigot/Lib/update/UpdateAPI.class | Bin 0 -> 8636 bytes .../lib/Spigot/Lib/update/UpdateObject.class | Bin 0 -> 568 bytes .../t2code/lib/Spigot/Lib/vault/Vault.class | Bin 0 -> 3924 bytes .../Spigot/Lib/yamlConfiguration/Config.class | Bin 0 -> 8359 bytes .../lib/Spigot/system/CmdExecuter$1.class | Bin 0 -> 627 bytes .../lib/Spigot/system/CmdExecuter.class | Bin 0 -> 4628 bytes .../lib/Spigot/system/CreateReportLog.class | Bin 0 -> 8951 bytes .../t2code/lib/Spigot/system/JoinEvent.class | Bin 0 -> 1201 bytes .../net/t2code/lib/Spigot/system/Main.class | Bin 0 -> 5904 bytes .../t2code/lib/Spigot/system/Metrics$1.class | Bin 0 -> 227 bytes .../system/Metrics$AdvancedBarChart.class | Bin 0 -> 2550 bytes .../Spigot/system/Metrics$AdvancedPie.class | Bin 0 -> 2649 bytes .../Spigot/system/Metrics$CustomChart.class | Bin 0 -> 2574 bytes .../Spigot/system/Metrics$DrilldownPie.class | Bin 0 -> 3130 bytes ...Metrics$JsonObjectBuilder$JsonObject.class | Bin 0 -> 986 bytes .../system/Metrics$JsonObjectBuilder.class | Bin 0 -> 5774 bytes .../Spigot/system/Metrics$MetricsBase.class | Bin 0 -> 12689 bytes .../system/Metrics$MultiLineChart.class | Bin 0 -> 2658 bytes .../system/Metrics$SimpleBarChart.class | Bin 0 -> 2574 bytes .../lib/Spigot/system/Metrics$SimplePie.class | Bin 0 -> 1620 bytes .../system/Metrics$SingleLineChart.class | Bin 0 -> 1622 bytes .../t2code/lib/Spigot/system/Metrics.class | Bin 0 -> 9300 bytes .../Spigot/system/config/ConfigCreate.class | Bin 0 -> 3334 bytes .../system/config/SelectLibConfig.class | Bin 0 -> 1283 bytes .../system/languages/LanguagesCreate.class | Bin 0 -> 3017 bytes .../lib/Spigot/system/languages/MSG.class | Bin 0 -> 1077 bytes .../system/languages/SelectLibMsg.class | Bin 0 -> 2736 bytes target/classes/net/t2code/lib/Util.class | Bin 0 -> 939 bytes target/classes/plugin.yml | 18 + 146 files changed, 4611 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/artifacts/T2CodeLib.xml create mode 100644 .idea/artifacts/T2CodeLib_1_0_0_32.xml create mode 100644 .idea/artifacts/T2CodeLib_7_3.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/discord.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/libraries/1_13_R2.xml create mode 100644 .idea/libraries/Maven__com_github_MilkBowl_VaultAPI_1_7.xml create mode 100644 .idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml create mode 100644 .idea/libraries/Maven__com_google_guava_guava_21_0.xml create mode 100644 .idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml create mode 100644 .idea/libraries/Maven__commons_lang_commons_lang_2_6.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_buffer_4_1_65_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_codec_4_1_65_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_common_4_1_65_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_resolver_4_1_65_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_transport_4_1_65_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_transport_native_unix_common_4_1_65_Final.xml create mode 100644 .idea/libraries/Maven__junit_junit_4_10.xml create mode 100644 .idea/libraries/Maven__me_clip_placeholderapi_2_9_2.xml create mode 100644 .idea/libraries/Maven__net_md_5_brigadier_1_0_16_SNAPSHOT.xml create mode 100644 .idea/libraries/Maven__net_md_5_bungeecord_api_1_17_R0_1_SNAPSHOT.xml create mode 100644 .idea/libraries/Maven__net_md_5_bungeecord_chat_1_16_R0_4.xml create mode 100644 .idea/libraries/Maven__net_md_5_bungeecord_config_1_17_R0_1_SNAPSHOT.xml create mode 100644 .idea/libraries/Maven__net_md_5_bungeecord_event_1_17_R0_1_SNAPSHOT.xml create mode 100644 .idea/libraries/Maven__net_md_5_bungeecord_protocol_1_17_R0_1_SNAPSHOT.xml create mode 100644 .idea/libraries/Maven__net_sf_trove4j_core_3_1_0.xml create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_1.xml create mode 100644 .idea/libraries/Maven__org_yaml_snakeyaml_1_28.xml create mode 100644 .idea/libraries/Maven__se_llbit_jo_nbt_1_3_0.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 T2CodeLib.iml create mode 100644 pom.xml create mode 100644 src/main/java/net/t2code/lib/Bungee/BMain.java create mode 100644 src/main/java/net/t2code/lib/Bungee/Lib/commands/BTab.java create mode 100644 src/main/java/net/t2code/lib/Bungee/Lib/commands/Bcmd.java create mode 100644 src/main/java/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.java create mode 100644 src/main/java/net/t2code/lib/Bungee/Lib/messages/Bsend.java create mode 100644 src/main/java/net/t2code/lib/Bungee/Lib/replace/BReplace.java create mode 100644 src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.java create mode 100644 src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateObject.java create mode 100644 src/main/java/net/t2code/lib/Bungee/system/BLoad.java create mode 100644 src/main/java/net/t2code/lib/Bungee/system/BMetrics.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/commands/Cmd.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/commands/Tab.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/items/ItemVersion.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/messages/TextBuilder.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/messages/send.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/register/Register.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/replace/Replace.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateAPI.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateObject.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/vault/Vault.java create mode 100644 src/main/java/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/CmdExecuter.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/CreateReportLog.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/JoinEvent.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/Main.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/Metrics.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/config/ConfigCreate.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/config/SelectLibConfig.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/languages/LanguagesCreate.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/languages/MSG.java create mode 100644 src/main/java/net/t2code/lib/Spigot/system/languages/SelectLibMsg.java create mode 100644 src/main/java/net/t2code/lib/Util.java create mode 100644 src/main/resources/bungee.yml create mode 100644 src/main/resources/plugin.yml create mode 100644 target/classes/bungee.yml create mode 100644 target/classes/net/t2code/lib/Bungee/BMain.class create mode 100644 target/classes/net/t2code/lib/Bungee/Lib/commands/BTab.class create mode 100644 target/classes/net/t2code/lib/Bungee/Lib/commands/Bcmd.class create mode 100644 target/classes/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.class create mode 100644 target/classes/net/t2code/lib/Bungee/Lib/messages/Bsend.class create mode 100644 target/classes/net/t2code/lib/Bungee/Lib/replace/BReplace.class create mode 100644 target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI$1.class create mode 100644 target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.class create mode 100644 target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateObject.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BLoad.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$1.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedBarChart.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedPie.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$CustomChart.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$DrilldownPie.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder$JsonObject.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$MetricsBase.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$MultiLineChart.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$SimpleBarChart.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$SimplePie.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics$SingleLineChart.class create mode 100644 target/classes/net/t2code/lib/Bungee/system/BMetrics.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/commands/Cmd.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/commands/Tab.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/items/ItemVersion.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder$ClickEventType.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/messages/send.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/register/Register.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/replace/Replace.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$1.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$2.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3$1.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/update/UpdateObject.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/vault/Vault.class create mode 100644 target/classes/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/CmdExecuter$1.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/CmdExecuter.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/CreateReportLog.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/JoinEvent.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Main.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$1.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$AdvancedBarChart.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$AdvancedPie.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$CustomChart.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$DrilldownPie.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder$JsonObject.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$MetricsBase.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$MultiLineChart.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$SimpleBarChart.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$SimplePie.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics$SingleLineChart.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/Metrics.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/config/ConfigCreate.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/config/SelectLibConfig.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/languages/LanguagesCreate.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/languages/MSG.class create mode 100644 target/classes/net/t2code/lib/Spigot/system/languages/SelectLibMsg.class create mode 100644 target/classes/net/t2code/lib/Util.class create mode 100644 target/classes/plugin.yml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/artifacts/T2CodeLib.xml b/.idea/artifacts/T2CodeLib.xml new file mode 100644 index 0000000..03e425d --- /dev/null +++ b/.idea/artifacts/T2CodeLib.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/../../Libarys + + + + + \ No newline at end of file diff --git a/.idea/artifacts/T2CodeLib_1_0_0_32.xml b/.idea/artifacts/T2CodeLib_1_0_0_32.xml new file mode 100644 index 0000000..ec9b69d --- /dev/null +++ b/.idea/artifacts/T2CodeLib_1_0_0_32.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/../../Testserver/1.17.1/Server/plugins + + + + + \ No newline at end of file diff --git a/.idea/artifacts/T2CodeLib_7_3.xml b/.idea/artifacts/T2CodeLib_7_3.xml new file mode 100644 index 0000000..9974c64 --- /dev/null +++ b/.idea/artifacts/T2CodeLib_7_3.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/../../Plugins/T2CodeLib/.jar + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b6c2c11 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..36c01dd --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/1_13_R2.xml b/.idea/libraries/1_13_R2.xml new file mode 100644 index 0000000..0a46628 --- /dev/null +++ b/.idea/libraries/1_13_R2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_MilkBowl_VaultAPI_1_7.xml b/.idea/libraries/Maven__com_github_MilkBowl_VaultAPI_1_7.xml new file mode 100644 index 0000000..a7198bd --- /dev/null +++ b/.idea/libraries/Maven__com_github_MilkBowl_VaultAPI_1_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml new file mode 100644 index 0000000..6e5d5b7 --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_guava_21_0.xml b/.idea/libraries/Maven__com_google_guava_guava_21_0.xml new file mode 100644 index 0000000..a923456 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_guava_21_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml b/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml new file mode 100644 index 0000000..f3f3738 --- /dev/null +++ b/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml b/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml new file mode 100644 index 0000000..2ec8376 --- /dev/null +++ b/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_buffer_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_buffer_4_1_65_Final.xml new file mode 100644 index 0000000..cc3e6ff --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_buffer_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_codec_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_codec_4_1_65_Final.xml new file mode 100644 index 0000000..321cc00 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_codec_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_common_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_common_4_1_65_Final.xml new file mode 100644 index 0000000..016342a --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_common_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_resolver_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_resolver_4_1_65_Final.xml new file mode 100644 index 0000000..9a2409b --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_resolver_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_transport_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_transport_4_1_65_Final.xml new file mode 100644 index 0000000..a002ea9 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_transport_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_transport_native_unix_common_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_transport_native_unix_common_4_1_65_Final.xml new file mode 100644 index 0000000..bae1261 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_transport_native_unix_common_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_10.xml b/.idea/libraries/Maven__junit_junit_4_10.xml new file mode 100644 index 0000000..ed8bf5f --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__me_clip_placeholderapi_2_9_2.xml b/.idea/libraries/Maven__me_clip_placeholderapi_2_9_2.xml new file mode 100644 index 0000000..5306a48 --- /dev/null +++ b/.idea/libraries/Maven__me_clip_placeholderapi_2_9_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_brigadier_1_0_16_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_brigadier_1_0_16_SNAPSHOT.xml new file mode 100644 index 0000000..844cdda --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_brigadier_1_0_16_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_api_1_17_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_bungeecord_api_1_17_R0_1_SNAPSHOT.xml new file mode 100644 index 0000000..78f2de9 --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_api_1_17_R0_1_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_chat_1_16_R0_4.xml b/.idea/libraries/Maven__net_md_5_bungeecord_chat_1_16_R0_4.xml new file mode 100644 index 0000000..9a850ea --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_chat_1_16_R0_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_config_1_17_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_bungeecord_config_1_17_R0_1_SNAPSHOT.xml new file mode 100644 index 0000000..4ee7632 --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_config_1_17_R0_1_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_event_1_17_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_bungeecord_event_1_17_R0_1_SNAPSHOT.xml new file mode 100644 index 0000000..7a85ff2 --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_event_1_17_R0_1_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_protocol_1_17_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_bungeecord_protocol_1_17_R0_1_SNAPSHOT.xml new file mode 100644 index 0000000..34c4a5e --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_protocol_1_17_R0_1_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_sf_trove4j_core_3_1_0.xml b/.idea/libraries/Maven__net_sf_trove4j_core_3_1_0.xml new file mode 100644 index 0000000..9460109 --- /dev/null +++ b/.idea/libraries/Maven__net_sf_trove4j_core_3_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_1.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_1.xml new file mode 100644 index 0000000..acdf443 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_1_28.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_1_28.xml new file mode 100644 index 0000000..1f853f7 --- /dev/null +++ b/.idea/libraries/Maven__org_yaml_snakeyaml_1_28.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__se_llbit_jo_nbt_1_3_0.xml b/.idea/libraries/Maven__se_llbit_jo_nbt_1_3_0.xml new file mode 100644 index 0000000..d3ebcf7 --- /dev/null +++ b/.idea/libraries/Maven__se_llbit_jo_nbt_1_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3656e5e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..0eedd60 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/T2CodeLib.iml b/T2CodeLib.iml new file mode 100644 index 0000000..5a56b3f --- /dev/null +++ b/T2CodeLib.iml @@ -0,0 +1,52 @@ + + + + + + + SPIGOT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..046009f --- /dev/null +++ b/pom.xml @@ -0,0 +1,114 @@ + + + 4.0.0 + + net.t2code + T2CodeLib + 1.0-SNAPSHOT + jar + + T2CodeLib + + Libarie from T2Code Plugins + + 1.8 + UTF-8 + + T2Code.net + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + false + + + + + + + + src/main/resources + true + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + jitpack.io + https://jitpack.io + + + placeholderapi + http://repo.extendedclip.com/content/repositories/placeholderapi/ + + + bungeecord-repo + https://oss.sonatype.org/content/repositories/snapshots + + + + + + org.spigotmc + spigot-api + 1.17.1-R0.1-SNAPSHOT + provided + + + com.github.MilkBowl + VaultAPI + 1.7 + provided + + + me.clip + placeholderapi + 2.9.2 + provided + + + net.md-5 + bungeecord-api + 1.17-R0.1-SNAPSHOT + jar + provided + + + net.md-5 + bungeecord-api + 1.17-R0.1-SNAPSHOT + javadoc + provided + + + diff --git a/src/main/java/net/t2code/lib/Bungee/BMain.java b/src/main/java/net/t2code/lib/Bungee/BMain.java new file mode 100644 index 0000000..d56d855 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/BMain.java @@ -0,0 +1,42 @@ +package net.t2code.lib.Bungee; + +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.system.BLoad; +import net.t2code.lib.Util; + +public final class BMain extends Plugin { + + + public static Plugin plugin; + public static String Version; + public static String Autor; + + public static String Prefix = Util.Prefix; + public static Integer SpigotID = Util.SpigotID; + public static Integer BstatsID = Util.BstatsID; + public static String Spigot = Util.Spigot; + public static String Discord = Util.Discord; + + + @Override + public void onEnable() { + // Plugin startup logic + plugin = this; + Version = plugin.getDescription().getVersion(); + Autor = plugin.getDescription().getAuthor(); + BLoad.onLoad(plugin, Prefix, Autor, Version, Spigot, Discord, SpigotID,BstatsID); + } + + @Override + public void onDisable() { + // Plugin shutdown logic + Bsend.console(Prefix + "§4============================= " + Prefix + " §4============================="); + Bsend.console(Prefix + " §2Autor: §6" + String.valueOf(Autor).replace("[", "").replace("]", "")); + Bsend.console(Prefix + " §2Version: §6" + Version); + Bsend.console(Prefix + " §2Spigot: §6" + Spigot); + Bsend.console(Prefix + " §2Discord: §6" + Discord); + Bsend.console(Prefix + " §4Plugin successfully disabled."); + Bsend.console(Prefix + "§4============================= " + Prefix + " §4============================="); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/commands/BTab.java b/src/main/java/net/t2code/lib/Bungee/Lib/commands/BTab.java new file mode 100644 index 0000000..2065dd8 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/commands/BTab.java @@ -0,0 +1,66 @@ +package net.t2code.lib.Bungee.Lib.commands; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class BTab { + public static Iterable tab(CommandSender sender, String[] args, String perm,Boolean onlinePlayer){ + List matches = new ArrayList<>(); + Iterator var6 = ProxyServer.getInstance().getPlayers().iterator(); + while (var6.hasNext()) { + ProxiedPlayer player1 = (ProxiedPlayer) var6.next(); + if (passend(player1.getName(), args[0]) && hasPermission(sender, perm)){ + matches.add(player1.getName()); + } + } + return matches; + } + + public static Iterable tab(CommandSender sender, String[] args, HashMap permMap) { + List matches = new ArrayList<>(); + for (String command : permMap.keySet()) { + if (hasPermission(sender, permMap.get(command)) && passend(command, args[0])) { + matches.add(command); + } + } + return matches; + } + + public static Iterable tab(CommandSender sender, String[] args, String perm, String command) { + List matches = new ArrayList<>(); + if (hasPermission(sender, perm) && passend(command, args[0])) { + matches.add(command); + } + return matches; + } + + public static Boolean passend(String command, String arg) { + for (int i = 0; i < arg.toUpperCase().length(); i++) { + if (arg.toUpperCase().length() >= command.toUpperCase().length()) { + return false; + } else { + if (arg.toUpperCase().charAt(i) != command.toUpperCase().charAt(i)) { + return false; + } + } + } + return true; + } + + + public static boolean hasPermission(CommandSender sender, String permission) { + String[] Permissions = permission.split(";"); + for (String perm : Permissions) { + if (sender.hasPermission(perm)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/commands/Bcmd.java b/src/main/java/net/t2code/lib/Bungee/Lib/commands/Bcmd.java new file mode 100644 index 0000000..7d2fd51 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/commands/Bcmd.java @@ -0,0 +1,13 @@ +package net.t2code.lib.Bungee.Lib.commands; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +public class Bcmd { + public static void Console(String cmd){ + ProxyServer.getInstance().getPluginManager().dispatchCommand(ProxyServer.getInstance().getConsole(), cmd); + } + public static void Player(ProxiedPlayer player, String cmd){ + ProxyServer.getInstance().getPluginManager().dispatchCommand(player, cmd); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.java b/src/main/java/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.java new file mode 100644 index 0000000..2e64c77 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.java @@ -0,0 +1,38 @@ +package net.t2code.lib.Bungee.Lib.messages; + +import java.util.List; + +public class BT2CodeTemplate { + + + public static Long onLoadHeader(String prefix, String autor, String version, String spigot, String discord) { + Long long_ = Long.valueOf(System.currentTimeMillis()); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + Bsend.console(prefix + " §2Autor: §6" + autor.replace("[", "").replace("]", "")); + Bsend.console(prefix + " §2Version: §6" + version); + Bsend.console(prefix + " §2Spigot: §6" + spigot); + Bsend.console(prefix + " §2Discord: §6" + discord); + Bsend.console(prefix + " §8-------------------------------"); + return long_; + } + public static void onLoadSeparateStroke(String prefix) { + Bsend.console(prefix + " §8-------------------------------"); + } + + public static void onLoadFooter(String prefix, Long long_) { + Bsend.console(prefix + " §8-------------------------------"); + Bsend.console(prefix + " §2Plugin loaded successfully." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + } + + public static void onDisable(String prefix, String autor, String version, String spigot, String discord) { + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + Bsend.console(prefix + " §2Autor: §6" + autor.replace("[", "").replace("]", "")); + Bsend.console(prefix + " §2Version: §6" + version); + Bsend.console(prefix + " §2Spigot: §6" + spigot); + Bsend.console(prefix + " §2Discord: §6" + discord); + Bsend.console(prefix + " §4Plugin successfully disabled."); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + } + +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/messages/Bsend.java b/src/main/java/net/t2code/lib/Bungee/Lib/messages/Bsend.java new file mode 100644 index 0000000..788567c --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/messages/Bsend.java @@ -0,0 +1,61 @@ +package net.t2code.lib.Bungee.Lib.messages; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.Title; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Plugin; + + +import java.util.logging.Level; + +public class Bsend { + public static void console(String msg) { + ProxyServer.getInstance().getConsole().sendMessage(msg); + } + + public static void player(ProxiedPlayer player, String msg) { + player.sendMessage(msg); + } + + public static void title(ProxiedPlayer player, Title msg) { + player.sendTitle(msg); + } + + public static void sender(CommandSender sender, String msg) { + sender.sendMessage(msg); + } + + public static void debug(Plugin plugin, String msg) { + debug(plugin, msg, null); + } + + public static void debug(Plugin plugin, String msg, Integer stage) { + // if (!new File(Main.getPath(), "config.yml").exists()) return; + if (stage == null) { + //todo if (plugin.getConfig().getBoolean("Plugin.Debug")){ + // ProxyServer.getInstance().getConsole().sendMessage(plugin.getDescription().getName() + " §5DEBUG: §6" + msg); + // } + return; + } + // todo if (plugin.getConfig().getInt("Plugin.Debug") >= stage) { + // ProxyServer.getInstance().getConsole().sendMessage(plugin.getDescription().getName() + " §5DEBUG: §6" + msg); + // } + } + + public static void debugmsg(Plugin plugin, String msg) { + ProxyServer.getInstance().getConsole().sendMessage(plugin.getDescription().getName() + " §5DEBUG-MSG: §6" + msg); + } + + public static void info(Plugin plugin, String msg) { + plugin.getLogger().log(Level.INFO, msg); + } + + public static void warning(Plugin plugin, String msg) { + plugin.getLogger().log(Level.WARNING, msg); + } + + public static void error(Plugin plugin, String msg) { + plugin.getLogger().log(Level.SEVERE, msg); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/replace/BReplace.java b/src/main/java/net/t2code/lib/Bungee/Lib/replace/BReplace.java new file mode 100644 index 0000000..13cd164 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/replace/BReplace.java @@ -0,0 +1,36 @@ +package net.t2code.lib.Bungee.Lib.replace; + +import java.util.ArrayList; +import java.util.List; + +public class BReplace { + + public static String replace(String prefix, String Text) { + return Text.replace("[prefix]", prefix).replace("&", "§").replace("[ue]", "ü") + .replace("[UE]", "Ü").replace("[oe]", "ö").replace("[OE]", "Ö") + .replace("[ae]", "ä").replace("[AE]", "Ä"); + } + + + + public static List replace(String prefix, List Text) { + List output = new ArrayList<>(); + for (String input : Text) { + output.add(input.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä")); + } + return output; + } + + public static List replacePrice(String prefix,List Text, String price) { + List rp = new ArrayList(); + for (String s : Text) { + rp.add(s.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä") + .replace("[price]", String.valueOf(price))); + } + return rp; + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.java b/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.java new file mode 100644 index 0000000..275d96c --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.java @@ -0,0 +1,104 @@ +package net.t2code.lib.Bungee.Lib.update; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Spigot.Lib.update.UpdateObject; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Scanner; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +public class BUpdateAPI { + public static HashMap bungeePluginVersionen = new HashMap(); + public static void sendUpdateMsg(String Prefix, String Spigot, String Discord, String foundVersion, String update_version) { + Bsend.console("§4=========== " + Prefix + " §4==========="); + Bsend.console("§6A new version was found!"); + Bsend.console("§6Your version: §c" + foundVersion + " §7- §6Current version: §a" + update_version); + Bsend.console("§6You can download it here: §e" + Spigot); + Bsend.console("§6You can find more information on Discord: §e" + Discord); + Bsend.console("§4=========== " + Prefix + " §4==========="); + } + private static Boolean noUpdate = true; + private static String pluginVersion; + public static void onUpdateCheckTimer(Plugin plugin, String Prefix, String Spigot, String Discord, Integer SpigotID) { + ProxyServer.getInstance().getScheduler().schedule(plugin, new Runnable() { + public void run() { + (new BUpdateAPI(plugin, SpigotID)).getVersion((update_version) -> { + pluginVersion = plugin.getDescription().getVersion(); + UpdateObject update = new UpdateObject( + plugin.getDescription().getName(), + pluginVersion, + update_version + ); + bungeePluginVersionen.put(plugin.getDescription().getName(), update); + if (!pluginVersion.replace("_Bungee", "").equalsIgnoreCase(update_version)) { + sendUpdateMsg(Prefix, Spigot, Discord, pluginVersion, update_version); + noUpdate = true; + } else { + if (noUpdate) { + Bsend.console(Prefix + " §2No update found."); + noUpdate = false; + } + } + },Prefix, pluginVersion); + } + }, 0, 20 * 60 * 60L, TimeUnit.SECONDS); + } + private Plugin plugin; + private int resourceId; + + public BUpdateAPI(Plugin plugin, int resourceId) { + this.plugin = plugin; + this.resourceId = resourceId; + } + + public void getVersion(Consumer consumer, String Prefix, String pluginVersion) { + ProxyServer.getInstance().getScheduler().runAsync(this.plugin, () -> { + try { + InputStream inputStream = (new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId)).openStream(); + try { + Scanner scanner = new Scanner(inputStream); + + try { + if (scanner.hasNext()) { + consumer.accept(scanner.next()); + } + } catch (Throwable var8) { + try { + scanner.close(); + } catch (Throwable var7) { + var8.addSuppressed(var7); + } + throw var8; + } + scanner.close(); + } catch (Throwable var9) { + if (inputStream != null) { + try { + inputStream.close(); + } catch (Throwable var6) { + var9.addSuppressed(var6); + } + } + throw var9; + } + if (inputStream != null) { + inputStream.close(); + } + } catch (IOException var10) { + UpdateObject update = new UpdateObject( + plugin.getDescription().getName(), + pluginVersion, + "§4No public version found!" + ); + bungeePluginVersionen.put(plugin.getDescription().getName(), update); + this.plugin.getLogger().severe(Prefix + "§4 Cannot look for updates: " + var10.getMessage()); + } + }); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateObject.java b/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateObject.java new file mode 100644 index 0000000..fc0bb6e --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateObject.java @@ -0,0 +1,12 @@ +package net.t2code.lib.Bungee.Lib.update; + +public class BUpdateObject { + public String pluginName; + public String pluginVersion; + public String publicVersion; + public BUpdateObject(String pluginName, String pluginVersion, String publicVersion){ + this.pluginName = pluginName; + this.pluginVersion = pluginVersion; + this.publicVersion = publicVersion; + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/system/BLoad.java b/src/main/java/net/t2code/lib/Bungee/system/BLoad.java new file mode 100644 index 0000000..7b68951 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/system/BLoad.java @@ -0,0 +1,26 @@ +package net.t2code.lib.Bungee.system; + +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.Lib.update.BUpdateAPI; + +public class BLoad { + public static void onLoad(Plugin plugin, String prefix, String autor, String version, String spigot, String discord, Integer spigotID,Integer bstatsID){ + Long long_ = Long.valueOf(System.currentTimeMillis()); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + Bsend.console(prefix + " §2Autor: §6" + String.valueOf(autor).replace("[", "").replace("]", "")); + Bsend.console(prefix + " §2Version: §6" + version); + Bsend.console(prefix + " §2Spigot: §6" + spigot); + Bsend.console(prefix + " §2Discord: §6" + discord); + + + + + BMetrics.Bstats(plugin, bstatsID); + + BUpdateAPI.onUpdateCheckTimer(plugin, prefix, spigot, discord, spigotID); + + Bsend.console(prefix + " §2Plugin loaded successfully." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/system/BMetrics.java b/src/main/java/net/t2code/lib/Bungee/system/BMetrics.java new file mode 100644 index 0000000..d0d996d --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/system/BMetrics.java @@ -0,0 +1,851 @@ +package net.t2code.lib.Bungee.system; + +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.zip.GZIPOutputStream; + +public class BMetrics { + + public static void Bstats(Plugin plugin, int bstatsID) { + int pluginId = bstatsID; // <-- Replace with the id of your plugin! + BMetrics metrics = new BMetrics(plugin, pluginId); + } + + private final Plugin plugin; + + private final MetricsBase metricsBase; + + private boolean enabled; + + private String serverUUID; + + private boolean logErrors = false; + + private boolean logSentData; + + private boolean logResponseStatusText; + + /** + * Creates a new Metrics instance. + * + * @param plugin Your plugin instance. + * @param serviceId The id of the service. It can be found at What is my plugin id? + */ + public BMetrics(Plugin plugin, int serviceId) { + this.plugin = plugin; + try { + loadConfig(); + } catch (IOException e) { + // Failed to load configuration + plugin.getLogger().log(Level.WARNING, "Failed to load bStats config!", e); + metricsBase = null; + return; + } + metricsBase = + new MetricsBase( + "bungeecord", + serverUUID, + serviceId, + enabled, + this::appendPlatformData, + this::appendServiceData, + null, + () -> true, + (message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error), + (message) -> this.plugin.getLogger().log(Level.INFO, message), + logErrors, + logSentData, + logResponseStatusText); + } + + /** Loads the bStats configuration. */ + private void loadConfig() throws IOException { + File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); + bStatsFolder.mkdirs(); + File configFile = new File(bStatsFolder, "config.yml"); + if (!configFile.exists()) { + writeFile( + configFile, + "# bStats (https://bStats.org) collects some basic information for plugin authors, like how", + "# many people use their plugin and their total player count. It's recommended to keep bStats", + "# enabled, but if you're not comfortable with this, you can turn this setting off. There is no", + "# performance penalty associated with having metrics enabled, and data sent to bStats is fully", + "# anonymous.", + "enabled: true", + "serverUuid: \"" + UUID.randomUUID() + "\"", + "logFailedRequests: false", + "logSentData: false", + "logResponseStatusText: false"); + } + Configuration configuration = + ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile); + // Load configuration + enabled = configuration.getBoolean("enabled", true); + serverUUID = configuration.getString("serverUuid"); + logErrors = configuration.getBoolean("logFailedRequests", false); + logSentData = configuration.getBoolean("logSentData", false); + logResponseStatusText = configuration.getBoolean("logResponseStatusText", false); + } + + private void writeFile(File file, String... lines) throws IOException { + try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file))) { + for (String line : lines) { + bufferedWriter.write(line); + bufferedWriter.newLine(); + } + } + } + + /** + * Adds a custom chart. + * + * @param chart The chart to add. + */ + public void addCustomChart(CustomChart chart) { + metricsBase.addCustomChart(chart); + } + + private void appendPlatformData(JsonObjectBuilder builder) { + builder.appendField("playerAmount", plugin.getProxy().getOnlineCount()); + builder.appendField("managedServers", plugin.getProxy().getServers().size()); + builder.appendField("onlineMode", plugin.getProxy().getConfig().isOnlineMode() ? 1 : 0); + builder.appendField("bungeecordVersion", plugin.getProxy().getVersion()); + builder.appendField("javaVersion", System.getProperty("java.version")); + builder.appendField("osName", System.getProperty("os.name")); + builder.appendField("osArch", System.getProperty("os.arch")); + builder.appendField("osVersion", System.getProperty("os.version")); + builder.appendField("coreCount", Runtime.getRuntime().availableProcessors()); + } + + private void appendServiceData(JsonObjectBuilder builder) { + builder.appendField("pluginVersion", plugin.getDescription().getVersion()); + } + + public static class MetricsBase { + + /** The version of the Metrics class. */ + public static final String METRICS_VERSION = "2.2.1"; + + private static final ScheduledExecutorService scheduler = + Executors.newScheduledThreadPool(1, task -> new Thread(task, "bStats-Metrics")); + + private static final String REPORT_URL = "https://bStats.org/api/v2/data/%s"; + + private final String platform; + + private final String serverUuid; + + private final int serviceId; + + private final Consumer appendPlatformDataConsumer; + + private final Consumer appendServiceDataConsumer; + + private final Consumer submitTaskConsumer; + + private final Supplier checkServiceEnabledSupplier; + + private final BiConsumer errorLogger; + + private final Consumer infoLogger; + + private final boolean logErrors; + + private final boolean logSentData; + + private final boolean logResponseStatusText; + + private final Set customCharts = new HashSet<>(); + + private final boolean enabled; + + /** + * Creates a new MetricsBase class instance. + * + * @param platform The platform of the service. + * @param serviceId The id of the service. + * @param serverUuid The server uuid. + * @param enabled Whether or not data sending is enabled. + * @param appendPlatformDataConsumer A consumer that receives a {@code JsonObjectBuilder} and + * appends all platform-specific data. + * @param appendServiceDataConsumer A consumer that receives a {@code JsonObjectBuilder} and + * appends all service-specific data. + * @param submitTaskConsumer A consumer that takes a runnable with the submit task. This can be + * used to delegate the data collection to a another thread to prevent errors caused by + * concurrency. Can be {@code null}. + * @param checkServiceEnabledSupplier A supplier to check if the service is still enabled. + * @param errorLogger A consumer that accepts log message and an error. + * @param infoLogger A consumer that accepts info log messages. + * @param logErrors Whether or not errors should be logged. + * @param logSentData Whether or not the sent data should be logged. + * @param logResponseStatusText Whether or not the response status text should be logged. + */ + public MetricsBase( + String platform, + String serverUuid, + int serviceId, + boolean enabled, + Consumer appendPlatformDataConsumer, + Consumer appendServiceDataConsumer, + Consumer submitTaskConsumer, + Supplier checkServiceEnabledSupplier, + BiConsumer errorLogger, + Consumer infoLogger, + boolean logErrors, + boolean logSentData, + boolean logResponseStatusText) { + this.platform = platform; + this.serverUuid = serverUuid; + this.serviceId = serviceId; + this.enabled = enabled; + this.appendPlatformDataConsumer = appendPlatformDataConsumer; + this.appendServiceDataConsumer = appendServiceDataConsumer; + this.submitTaskConsumer = submitTaskConsumer; + this.checkServiceEnabledSupplier = checkServiceEnabledSupplier; + this.errorLogger = errorLogger; + this.infoLogger = infoLogger; + this.logErrors = logErrors; + this.logSentData = logSentData; + this.logResponseStatusText = logResponseStatusText; + checkRelocation(); + if (enabled) { + startSubmitting(); + } + } + + public void addCustomChart(CustomChart chart) { + this.customCharts.add(chart); + } + + private void startSubmitting() { + final Runnable submitTask = + () -> { + if (!enabled || !checkServiceEnabledSupplier.get()) { + // Submitting data or service is disabled + scheduler.shutdown(); + return; + } + if (submitTaskConsumer != null) { + submitTaskConsumer.accept(this::submitData); + } else { + this.submitData(); + } + }; + // Many servers tend to restart at a fixed time at xx:00 which causes an uneven distribution + // of requests on the + // bStats backend. To circumvent this problem, we introduce some randomness into the initial + // and second delay. + // WARNING: You must not modify and part of this Metrics class, including the submit delay or + // frequency! + // WARNING: Modifying this code will get your plugin banned on bStats. Just don't do it! + long initialDelay = (long) (1000 * 60 * (3 + Math.random() * 3)); + long secondDelay = (long) (1000 * 60 * (Math.random() * 30)); + scheduler.schedule(submitTask, initialDelay, TimeUnit.MILLISECONDS); + scheduler.scheduleAtFixedRate( + submitTask, initialDelay + secondDelay, 1000 * 60 * 30, TimeUnit.MILLISECONDS); + } + + private void submitData() { + final JsonObjectBuilder baseJsonBuilder = new JsonObjectBuilder(); + appendPlatformDataConsumer.accept(baseJsonBuilder); + final JsonObjectBuilder serviceJsonBuilder = new JsonObjectBuilder(); + appendServiceDataConsumer.accept(serviceJsonBuilder); + JsonObjectBuilder.JsonObject[] chartData = + customCharts.stream() + .map(customChart -> customChart.getRequestJsonObject(errorLogger, logErrors)) + .filter(Objects::nonNull) + .toArray(JsonObjectBuilder.JsonObject[]::new); + serviceJsonBuilder.appendField("id", serviceId); + serviceJsonBuilder.appendField("customCharts", chartData); + baseJsonBuilder.appendField("service", serviceJsonBuilder.build()); + baseJsonBuilder.appendField("serverUUID", serverUuid); + baseJsonBuilder.appendField("metricsVersion", METRICS_VERSION); + JsonObjectBuilder.JsonObject data = baseJsonBuilder.build(); + scheduler.execute( + () -> { + try { + // Send the data + sendData(data); + } catch (Exception e) { + // Something went wrong! :( + if (logErrors) { + errorLogger.accept("Could not submit bStats metrics data", e); + } + } + }); + } + + private void sendData(JsonObjectBuilder.JsonObject data) throws Exception { + if (logSentData) { + infoLogger.accept("Sent bStats metrics data: " + data.toString()); + } + String url = String.format(REPORT_URL, platform); + HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection(); + // Compress the data to save bandwidth + byte[] compressedData = compress(data.toString()); + connection.setRequestMethod("POST"); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + connection.addRequestProperty("Content-Encoding", "gzip"); + connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("User-Agent", "Metrics-Service/1"); + connection.setDoOutput(true); + try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { + outputStream.write(compressedData); + } + StringBuilder builder = new StringBuilder(); + try (BufferedReader bufferedReader = + new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String line; + while ((line = bufferedReader.readLine()) != null) { + builder.append(line); + } + } + if (logResponseStatusText) { + infoLogger.accept("Sent data to bStats and received response: " + builder); + } + } + + /** Checks that the class was properly relocated. */ + private void checkRelocation() { + // You can use the property to disable the check in your test environment + if (System.getProperty("bstats.relocatecheck") == null + || !System.getProperty("bstats.relocatecheck").equals("false")) { + // Maven's Relocate is clever and changes strings, too. So we have to use this little + // "trick" ... :D + final String defaultPackage = + new String(new byte[] {'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's'}); + final String examplePackage = + new String(new byte[] {'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); + // We want to make sure no one just copy & pastes the example and uses the wrong package + // names + if (MetricsBase.class.getPackage().getName().startsWith(defaultPackage) + || MetricsBase.class.getPackage().getName().startsWith(examplePackage)) { + throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); + } + } + } + + /** + * Gzips the given string. + * + * @param str The string to gzip. + * @return The gzipped string. + */ + private static byte[] compress(final String str) throws IOException { + if (str == null) { + return null; + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { + gzip.write(str.getBytes(StandardCharsets.UTF_8)); + } + return outputStream.toByteArray(); + } + } + + public static class AdvancedBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().length == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class SimpleBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimpleBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + for (Map.Entry entry : map.entrySet()) { + valuesBuilder.appendField(entry.getKey(), new int[] {entry.getValue()}); + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class MultiLineChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public MultiLineChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class AdvancedPie extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedPie(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public abstract static class CustomChart { + + private final String chartId; + + protected CustomChart(String chartId) { + if (chartId == null) { + throw new IllegalArgumentException("chartId must not be null"); + } + this.chartId = chartId; + } + + public JsonObjectBuilder.JsonObject getRequestJsonObject( + BiConsumer errorLogger, boolean logErrors) { + JsonObjectBuilder builder = new JsonObjectBuilder(); + builder.appendField("chartId", chartId); + try { + JsonObjectBuilder.JsonObject data = getChartData(); + if (data == null) { + // If the data is null we don't send the chart. + return null; + } + builder.appendField("data", data); + } catch (Throwable t) { + if (logErrors) { + errorLogger.accept("Failed to get data for custom chart with id " + chartId, t); + } + return null; + } + return builder.build(); + } + + protected abstract JsonObjectBuilder.JsonObject getChartData() throws Exception; + } + + public static class SingleLineChart extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SingleLineChart(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + int value = callable.call(); + if (value == 0) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("value", value).build(); + } + } + + public static class SimplePie extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimplePie(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + String value = callable.call(); + if (value == null || value.isEmpty()) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("value", value).build(); + } + } + + public static class DrilldownPie extends CustomChart { + + private final Callable>> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public DrilldownPie(String chartId, Callable>> callable) { + super(chartId); + this.callable = callable; + } + + @Override + public JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map> map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean reallyAllSkipped = true; + for (Map.Entry> entryValues : map.entrySet()) { + JsonObjectBuilder valueBuilder = new JsonObjectBuilder(); + boolean allSkipped = true; + for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { + valueBuilder.appendField(valueEntry.getKey(), valueEntry.getValue()); + allSkipped = false; + } + if (!allSkipped) { + reallyAllSkipped = false; + valuesBuilder.appendField(entryValues.getKey(), valueBuilder.build()); + } + } + if (reallyAllSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + /** + * An extremely simple JSON builder. + * + *

While this class is neither feature-rich nor the most performant one, it's sufficient enough + * for its use-case. + */ + public static class JsonObjectBuilder { + + private StringBuilder builder = new StringBuilder(); + + private boolean hasAtLeastOneField = false; + + public JsonObjectBuilder() { + builder.append("{"); + } + + /** + * Appends a null field to the JSON. + * + * @param key The key of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendNull(String key) { + appendFieldUnescaped(key, "null"); + return this; + } + + /** + * Appends a string field to the JSON. + * + * @param key The key of the field. + * @param value The value of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, String value) { + if (value == null) { + throw new IllegalArgumentException("JSON value must not be null"); + } + appendFieldUnescaped(key, "\"" + escape(value) + "\""); + return this; + } + + /** + * Appends an integer field to the JSON. + * + * @param key The key of the field. + * @param value The value of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, int value) { + appendFieldUnescaped(key, String.valueOf(value)); + return this; + } + + /** + * Appends an object to the JSON. + * + * @param key The key of the field. + * @param object The object. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, JsonObject object) { + if (object == null) { + throw new IllegalArgumentException("JSON object must not be null"); + } + appendFieldUnescaped(key, object.toString()); + return this; + } + + /** + * Appends a string array to the JSON. + * + * @param key The key of the field. + * @param values The string array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, String[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values) + .map(value -> "\"" + escape(value) + "\"") + .collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends an integer array to the JSON. + * + * @param key The key of the field. + * @param values The integer array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, int[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values).mapToObj(String::valueOf).collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends an object array to the JSON. + * + * @param key The key of the field. + * @param values The integer array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, JsonObject[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values).map(JsonObject::toString).collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends a field to the object. + * + * @param key The key of the field. + * @param escapedValue The escaped value of the field. + */ + private void appendFieldUnescaped(String key, String escapedValue) { + if (builder == null) { + throw new IllegalStateException("JSON has already been built"); + } + if (key == null) { + throw new IllegalArgumentException("JSON key must not be null"); + } + if (hasAtLeastOneField) { + builder.append(","); + } + builder.append("\"").append(escape(key)).append("\":").append(escapedValue); + hasAtLeastOneField = true; + } + + /** + * Builds the JSON string and invalidates this builder. + * + * @return The built JSON string. + */ + public JsonObject build() { + if (builder == null) { + throw new IllegalStateException("JSON has already been built"); + } + JsonObject object = new JsonObject(builder.append("}").toString()); + builder = null; + return object; + } + + /** + * Escapes the given string like stated in https://www.ietf.org/rfc/rfc4627.txt. + * + *

This method escapes only the necessary characters '"', '\'. and '\u0000' - '\u001F'. + * Compact escapes are not used (e.g., '\n' is escaped as "\u000a" and not as "\n"). + * + * @param value The value to escape. + * @return The escaped value. + */ + private static String escape(String value) { + final StringBuilder builder = new StringBuilder(); + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + if (c == '"') { + builder.append("\\\""); + } else if (c == '\\') { + builder.append("\\\\"); + } else if (c <= '\u000F') { + builder.append("\\u000").append(Integer.toHexString(c)); + } else if (c <= '\u001F') { + builder.append("\\u00").append(Integer.toHexString(c)); + } else { + builder.append(c); + } + } + return builder.toString(); + } + + /** + * A super simple representation of a JSON object. + * + *

This class only exists to make methods of the {@link JsonObjectBuilder} type-safe and not + * allow a raw string inputs for methods like {@link JsonObjectBuilder#appendField(String, + * JsonObject)}. + */ + public static class JsonObject { + + private final String value; + + private JsonObject(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } + } + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/commands/Cmd.java b/src/main/java/net/t2code/lib/Spigot/Lib/commands/Cmd.java new file mode 100644 index 0000000..10f50db --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/commands/Cmd.java @@ -0,0 +1,14 @@ +package net.t2code.lib.Spigot.Lib.commands; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class Cmd { + public static void console(String cmd) { + Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), cmd); + } + + public static void player(Player player, String cmd) { + player.chat("/" + cmd); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/commands/Tab.java b/src/main/java/net/t2code/lib/Spigot/Lib/commands/Tab.java new file mode 100644 index 0000000..28fd7e6 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/commands/Tab.java @@ -0,0 +1,104 @@ +package net.t2code.lib.Spigot.Lib.commands; + + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class Tab { + + public static void tab(List matches, CommandSender sender, int arg, String[] args, String perm, Boolean onlinePlayer) { + if (args.length == arg + 1) { + Iterator var6 = Bukkit.getOnlinePlayers().iterator(); + while (var6.hasNext()) { + Player player1 = (Player) var6.next(); + if (passend(player1.getName(), args[arg]) && hasPermission(sender, perm)) { + matches.add(player1.getName()); + } + } + } + } + + public static void tab(List matches, CommandSender sender, int argEquals, String equalsValue, int arg, String[] args, String perm, Boolean onlinePlayer) { + if (args.length == arg + 1) { + if (args[argEquals].toLowerCase().equals(equalsValue)) { + Iterator var6 = Bukkit.getOnlinePlayers().iterator(); + while (var6.hasNext()) { + Player player1 = (Player) var6.next(); + if (passend(player1.getName(), args[arg]) && hasPermission(sender, perm)) { + matches.add(player1.getName()); + } + } + } + } + } + + //public static void tab(List matches,CommandSender sender, int arg, String[] args, HashMap permMap) { + // + // for (String command : permMap.keySet()) { + // if (hasPermission(sender, permMap.get(command)) && passend(command, args[arg])) { + // matches.add(command); + // } + // } + //} + + public static void tab(List matches, CommandSender sender, int arg, String[] args, HashMap permMap) { + if (args.length == arg + 1) { + for (String command : permMap.keySet()) { + if (hasPermission(sender, permMap.get(command)) && passend(command, args[arg])) { + matches.add(command); + } + } + } + } + + public static void tab(List matches, CommandSender sender, int argEquals, String equalsValue, int arg, String[] args, HashMap permMap) { + if (args.length == arg + 1) { + if (args[argEquals].toLowerCase().equals(equalsValue)) { + for (String command : permMap.keySet()) { + if (hasPermission(sender, permMap.get(command)) && passend(command, args[arg])) { + matches.add(command); + } + } + } + } + } + + public static List tab(CommandSender sender, int arg, String[] args, String perm, String command) { + List matches = new ArrayList<>(); + if (hasPermission(sender, perm) && passend(command, args[arg])) { + matches.add(command); + } + return matches; + } + + + private static Boolean passend(String command, String arg) { + for (int i = 0; i < arg.toUpperCase().length(); i++) { + if (arg.toUpperCase().length() >= command.toUpperCase().length()) { + return false; + } else { + if (arg.toUpperCase().charAt(i) != command.toUpperCase().charAt(i)) { + return false; + } + } + } + return true; + } + + + public static boolean hasPermission(CommandSender sender, String permission) { + String[] Permissions = permission.split(";"); + for (String perm : Permissions) { + if (sender.hasPermission(perm)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/items/ItemVersion.java b/src/main/java/net/t2code/lib/Spigot/Lib/items/ItemVersion.java new file mode 100644 index 0000000..9b8657a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/items/ItemVersion.java @@ -0,0 +1,15 @@ +package net.t2code.lib.Spigot.Lib.items; + +import net.t2code.lib.Spigot.Lib.minecraftVersion.MCVersion; +import org.bukkit.Material; + +public class ItemVersion { + public static Material Head; + public static void scan(){ + if (MCVersion.minecraft1_8 || MCVersion.minecraft1_9 || MCVersion.minecraft1_10 || MCVersion.minecraft1_11 || MCVersion.minecraft1_12) { + Head = Material.valueOf("SKULL"); + } else Head = Material.valueOf("PLAYER_HEAD"); + } + + +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.java b/src/main/java/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.java new file mode 100644 index 0000000..47a915a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.java @@ -0,0 +1,89 @@ +package net.t2code.lib.Spigot.Lib.messages; + +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.TextComponent; +import net.t2code.lib.Spigot.Lib.update.UpdateAPI; +import net.t2code.lib.Spigot.system.Main; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.util.List; +import java.util.logging.Level; + +public class T2CodeTemplate { + public static Long onLoadHeader(String prefix, List autor, String version, String spigot, String discord) { + Long long_ = Long.valueOf(System.currentTimeMillis()); + // send.console(prefix +" §4===================== " + prefix + " §4====================="); + send.console(prefix + " §4 _______ §7___ §4_____ "); + send.console(prefix + " §4 |__ __|§7__ \\ §4/ ____|"); + send.console(prefix + " §4 | | §7 ) §4| | "); + send.console(prefix + " §4 | | §7 / /§4| | "); + send.console(prefix + " §4 | | §7/ /_§4| |____ "); + send.console(prefix + " §4 |_| §7|____|§4\\_____|"); + send.console(prefix + " §4 §e------------------"); + send.console(prefix + " §4 §e| §2Autor: §6" + String.valueOf(autor).replace("[", "").replace("]", "")); + send.console(prefix + " §4 §e| §2Version: §6" + version); + send.console(prefix + " §4 §e| §2Spigot: §6" + spigot); + send.console(prefix + " §4 §e| §2Discord: §6" + discord); + send.console(prefix + " §4 §e-------------------"); + //onLoadSeparateStroke(prefix); + return long_; + } + + public static Long onLoadHeader(String prefix) { + Long long_ = Long.valueOf(System.currentTimeMillis()); + send.console(prefix + "§4===================== " + prefix + " §4====================="); + return long_; + } + + public static void onLoadSeparateStroke(String prefix) { + send.console(prefix + " §8-------------------------------"); + } + + public static void onLoadFooter(String prefix, Long long_, String version) { + onLoadSeparateStroke(prefix); + send.console(prefix + " §2Plugin loaded successfully." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + // send.console(prefix +" §4===================== " + prefix + "§4====================="); + } + + public static void onLoadFooter(String prefix, Long long_) { + onLoadSeparateStroke(prefix); + send.console(prefix + " §2Plugin loaded successfully." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + // send.console(prefix +" §4===================== " + prefix + "§4====================="); + } + + public static void onDisable(String prefix, List autor, String version, String spigot, String discord) { + //send.console(prefix + "§4===================== " + prefix + " §7- §6" + version + " §4====================="); + //send.console(prefix + " §2Autor: §6" + String.valueOf(autor).replace("[", "").replace("]", "")); + //send.console(prefix + " §2Version: §6" + version); + //send.console(prefix + " §2Spigot: §6" + spigot); + //send.console(prefix + " §2Discord: §6" + discord); + //send.console(prefix + " §4Plugin successfully disabled."); + //send.console(prefix + "§4===================== " + prefix + " §7- §6" + version + " §4====================="); + send.console(prefix + " §2Version: §6" + version); + send.console(prefix + " §4Plugin successfully disabled."); + } + + public static void sendInfo(CommandSender sender, String prefix, String spigot, String discord, List autor, String pluginVersion, String publicVersion) { + send.sender(sender, prefix + "§4======= " + prefix + " §4======="); + send.sender(sender, prefix + " §2Autor: §6" + String.valueOf(autor).replace("[", "").replace("]", "")); + + if (publicVersion.equalsIgnoreCase(pluginVersion)) { + send.sender(sender, prefix + " §2Version: §6" + pluginVersion); + } else { + if (sender instanceof Player) { + Player player = (Player) sender; + UpdateAPI.sendUpdateMsg(prefix, spigot, discord, pluginVersion, publicVersion, player); + } + } + send.sender(sender, prefix + " §2Spigot: §6" + spigot); + send.sender(sender, prefix + " §2Discord: §6" + discord); + send.sender(sender, prefix + "§4======= " + prefix + " §4======="); + } + + + + +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/messages/TextBuilder.java b/src/main/java/net/t2code/lib/Spigot/Lib/messages/TextBuilder.java new file mode 100644 index 0000000..280b45a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/messages/TextBuilder.java @@ -0,0 +1,45 @@ +package net.t2code.lib.Spigot.Lib.messages; + +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; + +public class TextBuilder { + + private final String text; + private String hover; + private String click; + private ClickEvent.Action action; + + public TextBuilder(String text) { + this.text = text; + } + + public TextBuilder addHover(String hover) { + this.hover = hover; + return this; + } + + public TextBuilder addClickEvent(ClickEvent.Action clickEventAction, String value) { + this.action = clickEventAction; + this.click = value; + return this; + } + + public TextComponent build() { + TextComponent textComponent = new TextComponent(); + textComponent.setText(this.text); + if (this.hover != null) { + textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(this.hover).create())); + } + if (this.click != null && (this.action != null)) { + textComponent.setClickEvent(new ClickEvent(action, this.click)); + } + return textComponent; + } + + public enum ClickEventType { + OPEN_URL, OPEN_FILE, RUN_COMMAND, SUGGEST_COMMAND, CHANGE_PAGE, COPY_TO_CLIPBOARD + } +} \ No newline at end of file diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/messages/send.java b/src/main/java/net/t2code/lib/Spigot/Lib/messages/send.java new file mode 100644 index 0000000..93fad33 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/messages/send.java @@ -0,0 +1,64 @@ +package net.t2code.lib.Spigot.Lib.messages; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.util.logging.Level; + +public class send { + + /** + * Spigot + */ + + public static void console(String msg) { + Bukkit.getConsoleSender().sendMessage(msg); + } + + public static void player(Player player, String msg) { + player.sendMessage(msg); + } + + public static void title(Player player, String msg, String msg2) { + player.sendTitle(msg, msg2); + } + + public static void title(Player player, String msg, String msg2, int i, int i1, int i2) { + player.sendTitle(msg, msg2, i, i1, i2); + } + + public static void sender(CommandSender sender, String msg) { + sender.sendMessage(msg); + } + + public static void debug(Plugin plugin, String msg) { + debug(plugin, msg, null); + } + + public static void debug(Plugin plugin, String msg, Integer stage) { + // if (!new File(Main.getPath(), "config.yml").exists()) return; + if (stage == null) { + if (plugin.getConfig().getBoolean("Plugin.Debug")) Bukkit.getConsoleSender().sendMessage(plugin.getDescription().getPrefix() + " §5DEBUG: §6" + msg); + return; + } + if (plugin.getConfig().getInt("Plugin.Debug") >= stage) Bukkit.getConsoleSender().sendMessage(plugin.getDescription().getPrefix() + " §5DEBUG: §6" + msg); + } + + public static void debugmsg(Plugin plugin, String msg) { + Bukkit.getConsoleSender().sendMessage(plugin.getDescription().getPrefix() + " §5DEBUG-MSG: §6" + msg); + } + + public static void info(Plugin plugin, String msg) { + plugin.getLogger().log(Level.INFO, msg); + } + + public static void warning(Plugin plugin, String msg) { + plugin.getLogger().log(Level.WARNING, msg); + } + + public static void error(Plugin plugin, String msg) { + plugin.getLogger().log(Level.SEVERE, msg); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.java b/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.java new file mode 100644 index 0000000..ff6854a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.java @@ -0,0 +1,34 @@ +package net.t2code.lib.Spigot.Lib.minecraftVersion; + +import org.bukkit.Bukkit; + +public class MCVersion { + public static String isVersion; + public static String isBuckitVersion; + public static boolean minecraft1_8; + public static boolean minecraft1_9; + public static boolean minecraft1_10; + public static boolean minecraft1_11; + public static boolean minecraft1_12; + public static boolean minecraft1_13; + public static boolean minecraft1_14; + public static boolean minecraft1_15; + public static boolean minecraft1_16; + public static boolean minecraft1_17; + public static boolean minecraft1_18; + public static void onCheck(){ + isVersion = Bukkit.getServer().getVersion(); + isBuckitVersion = Bukkit.getServer().getBukkitVersion(); + minecraft1_8 = Bukkit.getServer().getClass().getPackage().getName().contains("1_8"); + minecraft1_9 = Bukkit.getServer().getClass().getPackage().getName().contains("1_9"); + minecraft1_10 = Bukkit.getServer().getClass().getPackage().getName().contains("1_10"); + minecraft1_11 = Bukkit.getServer().getClass().getPackage().getName().contains("1_11"); + minecraft1_12 = Bukkit.getServer().getClass().getPackage().getName().contains("1_12"); + minecraft1_13 = Bukkit.getServer().getClass().getPackage().getName().contains("1_13"); + minecraft1_14 = Bukkit.getServer().getClass().getPackage().getName().contains("1_14"); + minecraft1_15 = Bukkit.getServer().getClass().getPackage().getName().contains("1_15"); + minecraft1_16 = Bukkit.getServer().getClass().getPackage().getName().contains("1_16"); + minecraft1_17 = Bukkit.getServer().getClass().getPackage().getName().contains("1_17"); + minecraft1_18 = Bukkit.getServer().getClass().getPackage().getName().contains("1_18"); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.java b/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.java new file mode 100644 index 0000000..ba410ea --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.java @@ -0,0 +1,47 @@ +package net.t2code.lib.Spigot.Lib.minecraftVersion; + +import org.bukkit.Bukkit; + +public class NMSVersion { + public static String isNMS; + public static boolean v1_8_R1; + public static boolean v1_8_R2; + public static boolean v1_8_R3; + public static boolean v1_9_R1; + public static boolean v1_9_R2; + public static boolean v1_10_R1; + public static boolean v1_11_R1; + public static boolean v1_12_R1; + public static boolean v1_13_R1; + public static boolean v1_13_R2; + public static boolean v1_14_R1; + public static boolean v1_15_R1; + public static boolean v1_16_R1; + public static boolean v1_16_R2; + public static boolean v1_16_R3; + public static boolean v1_17_R1; + public static boolean v1_18_R1; + public static boolean v1_18_R2; + + public static void onCheck() { + isNMS = Bukkit.getServer().getClass().getPackage().getName(); + v1_8_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_8_R1"); + v1_8_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_8_R2"); + v1_8_R3 = Bukkit.getServer().getClass().getPackage().getName().contains("1_8_R3"); + v1_9_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_9_R1"); + v1_9_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_9_R2"); + v1_10_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_10_R1"); + v1_11_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_11_R1"); + v1_12_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_12_R1"); + v1_13_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_13_R1"); + v1_13_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_13_R2"); + v1_14_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_14_R1"); + v1_15_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_15_R1"); + v1_16_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_16_R1"); + v1_16_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_16_R2"); + v1_16_R3 = Bukkit.getServer().getClass().getPackage().getName().contains("1_16_R3"); + v1_17_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_17_R1"); + v1_18_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_18_R1"); + v1_18_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_18_R2"); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.java b/src/main/java/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.java new file mode 100644 index 0000000..39497df --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.java @@ -0,0 +1,77 @@ +package net.t2code.lib.Spigot.Lib.plugins; + +import net.t2code.lib.Spigot.system.Main; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +import java.util.logging.Level; + +public class PluginCheck { + public static Boolean pluginCheck(String pluginName){ + return Bukkit.getPluginManager().getPlugin(pluginName) != null; + } + public static Plugin pluginInfos(String pluginName){ + return Bukkit.getPluginManager().getPlugin(pluginName); + } + public static Boolean papi(){ + return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; + } + public static Boolean vault(){ + return Bukkit.getPluginManager().getPlugin("Vault") != null; + } + public static Boolean plotSquared(){ + return Bukkit.getPluginManager().getPlugin("PlotSquared") != null; + } + public static Boolean plugManGUI(){ + return Bukkit.getPluginManager().getPlugin("PlugManGUI") != null; + } + public static Boolean cmi(){ + return Bukkit.getPluginManager().getPlugin("CMI") != null; + } + + + /** + * T2Code Plugins + * @return + */ + public static Boolean cgui(){ + return Bukkit.getPluginManager().getPlugin("CommandGUI") != null; + } + public static Boolean plotSquaredGUI(){ + return Bukkit.getPluginManager().getPlugin("PlotSquaredGUI") != null; + } + public static Boolean wbs(){ + return Bukkit.getPluginManager().getPlugin("WonderBagShop") != null; + } + public static Boolean opSec(){ + return Bukkit.getPluginManager().getPlugin("OPSecurity") != null; + } + public static Boolean papiTest(){ + return Bukkit.getPluginManager().getPlugin("PaPiTest") != null; + } + public static Boolean booster(){ + return Bukkit.getPluginManager().getPlugin("Booster") != null; + } + public static Boolean antiMapCopy(){ + return Bukkit.getPluginManager().getPlugin("AAntiMapCopy") != null; + } + public static Boolean loreEditor(){ + return Bukkit.getPluginManager().getPlugin("LoreEditor") != null; + } + public static Boolean t2cAlias(){ + return Bukkit.getPluginManager().getPlugin("T2C-Alias") != null; + } + public static Boolean t2cWarp(){ + return Bukkit.getPluginManager().getPlugin("T2C-Warp") != null; + } + + public static Boolean pluginNotFound(Plugin plugin, String prefix, String pl, Integer spigotID) { + if (Bukkit.getPluginManager().getPlugin(pl) == null) { + plugin.getLogger().log(Level.SEVERE, "Plugin can not be loaded!"); + Bukkit.getConsoleSender().sendMessage(prefix + " §e" + pl + " §4could not be found. Please download it here: " + + "§6https://spigotmc.org/resources/" + pl + "." + spigotID + " §4to be able to use this plugin."); + Main.plugin.getPluginLoader().disablePlugin(Main.plugin); + return true; + } else return false; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/register/Register.java b/src/main/java/net/t2code/lib/Spigot/Lib/register/Register.java new file mode 100644 index 0000000..a01af2f --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/register/Register.java @@ -0,0 +1,38 @@ +package net.t2code.lib.Spigot.Lib.register; + +import org.bukkit.Bukkit; +import org.bukkit.permissions.Permission; +import org.bukkit.event.Listener; +import org.bukkit.permissions.PermissionDefault; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.Collections; + +public class Register { + public static void listener(Listener listener, Plugin plugin) { + Bukkit.getServer().getPluginManager().registerEvents(listener, plugin); + } + + public static void permission(String permission, Plugin plugin) { + if (plugin.getServer().getPluginManager().getPermission(permission) == null) { + plugin.getServer().getPluginManager().addPermission(new Permission(permission)); + } + } + + public static void permission(String permission, PermissionDefault setDefault, Plugin plugin) { + permission(permission, plugin); + plugin.getServer().getPluginManager().getPermission(permission).setDefault(setDefault); + } + + public static void permission(String permission, String children, Boolean setBoolean, Plugin plugin) { + permission(permission, plugin); + plugin.getServer().getPluginManager().getPermission(permission).getChildren().put(children, setBoolean); + } + + public static void permission(String permission, PermissionDefault setDefault, String children, Boolean setBoolean, Plugin plugin) { + permission(permission, plugin); + plugin.getServer().getPluginManager().getPermission(permission).setDefault(setDefault); + plugin.getServer().getPluginManager().getPermission(permission).getChildren().put(children, setBoolean); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/replace/Replace.java b/src/main/java/net/t2code/lib/Spigot/Lib/replace/Replace.java new file mode 100644 index 0000000..fb0966a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/replace/Replace.java @@ -0,0 +1,90 @@ +package net.t2code.lib.Spigot.Lib.replace; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Replace { + + public static String replace(String prefix, String Text) { + return Text.replace("[prefix]", prefix).replace("&", "§").replace("[ue]", "ü") + .replace("[UE]", "Ü").replace("[oe]", "ö").replace("[OE]", "Ö") + .replace("[ae]", "ä").replace("[AE]", "Ä"); + } + + + public static String replace(String prefix,Player player, String Text) { + return PlaceholderAPI.setPlaceholders(player, Text.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä")); + } + + + public static List replace(String prefix, List Text) { + List output = new ArrayList<>(); + for (String input : Text) { + output.add(input.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä")); + } + return output; + } + + + public static List replace(String prefix,Player player, List Text) { + List output = new ArrayList(); + if (player == null) { + return Arrays.asList("player is null"); + } + if (Text == null) { + return Arrays.asList("Text is null"); + } + for (String input : Text) { + output.add(PlaceholderAPI.setPlaceholders(player, input.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä"))); + } + return output; + } + + + public static List replacePrice(String prefix,List Text, String price) { + List rp = new ArrayList(); + for (String s : Text) { + rp.add(s.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä") + .replace("[price]", String.valueOf(price))); + } + return rp; + } + + + public static List replacePrice(String prefix,Player player, List Text, String price) { + List rp = new ArrayList(); + for (String s : Text) { + rp.add(PlaceholderAPI.setPlaceholders(player, s.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä") + .replace("[price]", String.valueOf(price)))); + } + return rp; + } + public static String replacePrice(String prefix, String Text, String price) { + return Text.replace("[prefix]", prefix).replace("&", "§").replace("[ue]", "ü") + .replace("[UE]", "Ü").replace("[oe]", "ö").replace("[OE]", "Ö") + .replace("[ae]", "ä").replace("[AE]", "Ä").replace("[price]", String.valueOf(price)); + } + + + public static String replacePrice(String prefix,Player player, String Text, String price) { + return PlaceholderAPI.setPlaceholders(player, Text.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä") + .replace("[price]", String.valueOf(price))); + } + +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateAPI.java b/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateAPI.java new file mode 100644 index 0000000..f7895bd --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateAPI.java @@ -0,0 +1,167 @@ +package net.t2code.lib.Spigot.Lib.update; + + +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.TextComponent; + +import net.t2code.lib.Spigot.Lib.messages.TextBuilder; +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.system.config.SelectLibConfig; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Scanner; +import java.util.function.Consumer; + +public class UpdateAPI { + public static HashMap PluginVersionen = new HashMap<>(); + + public static void join(Plugin plugin, String prefix, String perm, Player player, String spigot, String discord) { + String pluginVersion = plugin.getDescription().getVersion(); + String publicVersion = UpdateAPI.PluginVersionen.get(plugin.getName()).publicVersion; + if (!player.hasPermission(perm) || !player.isOp()) { + return; + } + if (publicVersion == null) { + new BukkitRunnable() { + @Override + public void run() { + join(plugin, prefix, perm, player, spigot, discord); + } + }.runTaskLater(plugin, 20L); + } else use(plugin, prefix, player, pluginVersion, publicVersion, spigot, discord); + } + + private static void use(Plugin plugin, String prefix, Player player, String pluginVersion, String publicVersion, String spigot, String discord) { + new BukkitRunnable() { + @Override + public void run() { + if (!pluginVersion.equals(publicVersion)) { + if (SelectLibConfig.UpdateCheckOnJoin) { + UpdateAPI.sendUpdateMsg(prefix, spigot, discord, pluginVersion, publicVersion, player); + } + } + } + }.runTaskLater(plugin, 200L); + } + + public static void sendUpdateMsg(String Prefix, String Spigot, String Discord, String pluginVersion, String publicVersion) { + send.console("§4=========== " + Prefix + " §4==========="); + send.console("§6A new version was found!"); + send.console("§6Your version: §c" + pluginVersion + " §7- §6Current version: §a" + publicVersion); + send.console("§6You can download it here: §e" + Spigot); + send.console("§6You can find more information on Discord: §e" + Discord); + send.console("§4=========== " + Prefix + " §4==========="); + } + + public static void sendUpdateMsg(String Prefix, String Spigot, String Discord, String pluginVersion, String publicVersion, Player player) { + if (publicVersion.equals("§4No public version found!")) { + return; + } + send.player(player, Prefix); + TextComponent comp = new TextBuilder(Prefix + " §6A new version was found!") + .addHover("§6You can download it here: §e" + Spigot).addClickEvent(ClickEvent.Action.OPEN_URL, Spigot).build(); + player.spigot().sendMessage(comp); + TextComponent comp1 = new TextBuilder(Prefix + " §c" + pluginVersion + " §7-> §a" + publicVersion) + .addHover("§6You can download it here: §e" + Spigot).addClickEvent(ClickEvent.Action.OPEN_URL, Spigot).build(); + player.spigot().sendMessage(comp1); + TextComponent comp2 = new TextBuilder(Prefix + " §6You can find more information on Discord.") + .addHover("§e" + Discord).addClickEvent(ClickEvent.Action.OPEN_URL, Discord).build(); + player.spigot().sendMessage(comp2); + send.player(player, Prefix); + } + + private static Boolean noUpdate = true; + + public static void onUpdateCheck(Plugin plugin, String Prefix, String Spigot, int SpigotID, String Discord) { + int taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { + public void run() { + + (new UpdateAPI((JavaPlugin) plugin, SpigotID)).getVersion((update_version) -> { + UpdateObject update = new UpdateObject( + plugin.getName(), + plugin.getDescription().getVersion(), + update_version + ); + UpdateAPI.PluginVersionen.put(plugin.getName(), update); + + if (!plugin.getDescription().getVersion().equalsIgnoreCase(update_version)) { + noUpdate = true; + new BukkitRunnable() { + @Override + public void run() { + sendUpdateMsg(Prefix, Spigot, Discord, plugin.getDescription().getVersion(), update_version); + } + }.runTaskLater(plugin, 600L); + } else { + + if (noUpdate) { + send.console(Prefix + " §2No update found."); + noUpdate = false; + } + } + }, Prefix, plugin.getDescription().getVersion()); + } + }, 0L, 20 * 60 * 60L); + } + + private JavaPlugin plugin; + private int resourceId; + + public UpdateAPI(JavaPlugin plugin, int resourceId) { + this.plugin = plugin; + this.resourceId = resourceId; + } + + public void getVersion(Consumer consumer, String Prefix, String pluginVersion) { + Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { + try { + InputStream inputStream = (new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId)).openStream(); + try { + Scanner scanner = new Scanner(inputStream); + + try { + if (scanner.hasNext()) { + consumer.accept(scanner.next()); + } + } catch (Throwable var8) { + try { + scanner.close(); + } catch (Throwable var7) { + var8.addSuppressed(var7); + } + throw var8; + } + scanner.close(); + } catch (Throwable var9) { + if (inputStream != null) { + try { + inputStream.close(); + } catch (Throwable var6) { + var9.addSuppressed(var6); + } + } + throw var9; + } + if (inputStream != null) { + inputStream.close(); + } + } catch (IOException var10) { + UpdateObject update = new UpdateObject( + plugin.getName(), + pluginVersion, + "§4No public version found!" + ); + UpdateAPI.PluginVersionen.put(plugin.getName(), update); + this.plugin.getLogger().severe(Prefix + "§4 Cannot look for updates: " + var10.getMessage()); + } + }); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateObject.java b/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateObject.java new file mode 100644 index 0000000..dd74560 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateObject.java @@ -0,0 +1,14 @@ +package net.t2code.lib.Spigot.Lib.update; + +public class UpdateObject { + + public String pluginName; + public String pluginVersion; + public String publicVersion; + + public UpdateObject(String pluginName, String pluginVersion, String publicVersion) { + this.pluginName = pluginName; + this.pluginVersion = pluginVersion; + this.publicVersion = publicVersion; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/vault/Vault.java b/src/main/java/net/t2code/lib/Spigot/Lib/vault/Vault.java new file mode 100644 index 0000000..4b5301a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/vault/Vault.java @@ -0,0 +1,68 @@ +package net.t2code.lib.Spigot.Lib.vault; + +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.permission.Permission; +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.system.Main; +import net.t2code.lib.Spigot.system.languages.SelectLibMsg; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.RegisteredServiceProvider; + +public class Vault { + + public static Boolean vaultEnable; + public static Boolean connected; + + public static boolean buy(String prefix, Player p, Double price) { + if (Main.eco == null) { + if (Bukkit.getPluginManager().getPlugin("Vault") == null) { + send.console(prefix + " §4\n" + prefix + " §4Vault could not be found! §9Please download it here: " + + "§6https://www.spigotmc.org/resources/vault.34315/§4\n" + prefix); + } + p.sendMessage(prefix + "\n" + SelectLibMsg.VaultNotSetUp + "\n" + prefix); + } else { + if (Main.eco.getBalance(p) < price) { + return false; + } else { + Main.eco.withdrawPlayer(p, price); + return true; + } + } + return false; + } + + public static void loadVault() throws InterruptedException { + Long long_ = Long.valueOf(System.currentTimeMillis()); + if (Main.plugin.getServer().getPluginManager().getPlugin("Vault") != null) { + vaultEnable = true; + RegisteredServiceProvider eco = Main.plugin.getServer().getServicesManager().getRegistration(Economy.class); + if (eco != null) { + Main.eco = eco.getProvider(); + if (Main.eco != null) { + connected = true; + send.console(Main.prefix + " §2Vault / Economy successfully connected!" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else { + connected = false; + send.console(Main.prefix + " §4Economy could not be connected / found! 1" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } + } else { + connected = false; + send.console(Main.prefix + " §4Economy could not be connected / found! 2" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } + RegisteredServiceProvider perm = Main.plugin.getServer().getServicesManager().getRegistration(Permission.class); + if (perm != null) { + Main.perm = perm.getProvider(); + } + } else { + vaultEnable = false; + connected = false; + send.console(Main.prefix + " §4Vault could not be connected! 3" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } + } + + public static void vaultDisable() { + connected = false; + send.console(Main.prefix + " §4Vault / Economy successfully deactivated."); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.java b/src/main/java/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.java new file mode 100644 index 0000000..a6a6363 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.java @@ -0,0 +1,189 @@ +package net.t2code.lib.Spigot.Lib.yamlConfiguration; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.minecraftVersion.MCVersion; +import net.t2code.lib.Spigot.Lib.replace.Replace; +import net.t2code.lib.Spigot.system.languages.SelectLibMsg; +import org.bukkit.Sound; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.util.ArrayList; +import java.util.List; + +public class Config { + public static void set(String path, String value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void set(String path, YamlConfiguration YamlConfiguration) { + YamlConfiguration.set(path, null); + } + + public static void set(String path, Integer value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void set(String path, Double value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void set(String path, Boolean value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void set(String path, List value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void setSound(String soundName, String sound1_8, String sound1_9, String sound1_13, YamlConfiguration yamlConfiguration) { + Config.set("Sound." + soundName + ".Enable", true, yamlConfiguration); + String sound; + if (MCVersion.minecraft1_8) { + sound = sound1_8.toString(); + } else if (MCVersion.minecraft1_9 || MCVersion.minecraft1_10 || MCVersion.minecraft1_11 || MCVersion.minecraft1_12) { + sound = sound1_9.toString(); + } else sound = sound1_13.toString(); + Config.set("Sound." + soundName + ".Sound", sound, yamlConfiguration); + } + + public static void setSound(String soundName, String sound1_8, String sound1_13, YamlConfiguration yamlConfiguration) { + Config.set("Sound." + soundName + ".Enable", true, yamlConfiguration); + String sound; + if (MCVersion.minecraft1_8) { + sound = sound1_8.toString(); + } else sound = sound1_13.toString(); + Config.set("Sound." + soundName + ".Sound", sound, yamlConfiguration); + } + + public static void setSound(String soundName, String sound, YamlConfiguration yamlConfiguration) { + Config.set("Sound." + soundName + ".Enable", true, yamlConfiguration); + Config.set("Sound." + soundName + ".Sound", sound.toString(), yamlConfiguration); + } + + public static boolean selectSoundEnable( String soundName, YamlConfiguration yamlConfiguration) { + return selectBoolean("Sound." + soundName + ".Enable", yamlConfiguration); + } + + public static String selectSound(String prefix, String soundName, YamlConfiguration yamlConfiguration) { + return select(prefix, "Sound." + soundName + ".Sound", yamlConfiguration); + } + + public static Sound checkSound(String sound1_8, String sound1_9, String sound1_13, String selectSoundFromConfig, String prefix) { + String SOUND; + if (MCVersion.minecraft1_8) { + SOUND = sound1_8; + } else if (MCVersion.minecraft1_9 || MCVersion.minecraft1_10 || MCVersion.minecraft1_11 || MCVersion.minecraft1_12) { + SOUND = sound1_9; + } else SOUND = sound1_13; + + try { + Sound sound_Buy = Sound.valueOf(selectSoundFromConfig); + if (sound_Buy != null) { + return sound_Buy; + } else return null; + } catch (Exception e) { + send.console("§4\n§4\n§4\n" + SelectLibMsg.SoundNotFound.replace("[prefix]", prefix) + .replace("[sound]", "§8Buy: §6" + selectSoundFromConfig) + "§4\n§4\n§4\n"); + return Sound.valueOf(SOUND); + } + } + + public static Sound checkSound(String sound1_8, String sound1_13, String selectSoundFromConfig, String prefix) { + String SOUND; + if (MCVersion.minecraft1_8) { + SOUND = sound1_8; + } else SOUND = sound1_13; + + try { + Sound sound_Buy = Sound.valueOf(selectSoundFromConfig); + if (sound_Buy != null) { + return sound_Buy; + } else return null; + } catch (Exception e) { + send.console("§4\n§4\n§4\n" + SelectLibMsg.SoundNotFound.replace("[prefix]", prefix) + .replace("[sound]", "§8Buy: §6" + selectSoundFromConfig) + "§4\n§4\n§4\n"); + return Sound.valueOf(SOUND); + } + } + + public static Sound checkSound(String sound, String selectSoundFromConfig, String prefix) { + try { + Sound sound_Buy = Sound.valueOf(selectSoundFromConfig); + if (sound_Buy != null) { + return sound_Buy; + } else return null; + } catch (Exception e) { + send.console("§4\n§4\n§4\n" + SelectLibMsg.SoundNotFound.replace("[prefix]", prefix) + .replace("[sound]", "§8Buy: §6" + selectSoundFromConfig) + "§4\n§4\n§4\n"); + return Sound.valueOf(sound); + } + } + + public static String select(String prefix, String path, YamlConfiguration yamlConfiguration) { + return Replace.replace(prefix, yamlConfiguration.getString(path)); + } + + public static void select(String prefix, String value, String path, YamlConfiguration yamlConfiguration) { + value = Replace.replace(prefix, yamlConfiguration.getString(path)); + } + + public static Integer selectInt(String path, YamlConfiguration yamlConfiguration) { + return (yamlConfiguration.getInt(path)); + } + + public static void select(String path, Integer value, YamlConfiguration yamlConfiguration) { + value = (yamlConfiguration.getInt(path)); + } + + public static Boolean selectBoolean(String path, YamlConfiguration yamlConfiguration) { + return (yamlConfiguration.getBoolean(path)); + } + + public static void select(String path, Boolean value, YamlConfiguration yamlConfiguration) { + value = (yamlConfiguration.getBoolean(path)); + } + + public static Double selectDouble(String path, YamlConfiguration yamlConfiguration) { + return (yamlConfiguration.getDouble(path)); + } + + public static void select(String path, Double value, YamlConfiguration yamlConfiguration) { + value = (yamlConfiguration.getDouble(path)); + } + + public static List selectList(String path, YamlConfiguration yamlConfiguration) { + return (yamlConfiguration.getList(path)); + } + + public static void select(String path, List value, YamlConfiguration yamlConfiguration) { + value = (yamlConfiguration.getList(path)); + } + + public static List selectList(String prefix, String path, YamlConfiguration yamlConfiguration) { + List output = new ArrayList<>(); + List input = yamlConfiguration.getStringList(path); + for (String st : input) { + output.add(Replace.replace(prefix, st)); + } + return output; + } + + public static void select(String prefix, List value, String path, YamlConfiguration yamlConfiguration) { + List output = new ArrayList<>(); + List input = yamlConfiguration.getStringList(path); + for (String st : input) { + output.add(Replace.replace(prefix, st)); + } + value = output; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/CmdExecuter.java b/src/main/java/net/t2code/lib/Spigot/system/CmdExecuter.java new file mode 100644 index 0000000..ae004f6 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/CmdExecuter.java @@ -0,0 +1,110 @@ +package net.t2code.lib.Spigot.system; + +import net.md_5.bungee.protocol.packet.Commands; +import net.t2code.lib.Spigot.Lib.messages.T2CodeTemplate; +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.update.UpdateAPI; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URI; +import java.nio.file.*; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class CmdExecuter implements CommandExecutor, TabCompleter { + private static Plugin plugin = Main.plugin; + private static String prefix = Main.prefix; + private static List autor = Main.autor; + private static String version = Main.version; + private static String spigot = Main.spigot; + private static String discord = Main.discord; + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length == 0) { + T2CodeTemplate.sendInfo(sender, prefix, spigot, discord, autor, version, UpdateAPI.PluginVersionen.get(plugin.getName()).publicVersion); + } else { + if ("debug".equals(args[0].toLowerCase())) { + if (args.length != 2) { + send.sender(sender,"§4Use: §7/t2code debug createReportLog"); + return false; + } + if ("createreportlog".equals(args[1].toLowerCase())) { + + CreateReportLog.create(sender); + + } else send.sender(sender,"§4Use: §7/t2code debug createReportLog"); + } else send.sender(sender,"§4Use: §7/t2code debug createReportLog"); + } + return false; + } + + + //TabCompleter + private static HashMap arg1 = new HashMap() {{ + put("debug", "t2code.admin"); + }}; + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String s, String[] args) { + List list = new ArrayList<>(); + if (sender instanceof Player) { + Player p = (Player) sender; + if (args.length == 1) { + for (String command : arg1.keySet()) { + if (hasPermission(p, arg1.get(command)) && passend(command, args[0])) { + list.add(command); + } + } + } + + if (args.length == 2 && args[0].equalsIgnoreCase("debug")) { + if (sender.hasPermission("t2code.admin")) { + if (hasPermission(p, arg1.get("debug")) && passend("debug", args[1])) { + list.add("createReportLog"); + } + } + return list; + } + + } + return list; + } + + private static Boolean passend(String command, String arg) { + for (int i = 0; i < arg.toUpperCase().length(); i++) { + if (arg.toUpperCase().length() >= command.toUpperCase().length()) { + return false; + } else { + if (arg.toUpperCase().charAt(i) != command.toUpperCase().charAt(i)) { + return false; + } + } + } + return true; + } + + + public static boolean hasPermission(Player player, String permission) { + if (player.isOp()) { + return true; + } + String[] Permissions = permission.split(";"); + for (String perm : Permissions) { + if (player.hasPermission(perm)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/CreateReportLog.java b/src/main/java/net/t2code/lib/Spigot/system/CreateReportLog.java new file mode 100644 index 0000000..102d237 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/CreateReportLog.java @@ -0,0 +1,179 @@ +package net.t2code.lib.Spigot.system; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.minecraftVersion.MCVersion; +import net.t2code.lib.Spigot.Lib.minecraftVersion.NMSVersion; +import net.t2code.lib.Spigot.Lib.plugins.PluginCheck; +import net.t2code.lib.Spigot.Lib.vault.Vault; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + + +public class CreateReportLog { + protected static void create(CommandSender sender) { + send.sender(sender, Main.prefix + " §6A DebugLog is created..."); + String timeStampFile = new SimpleDateFormat("HH_mm_ss-dd_MM_yyyy").format(Calendar.getInstance().getTime()); + + File directory = new File(Main.getPath() + "/DebugLogs"); + if (!directory.exists()) { + directory.mkdir(); + } + + File file = new File(Main.getPath(), "/DebugLogs/T2CodeLog.txt"); + PrintWriter pWriter = null; + try { + pWriter = new PrintWriter(new FileWriter(file.getPath())); + String timeStamp = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy").format(Calendar.getInstance().getTime()); + pWriter.println("Created on: " + timeStamp); + pWriter.println(); + pWriter.println("Server Bukkit version: " + MCVersion.isBuckitVersion); + pWriter.println("Server run on: " + MCVersion.isVersion); + pWriter.println("Server NMS: " + NMSVersion.isNMS); + pWriter.println(); + pWriter.println("Online Mode: " + Bukkit.getOnlineMode()); + pWriter.println("Worlds: " + Bukkit.getWorlds()); + pWriter.println(); + if (Vault.vaultEnable) { + pWriter.println("Vault: " + Bukkit.getPluginManager().getPlugin("Vault").getName() + " - " + Bukkit.getPluginManager().getPlugin("Vault").getDescription().getVersion()); + } else pWriter.println("Vault: not connected"); + if (Main.eco != null) { + String st; + st = Main.eco.getName(); + if (Main.eco.getName().equals("CMIEconomy")) st = "CMI"; + pWriter.println("Economy: " + Main.eco.isEnabled() + " - " + Main.eco.getName() + " - " + Bukkit.getPluginManager().getPlugin(st).getDescription().getVersion()); + } else pWriter.println("Economy: not connected via vault"); + if (Main.perm != null) { + pWriter.println("Permission: " + Main.perm.isEnabled() + " - " + Main.perm.getName() + " - " + Bukkit.getPluginManager().getPlugin(Main.perm.getName()).getDescription().getVersion()); + } else pWriter.println("Permission: not connected via vault"); + pWriter.println(); + pWriter.println("Java: " + System.getProperty("java.version")); + pWriter.println("System: " + System.getProperty("os.name")); + pWriter.println("System: " + System.getProperty("os.version")); + pWriter.println("User Home: " + System.getProperty("user.home")); + pWriter.println(); + pWriter.println("T2CodeLib: " + Main.plugin.getDescription().getVersion()); + pWriter.println(); + pWriter.println("Plugins: "); + for (Plugin pl : Bukkit.getPluginManager().getPlugins()) { + pWriter.println(" - " + pl.getName() + " - " + pl.getDescription().getVersion() + " - Enabled: " + pl.isEnabled() + " - Autors: " + pl.getDescription().getAuthors() + " - Website: " + pl.getDescription().getWebsite()); + } + } catch (IOException ioe) { + ioe.printStackTrace(); + } finally { + if (pWriter != null) { + pWriter.flush(); + pWriter.close(); + } + } + + String filePath = Main.getPath() + "/DebugLogs/T2CodeLog.txt"; + String log = "logs/latest.log"; + String zipPath = "plugins/T2CodeLib/DebugLogs/T2CLog-" + timeStampFile + ".zip"; + try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipPath))) { + File fileToZip = new File(filePath); + zip.putNextEntry(new ZipEntry(fileToZip.getName())); + Files.copy(fileToZip.toPath(), zip); + + //File logToZip = new File(log); + //zipOut.putNextEntry(new ZipEntry(logToZip.getName())); + //Files.copy(logToZip.toPath(), zipOut); + + addFileToZip("", "logs/latest.log", zip, false); + + pluginToDebug("T2C-LuckyBox", "T2C-LuckyBox", zip); + pluginToDebug("WonderBagShop", "WonderBagShop", zip); + pluginToDebug("CommandGUI", "CommandGUI", zip); + pluginToDebug("OPSecurity", "OPSecurity", zip); + pluginToDebug("PaPiTest", "PaPiTest", zip); + pluginToDebug("PlotSquaredGUI", "PlotSquaredGUI", zip); + pluginToDebug("T2C-Alias", "T2Code-Alias", zip); + + pluginToDebug("LoreEditor", "LoreEditor", zip); + pluginToDebug("Booster", "Booster", zip); + pluginToDebug("AntiMapCopy", "AntiCopy", zip); + + zip.closeEntry(); + zip.close(); + } catch (IOException e) { + e.printStackTrace(); + } + file.delete(); + if (sender instanceof Player) { + send.sender(sender, Main.prefix + " §6The DebugLog has been created. You can find it under: §e" + zipPath); + send.console(Main.prefix + " §6A DebugLog has been created. You can find it under: §e" + zipPath); + } else send.sender(sender, Main.prefix + " §6The DebugLog has been created. You can find it under: §e" + zipPath); + + } + + private static void pluginToDebug(String pluginName, String jar, ZipOutputStream zip) throws IOException { + if (PluginCheck.pluginCheck(pluginName)) { + Plugin plugin = Bukkit.getPluginManager().getPlugin(pluginName); + File plConfigs = new File(plugin.getDataFolder().getPath()); + if (plConfigs.exists()) { + addFolderToZip("T2Code-Plugins", plugin.getDataFolder().getPath(), zip); + } + File f = new File("plugins/"); + File[] fileArray = f.listFiles(); + + for (File config : fileArray) { + if (config.getName().contains(jar) && config.getName().contains(".jar")) { + addFileToZip("T2Code-Plugins", config.getPath(), zip, false); + } + } + } + } + + private static void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws IOException { + File folder = new File(srcFolder); + if (folder.list() == null) { + addFileToZip(path + "/" + folder.getName(), srcFolder, zip, false); + } else if (folder.list().length == 0) { + addFileToZip(path, srcFolder, zip, true); + } else { + for (String fileName : folder.list()) { + if (path.equals("")) { + addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip, false); + } else { + addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip, false); + } + } + } + } + + private static void addFileToZip(String path, String srcFile, ZipOutputStream zip, boolean flag) throws IOException { + File folder = new File(srcFile); + if (flag) { + zip.putNextEntry(new ZipEntry(path + "/" + folder.getName() + "/")); + } else { + if (folder.isDirectory()) { + addFolderToZip(path, srcFile, zip); + } else { + byte[] buf = new byte[1024]; + int len; + FileInputStream in = new FileInputStream(srcFile); + + if (path.equals("")) { + zip.putNextEntry(new ZipEntry((folder.getName()))); + } else { + zip.putNextEntry(new ZipEntry((path + "/" + folder.getName()))); + } + + while ((len = in.read(buf)) > 0) { + zip.write(buf, 0, len); + } + } + } + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/JoinEvent.java b/src/main/java/net/t2code/lib/Spigot/system/JoinEvent.java new file mode 100644 index 0000000..6b109a2 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/JoinEvent.java @@ -0,0 +1,19 @@ +// This claas was created by JaTiTV + +package net.t2code.lib.Spigot.system; + +import net.t2code.lib.Spigot.Lib.update.UpdateAPI; +import net.t2code.lib.Util; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerLoginEvent; + +public class JoinEvent implements Listener { + + @EventHandler + public void onJoinEvent(PlayerLoginEvent event) { + Player player = event.getPlayer(); + UpdateAPI.join(Main.plugin, Util.Prefix, "t2code.lib.updatemsg", event.getPlayer(), Main.spigot, Main.discord); + } +} \ No newline at end of file diff --git a/src/main/java/net/t2code/lib/Spigot/system/Main.java b/src/main/java/net/t2code/lib/Spigot/system/Main.java new file mode 100644 index 0000000..d5ac921 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/Main.java @@ -0,0 +1,109 @@ +package net.t2code.lib.Spigot.system; + +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.permission.Permission; +import net.t2code.lib.Spigot.Lib.items.ItemVersion; +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.minecraftVersion.MCVersion; +import net.t2code.lib.Spigot.Lib.minecraftVersion.NMSVersion; +import net.t2code.lib.Spigot.Lib.messages.T2CodeTemplate; +import net.t2code.lib.Spigot.Lib.plugins.PluginCheck; +import net.t2code.lib.Spigot.Lib.register.Register; +import net.t2code.lib.Spigot.Lib.update.UpdateAPI; +import net.t2code.lib.Spigot.Lib.vault.Vault; +import net.t2code.lib.Spigot.system.config.ConfigCreate; +import net.t2code.lib.Spigot.system.languages.LanguagesCreate; +import net.t2code.lib.Util; +import net.t2code.lib.Spigot.system.config.SelectLibConfig; +import net.t2code.lib.Spigot.system.languages.SelectLibMsg; +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.util.List; + +public final class Main extends JavaPlugin { + + public static File getPath() { + return plugin.getDataFolder(); + } + + public static Main plugin; + public static Economy eco = null; + public static Permission perm = null; + + public static List autor; + public static String version; + + public static String prefix = Util.Prefix; + public static Integer spigotID = Util.SpigotID; + public static Integer bstatsID = Util.BstatsID; + public static String spigot = Util.Spigot; + public static String discord = Util.Discord; + + @Override + public void onEnable() { + // Plugin startup logic + plugin = this; + autor = plugin.getDescription().getAuthors(); + version = plugin.getDescription().getVersion(); + Long long_; + long_ = T2CodeTemplate.onLoadHeader(prefix, autor, version, spigot, discord); + //send.console("§4 _|_|_|_|_| _|_| _|_|_| _| "); + //send.console("§4 _| _| _| _| _|_| _|_|_| _|_| "); + //send.console("§4 _| _| _| _| _| _| _| _|_|_|_| "); + //send.console("§4 _| _| _| _| _| _| _| _| "); + //send.console("§4 _| _|_|_|_| _|_|_| _|_| _|_|_| _|_|_| "); + //T2CodeTemplate.onLoadSeparateStroke(prefix); + try { + Vault.loadVault(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + NMSVersion.onCheck(); + MCVersion.onCheck(); + if (MCVersion.minecraft1_18){ + send.warning(this, "The 1.18 is not yet supported with this version! Please check if there are updates of our plugins! " + + "For further questions please join our Discord: http://dc.t2code.net"); + } + ItemVersion.scan(); + send.console(Main.prefix + " §3Server run on: §6" + MCVersion.isVersion + " / " + NMSVersion.isNMS); + if (eco != null) { + String st; + st = eco.getName(); + if (eco.getName().equals("CMIEconomy")) st = "CMI"; + if (Bukkit.getPluginManager().getPlugin(st) != null){ + send.console(Main.prefix + " §3Economy: §6" + eco.getName() + " - " + Bukkit.getPluginManager().getPlugin(st).getDescription().getVersion() + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else send.console(Main.prefix + " §3Economy: §6" + eco.getName() + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else send.console(Main.prefix + " §3Economy: §4not connected via vault!" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + + if (perm != null) { + if (Bukkit.getPluginManager().getPlugin(perm.getName()) != null){ + send.console(Main.prefix + " §3Permission plugin: §6" + perm.getName() + " - " + Bukkit.getPluginManager().getPlugin(perm.getName()).getDescription().getVersion() + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else send.console(Main.prefix + " §3Permission plugin: §6" + perm.getName() + " - §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else send.console(Main.prefix + " §3Permission plugin: §4not connected via vault!" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + if (PluginCheck.pluginCheck("PlaceholderAPI")) { + send.console(Main.prefix + " §3PlaceholderAPI: §6connected" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + + } + + + Main.plugin.getCommand("t2code").setExecutor(new CmdExecuter()); + ConfigCreate.configCreate(); + LanguagesCreate.langCreate(); + SelectLibConfig.onSelect(); + SelectLibMsg.onSelect(prefix); + UpdateAPI.onUpdateCheck(plugin, prefix, spigot, spigotID, discord); + Metrics.Bstats(plugin, bstatsID); + Bukkit.getServer().getPluginManager().registerEvents(new JoinEvent(), plugin); + T2CodeTemplate.onLoadFooter(prefix, long_); + } + + @Override + public void onDisable() { + // Plugin shutdown logic + Vault.vaultDisable(); + T2CodeTemplate.onDisable(prefix, autor, version, spigot, discord); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/Metrics.java b/src/main/java/net/t2code/lib/Spigot/system/Metrics.java new file mode 100644 index 0000000..a4c7f02 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/Metrics.java @@ -0,0 +1,851 @@ +// This claas was created by JaTiTV + + +package net.t2code.lib.Spigot.system; + +import net.t2code.lib.Spigot.system.config.SelectLibConfig; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.lang.reflect.Method; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.zip.GZIPOutputStream; + +public class Metrics { + + public static void Bstats(Plugin plugin, int bstatsID) { + int pluginId = bstatsID; // <-- Replace with the id of your plugin! + Metrics metrics = new Metrics((JavaPlugin) plugin, pluginId); + metrics.addCustomChart(new SimplePie("updatecheckonjoin", () -> String.valueOf(SelectLibConfig.UpdateCheckOnJoin))); + } + + private final Plugin plugin; + + private final MetricsBase metricsBase; + + /** + * Creates a new Metrics instance. + * + * @param plugin Your plugin instance. + * @param serviceId The id of the service. It can be found at What is my plugin id? + */ + public Metrics(JavaPlugin plugin, int serviceId) { + this.plugin = plugin; + // Get the config file + File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); + File configFile = new File(bStatsFolder, "config.yml"); + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + if (!config.isSet("serverUuid")) { + config.addDefault("enabled", true); + config.addDefault("serverUuid", UUID.randomUUID().toString()); + config.addDefault("logFailedRequests", false); + config.addDefault("logSentData", false); + config.addDefault("logResponseStatusText", false); + // Inform the server owners about bStats + config + .options() + .header( + "bStats (https://bStats.org) collects some basic information for plugin authors, like how\n" + + "many people use their plugin and their total player count. It's recommended to keep bStats\n" + + "enabled, but if you're not comfortable with this, you can turn this setting off. There is no\n" + + "performance penalty associated with having metrics enabled, and data sent to bStats is fully\n" + + "anonymous.") + .copyDefaults(true); + try { + config.save(configFile); + } catch (IOException ignored) { + } + } + // Load the data + boolean enabled = config.getBoolean("enabled", true); + String serverUUID = config.getString("serverUuid"); + boolean logErrors = config.getBoolean("logFailedRequests", false); + boolean logSentData = config.getBoolean("logSentData", false); + boolean logResponseStatusText = config.getBoolean("logResponseStatusText", false); + metricsBase = + new MetricsBase( + "bukkit", + serverUUID, + serviceId, + enabled, + this::appendPlatformData, + this::appendServiceData, + submitDataTask -> Bukkit.getScheduler().runTask(plugin, submitDataTask), + plugin::isEnabled, + (message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error), + (message) -> this.plugin.getLogger().log(Level.INFO, message), + logErrors, + logSentData, + logResponseStatusText); + } + + /** + * Adds a custom chart. + * + * @param chart The chart to add. + */ + public void addCustomChart(CustomChart chart) { + metricsBase.addCustomChart(chart); + } + + private void appendPlatformData(JsonObjectBuilder builder) { + builder.appendField("playerAmount", getPlayerAmount()); + builder.appendField("onlineMode", Bukkit.getOnlineMode() ? 1 : 0); + builder.appendField("bukkitVersion", Bukkit.getVersion()); + builder.appendField("bukkitName", Bukkit.getName()); + builder.appendField("javaVersion", System.getProperty("java.version")); + builder.appendField("osName", System.getProperty("os.name")); + builder.appendField("osArch", System.getProperty("os.arch")); + builder.appendField("osVersion", System.getProperty("os.version")); + builder.appendField("coreCount", Runtime.getRuntime().availableProcessors()); + } + + private void appendServiceData(JsonObjectBuilder builder) { + builder.appendField("pluginVersion", plugin.getDescription().getVersion()); + } + + private int getPlayerAmount() { + try { + // Around MC 1.8 the return type was changed from an array to a collection, + // This fixes java.lang.NoSuchMethodError: + // org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; + Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); + return onlinePlayersMethod.getReturnType().equals(Collection.class) + ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() + : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; + } catch (Exception e) { + // Just use the new method if the reflection failed + return Bukkit.getOnlinePlayers().size(); + } + } + + public static class MetricsBase { + + /** + * The version of the Metrics class. + */ + public static final String METRICS_VERSION = "2.2.1"; + + private static final ScheduledExecutorService scheduler = + Executors.newScheduledThreadPool(1, task -> new Thread(task, "bStats-Metrics")); + + private static final String REPORT_URL = "https://bStats.org/api/v2/data/%s"; + + private final String platform; + + private final String serverUuid; + + private final int serviceId; + + private final Consumer appendPlatformDataConsumer; + + private final Consumer appendServiceDataConsumer; + + private final Consumer submitTaskConsumer; + + private final Supplier checkServiceEnabledSupplier; + + private final BiConsumer errorLogger; + + private final Consumer infoLogger; + + private final boolean logErrors; + + private final boolean logSentData; + + private final boolean logResponseStatusText; + + private final Set customCharts = new HashSet<>(); + + private final boolean enabled; + + /** + * Creates a new MetricsBase class instance. + * + * @param platform The platform of the service. + * @param serviceId The id of the service. + * @param serverUuid The server uuid. + * @param enabled Whether or not data sending is enabled. + * @param appendPlatformDataConsumer A consumer that receives a {@code JsonObjectBuilder} and + * appends all platform-specific data. + * @param appendServiceDataConsumer A consumer that receives a {@code JsonObjectBuilder} and + * appends all service-specific data. + * @param submitTaskConsumer A consumer that takes a runnable with the submit task. This can be + * used to delegate the data collection to a another thread to prevent errors caused by + * concurrency. Can be {@code null}. + * @param checkServiceEnabledSupplier A supplier to check if the service is still enabled. + * @param errorLogger A consumer that accepts log message and an error. + * @param infoLogger A consumer that accepts info log messages. + * @param logErrors Whether or not errors should be logged. + * @param logSentData Whether or not the sent data should be logged. + * @param logResponseStatusText Whether or not the response status text should be logged. + */ + public MetricsBase( + String platform, + String serverUuid, + int serviceId, + boolean enabled, + Consumer appendPlatformDataConsumer, + Consumer appendServiceDataConsumer, + Consumer submitTaskConsumer, + Supplier checkServiceEnabledSupplier, + BiConsumer errorLogger, + Consumer infoLogger, + boolean logErrors, + boolean logSentData, + boolean logResponseStatusText) { + this.platform = platform; + this.serverUuid = serverUuid; + this.serviceId = serviceId; + this.enabled = enabled; + this.appendPlatformDataConsumer = appendPlatformDataConsumer; + this.appendServiceDataConsumer = appendServiceDataConsumer; + this.submitTaskConsumer = submitTaskConsumer; + this.checkServiceEnabledSupplier = checkServiceEnabledSupplier; + this.errorLogger = errorLogger; + this.infoLogger = infoLogger; + this.logErrors = logErrors; + this.logSentData = logSentData; + this.logResponseStatusText = logResponseStatusText; + checkRelocation(); + if (enabled) { + startSubmitting(); + } + } + + public void addCustomChart(CustomChart chart) { + this.customCharts.add(chart); + } + + private void startSubmitting() { + final Runnable submitTask = + () -> { + if (!enabled || !checkServiceEnabledSupplier.get()) { + // Submitting data or service is disabled + scheduler.shutdown(); + return; + } + if (submitTaskConsumer != null) { + submitTaskConsumer.accept(this::submitData); + } else { + this.submitData(); + } + }; + // Many servers tend to restart at a fixed time at xx:00 which causes an uneven distribution + // of requests on the + // bStats backend. To circumvent this problem, we introduce some randomness into the initial + // and second delay. + // WARNING: You must not modify and part of this Metrics class, including the submit delay or + // frequency! + // WARNING: Modifying this code will get your plugin banned on bStats. Just don't do it! + long initialDelay = (long) (1000 * 60 * (3 + Math.random() * 3)); + long secondDelay = (long) (1000 * 60 * (Math.random() * 30)); + scheduler.schedule(submitTask, initialDelay, TimeUnit.MILLISECONDS); + scheduler.scheduleAtFixedRate( + submitTask, initialDelay + secondDelay, 1000 * 60 * 30, TimeUnit.MILLISECONDS); + } + + private void submitData() { + final JsonObjectBuilder baseJsonBuilder = new JsonObjectBuilder(); + appendPlatformDataConsumer.accept(baseJsonBuilder); + final JsonObjectBuilder serviceJsonBuilder = new JsonObjectBuilder(); + appendServiceDataConsumer.accept(serviceJsonBuilder); + JsonObjectBuilder.JsonObject[] chartData = + customCharts.stream() + .map(customChart -> customChart.getRequestJsonObject(errorLogger, logErrors)) + .filter(Objects::nonNull) + .toArray(JsonObjectBuilder.JsonObject[]::new); + serviceJsonBuilder.appendField("id", serviceId); + serviceJsonBuilder.appendField("customCharts", chartData); + baseJsonBuilder.appendField("service", serviceJsonBuilder.build()); + baseJsonBuilder.appendField("serverUUID", serverUuid); + baseJsonBuilder.appendField("metricsVersion", METRICS_VERSION); + JsonObjectBuilder.JsonObject data = baseJsonBuilder.build(); + scheduler.execute( + () -> { + try { + // Send the data + sendData(data); + } catch (Exception e) { + // Something went wrong! :( + if (logErrors) { + errorLogger.accept("Could not submit bStats metrics data", e); + } + } + }); + } + + private void sendData(JsonObjectBuilder.JsonObject data) throws Exception { + if (logSentData) { + infoLogger.accept("Sent bStats metrics data: " + data.toString()); + } + String url = String.format(REPORT_URL, platform); + HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection(); + // Compress the data to save bandwidth + byte[] compressedData = compress(data.toString()); + connection.setRequestMethod("POST"); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + connection.addRequestProperty("Content-Encoding", "gzip"); + connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("User-Agent", "Metrics-Service/1"); + connection.setDoOutput(true); + try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { + outputStream.write(compressedData); + } + StringBuilder builder = new StringBuilder(); + try (BufferedReader bufferedReader = + new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String line; + while ((line = bufferedReader.readLine()) != null) { + builder.append(line); + } + } + if (logResponseStatusText) { + infoLogger.accept("Sent data to bStats and received response: " + builder); + } + } + + /** + * Checks that the class was properly relocated. + */ + private void checkRelocation() { + // You can use the property to disable the check in your test environment + if (System.getProperty("bstats.relocatecheck") == null + || !System.getProperty("bstats.relocatecheck").equals("false")) { + // Maven's Relocate is clever and changes strings, too. So we have to use this little + // "trick" ... :D + final String defaultPackage = + new String(new byte[]{'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's'}); + final String examplePackage = + new String(new byte[]{'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); + // We want to make sure no one just copy & pastes the example and uses the wrong package + // names + if (MetricsBase.class.getPackage().getName().startsWith(defaultPackage) + || MetricsBase.class.getPackage().getName().startsWith(examplePackage)) { + throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); + } + } + } + + /** + * Gzips the given string. + * + * @param str The string to gzip. + * @return The gzipped string. + */ + private static byte[] compress(final String str) throws IOException { + if (str == null) { + return null; + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { + gzip.write(str.getBytes(StandardCharsets.UTF_8)); + } + return outputStream.toByteArray(); + } + } + + public static class AdvancedBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().length == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class SimpleBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimpleBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + for (Map.Entry entry : map.entrySet()) { + valuesBuilder.appendField(entry.getKey(), new int[]{entry.getValue()}); + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class MultiLineChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public MultiLineChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class AdvancedPie extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedPie(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public abstract static class CustomChart { + + private final String chartId; + + protected CustomChart(String chartId) { + if (chartId == null) { + throw new IllegalArgumentException("chartId must not be null"); + } + this.chartId = chartId; + } + + public JsonObjectBuilder.JsonObject getRequestJsonObject( + BiConsumer errorLogger, boolean logErrors) { + JsonObjectBuilder builder = new JsonObjectBuilder(); + builder.appendField("chartId", chartId); + try { + JsonObjectBuilder.JsonObject data = getChartData(); + if (data == null) { + // If the data is null we don't send the chart. + return null; + } + builder.appendField("data", data); + } catch (Throwable t) { + if (logErrors) { + errorLogger.accept("Failed to get data for custom chart with id " + chartId, t); + } + return null; + } + return builder.build(); + } + + protected abstract JsonObjectBuilder.JsonObject getChartData() throws Exception; + } + + public static class SingleLineChart extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SingleLineChart(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + int value = callable.call(); + if (value == 0) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("value", value).build(); + } + } + + public static class SimplePie extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimplePie(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + String value = callable.call(); + if (value == null || value.isEmpty()) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("value", value).build(); + } + } + + public static class DrilldownPie extends CustomChart { + + private final Callable>> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public DrilldownPie(String chartId, Callable>> callable) { + super(chartId); + this.callable = callable; + } + + @Override + public JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map> map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean reallyAllSkipped = true; + for (Map.Entry> entryValues : map.entrySet()) { + JsonObjectBuilder valueBuilder = new JsonObjectBuilder(); + boolean allSkipped = true; + for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { + valueBuilder.appendField(valueEntry.getKey(), valueEntry.getValue()); + allSkipped = false; + } + if (!allSkipped) { + reallyAllSkipped = false; + valuesBuilder.appendField(entryValues.getKey(), valueBuilder.build()); + } + } + if (reallyAllSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + /** + * An extremely simple JSON builder. + * + *

While this class is neither feature-rich nor the most performant one, it's sufficient enough + * for its use-case. + */ + public static class JsonObjectBuilder { + + private StringBuilder builder = new StringBuilder(); + + private boolean hasAtLeastOneField = false; + + public JsonObjectBuilder() { + builder.append("{"); + } + + /** + * Appends a null field to the JSON. + * + * @param key The key of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendNull(String key) { + appendFieldUnescaped(key, "null"); + return this; + } + + /** + * Appends a string field to the JSON. + * + * @param key The key of the field. + * @param value The value of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, String value) { + if (value == null) { + throw new IllegalArgumentException("JSON value must not be null"); + } + appendFieldUnescaped(key, "\"" + escape(value) + "\""); + return this; + } + + /** + * Appends an integer field to the JSON. + * + * @param key The key of the field. + * @param value The value of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, int value) { + appendFieldUnescaped(key, String.valueOf(value)); + return this; + } + + /** + * Appends an object to the JSON. + * + * @param key The key of the field. + * @param object The object. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, JsonObject object) { + if (object == null) { + throw new IllegalArgumentException("JSON object must not be null"); + } + appendFieldUnescaped(key, object.toString()); + return this; + } + + /** + * Appends a string array to the JSON. + * + * @param key The key of the field. + * @param values The string array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, String[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values) + .map(value -> "\"" + escape(value) + "\"") + .collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends an integer array to the JSON. + * + * @param key The key of the field. + * @param values The integer array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, int[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values).mapToObj(String::valueOf).collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends an object array to the JSON. + * + * @param key The key of the field. + * @param values The integer array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, JsonObject[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values).map(JsonObject::toString).collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends a field to the object. + * + * @param key The key of the field. + * @param escapedValue The escaped value of the field. + */ + private void appendFieldUnescaped(String key, String escapedValue) { + if (builder == null) { + throw new IllegalStateException("JSON has already been built"); + } + if (key == null) { + throw new IllegalArgumentException("JSON key must not be null"); + } + if (hasAtLeastOneField) { + builder.append(","); + } + builder.append("\"").append(escape(key)).append("\":").append(escapedValue); + hasAtLeastOneField = true; + } + + /** + * Builds the JSON string and invalidates this builder. + * + * @return The built JSON string. + */ + public JsonObject build() { + if (builder == null) { + throw new IllegalStateException("JSON has already been built"); + } + JsonObject object = new JsonObject(builder.append("}").toString()); + builder = null; + return object; + } + + /** + * Escapes the given string like stated in https://www.ietf.org/rfc/rfc4627.txt. + * + *

This method escapes only the necessary characters '"', '\'. and '\u0000' - '\u001F'. + * Compact escapes are not used (e.g., '\n' is escaped as "\u000a" and not as "\n"). + * + * @param value The value to escape. + * @return The escaped value. + */ + private static String escape(String value) { + final StringBuilder builder = new StringBuilder(); + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + if (c == '"') { + builder.append("\\\""); + } else if (c == '\\') { + builder.append("\\\\"); + } else if (c <= '\u000F') { + builder.append("\\u000").append(Integer.toHexString(c)); + } else if (c <= '\u001F') { + builder.append("\\u00").append(Integer.toHexString(c)); + } else { + builder.append(c); + } + } + return builder.toString(); + } + + /** + * A super simple representation of a JSON object. + * + *

This class only exists to make methods of the {@link JsonObjectBuilder} type-safe and not + * allow a raw string inputs for methods like {@link JsonObjectBuilder#appendField(String, + * JsonObject)}. + */ + public static class JsonObject { + + private final String value; + + private JsonObject(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/net/t2code/lib/Spigot/system/config/ConfigCreate.java b/src/main/java/net/t2code/lib/Spigot/system/config/ConfigCreate.java new file mode 100644 index 0000000..fa4616b --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/config/ConfigCreate.java @@ -0,0 +1,67 @@ +package net.t2code.lib.Spigot.system.config; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.system.Main; +import net.t2code.lib.Spigot.Lib.yamlConfiguration.Config; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; + + +public class ConfigCreate { + + private static Boolean UpdateCheckOnJoin = true; + private static Boolean Debug = false; + private static String language = "english"; + + + private static Boolean mySQL = false; + private static String Storage = "YML"; + private static String ip = "localhost"; + private static Integer port = 3306; + private static String database = "database"; + private static String user = "root"; + private static String password = "password"; + private static Boolean SSL = false; + + private static Boolean Bungee = false; + private static String thisServer = "server"; + + public static void configCreate() { + Long long_ = Long.valueOf(System.currentTimeMillis()); + if (new File(Main.getPath(), "config.yml").exists()){ + if (Main.plugin.getConfig().getBoolean("Plugin.Debug")) send.console(Main.prefix + " §5DEBUG: §6" + " §4config.yml are created / updated..."); + } else send.console(Main.prefix + " §4config.yml are created..."); + + + File config = new File(Main.getPath(), "config.yml"); + YamlConfiguration yamlConfiguration = YamlConfiguration.loadConfiguration(config); + + Config.set("Plugin.UpdateCheckOnJoin", UpdateCheckOnJoin, yamlConfiguration); + Config.set("Plugin.language", language, yamlConfiguration); + + Config.set("BungeeCord.Enable", Bungee, yamlConfiguration); + Config.set("BungeeCord.ThisServer", thisServer, yamlConfiguration); + + // Config.set("Storage.MySQL.Enable", mySQL, yamlConfiguration); + // Config.set("Storage.Type", Storage, yamlConfiguration); + // Config.set("Storage.MySQL.IP", ip, yamlConfiguration); + // Config.set("Storage.MySQL.Port", port, yamlConfiguration); + // Config.set("Storage.MySQL.Database", database, yamlConfiguration); + // Config.set("Storage.MySQL.User", user, yamlConfiguration); + // Config.set("Storage.MySQL.Password", password, yamlConfiguration); + // Config.set("Storage.MySQL.SSL", SSL, yamlConfiguration); + + + + try { + yamlConfiguration.save(config); + } catch (IOException e) { + e.printStackTrace(); + } + + send.console(Main.prefix + " §2config.yml were successfully created / updated." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/config/SelectLibConfig.java b/src/main/java/net/t2code/lib/Spigot/system/config/SelectLibConfig.java new file mode 100644 index 0000000..2250889 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/config/SelectLibConfig.java @@ -0,0 +1,24 @@ +package net.t2code.lib.Spigot.system.config; + +import net.t2code.lib.Spigot.system.Main; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; + +public class SelectLibConfig { + + + public static Boolean UpdateCheckOnJoin; + public static Boolean Debug; + public static String language; + + public static void onSelect() { + File config = new File(Main.getPath(), "config.yml"); + YamlConfiguration yamlConfiguration = YamlConfiguration.loadConfiguration(config); + + UpdateCheckOnJoin = yamlConfiguration.getBoolean("Plugin.UpdateCheckOnJoin"); + Debug = yamlConfiguration.getBoolean("Plugin.Debug"); + language = yamlConfiguration.getString("Plugin.language"); + + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/languages/LanguagesCreate.java b/src/main/java/net/t2code/lib/Spigot/system/languages/LanguagesCreate.java new file mode 100644 index 0000000..2cf3c57 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/languages/LanguagesCreate.java @@ -0,0 +1,78 @@ +package net.t2code.lib.Spigot.system.languages; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.system.Main; +import net.t2code.lib.Spigot.Lib.yamlConfiguration.Config; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.io.IOException; + +public class LanguagesCreate { + static Plugin plugin = Main.plugin; + + public static void langCreate() { + send.debug(plugin,"§4Language files are created / updated..."); + Long long_ = Long.valueOf(System.currentTimeMillis()); + + /** + * + * ENGLISH + * + */ + + File messagesEN = new File(Main.getPath(), "languages/english_messages.yml"); + YamlConfiguration yamlConfigurationEN = YamlConfiguration.loadConfiguration(messagesEN); + + Config.set("Plugin.VaultNotSetUp", MSG.EN_VaultNotSetUp, yamlConfigurationEN); + Config.set("Plugin.SoundNotFound", MSG.EN_SoundNotFound, yamlConfigurationEN); + + try { + yamlConfigurationEN.save(messagesEN); + } catch (IOException e) { + send.warning(Main.plugin,e.getMessage()); + e.printStackTrace(); + } + + /** + * + * GERMAN + * + */ + + File messagesDE = new File(Main.getPath(), "languages/german_messages.yml"); + YamlConfiguration yamlConfigurationDE = YamlConfiguration.loadConfiguration(messagesDE); + + Config.set("Plugin.VaultNotSetUp", MSG.DE_VaultNotSetUp, yamlConfigurationDE); + Config.set("Plugin.SoundNotFound", MSG.DE_SoundNotFound, yamlConfigurationDE); + + try { + yamlConfigurationDE.save(messagesDE); + } catch (IOException e) { + send.warning(Main.plugin,e.getMessage()); + e.printStackTrace(); + } + + /** + * + * norwegian + * + */ + + File messagesNO = new File(Main.getPath(), "languages/norwegian_messages.yml"); + YamlConfiguration yamlConfigurationNO = YamlConfiguration.loadConfiguration(messagesNO); + + Config.set("Plugin.VaultNotSetUp", MSG.NO_VaultNotSetUp, yamlConfigurationNO); + Config.set("Plugin.SoundNotFound", MSG.NO_SoundNotFound, yamlConfigurationNO); + + try { + yamlConfigurationNO.save(messagesNO); + } catch (IOException e) { + send.warning(Main.plugin,e.getMessage()); + e.printStackTrace(); + } + + send.console(Main.prefix + " §2Language files were successfully created / updated." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/languages/MSG.java b/src/main/java/net/t2code/lib/Spigot/system/languages/MSG.java new file mode 100644 index 0000000..bb6399b --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/languages/MSG.java @@ -0,0 +1,22 @@ +// This claas was created by JaTiTV + +package net.t2code.lib.Spigot.system.languages; + +public class MSG { + + // EN + public static String EN_VaultNotSetUp = "[prefix] &4Vault / Economy not set up!"; + public static String EN_SoundNotFound = "[prefix] &4The sound &6[sound] &4was not found! Please check the settings."; + + + // DE + public static String DE_VaultNotSetUp = "[prefix] &4Vault / Economy nicht eingerichtet!"; + public static String DE_SoundNotFound = "[prefix] &4Der Sound &6[sound] &4wurde nicht gefunden! Bitte [ue]berpr[ue]fe die Einstellungen."; + + + + // NO + public static String NO_VaultNotSetUp = "[prefix] &4Vault / Økonomi har ikke blitt satt opp!"; + public static String NO_SoundNotFound = "[prefix] &4Lyden &6[sound] &4ble ikke bli funnet! Vennligst sjekk innstillingene."; + +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/languages/SelectLibMsg.java b/src/main/java/net/t2code/lib/Spigot/system/languages/SelectLibMsg.java new file mode 100644 index 0000000..6c5f9b2 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/languages/SelectLibMsg.java @@ -0,0 +1,48 @@ +package net.t2code.lib.Spigot.system.languages; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.replace.Replace; +import net.t2code.lib.Spigot.system.Main; +import net.t2code.lib.Spigot.system.config.SelectLibConfig; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.Plugin; + +import java.io.File; + +public class SelectLibMsg { + private static Plugin plugin = Main.plugin; +private static String prefix = Main.prefix; + + public static String selectMSG; + + public static String VaultNotSetUp; + public static String SoundNotFound; + + public static void onSelect(String Prefix) { + + send.debug(plugin, "§4Select language..."); + Long long_ = Long.valueOf(System.currentTimeMillis()); + + File msg; + + msg = new File(Main.getPath(), "languages/" + SelectLibConfig.language + "_messages.yml"); + if (!msg.isFile()) { + send.console(Prefix); + send.console(Prefix + " §4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + send.console(Prefix + " §4The selected §c" + SelectLibConfig.language + " §4language file was not found."); + send.console(Prefix + " §6The default language §eEnglish §6is used!"); + send.console(Prefix + " §4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + send.console(Prefix); + msg = new File(Main.getPath(), "languages/" + "english_messages.yml"); + selectMSG = "english"; + } else selectMSG = SelectLibConfig.language; + YamlConfiguration yamlConfiguration_msg = YamlConfiguration.loadConfiguration(msg); + + VaultNotSetUp = Replace.replace(prefix, yamlConfiguration_msg.getString("Plugin.VaultNotSetUp")); + SoundNotFound = Replace.replace(prefix, yamlConfiguration_msg.getString("Plugin.SoundNotFound")); + + + + send.console(Prefix + " §2Language successfully selected to: §6" + selectMSG + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } +} diff --git a/src/main/java/net/t2code/lib/Util.java b/src/main/java/net/t2code/lib/Util.java new file mode 100644 index 0000000..498f2ba --- /dev/null +++ b/src/main/java/net/t2code/lib/Util.java @@ -0,0 +1,9 @@ +package net.t2code.lib; + +public class Util { + public static String Prefix = "§8[§4T2Code§5Lib§8]"; + public static Integer SpigotID = 96388; + public static Integer BstatsID = 12518; + public static String Spigot = "https://www.spigotmc.org/resources/" + SpigotID; + public static String Discord = "http://dc.t2code.net"; +} diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml new file mode 100644 index 0000000..926377b --- /dev/null +++ b/src/main/resources/bungee.yml @@ -0,0 +1,5 @@ +name: T2CodeLib +version: 7.3 +main: net.t2code.lib.Bungee.BMain +author: JaTiTV, Jkobs +description: Libarie from T2Code Plugins \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..fa0444c --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,18 @@ +name: T2CodeLib +version: 7.3 +main: net.t2code.lib.Spigot.system.Main +api-version: 1.13 +prefix: T2CodeLib +authors: [ JaTiTV, Jkobs ] +description: Libarie from T2Code Plugins +website: T2Code.net +load: STARTUP +softdepend: [ PlaceholderAPI, PlotSquared, CMI, CMILib, Vault, Economy, XConomy ] +loadbefore: [ T2C-Alias ] + +commands: + t2code: + +permissions: + t2code.admin: + default: op \ No newline at end of file diff --git a/target/classes/bungee.yml b/target/classes/bungee.yml new file mode 100644 index 0000000..926377b --- /dev/null +++ b/target/classes/bungee.yml @@ -0,0 +1,5 @@ +name: T2CodeLib +version: 7.3 +main: net.t2code.lib.Bungee.BMain +author: JaTiTV, Jkobs +description: Libarie from T2Code Plugins \ No newline at end of file diff --git a/target/classes/net/t2code/lib/Bungee/BMain.class b/target/classes/net/t2code/lib/Bungee/BMain.class new file mode 100644 index 0000000000000000000000000000000000000000..6513b3a6ecbfd52de20caa1925862a77c7c1c1e8 GIT binary patch literal 2248 zcmcIlZF3V<6n<`-b~kaQB?XF>m(UlQ7RW*^w33372Cy1vB@jhK+-z>st=rwOFCF<4 z{tW%%7n7OL(HTEDe)5mVuW&r~?xqcGV?UY9+;jHabI<#I?qC1>`a6JmY^TtNegz2) z0~lnu;P61-s=c_bS3{@Hxo$KpyDB%vayAf@3QXbfZG zd@yIaHLlxMRWC$V3J(m+p_7p%hKbUVe)1x+V;Y7q%y6vEgCh4$&uRpgOO~!?XO1?} zb%Ly=F{0pvhLbqOaQR68U56P`Sv1{xhJF6HC&ad1wSwXf2Ekh96nGm zui-jwFpMAGQva17@GZSia*Y~A=sFSeWA^C2IyrWk?uce83Kkhg_jj=n zT6T?lDJ-C0EO`w}xJB6+jRtop%`4e1YjNlYhaonTSMd?us6T$1zx7|gjEXy?mN`mK z1hlN7CfF~0zDz|iUB`EA&T#Uuq$(;( zbnhstIXR9uiMx@)L#!%T)9^VSF%0joAC3ODVTXKmo#A4))z#`IH-r4aQc;Z_Gq7hW zDhv?zztr#)Uy&t`H*CYC_=??@mNyKq%wLAwF?shKy(K@?&)4MVxr%QnZjn`dM`d0r zzGWB^(&)Ox!fLD<->X{QUV)E2}vX+jFOaqiD&|ZY8a%|rZ1f+H5&u7ufcvHrVm@Rif!S{p;e0%;G#ia z3@>*Nd!!-s7H3;fno!z!w~ga1jCT037S0jh#D%6{NIu!bbQ7~paCy)F;;w(M^S-vn=o{%o{FTdWpxO>DMAqrPilTDW9# bB%&4#k%3_viR1Kgrg0i0v>T94AHshD?lLoJ literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/Lib/commands/BTab.class b/target/classes/net/t2code/lib/Bungee/Lib/commands/BTab.class new file mode 100644 index 0000000000000000000000000000000000000000..ad119febcf666bad367678d8b1b6c1428c60eaef GIT binary patch literal 3803 zcmcguTXPge7(Kn0OfJJMA%P7+!bOrS8x|r2$cAeaHX1@SBuYeavKf+r-PvV!5{VZ? z4c_l>JX!LB4_e|&AX-IHrBD71U;P1=rQ+$H+08_kk}55#wsv~H?*96m^IfKY`t!Tn z0CwTCT7(eR5YZ7umB7k##*C578un!J#P~Tg;|f&uTDIjL5D2$-jB2PBXi$r$T`QYB z>^R2kfK_yBp&?w0I_Mgf=~#{x0vl}8P39)f>`snP+moi5GzwO7$jM)v9X6dA(-Ekf zG~Ir?=o)s$6xiI}G4L;2Qu2sZI_l9NP|MvzS!338iUMo7c@bA%KARO95gRdHHtMR zcWl(L37Z8Xwlc3S`3^{&((tfAq7w5=-nKm&N;k`#@c7nY3)*zFql0Hsg+U`n{gyf( zb{)%}q+r{S(9o%4JCXuz@))-(lbt)){Yw4X;Xsj*0BeB z1(s3EA=AlO#UjHfu(!Qpa`btqhl$j5QWan^3_YO6y*l=TX}o+fa58ZjDr15q8-pah z+)s6k)#4BiYdE5#5091zsLW3r#i`>)f%S3TWIof+s#0v#JWWiQqcZi5k<8+uoY2s} zq|`i3BmZ=)GT;zs+q=9I)-tQD6^(L z=}xJ{?3ZB~)$uf*VVGy6@F&j7ydSF^!!*WpJd4xxl9@7`!$cNo@9*fV#`6M#K~CcZ z9R`>*(PANMalS2x+)tT~X9LiETOB4~YB(!nJ}I!VQV}eP@ZSPeay>>!eavZr6$6%S z4o>IBO^0cmrKNr#pE0tdhGWTh-xzVHEOrgA;oL_(q^O)L%i_ZQq+tc7|KuL9lT){;wpXlyd$kE}t&$}yTkYnGJC|t7$LV5Iz;dHZ!1!hW(m9tGtgE(6#1#(MZ zz4X)@IN3*cfcuvXyGG_b3)YW+&9F6T8}78j1iA8{LwXO4XZ{n8U{^}rE0O#jFH?%K zRQ<~j)spS(`2kt|R#yRaWv#FNZ#?ev$VzN0Y?XOX_)pmG{|gwX-nj>S@!|+nfz4k1Pw_3u zH^FB#eiPzb4nnZ}MSzZT9P8c!oJW>#HORr{DsC2Ggn4-cPJa*W)J@d%L~fyW9xE5H zTA(Kyi!Pv9;3|6Ms8!$&w)9lRsur+SU|YEB7UJ{RaTU$+#4YT;iuzc@pIpGc5T3q% z_f9NwgZ?85(OPqU+mSqV4Auk6#8rB^Q z;WAAjysm_K!xIL-(4jnf#202TF^_`_c#Nt61z&jkty!w)h<&p7nYWP8p zbq0yWBAp(wV4&+MGlZcl|#LMA~E3z`28~t!D22ol{L9B-O z9c?7xqkoq>c+F<8CHk+4KFsIQ@cx!<^BA1Rlh?4vA2DgA;R{rUZ(-zyw6@ISlr+od z=e~U|B(C56krgo_0~S^({E#Y_1XHM!%(i1QcA%SAx)c-kFm@}Jty~+zLA;0e`6LF# zhy#v3U?7DGLLDN%BP3ea{6?8;h3a zbT&r2daB~G&@v&`W;F8ET$D(E4u8d69!xKhU=JyXaRz8TNyr+K xY2H;1Nf$m;5H+@&k63FV1$G_6cUiDi8YVQPHGIsUVAqNLO7H@o&_xKJ{sq-?%N+m! literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/Lib/commands/Bcmd.class b/target/classes/net/t2code/lib/Bungee/Lib/commands/Bcmd.class new file mode 100644 index 0000000000000000000000000000000000000000..9d514044d0e1bf42ea46e650ae5d98a0feb028b1 GIT binary patch literal 1037 zcma)*ZEMs(5Xb*}cfEMm)V8Os&sMFq$+dJr6oeCz9tuL#gOd|{BYVk`Zb>#rk}LLO z`KF35`~ZF^aW*+TN^@uevrjX>nVp^a_4~(908g;rMh$ff4I4{nGOQho6Tu^)L;ikz zEd89J`CMt0zhJ04?x>ARXjy36Scc88rDe|J;PX>Hp6XCaE+&c((&WqOP^Kp`Wmpbn z{zhlH(7t5Yc3kftCOzZgvW-=&Q8;8hh^C>^Z-o}20q!qAObRuAPP<@rY+S)rhBmSK ziO!OU0@+zW=_he4bTE`UkSUpO;+lo)Hg4c1gHsiHm0yO{KxGq=`$sb%!!xJy=I0%H z^Yjn%ROztiezI_zVb{3MANxrld8EetuuQi{Q@;#3FbGWKbIPF2Y>$)SS$42bIZPNTX^PCezfHua!wn%cSnWV57SD(82?3(~dEIS-^nKcUWgwDdc+h3>zQk zB-4nX(qAXbIjw_-*ePg_usfr@BAU@HIV;`0DiF0N{RXsID#L+GD>5sP<~Chg)v)&m D&h-K< literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.class b/target/classes/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.class new file mode 100644 index 0000000000000000000000000000000000000000..f85fcd0cf08839ae454441d22cc03ad40952a1d0 GIT binary patch literal 2492 zcmc&#-%}e^6#gzGWQl2^fkLVM5ol`z2vNkg5{ecmt(cZ-Fj@=NWphclZg%7DrenuP z{|BEOUwv^#o#_BmXMFHc`I{WSySo!MHAC(6!F{-U?z!ilAK&@zy?_4w^mhQW*h-@d z-6 z%xJo^dL~lv17(llghBG*U5vHs+8q%%`Oyy&a!ac>f?>09@4X+A}{_*4N z)x*A=hSN05J)X_yoc_cTli zAdLdvNa4*4X7E;fM+1!68CNze-C&62c!;G3x?7fCHKlFHVhrXseTP~#yv^vF8ZI-M zN~|JX&vfi4wRZ&il(yV3YmOf&i;?NF=^2h&jkH$<&e8PB)Zw3ocL}NTdBe zdR10)Uehp$=62Jv9#3=m@)QTDczP{^MMdvki`1+rUaDp;D|THMIMvS2XE}63psVg_ zct0XZ6f_8_8G@65wn|;xVZvWoCeXUiV@(YG;zYHi-FO58m`TOH4j!&hJJoSzj@pq# z$EEp}b|m==QxD4><71{u(|8G9sZx4Z&=Kp&o`?rS3rblv09Tf5u&WMmT$MkN!jCuhUxX9FC)MklsNr)WZzkIzt$Y^hlRJ1%?qDgq(!wQf)uD$6d1YA|(`Q~MFpm+Ib~4Cs zD9oV+(ne4`PXs>4{V-E8$Gu7J-hWQC`11e6n42$-Oh~8GIEyp5!BIyJ-|z^2hcW!b j2mUXd50IJ-F=!#R-=fogi%$D3I_)E*lfV~5t_%7hxSmI2M+g_Q8@Ro%1{Uxqtor{&xV&FyrV!L_$7~VjB^Ze(%vwQhN+YCwGibEvsP1$N`V^{ zZe<3Lz=(wNGA>}0VLHg1PlJ4Hkm@dPG}J1Yxsc3#NJ7E3G^3hH6$fxpU@tMu2NBDr zVNkX-({RGqcx7K#UvW#Qjmx-#PZ|1!nM2JMu}mZb^Wc0XYjI3sO2V{^tC(R(3X}GY zvRUDZu9cK^H`zJ*TXWrRDC>gG&|Bf9W|iS#uz|YXtZL+=bIWuG+VLi9*t|*!O%)|v zV;DP|l=Y^jQ^MnzMI??SQWDZK<}e?Ubf0O4Au8=AZ+GrVpzOiK#z+ zS=roLKiXN?E$rN(r&|JjM@B|C-DjI_i-`<=DdR5gQKOJ+IkQU1XSj0eT+`NcMW?sa zkBa*>(~k#Om#`sY6I-Vx@(c14t}{fl`RzT1ORlfo5)|$ZzLJoY@iiVYTy*l`m-8Ho zkPi%tUMBn^!dO64rHaDQT^V`drS#~*K|Y(`5%2b8d?Vh)3R}gk1Nsx)pdM!!&S?hE zH)|zs9jYZUFo~R5R`sH4Y2w*?8MR+%4TiKcOaEm)GGv}c)!iqNT7x1s~+gIm^>&i>PKi zH>q2GQZ0ifj!4|HOiE6?U^cBX-_}G|#+|LZD5eF|w6lBYPz4>0B#sze59mpuJEMDV z`VH7?`qP5~UBzcW#-Vd{1aO2RJ@w-eMm^;WNsDiTZy~iXn0|*(dhh`vPH$j{FvA_7 zL41qH4(JKK^Fa4WQponD=iXtgn~{Ko5r;AA%HavVCwbCvXtb5^1AYvmUGAoh5^XG$ z_LM07cm_3y77*WMqK*4#&rmw!+f|f3+C4;^2&D8Jdy9#)$(o?dPj*)f;l&&LE2GRO)$$H|0vUc`=VCYW*Bla_WVn&w43(t?jQ$ zYN9eJx5U3;_VF8hmTuvC3kxmWOx&i+9Q|7OBCz}l9UV&@5vAH5q}mZ3x6N&O=47(4 z_ABladHZaRZc+;`cM#<^QEn4oh7of?#M?w%{RmMHBklzeGelhbS0Y1=(%J*#AD-5U Avj6}9 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/Lib/replace/BReplace.class b/target/classes/net/t2code/lib/Bungee/Lib/replace/BReplace.class new file mode 100644 index 0000000000000000000000000000000000000000..c4782a84c826ec7bf387dd5e058696f444e14342 GIT binary patch literal 2138 zcmbVMT~ixn6n@^2kR>c1T|R2;H`K`YYNfUiM1dAX1GEib3q{?8g=~#UTsEC@?{9F% z8E>3%rZ>INn^tVcarDlgn_np*0F!M;qFo zyPWo1r?8_Cb?s8#%GwIo22!=yb2-aR+h3OLLe@^c2p_C7RN^HybSkKX216nA+d~cA z3gL~iy{Vy>$nVcIyduczbt10{@~wu`f)vH)tRRmyoEKzSeEJ0WTEj&_Eb&PQ^1X%u zL1x5fNRY3h7*Xi*TPS-@-kfn=YcJ*OdNB;6sTC&Ph~iBhm++QCd(BT=NSWi=uH_Y7 zh2DXnF+a>gfG1mV8E;2%MaNZ4C>XT}RTr|Evv!y42aLyAtjmq0jw!suQVTxZU5#Bg zK}I(5u8#LG!+X}&mO@YcEGlzO4z6pMV+zjJ$=d#Cuj`n{`^4^B`Leydt&nJR@#vVM zSWp-$*q-TK$`-e5Gw)=~*>YjWw#^jPU@6SmTh;9d&(TexBjptArScaU+g-6Tc_K!t zn6>h2mg~rO0EWGsv#T(Y`u{1C3Rmlk4;JcZ?G3h$|AETFOF6YA4nmOp6`%a^7smG| zEsKz>AH5GKM4UpY%#n6hLf3qmwpjLjTkrEM?3JoaTs(AX>S%q_Y`rb*S=rAQtx`Z> zOWN5fSYFvB!*`D_yJ6JBtu%B}(1T&$khM~nKR#RigAj0hI2T(|T!4tbtNeSqC583l zBR4GZC}Rz>#nQ#Ho3-a1*~zx*-j2yK-~vA2BPzczSQDCge#kGAQc*^RoJL7oDp%(xFDk6 zcumCX#vsKH3{pvGur3K6=W9KNR=zJSe)8T*0^Gn&+JOn&qNe;Z(zHn#fAMaFGWQh2 zcb;H$ad;nN3QME=7+3fPH>pf2{EFCQcqATv$y)a@9m2;C|9vzfRfm0=`k+xi!P7uL zx^M;EthxuA)U)WtHct9o4AH-zkJ}1smp*d`{p8rsD*Ms!8P=#V1?`ot#diC^cAK_4 zw6!DjH#(v)qqzJh@2nFGVS|j^WnP~Vr87%2aW7zGslv!)I35l-*$^!tB{CY1yd){c z?8r~J#z|J$`EInvPJ%T7r`X$RBya|kILp;JM`q5$;dhZ+>7vhPXq*#FU;&?yA(^Fj rz>pU(B-p34h8QnTwpO`(!c}EG#Y?z4V5qaokQFdw(VC%u2-*Jt4fyUc literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI$1.class b/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..4a849b1016ea0a6d64f1d47ddb194e307f93165b GIT binary patch literal 3802 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/system/BLoad.class b/target/classes/net/t2code/lib/Bungee/system/BLoad.class new file mode 100644 index 0000000000000000000000000000000000000000..119b66b53f566aa519bac774128341f1943cff58 GIT binary patch literal 2257 zcmcgt&2k$>5dOxNv}>{XlVgk^fSo@}cI*Y?Bw!_gWfPE*V-q=okOZ?@jpcP#yUPBg z$P@4wRB?aFMd|>HfOE*l41?vnKk_+R@-q*_;obWTL;WK4FFai>0 z3RQ8W-Q2mXH=-&U9ZT=nVasy#Ejg7cf>%{+D7dL%6I%>($@ho`2s=$9;ClJCoL9Cg z3^~_{R;zp5d?1KNiMU6(IaY%{JN~1lk6WoojdqI~SCk>jYRYzvCT~vpp=naj?uNGg zc!9RB&eOofYp|{1ws=IwYDs zA+<_mqCTlw4!;?;8{FGA8iF>ts%si{-S8~2?kiKlo_M#;%i=vx#JKAcRoiu=1urhTCer$b8mL>R_>~t5>4MB?R?@+iM07t z;?{Msm43E0n^(GcuZIt2=klq1I-lv`<9IlqkR@f2SG%b3F6y~E&yL2;5|SE#wm?69 z0gy^>{S3*s2s#_b@HLV7TcYj{m_Qek_>CC+2l5i!dl7(Wg40=o61!+gzz?uTlBn4M nERsg0v`N)Jd%OUXu?3MT9vk`%iCcev=#%=CafFCZUnDp;Q>69xDo6f_%qGp z&%EA`CxA5u0X)K7vlVtFt1}B#WFl#F&MeH`SiXwnz_u==nJxqPgt$y^sZgoT#W5>c zT0(THnp*O%P)r#8_(cm6##=2_WeT0UKbPtppih|n)kqlbwdQ)GQe)V}6A(IXcdHJ% T&OP)HxbzV^kG@Baa*D$b>(@Fj literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedBarChart.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedBarChart.class new file mode 100644 index 0000000000000000000000000000000000000000..dd108ee119a4ba90326826db737a6f52cfc3edc1 GIT binary patch literal 2562 zcmb_eS#ujj5dK=%>R1KGiH!}I95}|ZP2>cV!wP~(u|bIsKtU#UI997cUVFV#tyV6J zo1%c?EXW)DfxLz)aLQ2S;)w@-1Al}nLg-n^ND4M3Ts%lK)6>&m_t!l=`|F=SZUdM= zISdcH3VbU32oO$L!ihVl^-@8^O(P#qRjr~B@k*`Yh_!fXRyekyR|eD7ic?xkFKf0# z2wX5M!$}f)hG$l^buDgcRxzGsO{KJBRFIjrkwuR-y(+!1$f&+xJodI30l&tyuiqM@@)i4Xf4kL;#NykBg zcQ}@d;1CWg=uy#&`w0VXhd8Fc{mtDg{U8kp6}5%l3f6%S#6pcs{@ zwX#!laTn#z5fw*qj1c7T>{?bZ+Xr_HyDqRO5y2xERB%GY5FTx_?;Z#mj<7YSWD|PZ z&Sn~NHW0&zf>9M?(v9w>gF7nh+p<=f6B~}yJ*grtsqk4WP;iQHsCk5A8k~~eMlg=Y zRjx7C3>Jlx)6A++aE9Pn%E--gD$dKz0B>FqH3bPmmusk{fMhnFRFT9}gosuy3#%|~ z2(v(#-=*4?GO?L`rackFMfPP~dRdXEX%&|+MeyfkT@a?3ynWgpY!+EUntnzG^eo}) zT|)RjF!t>zXCRa{ik9Y7ZN6vI|9;Odv}|+Q8_SmDC6+SDM3Rk8>=tOVW_G*7u^bmz zn)?vpz8S+3bJexHu&>q|K=(|EuUSsB4Y_Uzea^B`A)M=w!FxLlyQ%21qh&bR-7S~5 z(aHGww4>I_JIG7_IlNA(lPsuwKinR8Npm!=N4FPnw{2&?e(5-fXuX6R-HdR)Lq3`{ z+BnL#ylYxn^50Aq=b7bU?s3^wgRdiVMT>;dc9ps_dlUrWM7#E$deN+->8lLc$Z&XS zLl<1{{@zRS~{y!kMs0Kg1fiS&^IhGx*t79I|@rn=PdAz_T z$s^;F{(k=!PRscd+utH^^X_lnh`TrJs<#XeoWClR*B1rF{hu&xK4=_j{Vu(IMhCapu zeS$^$4A<#%ROt(B(3g0NzQQ|n!{us%iO%r5nZp9lIMxPhL41mraE&?Y!P{8G5_2*H z6W8%Fvm*KHby<@qU*VH=tyfw08t)Ata0kZ~L>2VW9sZh85c>l|3dVoOfFByG_}Fxw q)eAiLK;U&AN7#@DMHoK$(N)9>Lj2kkvC88(e@>Wz5Y|{yLg+6~+qgXd literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedPie.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedPie.class new file mode 100644 index 0000000000000000000000000000000000000000..644d71bf4c92f3a983a7322bf681cd2542e55646 GIT binary patch literal 2661 zcmb_eT~ixX7=8|fY(h4*r3FF7(n^s4Hqg@6l8TlTG%e6-Y7oTgk{rWA*u>opQ=IWa z{Q*v|9Q^~mtusmoopE~Qg+IYRpkAossN+=o;d6F_Nfe#PI1D-Gyyrdd$8()dn{Yb$#}tBicgfSyp(Zg!*S(Wd}2nrwwZN$lV!&( zt|gZZ+Z70&F)h;_7ijOFUNP29dQLkz@k9Ih`|2p5$4o8 zsiKWw7{_(ei<+UlbTdYwEH#{D3ZAw{kd)=hyu$nhp44#~W7IV*U)O^nrOces@su(X zq?rqHL&MVod#gr#mZ^I?t78I5frwEmNh>#H%0f^jhdKsasYEyFF_EXcWkFUT`B z+vG=OS=%9MYNbMn#5n&1Mt91*%C?=VKb9dilWblB4@{euoGq^{N&B+jI@+d-EYOT$ zn`&JV2Ha)S5jfr;q&01c5o%f00aLvAwwf#|osTtF?{K5E?X>WpGut(c3K5;P6?4{e7Y#7d1_$ zaz`~1rd9QULwvTI_>DkrtB0H83|CE<&g3zYTv>PX`9CB(fOO?*uclow$LVU3!O7VUqBz)!b1Wd(EE+RI2Vr!Y~irLSfDGgg?_b_RI?}4 zk>RnHu9htvQ}Yv>IQ1cd*YAJTJU*zTWb7@B*X?iOnYrutx4J#^l@Qv_4Q^s;6X*GR zgP{dH5XJ}t#CHgZ@6j%PU<5y+SNw!N@iX6!UobCz#iF>4E8;i2DSpRW;tt*x_wX*^ zSAdNY?G#3^fR{OA!WHO3cn^zsg+R6A9bCby1f~yf;58V8MuFHtiGOm5Cw(n-Upek| zBX}2wHAFRZio5)3(h$3YehtI7(bED+l>kk@PW5HZn_yyv;{XjcVHIlu^K1 Tt0;0D=4VSO7-k4jI0*j%x=i0d literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$CustomChart.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$CustomChart.class new file mode 100644 index 0000000000000000000000000000000000000000..bf25889fe946e19f84406e903325cc755d846a77 GIT binary patch literal 2588 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 JZ8MHm<0rC{=W74} literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..b95117cb03eb56aca29945b382010ff95bc217d1 GIT binary patch literal 5794 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$SimplePie.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$SimplePie.class new file mode 100644 index 0000000000000000000000000000000000000000..04e5972dc77779fb0bb507de007fb03d9b9f4966 GIT binary patch literal 1629 zcmbVMTTc@~6#iygSbF19E&|F`kkTS67ey_iwm?LSw~{9MVz%2!S=?@$-B}|36aNJ! z3Q-f|lMntTV?5KAn}Df4v}fk*ne%;T&Nt`Bug_lr%wstS1wIx2Fq+WJFk^F}iCLpu z;F@LTwUlQUIoI4BSMZXSTIa$s4R`wys&aUDUD^ zX%~}|xd2)aP!S9xgfN5F7(&)8RV@D09EaONOVh%yXR>6{nM;Fp;hx?+>Zh(F11aYH0kbTPF5Sx*q1=n3NjdKpyHT`5(> z4udZ?`BFtc!$M=lJ#@=<4JPH8R)IS~^x=|h!9X=xt_4F3P20NVartQ^j8R->25eJ)b*Eo!nl3$y z28%vaE%8$g`8?L>(xRseVCXpsw^KQQeDKe8oq0jB)^L%F>LXp&h0YMk3f*|Uu2<^C z1y|k}yduo9?W(xR(0Qcx!!HcMY}s=RzG}(`7&#aL(=wJ2)@++QX-juqPD$=Cj5j0? z((;KJLUK5K?;S@%sXq@DDTY)-iI1tQe)yP&iaE-S5gJSiO+jjq98F|nv{NuiKT~Niz?w$_)}ZI$r=dJi2YyR=B*8@d1JqB5FnmL2Ch;A?#2&iep^5E&LEnpgT#OEq zXLt`|yA)m{7Nt~Bo*|+vStWLWQM^+vdR6|Yxm97f{hesA!)Fl)A};u*t0qt*X@VTcrKo@4MGQ%+y^#TJ;Cw#1URZSLeO-E}#E&>om> zsa2?rFRhW@D@mleYqU-3j`@o zl1RZKoh6~Kk%T_=5<;|{X98lEaHNAXsZUV9pqt?b22L@Q8To*AcJd9wZ_h9idoXf} z@l#Blkg4xfj9{RwqEA`Fpt6p*k~w!Q?!yI+_0b|5!wR|alwNj#{X(32pUxrDt�I hofV{!AvsA}1sixClAC=4FA%1Uv4NK)vvk@*_z&ZAuUY^A literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics.class new file mode 100644 index 0000000000000000000000000000000000000000..ef3bde05ea012e6c55c1d2d774b10fc037469e38 GIT binary patch literal 8577 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 J5m^bm_zOED14IA- literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/commands/Tab.class b/target/classes/net/t2code/lib/Spigot/Lib/commands/Tab.class new file mode 100644 index 0000000000000000000000000000000000000000..fbfb28bacd841788b0ab2bd834d60bb77864971a GIT binary patch literal 4965 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.class b/target/classes/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.class new file mode 100644 index 0000000000000000000000000000000000000000..dfe3858a4016fe01523882cf0279a20d4f7f447c GIT binary patch literal 4318 zcmbtXS#R7_6#j0uai&9C(j}cX6jNx)!o(z`1QJ?k(-u-DZRv!tv=E#bXX3`Oryfrr z5Z1EqJCyB#7bKqGB}5=0K;i|7pF#K$NQm#+PGUEXRA3_6=bn4+S-*3x^V{Fw{|KND zU!+lo`V<;6Xhf61=5zY2u35TW)=o~GGm4%-(`}}0dItsS+dIb6P|%!0I)e?!#Ka48 zRnM3axUyJtUBmW9%^73Fv@EmgpFEz%Mr=x9a|TzUMPTEqp}b?41yZxRRWnXb3T$aV z-jR=Q52mnHpmmj5@Lba_AFi2J$#B!yf_nLA&0q(zbXl)d47((dYmX=j&J0F%$J7ie z*d?HM!CF-nbR|k@suq*VB}q|eJdl#vp)M^dHBO5( zNEdzo`p!yXoPPBPTqS*=Lwp&zH9rM63G9rB%#-dtRP!8nfYi-t?8nV1^h-G15(lCW z4S{{p#06kZs6C55ARx{txJ>|3>%k0e#~lQuYg8<~$PyfhY8sl--GXtxX4pkzFoLca zKLH8~4%5y<3XTZ0T^iSz;Z{w@_9IhpOkmfg5&={~fx8k^95Jg!$1Q~t#|3srRIEvF zE~g+bkYx!DB>h;(6Wo?6lC}>hI3;i`w{J;M9c86)8if=_Gq_iFK+k1#z-aFf8)Vd& zVfsC$f2(8X9lcaAD!NMs8_t z%;NJaaGqfh!@5-+F58Z44Cz%mmpE!3Oo0=8 zN5lsXchj5GPFeb#oV_*7rtoM6k6})rbN%|(DkWA=yVrjmIyEeCg^V#+k5rk9N27ff z1`_G8|HoM`06$ev2yBw6ignqOVXdQ`CD0(jN%6dC8z*Wr6NWn~>nqTbcZ#|-rn{zG zhs*|VN?w3B<=4;4%H)sZeo!D20RJw7$R-lbt(%^jXIi{Ps$K#TE+>J}aV2kK+HR`2 z#-#a}4C~Tcm%EL+9K_5|u(@hq-s8b6lMwc=H?r6RayIdt>^=5Uc+UUM2n}AB5M6>_ zVNQ-Yju&>v8uua&`?@3RmF^JOn_w>@>7VQvaPb5}ao#9_>K=baoKN3l^rTm9U4>1*hf~jbo6X>!*gVb8Sou>xkfDjsr?}Gi=B@UZw54U~k~zlhW#t{7M;2dVCw|8+{E0Tf z4@1$0-J%z&U!a3Q5%26<}G zQKGcONqbPze6)6V(|fi;m`NAvq>zCV)2t~KVH z@h;vAjlM>cjWpU5jrS48mki&Dbt6ASq#eeM81hZ`1xi;;_bg+JnF+B)D#RA409(y? zA0GsciC2kEg^n$ChMqC|+gnO}_{8M0BU7<`i|lN}x=lKjZOS$-z`lq*v12k|xe?5b zsjtx1`7_*$97#XH9Y}TEkjpmmD5sSdJNGz`tRyP#$vn4K8a=+15QKzly+1;``Tsv~ zj6HfMMlg)~*weGf<4LYA-~{n<55DG9{uKrMfl)u(r9Jn9iBlZz<#xLEE`IeOI wZrLYGezqmPmi%l>pfCAVY4E9wl#@VM!Y8Df@G0pg)cu9o9X$UTS9SROALWi_=Kufz literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder$ClickEventType.class b/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder$ClickEventType.class new file mode 100644 index 0000000000000000000000000000000000000000..2cb13f5813d934825a3a80a1197ad86f02ee98a2 GIT binary patch literal 1574 zcmbtUYflqV5IvVZcDpQ6%0qdm2#9S_DlcE<(FX-dmKNETr13+ul(jA{TWq&P|CN?R zh(_aQf0S|VrG^sxVp@_8=iHfdXXeiI*YB@C04!odLKnk|W4bYSzFa*pW45&)(~qr6 z)s1QN?~z%r8x^x2%bOqERKv0l%-U4iw#x4^C#K`(KOUO_FnCq?;AfC?JDF^$u&Xhw zX&tG?xvZ=rz-0qMc4JG+aJE~8%GvJSLbjC7ZEq*D>zu!#qL=f%dSP=jqvzYt`c#BO zO!{RqyO}BNBsYcDfQmuR_oZ_?#Zo?3N^4s?sa$ebDBe_Y3&RZ3)Lv36WORna>ki9O zFp4n=!zym$4uh|3R~?gKARN&SjT0kg8%`yb+dnkRZd}1Q?n#(XF^MUv@6sXTG>#~( z6T@zpxi<_;;kM|sZPe@WHbQr6mQ#th-@pZg{F|9RLRz(K*n39J;3oh3pOWcf#FV(1G- zeq!_!A%-XP?H6ZJ@}I=hmj5EU1gnHt^c;78f^q+@EB?=jQ7^pk952KR%5ig?ZtJ%vYr8Lt4601tfvC;~k43(zCL xtRz5CfS4>m|2ZC?Vu%-c(Nl%G0L&nZD0ShYur(xz>p~JKvV5T#(#Rx+{{VnnYSI7z literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder.class b/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..3428d2e7402506397303b4eca36a39442dc8e04e GIT binary patch literal 2174 zcmbtVTW=Fr5dMyxWMi{VOqxp*$OQ<&mo!U(K*2yRCN#7rX|ZdF`hbqtN6vz?w!G^I z{uNY^NR8CTJn)+kVrIQ~gTR)fK6uZ?Gv9nObIx}@eERo405|Y7iV(sY`gHVTKp_4? z?n|R8?TWEodZA2LVBoH0Tkd^bnrH1{j_DZpFirkj!;bD_9Q!&l6w2npmM13$D zO1erQok;%OxfScuQEk9X6f-aw>Z-uAL}#yWIrkhQS>#4t({UX)1Y*>v08Aj!Q_u`| z@MgCT1}7|vW&FY^-400$06$^nQmk0)w(#_R1^p;CmP0^oTJ+43ZJ3 z|KF0Hofi(FVigt8AKA8QWUJC~l%wHEH$@4m+*Xu%?y8>kZPmL3&_-K9X^IF=!TIiT6g5Wp5;b_bjN;n1;Z8T0JB?_KT(tAyVo0 z(B68sEA$;gn7+e=8Ak+Xu}Z7)mNnL}PAl^Bq6tFF;(?F3;$v!z7fZb%vk(}N-#}oL z!jGK*)7oH~N14Gkh**o@6Y^miI)lYii|;Xd0iCrs7mR^T z`h{rz2*3IGZ=rdtibt5(ImBcxoq7lD08=!?jxn1)!pzP;m^;G44sRVIaR4gT(gA*^ z_2@CCX^0p0eZ+MQ6LUm&i#9^o#ve3JQGh>5CG)G31Uuu61qxGKo%{?^do4Zy literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/messages/send.class b/target/classes/net/t2code/lib/Spigot/Lib/messages/send.class new file mode 100644 index 0000000000000000000000000000000000000000..eb24d60edc3f0a10d5d4801e88b88baa5ab297e4 GIT binary patch literal 3357 zcmbuB*>lrY6vn?BCsFJO1A&C4&;|;`aY9tW9#fWV)Wr!DLt5yD;wVPMkz843=|=ax zeeYwR`rJMQ($4guFP-U3|D{g9D=CiTg{ISFEXmjB{O&p5J@@GT`S&ls0XT;55@d;tCQfx}geewVk3iUtL-< zU2WXE5m7YU3EQgJB_nTG3x*>wlp4&1EDQGXvTiMCfz^cn)i=&`BZ$1HQfi=m6HCzaHPo&6+5v@ zATE*DOt(bfKoelADV~!4dj!%O^2uhiGP0*-WX}lnhay{7%2UjjD1m+0ui#k~2XK&q zS%#~*qXm1x&`RdKmM@z{+tqS>T=vzdXfh9hjs;`BS`-*hg;%3osuoR)*~?p|F{RK* z)^d%a;dnw0Af;eXMH)j=nUo16py4?MM^udBsDKvHE9BaOD3D-C<2LJ4w^|g+O$EmVcGOqUc-1VipcC9U zv2G0Dl#0_B6G##`X;cc1S(d3Z6nsRIkfF>rlfW4~ui&hTb2uL@_$T@K%3g7dMf1ME zb}CyREy>3)u3`d{+{Jpi>=nV`CN=?>`=&oEpD=ag0wVB=!XrSs87Y zYx|o^F3KepIm~b_%E3};p=~yS%ebQ8B^6hZXAfDAJE$*WP0O9rOI7YWcAab&t_$?k zqBuO0_al*O@Un_maKl$4XBSzX0(;ifsJdoJD{++DU-N&>#PKR#Q}DWqH}K}#B1a94 zyGBW%Jv%#nSzwnhY@-GB)iJN2pke`xbf=d{)Gi1p#ux-f0_meBa^q$rmjvg&X))m)#du|KKx7PFpHsxKtur#BWgG%c1-X~r~w42tV%|f}S zI~MmENrvOt6e5wgt4_g?oi2Evj>v7oSJ*zDJmjAWTBDQK62ED@3*I}@k05^HLmQTP zl|KUsSiDLH8o)-G_c-1{4@ac)DO!7WkD;Vjv8fH~1bNT_&lGW5uTv6mQ1K`(ssZIZ zEv0Q&dT15f8X3J%(C0Dwd^@dmwdd>rw-2j5Fa#?Xm6uL`zX==h(r(ZAz5LG4&bAJc8)Vj!Ikuoc#Qt~ zH9N?_4~1X~KE@{=OsVP3lTZNri!iCTJNySuvj`5cT@9~b+)zw$W$$aR87b)YqL!U zvn449Tj$TXNs(^VFU|?p*U1nwS!1r%R~%opW-c~kj**%97v|TknPxNQSu)Q(kty(v Ir`Nat01X8g{r~^~ literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.class b/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.class new file mode 100644 index 0000000000000000000000000000000000000000..2d325e4efaa205a9a1f0f234afb7f7098bb6b7eb GIT binary patch literal 1646 zcmbW1+g8&+6o&r+G-(+S3aFeE&wz(e&QJuUil>4~6%`MdhM|O(1k#iXAHs+54P2~M z4;MZF58*@Ty~{n5a)`NeWv%SVpKta|{=FxAf4=_!FbqGA8q{j2<2Z)n3{4y6j%gH4 zCvQB?Z3xR}I6h@Nwm;2K+uOGkhmM$rI7dA=L$mAUja<1aFXK`PBRQU z!Z-Xu%Uu;l(ass!Ej#b}Muvu)wj(UhT-#4*%%=}h$L!LTeirC>N{y`563y2XV7V4x@eY43@xEAQDQ2Ni@2oWGRGD4Ql`T% ztxl3&JTa|;nHPbhheTDT9R0Ye;Tp$v5D0v0WC9B~pFM(uXmQaZE7q1G8xb2DYptrIwqJ)J=}* zf2j!_w;1Y@E6D+g%yOh9(r_eEazMx3fJsW`9>@I%lhpArUGW>_*y94{iwu#Q&&Ga{MS9B(4bh>mvwGb)+)9A<O|qE=`?J-IJkaUnpr@ASO>Kjbie+s7URiA~l4HRCN`p zvMN&bRHO>2NL5ggoK}(CRFNE0kzAoz115iDbT87AL6K2B*8c_UvwFQrclnw`ICSUL zv5PHwieYOKu{Iy v(T0E4x8x^YU9?s$?dhm;C&*0JA8kGJ5j-qeK literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.class b/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.class new file mode 100644 index 0000000000000000000000000000000000000000..48931a412959f5dfc56e04cecfbeae66e4ae6bc5 GIT binary patch literal 1957 zcmbW2+jiST6o&svlXz?f(k3aV^hjG`_oUiMniiJ=HIzf$q{JmaI2c(~9mS5+%5qwc z1n!QK<l}+fzU@X0H{5VTft|%tJ!6S+Rj>Jw!Wgy-NOIS@cCRNeLFTRH8IpAz6FE#O?8L(Y zWB-Z^6zKPtY^P(l-FUezM}jHGqj)Tb#}%fqi)#LlLm)?47VLFOF=-Uhh(gbASM%6| zy*cbt*pDX!=6pA@qKXq-ajmY`vKrUCb`V*0x?T5t*9q;b(Xt!%yuh~>E;f=|ff27q zj{@VF*GyKBI7mBPZk}o`l?!+h(>W9sN;qt^BsSBgIe{P9o==-LRm>!-t=eJ3z20|y z$E}uDblFE0j^Q}H;YOTXK&(id7%W!No{GXu##51)8^mXHd|u&HCO#wa6vt0fu{wT6 z;pstKGl^#ganApo!nsVG@;^@nm7C=gNrLkVFKUCNA{k1&96QR1;6hgv-pV?t(syFVY?7m?@LuZBP@)w(<`Tyh z1vhnQDAA4`CliOKu$DSBl<1}ouESRdvJR@_dg|bo^c143gL<+NJLZ#BZYsQ=Iy98{ zFm~t}({1}$;gi&%p~R=DgX{QQ;ft)JA~0N|si%Wjr$JxnueaRrvfb(u8LtP9-Cedr zPd_JcI9l~+NaySS>%>&4n!vBEx=x1>G~x-S)_t=7e@?cF)JHvmf1;zon}@w*jZ-J8mz|b1%tiB>=lDuWVUFq zC1#fm_ByjS4fZy(cMWDUa}0Ks*{Z=h%+?Kdjag{0KC>GJ`+(U;2D`=VGu5-+`=6M`-zbU+l*BZB;Hx+y U7I9QKI3{k;s0e&VIfroP9~{(|00000 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.class b/target/classes/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.class new file mode 100644 index 0000000000000000000000000000000000000000..2cfc37b23f30774a3a0881f361802cd97fda89f1 GIT binary patch literal 3820 zcmai$+jG-K6vn@GoY-*$B!O^Axj4{55|XG*0|iVeiJQ=Xlejp9LR(r{-q<3tWGp#A z@Av!te!o2N+V&wpJJW|gv@?C_AJmyn&q{J^F$&5|m7?6>~=zh8d`Foqu! zh@d5gsDxIuF?3#3mK9l7jG{c3zsOaaq3x($l}hW1rI z3?u!SM&LQSsu{)9+AdQGY(h^Ant|SZ)-=e^gi_3v%t{=Cv}`V$<7%y{*;nHjVu)vz ztTxXraz8?Qpja)NSL3*wK^h-7Y;8uVq|FK$kJ4hQ37;%zwn-Lal+gLn^zgW@DOMZ@ zi6y?CRjQQ^9Kzukjz~!1D8tsZD&v+UV-}s7Z>O3&d9B%+F6;D`iXywSsdgO012G(z zFpdd^Edhpnnd{Vixygme(~}I_f?&di3h^LKyUmnT6(ebwb~4YCx~UX+p)Y|coQUBe z3DY=9(FeHlB5t7|8?EFI+ws)Y1@#_t4n#)63})TVPn(8CEtKP;R1Ew5ov*r8mOU%4 z=&o@phHO0*&H;3NOw=^dT?x#gMLcp6=5dBHqf{#7gkd$iwygkn)r4_p)+hzmS?zSk(4p?1SNZ+ z9XiS}7!piW82Suu%l4>h7Pzcyc{%6gNw%)iVJyotibnd<=I(*CF%xP{dZnW(!2-$g zhE>_ihz6$~+wJc$7woC4YeTzV#^o5UNVtlp7sd#s8Fuuqso$xA zg&3Zp5(jT1L;H7KSYAl!5?7a~2h)@u+D=9@_-w75=hb=Pk)bzil&(pNAXi}un zic--;zcjab1K+wVE(s^RRh{>oy4M5U4QiPHQMFj3kM)(tO+xnp&0fxvmsYbv`cK_2 zyb0YW(a*c0Pi&u87K68!?O=+T+I^70#sy`xX zh(0_`zj(yoMo|9HM$c#In@pdKK3fN`gZ)f{2%e*-mF&_nE_J?6c{g{t~F~eb)1AfdW!5BFVbI6bRG#GPF7$)V%d=`wkHw<&kkNG?p zb07>e?#FzAFFm37hcqfmLQx{27;-3o;XG;CeGI?g{_gY&CU4->Z~8Vs-CvF;~muma^Kc!X9jt>6+pZ=x1KR0yJ96?;i!fk~3rDfHq5vh+j! z0!gZhQ;xU|x^dA@tFMHTp@gqVGlkri@C}WGz?JYVzM~zuI?Dc~#SGumLOV literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/register/Register.class b/target/classes/net/t2code/lib/Spigot/Lib/register/Register.class new file mode 100644 index 0000000000000000000000000000000000000000..a60ec2404fe10df35f6685823eeaa0985a83c97e GIT binary patch literal 2276 zcmbtVYg5xe6g}G%DkWff3RDFOXz7C}qG;Iyihx%US{8D9QQFD9)fKf~bmKs0;&DyP}mEdwYhXt;h#MPlY>0ZXa-)VI(eC0~ic~950L!$V;9OcFvc+H zJo#AHEFPMv2tso*SZs+}<0(klP&0b6hXW|TFzhf2ZE~vPO zNrpa=Ah-98dflj649m$v%le{Y8&)MB@UGSju4}D@`3R;Nru~c^*)w%PKztbBgHE;GWlzYKcLjkj-;yP|H^iqLV zcMNme=2V^mYCc(?hGUr8hF+sqyNO#7!XFmg143FWTd#-7nWCeY_sB9&>XzRVFDd}qv4M|^6o~X60aQMQRN(We zKn!m>2|1B~FQt`g)#SQ$>M=l`mYZE8TG3m?Fw_Bw;e96&f85SZH~wF4v{-G}Wxi&J z-s(Hvj|&1A)3l*ObWZ@?VB&(H|2s6&=*j5WmHGtskzPW$>jeQS?$NvI2H-v((5MG1 z81ojdLy@4d&xjnMkBXK)!jOU%j<}N`?g;t`tWh_fFji><#PAT02(3q)Gajmqu#CzQ z*f@g=e1!8Md`H|j_Z3rHq&jhgxsaq(r1X9g1q{*|ID`yFe6(32S(CI`kM=Q*6tIls zU-$TRViyqcROU10GwmYMhtOIHx@=?Q=s4XP6OwJpUEXAi(`ojEzzI_Fh9uq7X1WR` z3?x!nqRY0^9pYM=G%PE4+s=A{ST9m#CnamjMQO4o@Qkt*tO*pbAuUZvens*>_xL}M z+AfO9rN+Y~U_9KeKqP!}mULxEY*5#rr=c4&IFDJ}!kpB$?4h`YbzRh#$BY&Fqbjb*6N4d~#t=!%D)ZK&?+Pu^^DzvEkic1<)92;{ zwpFUaQCx4w6%AyriOiCdHgmZxTgYUBcn8S=LY27mA zyKD5>izX9}CD$FHSKve?bQkCI$ZP10%sTxp(Ug1Gb-{{D4h1G_`F}N~%g9Ou0^48Q zGy+F!g)YlhmAg{v${^r3v-tv%H&;u8adQP*t+hPM|7yNigMC$p`ktp|fUGyBY(2d+ zs^{I(ZAh65S=}yJtnJm8!>;MII+dE61jcH)e@Q{g?NJ?sx!isghc!V~2dTM9axdb85;S(>U49kGe;Yu7pn=aT ze2a4w9Q~b-Ab#M)gBd>MGWaEQmCul~0oU*z-!|~O=zUt`;Z=B*)044qpz|R%gg1pZ z%VA4+n;c#XN93?0+$x7%;oWlB8{RL61K|!159q`R7>1AYMnuqrgV@9$`bHJJ#R-7x z(76tr#4Kk*!AQF>KI2(0*ZN~!b>eu8ST&Tb*n(|{qJ<&1DkyDEkP?)B%)wCH^ea#v z1!|svB{xqA%Fl7}Cmg=~2yc$Yp5Q1iuxhI5{Qo8-hK)u86Nr;7@SIgG=}S z`@T!!_o>?LfyVg`K6hd-T5%k2Ac)OfvdvOX2Bvg{WSjudX`7AOs zjTVzL4{mVXDTQ2HDy=PXEyJ}Yc>ckr0FDLF`!_!@ZqnvKRxy%u7!gBCcEDYik+ImH zX!iYr;AL-kB=s2QA9R%s6OKV~*5ix#T-K)L%%#oW9gFzuoKO-w?*#0so<`im_V^-YO%MN%^CLQqKIVH8IrJ0pK#8w*oWnAuC;75V zeA%w_q|N542~6TF`*MT{4KvwuSiyNk z)Bp>6fPWoGqGXBJN<^)dgtg`hORh@Fy!31-%6v*<4rOxJGu^tmNZGtg*@~iUm9)zH z>kj>RIi9ZfZZC literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$1.class b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a2f2a0fbff89c419f241d589a257645446e881e2 GIT binary patch literal 986 zcma)4T~8B16g|_H7M2xi6}3E9pKCw;D_D5zv4uwBbzPgSZ(sy3*^YB;_EbA!a<~f09pYrgZq}-21 zd`d~>og%uWqnO=CL)GddYc#!iMsqgu$YWK`!eRE%md z!;0}0_r9q3En15d4{V}ItFG)O9-&1$hBnrx?60SOH6tbRl(sQ*Gk z(fHsG@JAWXY%5e#6OEh9o|!Y}`kiy;+xIVD0W2fei8i!ri0SA+oMB$_zzj0BTjHi8 zissItD7%4~r)_vxvI1_tjL6#dMmodLdt^E3LnkZ?S>T>8T*=Uv-?xq|)3IdP+zC7( z%UR{*f{sq*p{^1Z9bq?A)NPjzUEL-kgC5@#Zxp**N6#7Ck77~mULAdk-KC^U!na+o zr1%$g4B*mFD~@%{J%*9I>y^!7Sgne{)thFs&CQSK)SbOFnf4m7%}M z+q&yI+>(^9fjJHHIu@`pH#KB*EMb|!XdPm!7GX&G zT$bw5ZTe+~*Uca_x}z!3|Kl{3@7Frd78qhV>S>0aypa4^cu?fti+Vl#@~&+;1n(zzwrr!A0qwR^pBH1Fo!$z*Q5Ou?&2Pu817@NVcl!UEg2_d z`~=!5F2Be0M@*h#_8rEFm7tZRm7*1i5bggAQ@Lt~a@B_z{TI;<6N5Ar8JdW5w@VGT e*+`ycNNI((ZFqoHqA^lrT`_6#fR5t(4)m0-Br2MaEQE;e4-;d$?N~-?yXl4a9zKc5 zuD2gPfDdIn)7>CSNWeHrduGne`MxtV=bIltzkLUA3md)YLbrw-M-TE0i-Ab2WW@VZF%A!`&@o)mUc8C;KusmMF4%p3sWoy};26ok2geePcHg zZ{&N1LiMeEXj{G=c-CGL$-v9ja*qC^we74F#309za`!2SO&L33{4I|I0rw0czvD!{+H=D~S#yBo1tb)R7@Ambfh+-KAI*ORkaG7HgR~V*`;l$3q za8qAI)}svgSsDa(-4}E;>oSnZ219qLT}fQA#nC|#YpuOmh7n>saSJ-;Ft1^OV-XgE zdG_mO=#NF)1#{73H7PPcLrPi2*ROtNAatja*_r0?n? zdfu*-LN#=3zh*~LjXTbqQWnF~xprbKSE$~il*&fm3)9FEsw}9ej%2&2E|!vb5;%Ss zlf1S?vLCt{C~*GlcWSJ1+)-NKTR|YA$G#oMBE}SHuShRTerQN(8z4)%%`6Euvn0&S zlGrj!4-Z9j(Km@DFf3E=C5<(*Gv-_i%$#pQGZ$LuGmE(v2Fzkl3&UnH-@>T*8RH+b z_!au+DITz~O8>D8bB12I+cY99^~BLUQ;BzYcF3n9rpzWWG>M=|@J$SV#Z`t+FsMKJ t1?F!CJwtU#&LU&s?f4E$H|`Qz7w+Lc*&NoejtA5$kZ+BwYHFv{egRmlX`lcA literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3.class b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3.class new file mode 100644 index 0000000000000000000000000000000000000000..c01b93a9daf72cd275fc9c34b6b72026bafd4cde GIT binary patch literal 3727 zcmbVP`&SfI9RFM%JFtv`_(aXn7G)P@5Vh1bOF$D^kpveZ%ZA;{GBC`n^B~RM(fggf zwCr70ztsuwaZabxkDdOcPN(mk8DwM^4z}ma+?ns(`+a;q-}}Aa{p;TwzXRBfpDR&< zQVC@;$`N7MZg59&S~F&rE4ntM^yamk=_o0Bbn{u&;mS#GIMmY_+r%hJuukz&maz=W1BE>nAJ)z>)TTz& z302WmBd7E_mS*HUMKv;3+?wkv5-L{8SS7?&LVt&5XG|*_#Tu-YuueuD)-%-1={r6& z$}Bo|!K4-48#C4X76`Y-ZTjSOlec^OK$N zbS=?ykBk@^$VWAk;dyfQN@Hs2&c${mik4u4jWaCIai@dZ8B5Cx6%0*{@dbSiO+2FMJQ>9fG)quqv|uLz zx{#T9>nOL#YMNWNXK@u-oXdtFy980Ygx=i@9gT|yTe!GTA`9YP)jkyg9Goav=`ZoPJ*wIx z$J9JQ-G+7v9WoB%2*U~wu<#7pHhGs4b8pxwKaOO`g+LNUJP<{36rB>fWIT-2Z5!05 zghc$TtLk=V&M+@;8rvB~KL!Q8k1|}m z(=A?*#39@RY>G%0+B9L-W|2*oQ!S!j$tmIJ85vJNr7~{0MxSbrrRY$w7!DSzYeBK; zx@~jYnGv3Kb#5tb-cccxc)(|5WI^=K0pB9HE{3w;IwxZU8aXoL)0-CDdUbqI!WhHa z`N*`nnx5rW6r)%xZiWmKc~M^Td2VEBqlQVIjlKZ9Kuxj&6!xn6Kd-iSoAv(TSU+sK zMz&cfcVxI?3s*R%uPKTraZbW{8BgH?m92$SWSp{2&2d|?J+Gt;6o+y;{yt9oG_^Qmzrvx;j3TRb%uLqs-uoL|5qe|C5MtBl)1eiOlvT z5x?o6dJ?o5bfWnQaAsome2Mr124$&%2NjWFS+ApJ#;E=V2u6EN*UE5l_>rMo{a3S~ zoM<>~WOUP}=I9uAM$D{?5AhKxF%5ra`v}j_ZdfcAmV!-@d=cQ(P%U(9$5QjYb-Ox( zPoubm%Mw15@j0$AY?;eV&6qI9xRUaSq!sG0nsH3)Jauj3;kUoTJ26<~8#t;OS)JRl zlxdE+`NebgwuOD?^E^C#=^uTQi?0nAsX%kPs_VU)!;>}ma^BvZJrC2>626X7@A{35 zSMX|$C=7C^VQ{NmS8bcy5`JK4D8R266cT=9*tGamN@gE7)RWOQV0aqkH8rC32WX`J z+#9JC_eN^7y^;EAs{f^Q)!|uM`5ZlU(MYRMpJ+4=fIhrHciDTc$BTH0-X`fP!FrOt?A?WaE0}-aCN>NtegpdhchMlt z;O>NYrK^grYPxD~U<(ik*mZ1Wn8x;Lw9eVCMH%Vrr`FEEUK*2B`se&O;QLWiB3K|V z$UbX81tj6yP3#$Hx{mv(OPy6+S3ZON`y;>Ne*Z&VWEzM1L!YPd&}B4~UBj_!=dI7&SX zTM0Sf6frh{Dhv`@k0FjT*iVOY8&v9ChH)AiI2}P3Fh=MaUYtk$SOUBS;;#kxPU3Z9 zw?ssWH|R;QJc&2yNgy_fx9F*y?2O`VyhCf=B`N*g`Uj^a?Ac0_-XlQ?-p2*-CH5x;(a!1uU{pHTN7qtGHJ literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI.class b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI.class new file mode 100644 index 0000000000000000000000000000000000000000..37c2f4ed87b158011ab9d9cca869e36b78f2c3ab GIT binary patch literal 8636 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 fIcPtDM`cKc4+eSJzl~|AlACXTqAyM!Fd=z5O z2?B`*n%kXy%+Bt;f4sf{xWJJG1EmT~8(Szdv}XR3&tpG{_+2m)p<*as$waDahEjjv zRk4j~1(uB(Y=&VX6j$eAIu$&Y0iP^nlq&9$n=hum68xbsUtHEA&Lf$O{kdT1xZlGj zDw9bx()0}*P0d|j*Losb$~4iLwvEm@lLxU3HyMV@{%@wgLU0yFxeF2#FY`3@ ez*+ZW5Br3OshG literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/Lib/vault/Vault.class b/target/classes/net/t2code/lib/Spigot/Lib/vault/Vault.class new file mode 100644 index 0000000000000000000000000000000000000000..bca48eb6e5db122268704cf9a8d260fe8c62ef19 GIT binary patch literal 3924 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 UEW0iR#?Su#mwVL#fZ7xt(Yk*f%`xb@-5B?m{Z5 zFB#I6gU1|l3>i;2iJybXVCiEw^hAw&1F1|{SjeJap@>C>suJ3s)a^hzc6TWKP}}iq zti`}?4!qWja1$+}{Ud5VOf*Bi(jGGixbp3Lr!QRH_=_C;g&2$`@n9&nr4o0^z!A{{ zcLGAn?a<}HBah@LpMr+&$(Z4={eO-PhJ080it8kzw&xQPv%9*O;nmfVRQ@daDRN1D z%x;)OuDF&Xev31ksEwwlAzI1}!k8L#gzkl27TXM!|57DYZj};IGvIM7V(gJDDUust zWTZ3265Xzl9wUY72UxY7E$81c|MW(c6w2faR0mFB;0z0>V~H|r@&n6Qq0GQ4`4rZ$ UK8_pM9HU$0cgRe7ZBeB23x)TbSO5S3 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/CmdExecuter.class b/target/classes/net/t2code/lib/Spigot/system/CmdExecuter.class new file mode 100644 index 0000000000000000000000000000000000000000..47a9b7f8b652945594bbf6bb2c5cba075334ddc9 GIT binary patch literal 4628 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Main.class b/target/classes/net/t2code/lib/Spigot/system/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..e5f1245d04b49bb77b6aab164745e1df07ffeb06 GIT binary patch literal 5904 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$1.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$1.class new file mode 100644 index 0000000000000000000000000000000000000000..face7c9b540cec18a71ad7811b85117c78876edf GIT binary patch literal 227 zcma)$K?=e!5Ji95YHJnj5nL3P2E`kQf(voc6SV12Q(_`b6ug=X58$E1R6Kwm{vQ|~ z^XK(`JOQjRju9}-H9789!qmi-tax#ejd9%Gt)nwPkn5zd`7%btkhSHl?DT6~(d% zf%Cel+bKfd$lR*3t|Sb_EG2TRX_k`ldqa&M20P5>yq# zPzr`dIMRfv+q#iZE2dhvEX}kNX;&dB;Q--GS2!1I74vdoRa5Pmx^5ITD~u?51Q!Ph z-jR4dfY7m`EbNkN%h~wc{%$=P#5B9IE}X0h(6o#T$PoMmkrspubGJX!u~v#Dh2>{OIL{Hj z+9iPh0b;*yGW(&NUNRNCZgGjt{(Fg?Z`msno0bg_1YK6^#45zcnU-@Uzsy_8hZ%CdaXy=`^t zwlJ=oPS8em2YC5EN7pTLf&`gM!|8q(6kFk3blL#7*-rAC^~OO&o9XK|GQzp;=xF7q zdy-9g%Su(S-?}KiWtNAzyXDq&E<~n^mIz~=DotPZNC(1+PVGJQqB&bp*BH{h-*9F_ z)vC5$F>4akordG2+uu9vT&_~LRBculZ-neVRVPIVyv&-WW~B|KR@2zV3L(}_Idj+P zcBT(%9}rvAfS=w(nBKwy%Z@hHaT(9^iVxxiyvQcS zOaOV1)iMW(W|#Phep4Lw1r;6&ls2={{`~+79Jpc z!|1nsDPBBG*urtblyA_tg%Pop60^s|k%=k)pnnUe#QgO3w+P(4`kR$@V)P+~=_6$6V=U4q zSfbBxjXp=6zQ6{3iMQ!%yh}G6t|po2EI*fdEb@$Fby*AIQ@o6;%uyfS!4j64lVKRR zhF6#s!C$|_nmG9?pKNNq#;0(sC22Kq0ANpTNn6ayaJ{tqUt_GV7ixn}wXT+YrNk z1;YV>=7IQp6bErgLx+w|+%M4M<@QgW1wtxHfkOlF8Wem7469opRy8ndl%nXugE}5U zkAP-6QyV3B%k#UWb`I<4#Sx~??ChfR=GoIy$;YLrUS%1xWHkQ12Qg^=m^%--mcj9`k9Y^rP=QlSI(+SZ?+Hwn{rb3;#K>J)@`q(OEWLlRj&> z28rr56ZYx)oAIlbS;c&A2klVcRAbOo$s3%cspbu%q;8^mX`}$(JbBqoS-GCSz{sh`bTsGqc{_ay- z;%l^sZ_p;b#fy~n`s&Ew5?4HkmoQJ0YNi}DVS#hy(3dEOzU!9}!XnbXW3fy-Vd}j9 z8Dfh!NU*_=p;gc>a1&j#!(TujuHXTI59s}RXo8D}1u8fyFdpg-RWP8oQfl_NIx;fe z(%n+QsG6VH#*-f+eC^&>%@adPO1j>}MBV;2o?WSJyl7FzjAt)s|s PgkLMAa4SQI!9nXEL%-d8 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$CustomChart.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$CustomChart.class new file mode 100644 index 0000000000000000000000000000000000000000..ad5253a0427f3126d0d81ae38d3b08580b4dd309 GIT binary patch literal 2574 zcmb_eZC4vb6nem%?pOT;1x;-+zFPxG%!PB|5eCCkopFODumqDY7_siGej8Cr~DkvsWii`#jI2WLP!9YboZG5_f}<>r!# zK@2gd1s;TeZySNZur$`F)sY&`bQHr3a-J*-j8_E45r(hNLe&_AdS{IWoL2A}LuZXU zTl=2-#K_rP!5BktZKF)8YV}4%^(Gi5mkrD2c`a}?N}?vA$_zbRUU$io=<5SmpA|g}t9m8mSL}k{d>#SEKscli$w2C=Fp{AVR zH5EKV-Nn$hW;uMLbdclTmdK{)AJ;VOZNsy~x+0W=eamN5KQ3`UsBx2lS0KJB8|l498CB0phRpep)k3S(`J@#_Md_}qK$WDF zh8FI5uD9kE3ZjNXDn!ZJA}_e>}EWEMNe=-NF( z&&E`ucl4l(V+mHk&;M5>c_Nn z5i`;N?n#5#l(Z1(JerY2JBINd<#8G#xPuj%5riuG9jxMgf+=KcSf?1GxQh+?MR1R# zYGrQ~AJ9zXXbkf2&=hnj*nEi=$YHW>Fp_{iSAWA5`u<9%x9GHl4`o^WA)xg(tz{Z_ gNV*&D?crk@`^i@u?&EIN3CtA+xi~%xuU4 zT9z-o>9amtMU^i?m4=F1R$jC$O8o&o`YSA|FrJ>7u(L7XR!S?C?dj9!obU8GU!U%K ze|`G{fCIRZ07pncSVaU;hCx#}S!Z9VIxVt>K9w!j^m5h7+6~(gmF&21EWKoRkJN3a zS{a$qEQcX_NH=vS&(PUBc3GR#vW8}svqjQ0%el;C95KWdBvd4!GVE;&;Hae=#&q?n zc}f=yv65yO+LS?`J3NTGqZ`>$)hyL5OPEe}#8=2E*uXH<7RGVAYMz|BEK1Iix^7Gh zD}fX?$~;msiuQ*t(HU= zo>K8NwlgTYJzA+b4Hx%Diqs{W>1KDN9yiTk(H?kn#gL0Iej#Ar-Gk zgc!M-)Qq}N@G2##sah}{QI=KB*G~U;uKUI#|ehWlq4I&C{<*A?z)@Abv=*E9ZWEMx<<_Z0mOR4%*Aku z>OUt-V>85ydfC*Rxg!xLk=DJJTbDPf)QI#S12l@9)-X6bV73&YNgPMhA}UjBpKE=MP>BpYjiNYWAL zBt8r2EVlwSYAc{?65z2r`#&=+lcv(ybZ?2Hnxio!Tr#*lf^Lh}B6_WZcCWfheoJOJ z*j@^oXTrB6PYLSB#aW%sHKmeWpfm0^Q@2@AaZ(;NA0mY+T1^(XnK2?Cx!Gt5a@05+ zaJDLMUhI$L=_(pBTx`Yo7jw7WKkgi?@}H-e&$l8xGPL#hP8A)kG)n>bTu+S7mqg9c ztER1>x^gABK|NfdVic=&t0a!;@)lS9hr}M4Ynm2JQ&=O0X4`^%(CyIOPHUuswmd}C z;5nkJ;2)fz?(33I!8L}%?LY*2t#dB_wzmlO)^espA~pq8Sz1dY}CA zt>fuvI_{b*;br+nv|U1e0k19K=(*64a%=fsr}8<{p?tsZTPj8u@Wukh&fQuzx4V)0 zL3Et#_g3ilHtjO(=5vCcaNx6uaRZ&ag5A7|Zhi$l+(LodIL#fL<#pWTbNGT^#VtOM zFL?uB@oTuluj5Dl0e;@~ zO{)=^ZNF|Y{0>2S)cEi#E}=|S>B0AyA&Zb(L0Mi25BPKfcrT3C$`-OkD%fvhQTCfHTveb0*l5zg5k80 cdRV^JZOl;sDH^ZRI7m;o`Dh#sl3YjpZfgc5Pf4OabirHLd!>i(n6?`RKf%yE(IhARB8$I5R|*)uEJKXjcliae+3e# z5(j<&KML{It_V_lh~TobGyCSvoALPPukSwqJi?|63$}xbhbn4<=dsHD{9%|JC_mC; zfA~R9lHAWeWw|=?->5v*VbFv<7Xx;7!obJ{)cwgvQSmL=rEbLuW z>^(H>*JJ>$lxSSWGCk%MtU|UGzLlIlt?;ed{R;0hFD0ER346bw@k&5RLmgFIWyA=2 zNi@r%*4;XR%*2%0uZryT67few4cFM3DOtmHtdhaPjiT;N+@f72ehurm1M{1#;Vx~9 IaWw0{0quC^GXMYp literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..1db1a7522f687cf386a1c628e98332b993d8a37d GIT binary patch literal 5774 zcmb_gYj_-08Gg@9(%o(*&1PxSrcIh9rX}4?vS}%$WN9%Cy`-i|HN6;8z{zHsY_pjS zyR)SM5f!{ERKN=&h@e&w5VTFwRw*i2M7)Cc|N40OuMdLyo|)OrgxzAEl&9&=%$ak( z@BQBIJ>PeBU;59PX8~-)Zvs%D`cS5!9E${kNA#n5ETx+xvA&@rM#2(Ubam29T3ZFw z=5+^r@Cz)Toz!n-lIF;^TrxFmWCHL(U5pB7K2&O0f+~ScreVdb4T4T*C^~G9Z0o!Z7)^wYkW0d|lCyizx2LDuFUHmr4cbwqC<( zGzctpjM@J7n?^RFPZ%_PSqalcmgADoO9dKdY4WSi+dFl4;YA zcL=Q7-QU+6KB}j3MtD4zwZdlF3J)1!2U8epWD?g3EGyxB-2p$E$wZ?BAJGs+3z=~6 z3al-)q8P7au}wn^?E-!)?IfQZG#9fL4`2f>_hF-kE3j#fu=2}%b|ig=CE)H77W~*O zP-n-SwzXIy=nk~`5EtlNn9MxF^J7cin~f`5!rL`?rw^SPwxKH@QO-)HVx5_cKA9z- zSu11c;{t8XgC6!AW#^@3uW%;DNCoG|L)?qoHSEAnfpQ8eH7U@LC)J*RIARkrX_%P<2^p~YuJbVl%g$J z@AR%TrJJzQ8S>yel4i{?N4WjH!s;5;GyTR*Im1jCrPwH#u!B3O;k_83v4mq;pxqmT z%i!!9uYz30{TL+nK|ikN<@x}w!HqI`?-K|&59TH34Wiq$3Mmm7k|{}Wf0j-KCwsDC z;II!P8b*;6SXo3*!7_Ia6S6N&hyrnMM1>rC4PQ7hAy)3~KBOp>qWaNq>6YOs9%jCH zut*ZOctr%4<=S=?C>K;GH(l@12@Zhb4*~1 zH_7CWnUD9(YeTMQ36zE677e%J{oFt)!yK_j?OxL@UwlBr?f4*HB&eNEcB3+uiY`As zOe}{Q{kT(J5Bc#?Zk$88_V)GwK8{cL@JS7yl4YmbLyc(}BSuD`!bE8RXs`5=*^7}8JT_hP>Lg=o^(P_9ndpL`Rops zS))l(w|Rby6m>!tw}8`Qdf9pedPqgv#&IDxJO+VJ8KxUocl z-j?Jh`CnOT-co=rCXLD<^LV_J)whAbi{Rzj!MDM`fac|o z#mznq3v6dATA0S>>O-)t2_9kuo7K{kK0Y+8H+i;u6AyTS{&X&r;7M9mHqAY$x5+xe zv(L74+R9oPeS+ho>EUeEB1{D^jTs+KYdC|mb56BM^Jsd^i1pZhxI#ay%aZ~NPsO1A&^-9?UrUAj4(GO|rQ>GW7`B3@j0JR@@!?wg!2ywm6Z(sB9LYrS2MrFpJLbbL$jp39HLdsIR|0EhyVIQf%~gdD zuL!Ju>#00RI1<98q+8*+Tj4)`Q?>8-MUqzy+;3RK&(HE{04nc*hR8HT&w~!yyT%A`-2e!TP)}Z-g^gtep1vs3`cTDEO$L zkFU^&jP+sHbjmedTZr{aC)SoJT$Oj^4eEIY^#X%BkLAjX9*4CBhqVQVwfHI?d2>*Y zx}K-V5m`ca!SmJ9GkM*52G;_ou}eXycLsY;dB3N)ydSgS5UyBfr9 zwHkeD$PUNZ)q4vv+FOv(UVN*ttIMHQR|Xlt6L``M;}*(C)~(i}FwUZ5z{YA38}%)w zakM8QSURJ!wmBH>VyUhq##O{vPi(6ZRU2$fPMvFYF|FnIGr1K-UdGidjQkbL!6B-M zLT<&I-2&I6ZmEk*Ve%0qB6U-^ZEJn7@nKX(Lm!e%oxsle;350@4(IvG`e4S=gH*ghgKAP7bkg@nmNV)-@~)`fqnNwJdYRLu^;0+e!^LeOiKk`!pl@+2k(By>(4ok NpdY`)ukk8s{|Dp|1hD`B literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$MetricsBase.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$MetricsBase.class new file mode 100644 index 0000000000000000000000000000000000000000..cb97fc55e53303b7f7ea28c2a9e0d1f71c7a1379 GIT binary patch literal 12689 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 V7Q(h(kMBjka_t0du~tuY{|ndSAj|*& literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$MultiLineChart.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$MultiLineChart.class new file mode 100644 index 0000000000000000000000000000000000000000..d4e3b819de966c239d9d40f6813c3ca515ada1ff GIT binary patch literal 2658 zcmb_eZBrXn6n+kQ*}QCOOACUEr8Ob}Y-kI$5=7e+G%cZOY7oTgCahs0*~HzOPI1N$ z>JR8gNB=;-))}P}ol*Q?9pA?BWgN$U;*7PPyStb~(TR-1ko$J-dCqz6bI;u`fB*1f z022@qbit>r#lioie6Z|qt!lB_r3lS~=ht*GrH63KNS`>Y_SH*o8ASi}C zTd9dn2X|Sn99A)iBZLrVXKm(mX8OR6Vf&khn8Q821vOoq|j3~?Clnkf9BgjkoZ_=G+9<|x zQe}CuWvHZ!yjHI33Qlnfjjy$*mgQ^Hsi_dCfB9*qii= zHNz%Mc1CD>P2w1pqAY+JKKJgHJiNlkH?AFWv$g|U{?EDXnMlcr$~VU;qvtfCu~waW z!qvL{aNLW_S;bs=dlivzx-)i~`t^3QD_=#c$-`)#8>@ilBU~nP8wTG~=8l#Lf632{ zrBk_ZwQoo0d}AypwBiN_b;4_ zWRg70n5J%}%bIQL?1Nu}cqavc%U0W)y02YqTsQy5FQ24SYZY*HKhp_FOO5f)sAY!J zYC_-$KiXaVfxyz1&o;MN9(7@X{}~t;xqX^viro6RjgE}o1dWV+0OdU%`tS_@?vqRO z2?Df@2z`oYd2Y}(M-G>G#2fJ(^6XOfBv2O?xi10T842h@KMy~aka2-&h5ZEC=IxIV zTe`^_8+ji}1Kose^kv6xK^<%09>P0}e#1Y*gZl{$93@Qo`~3|J%cZpJJuJ73PX+n| z4V;ku$t^tcE`rzZ{NkG#m9wnaZOpW-Z{dl>>vtLhj(abJ?sKDCnA^g6{=LDW`5h9b zmk&F^4b7`w{cWK zOhF&r<}W4%iQh1+VEk7M2B16P6JBBSHSTx8z&f`h?5GPHsQBeq-3CmA`K{VOmD_Rt OW~l|k96}5>!hZnq*x%0p literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$SimpleBarChart.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$SimpleBarChart.class new file mode 100644 index 0000000000000000000000000000000000000000..d8a1b136a9e718cf3781ecae87ba1a3c3437722f GIT binary patch literal 2574 zcmb_e-BTM?6#w01Ve_%UmKLOHZHrM!pbeI`B0;nS(6j;6)F7>2o8>lKy4l3tn@)M~ zZ}8bi^`Uhf6=#$V>Nr06&_BuX>)hSNB#KUC9ERL`&pr42&d2YbyAOW*_6GnL;3g13 zREK7u5B&_24wpH3-fC>{oGq%ka#PeAGUsi3lGk&~T)M*Y(uI~M8}-7b=}LzFS>Xsd z$1pTj+A?pOIootg^4!we_=@cs#zK~r8b93RVcBq9JHw@xsm+6I=*W)dTK)WBmn$)F2wvEG#1KJIn3 zbIQPJoMDJjbnbSUQ>KsZ8}?lwQ9g+$kk;{}fv50vmwo?0Oi1pUvf(lecbzSUax#!X zR>!!33FXFM+rfPm@@>=fR`?yMbk7;csZ?kV33NQeaIAfVVoEP6Zz#c2c2Da9BmR!qCab>u15wrbIlyrzmXgXay*;RVtaPN3`OtElRB z*}yys3`w)uF|9%-~JGO}&;j*Lt`HqVcmN`F1 ze+(B6in~praoBOc#e~#_YiBvf;=wkVObitG+an)}q)ULaW6Wm;i zDizQ>Y>5ohy=AA(-|!@viq_4hDn`3*!~&B4C7b}dS9VZ$?>5-`!BknA)-CcOtbbzh zj>Vf&G#pO{(I)6+K0p85VMvr4E!W~pLOnl5_y(R+G10QUu*5y17N|?{Dd(!uh>b2c`6KFCZN)B`isYgu-e=;0!&|5&9q?CaY(f#${SXutNU? zj8z(6A&Es}l*VLs{61KA;v48+(K3ox>32YFv5(NlK1PClg4alPI#5R$*Jwot@j5DG zQq2@l1Zy-`fPq8-2GDOn!#auqFdIQXxdFWY9a8J}iBj3Gq3>ak;YW-tPy7U9Vh@in zd`Rd!G<}?552Muo&+cJNiKl3CR%uVpXyYfeJ)BpIi`w^z^{84ttClmnm|fk)i)(j( ze-Hu`Mr?Eed-Gn|K@VgozlYG0=aP^n*QPYDrVZR`$Bl9z+ wsU*rNh7D4?N%IJ5WD>|yz9JB~rKvA40UL38Rs`xaPSW><(;r8JB<~^q2WKnDhX4Qo literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$SimplePie.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$SimplePie.class new file mode 100644 index 0000000000000000000000000000000000000000..f035d3aed92a5c778f8d4646ff3d991982a43bf8 GIT binary patch literal 1620 zcmbVMTTc^F5dO|mSX!1_3kWDzQD}=S0$z(K6o_c?R?%+NNta7gPT7TZ zZaN}sri&t1kfy)wOP)7Zx%7nXk0eXJEaa0LmM0k+W`!%{97E?=YSY@XOviF_W|}nRK^Oi~z9_dD z>c*n4bo4UZtf{s~e!;C|Stto-oqHkl;F9WpUpZE$5d#eMTb5Je>eG;cVO(ZtvWi9S zt}hGjtTVhmrP)Wy*l&O8e2@|<@f8DCF-lOf3Ma!7HR^ofMh!=+@`Tc>#(>-qK21bz zH6JjR;OVxSj1_8G_#}RYuH)IZi~AWL{&!iY_D7X!^G}cv07Vb z>8;I+QWRWY$8CnlA=3}OFoe>Dl4tW}p@z?>4*!I5C3VGhxtDY--{%zL9>Yj2+#nhs zTOP!PgGp~cWJz^0bSyB;*An*#!>V_WSg4Z2&={hHq|x%D*HJ5po89LE$Wl@81-5TA#D}c$TnDU#{^8$=prU@okFUUN~B?m z&MINWq7qh8Pa{CPc(j`M9mP=qKcku9J0hw04}{{o=zNcQw(}J|FZXaU+)tLl zU5xCIdj(jSLP2|uX6*&KwKeo=nKHPpO2{g>X7ppA4DJTq3_|;bZXFR?VWb8K;Vp8% hLuUY53#ffQi~Dq`hvWm2^K?og_y-aUt-AmK literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$SingleLineChart.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$SingleLineChart.class new file mode 100644 index 0000000000000000000000000000000000000000..e7a6a13618780236f7befbce5a65baaebd22243c GIT binary patch literal 1622 zcmbVMTTc@~6#iyg*j^Ta0#!uhVwDz<`saN6@LXL z3Q-f|v%kq0&(PHtf~4}$o|&^}zVFMF_YF@lbmlC_66*{D>EeNLWazfxRP_>BI@N5Z z97P0C6)_EQXbg*O5tQhy&5M@91Coeo*tSuzIm1YUr7kR6H(kf9dmeX$o(~MNaoj?; ziXIKUNH7ea`}8kshOk6t=uc-_ynj_W;HJo`=x69{232qbuW~PjJ|s2V#vO);<%qIj z*U7O^I#W<_mtm=`7+?6V)8N^xTlSuW9mG9Zhv9Rqas(p`9Y+#eej3v-jt2~JqgLb2 z-j2oXJ%-&Yl3vIZZ{|T(@;ub=2ouCyk!~?;Q)X@kmuiNXWr&uns$+<{N2yx8zJ|G$ zQUp2At`o%K6~SJQL=8wK&Qm)xbjyBvSwF0B?{%Y<5=ED)Up72T-UDS=>{~t+vAv)# zbt*ZjnsP1*l(|Gp7{NR+BrkFv*Z%Mp{yVs<(AOkNX~>-Z|3GW0du{O=crSjnw>Cf~8-6r-nM8co+dQLXfr9a1*uSSH<3)!O+ki!)c%+x zIYk+x#6ICj2PY;!Lj8;`hVSS*#XxT8Jv!LQR}8*6!%*V>&?!bw zkvbvMhEoZGfwGJqWd;4pDw0a>+_7W>E^w@eHrNQBkQ+<%vJ>nlk_^jq4wG($Y**>5 gAd4KyandSS!?Up5=xcb6C@qUMY>?cf(-xw?0r2>({{R30 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics.class b/target/classes/net/t2code/lib/Spigot/system/Metrics.class new file mode 100644 index 0000000000000000000000000000000000000000..567d455d90e64f66b4688b317c4027307ea39713 GIT binary patch literal 9300 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 Zw|j7$5RGtT40|!o5Cs0gbuIYk{{XcWjY9wc literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/config/SelectLibConfig.class b/target/classes/net/t2code/lib/Spigot/system/config/SelectLibConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..a997acb2d820a02fbf48c8a5aad7dc7fa2de5099 GIT binary patch literal 1283 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 U1?D}=jOLm50!KDI*K*+h2EZc?MF0Q* literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Spigot/system/languages/SelectLibMsg.class b/target/classes/net/t2code/lib/Spigot/system/languages/SelectLibMsg.class new file mode 100644 index 0000000000000000000000000000000000000000..d80f4d2c15d7aec8f3f28ff72f95bac73c8e6ee5 GIT binary patch literal 2736 zcmb7GTXz#x6#hlyR);pqxwX3 z+&fFj=wlf8<>rWgH7XzpS;=HFjCEKqA);UdHZtsOkAak_6>i&}ew&*`hVCNIyQE(o z`e(iArUSB0O*hM_crJ`h*eqd-f_t%bg^#kHp$zK_Zmq^mXF{*=jBXgZ?YV0-j6rOZ zuwB9Zh%)pwg{Li(kVtcy;qr?mh7Cib@fO|UI3-~RgW}!ME%lsk@Gy2^w}d?k_F{-3 z*535M{TWU8SSoX8Tytg!_fViA5JvJ744a#ne1lKBx>4k{FyiQxG0YHd_}*3pQC08& z4p0=eYSnY=@K6izhSS!N0Ln@%0zm^a9Y6` zJW5W{Z4oCg`jOoh7bpy5ifxILfp+f7$rvSVQA+sO-9H&=!YvplW_Z;03X2zM zUyw1z5EUm4??g+4C3;P>qo(CVOO|UElQPDs0*LE~xL@QY%{81m#K0Z!PZsB9>B8#Lq_B-v$(hV{LS;Rn^*0g47n4nhGpoY3~ZNWIW$AI4d%R3_d4jamQBRcz0Hu$e3eD zP@Wu22i-YpyM+QZ-I8k<^UdURtm7h^WLzho(dy_h4b;pA@q&UEMNbVG)bMhm8H!4M zS+tl}7zS51Mc;@+Xcxl!xZq!AKaije8NYrsQU`z;($9#@e)W?Y$h{&{MxY(B36y~e( zU`3t~>Lb}jOx{F@q|#!49Z!ud;L31BTSB3Z@**nUw%XX%T0y!VoJkrZ*JvQK_bp+b zFX5%gt9O71Z+3d#97TlIn<-RV&`*Unf^A4)J5JJ{$RwheqcDDm9rzYI@f}sfB6edL zd+;;;S=^=){0#~Gfg~HCaEXW{e6QmJFQENQqT3%)Oh)iKKE@{$!`m3gr}&KYe@^@g zI{w76gh2_hZbI?Jo$$xKI0L;4czqGl0^VH26#<-iz{L+K9TIyVQNE;g2fq3nPRZvt literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/lib/Util.class b/target/classes/net/t2code/lib/Util.class new file mode 100644 index 0000000000000000000000000000000000000000..608c3e5ab1a713f9778a220fc99827a8f6569293 GIT binary patch literal 939 zcmaJ=TTc^F5dKbY+tyX+0>v9D;-y8|#R`hF`hbl|lSWL6Bu0JMZV%; z0fTm6yIsDy!;ml3il_375M|ZLtd8@zz>scqMBA6ODs}V^=p`MOBj`pbZ5h_88m$;%Uq?EbL0z3D+&_@bJ(KqcZ!B=?85q;Gy3Q93ENebvhsdYgG|Cen7Mm>K+&->cZpCyZcQZY}rkhJVxDj zYz5ylf*H<};ykWz-#+YB!jtE@E`YNo3T?(N{+8 zJkqq#NE4q(Q>&z7VCv9Gu99VuW~7sgCt&ZR=LaO!GZ4o^lKK#UH9R6KjrE_wZ=%xl z6B$|$8DrujCVR-|mcK