33 Commits
1.2.0 ... dev

Author SHA1 Message Date
e7d24dbfbf Set Snapshot version (DEV) 2025-04-06 15:50:42 +02:00
f28908d3aa Updated documentations 2025-04-06 15:49:07 +02:00
1043e1805e Checking st.slogin.skip permission 2025-04-06 15:42:50 +02:00
4d001c0432 Updated version - v1.2.4 2025-04-06 15:03:43 +02:00
047f54094a Allow plugin run with newer untested server versions 2025-04-06 15:00:26 +02:00
882e58e38e Implemented Clearing dropped items feature 2025-04-06 14:47:43 +02:00
f5d60cd7e4 Corrected skipping op players - server password 2025-04-06 14:43:56 +02:00
2d7192ae9b Server password feature - skipping op players if set 2025-04-05 20:21:53 +02:00
49bd873392 Changed ConfigUpdater to be a maven dependency 2025-03-29 20:46:53 +01:00
054ea4931d Updated logging 2025-03-29 19:43:49 +01:00
76afccf285 Deleted old plugin manager code 2025-03-29 19:29:33 +01:00
52b74cb772 Lang files restructure, init refactor 2025-03-29 19:03:15 +01:00
1c5402cf6e Fixed not creating new lang resources 2025-03-28 19:35:17 +01:00
571fa366bc Handling unauthenticated disconnect - server password 2025-03-28 19:19:13 +01:00
b82f47fb3b Implemented translation 2025-03-28 18:05:22 +01:00
f559ace08b Updated server version detecting 2025-03-28 18:03:45 +01:00
4b41a6198d Removed old reflection code 2025-03-28 18:02:15 +01:00
84ec5838d4 Implemented Server Password feature 2025-03-28 14:53:16 +01:00
e2b72802d0 Auto-saving disabled by default 2025-03-28 11:10:14 +01:00
653ba71f73 Support for 1.21.5 2025-03-27 23:33:57 +01:00
eda31a1df2 Tab completer optimalization 2025-03-27 23:33:28 +01:00
8ba67b35d1 Added total play time to stats command 2025-03-27 23:29:35 +01:00
36f4896dce Updated Changelog - v1.2.3 2024-12-16 23:46:35 +01:00
ffe27ee24c v1.2.3 2024-12-16 23:40:26 +01:00
7eff18257d Tab feature: support for MC ver. 1.20.2+ with protocolLib 2024-12-12 22:34:27 +01:00
6f9e97acce Added missing feature settings status in settings cmd 2024-12-12 22:30:53 +01:00
27c9de4776 Minor optimizations in save command 2024-12-12 22:28:56 +01:00
619548297d Added support for MC version up to 1.21.4 2024-12-12 22:25:58 +01:00
62ae820837 Update ChangeLog.md 2023-11-19 11:48:15 +01:00
0227814e72 v1.2.2 - Added support for 1.20.2 2023-11-19 11:39:33 +01:00
524510ae14 Refactored: Config, SettingsCommand 2023-07-13 01:05:09 +02:00
83412fd574 Refactoring 2023-07-13 00:09:18 +02:00
d40a47a783 1.2.1 2023-07-09 14:22:06 +02:00
46 changed files with 1112 additions and 1247 deletions

3
.idea/compiler.xml generated
View File

@ -9,8 +9,5 @@
<module name="SimplifyTools" /> <module name="SimplifyTools" />
</profile> </profile>
</annotationProcessing> </annotationProcessing>
<bytecodeTargetLevel>
<module name="SimplifyTools" target="1.8" />
</bytecodeTargetLevel>
</component> </component>
</project> </project>

View File

@ -6,16 +6,16 @@
<option name="name" value="Central Repository" /> <option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" /> <option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository> </remote-repository>
<remote-repository>
<option name="id" value="jeff-media-public" />
<option name="name" value="jeff-media-public" />
<option name="url" value="https://hub.jeff-media.com/nexus/repository/jeff-media-public/" />
</remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="papermc" /> <option name="id" value="papermc" />
<option name="name" value="papermc" /> <option name="name" value="papermc" />
<option name="url" value="https://papermc.io/repo/repository/maven-public/" /> <option name="url" value="https://papermc.io/repo/repository/maven-public/" />
</remote-repository> </remote-repository>
<remote-repository>
<option name="id" value="jeff-media-public" />
<option name="name" value="jeff-media-public" />
<option name="url" value="https://hub.jeff-media.com/nexus/repository/jeff-media-public/" />
</remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="sonatype" /> <option name="id" value="sonatype" />
<option name="name" value="sonatype" /> <option name="name" value="sonatype" />
@ -32,15 +32,20 @@
<option name="url" value="https://repo.dmulloy2.net/repository/public/" /> <option name="url" value="https://repo.dmulloy2.net/repository/public/" />
</remote-repository> </remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="central" /> <option name="id" value="spigot-repo" />
<option name="name" value="Maven Central repository" /> <option name="name" value="spigot-repo" />
<option name="url" value="https://repo1.maven.org/maven2" /> <option name="url" value="https://hub.spigotmc.org/nexus/content/groups/public/" />
</remote-repository> </remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="spigot" /> <option name="id" value="spigot" />
<option name="name" value="spigot" /> <option name="name" value="spigot" />
<option name="url" value="https://hub.spigotmc.org/nexus/content/groups/public/" /> <option name="url" value="https://hub.spigotmc.org/nexus/content/groups/public/" />
</remote-repository> </remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="jboss.community" /> <option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" /> <option name="name" value="JBoss Community repository" />

1
.idea/misc.xml generated
View File

@ -5,6 +5,7 @@
<item index="0" class="java.lang.String" itemvalue="org.bukkit.event.EventHandler" /> <item index="0" class="java.lang.String" itemvalue="org.bukkit.event.EventHandler" />
</list> </list>
</component> </component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager"> <component name="MavenProjectsManager">
<option name="originalFiles"> <option name="originalFiles">
<list> <list>

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
</set>
</option>
</component>
</project>

View File

@ -1,27 +1,45 @@
# SimplifyTools ![SimplifyTools logo](docs/img/SimplifyTools.png)
### An 'All-in-one' plugin for MC servers. ### An 'All-in-one' plugin for MC servers.
#### TabList Customizing, Custom Advancement, Connect messages, AutoSave, Logger #### TabList Customizing, Server Password, Clear Dropped Items, Custom Advancement, Connect messages, AutoSave, Logger
[![Build Status](https://ci.ditservices.hu/job/SimplifyTools/badge/icon)](https://ci.ditservices.hu/job/SimplifyTools/) ![ MC Version](https://ci.ditservices.hu/job/SimplifyTools/badge/icon?subject=MC&status=1.12%20-%201.19.3&color=darkblue) ![Git latest release](https://img.shields.io/github/v/release/LabodiDavid/SimplifyTools) [![bStats](https://ci.ditservices.hu/job/SimplifyTools/badge/icon?subject=bStats&status=3.0&color=brightgreen)](https://bstats.org/plugin/bukkit/SimplifyTools/15108) ![ Lines of code](https://tokei.rs/b1/github/LabodiDavid/SimplifyTools?category=code) [![Build Status](https://ci.ditservices.hu/job/SimplifyTools/badge/icon)](https://ci.ditservices.hu/job/SimplifyTools/) ![ MC Version](https://ci.ditservices.hu/job/SimplifyTools/badge/icon?subject=MC&status=1.12%20-%201.21.4&color=darkblue) ![Git latest release](https://img.shields.io/github/v/release/LabodiDavid/SimplifyTools) [![bStats](https://ci.ditservices.hu/job/SimplifyTools/badge/icon?subject=bStats&status=3.0&color=brightgreen)](https://bstats.org/plugin/bukkit/SimplifyTools/15108) ![Lines of code](https://tokei.rs/b1/github/LabodiDavid/SimplifyTools?category=code)
<br>[Changelog](docs/ChangeLog.md)
<hr>
## Features ## Features
- **Tab Manager** - Allows you to specify colored texts, with animations on the tab window. - **Tab Manager** - Allows you to specify colored texts, with animations on the tab window.
Also you can display the average ping, Server RAM statistics. Also you can display the average ping, Server RAM statistics.
![Tab manager preview](docs/img/1.gif) ![Tab manager preview](docs/img/1.gif)
- **Automatic/command saving** - Allows you to schedule auto saving of the world/player data on your server, or you can initiate a save by a command. - **Gameplay statistics** - You can check your gameplay statistics such as player/mob kills, etc.
(Note: The plugin just shows the stats not recording itself, so stats before installing this plugin are counted too.)
![Stats preview](docs/img/3.gif)
- **Server Password** - Allows you to set a server password *(same password for all players)*, ability to: skip auth for OP players, hide inventory, disable moving, building, until providing correct password `/slogin {PASSWORD}`
- **Clearing Dropped Items** - Set an interval in seconds to remove dropped items. Ability to broadcast clearing before 1min, 10sec, skip items and/or worlds.
- **Custom Connect/Disconnect messages** - Allows you to customize the message that is broadcasted when someone joins or leaves the server. - **Custom Connect/Disconnect messages** - Allows you to customize the message that is broadcasted when someone joins or leaves the server.
![Connect messages preview](docs/img/2.gif) ![Connect messages preview](docs/img/2.gif)
- **Plugin Manager** - Allows you to unload/load plugins without a server restart. - **Automatic/command saving** - Allows you to schedule auto saving of the world/player data on your server, or you can initiate a save by a command.
- **Gameplay statistics** - You can check your gameplay statistics such as player/mob kills, etc. - **Plugin Manager** - Allows you to unload/load plugins without a server restart. (Disabled by default since v1.2.1)
(Note: The plugin just shows the stats not recording itself, so stats before installing this plugin are counted too.)
![Stats preview](docs/img/3.gif)
- **Custom Advancement Messages** - You can customize the advancement messages in three categories: advancement, goal, challenge. - **Custom Advancement Messages** - You can customize the advancement messages in three categories: advancement, goal, challenge.
(Note: The advancement names are currently only can be displayed in english. In future versions there will be a feature to translate to any languages.) (Note: The advancement names are currently only can be displayed in english. In future versions there will be a feature to translate to any languages.)
![Advancement Messages preview](docs/img/4.gif) ![Advancement Messages preview](docs/img/4.gif)
- **Logging** - A logger with fully customizable format for dis/connect, chat, commands actions. - **Logging** - A logger with fully customizable format for dis/connect, chat, commands actions.
_________________
### Dependencies
#### From version [v1.2.3](https://github.com/LabodiDavid/SimplifyTools/releases/tag/1.2.3) the plugin requires [ProtocolLib](https://github.com/dmulloy2/ProtocolLib/)
_________________
### [Check the config file for more explanation and examples](https://github.com/LabodiDavid/SimplifyTools/blob/main/src/main/resources/config.yml) ### [Check the config file for more explanation and examples](https://github.com/LabodiDavid/SimplifyTools/blob/main/src/main/resources/config.yml)
_________________ _________________
### [Commands & Permissions](docs/cmd_perms.md) ### [Commands & Permissions](docs/cmd_perms.md)
_________________ _________________
### Translation
Under the plugin's directory inside the lang folder you can add your own translation. <br>
Just copy-paste [en.yml](src/main/resources/en.yml) and translate the strings to your language. <br>
In the config.yml you can set the newly created language (for example: de.yml) to like this: `language: 'de'` and your translation will be used. <br>
Feel free to open a pull request and your language can be added to the plugin.
_________________
### [Building from source](docs/BUILDING.md) ### [Building from source](docs/BUILDING.md)
_________________ _________________
### If you have an idea or bug report [Create an issue](https://github.com/LabodiDavid/SimplifyTools/issues/new/choose) or [Create a pull request](https://github.com/LabodiDavid/SimplifyTools/compare) ### If you have an idea or bug report [Create an issue](https://github.com/LabodiDavid/SimplifyTools/issues/new/choose) or [Create a pull request](https://github.com/LabodiDavid/SimplifyTools/compare)
@ -30,5 +48,6 @@ _________________
My main goal is to create a single plugin that has many features, so it's can replace plugins that i often use on my servers while lowering the plugins count. My main goal is to create a single plugin that has many features, so it's can replace plugins that i often use on my servers while lowering the plugins count.
_________________ _________________
## 3rd party libraries used by this plugin ## 3rd party libraries used by this plugin
### [ProtocolLib by dmulloy2](https://github.com/dmulloy2/ProtocolLib/)
### [Config-Updater by tchristofferson](https://github.com/tchristofferson/Config-Updater) ### [Config-Updater by tchristofferson](https://github.com/tchristofferson/Config-Updater)
### [SpigotUpdateChecker by JEFF-Media-GbR](https://github.com/JEFF-Media-GbR/Spigot-UpdateChecker) ### [SpigotUpdateChecker by JEFF-Media-GbR](https://github.com/JEFF-Media-GbR/Spigot-UpdateChecker)

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> <module version="4">
<component name="FacetManager"> <component name="FacetManager">
<facet type="minecraft" name="Minecraft"> <facet type="minecraft" name="Minecraft">
<configuration> <configuration>
@ -12,32 +12,4 @@
<component name="McpModuleSettings"> <component name="McpModuleSettings">
<option name="srgType" value="SRG" /> <option name="srgType" value="SRG" />
</component> </component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: com.jeff_media:SpigotUpdateChecker:2.2.0" level="project" />
<orderEntry type="library" name="Maven: org.bstats:bstats-bukkit:3.0.0" level="project" />
<orderEntry type="library" name="Maven: org.bstats:bstats-base:3.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.checkerframework:checker-qual:3.12.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.errorprone:error_prone_annotations:2.11.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.gson:gson:2.10" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.md-5:bungeecord-chat:1.16-R0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.33" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit:craftbukkit:1.19.3-R0.1-SNAPSHOT" level="project" />
</component>
</module> </module>

View File

@ -1,14 +1,37 @@
# SimplifyTools - Changelog # SimplifyTools - Changelog
- 1.2.0 - **1.2.4**
- Added *Server password feature*
- Added *Clearing dropped items feature*
- Implemented customizable translation
- Added total play time to stats command
- Tab completer optimalizations
- Minor refactors/optimalizations
- Prepared support for 1.21.5 (Not tested yet)
- From now running newer untested server versions is allowed
- **1.2.3**
- Added support for version up to 1.21.4
- The plugin now depends on, <b>requires ProtocolLib</b> (https://github.com/dmulloy2/ProtocolLib/)
- Tab feature adjustments, refactor for ProtocolLib
- Removed Reflection (~300 lines of code)
- Showing more feature setting statuses in `/st settings`
- **1.2.2**
- Added support for version up to 1.20.2
- **1.2.1**
- Added support for version up to 1.20.1
- Plugin manager added setting, now disabled by default in the config.
- Removed coloring of the logs in the server console
- TPS number displayed in the TAB now rounded to the nearest integer.
- Minor code refactors
- **1.2.0**
- Added TPS command `/st tps` - Added TPS command `/st tps`
- Added `{MOTD}`, `{TPS}` variable for TAB customization in the config - Added `{MOTD}`, `{TPS}` variable for TAB customization in the config
- Refactored code for multi version support (1.12 - 1.19.3) - Refactored code for multi version support (1.12 - 1.19.3)
- Fixes [#1](https://github.com/LabodiDavid/SimplifyTools/issues/1) - Fixes [#1](https://github.com/LabodiDavid/SimplifyTools/issues/1)
- 1.1.0 - **1.1.0**
- Updated to 1.18.2 - Updated to 1.18.2
- Minor changes - Minor changes
- Temporarily reworked Plugin Manager - Temporarily reworked Plugin Manager
- Added Update Checker (https://github.com/JEFF-Media-GbR/Spigot-UpdateChecker) - Added Update Checker (https://github.com/JEFF-Media-GbR/Spigot-UpdateChecker)
- Implemented Metrics (bStats) - Implemented Metrics (bStats)
- 1.0.0 - First Release - **1.0.0** - First Release
- Notice: If the /st reload command not reloading the new settings, you need to restart your MC server. - Notice: If the `/st reload` command not reloading the new settings, you need to restart your MC server.

View File

@ -5,12 +5,14 @@ You can use the following commands to use the features of SimplifyTools.
- **/st ping**: Displays your ping to the current server.<br />Requires `st.ping` - **/st ping**: Displays your ping to the current server.<br />Requires `st.ping`
- **/st tps**: Displays plugin calculated TPS.<br />Requires `st.tps` - **/st tps**: Displays plugin calculated TPS.<br />Requires `st.tps`
- **/st stats**: Displays your gameplay statistics.<br />Requires `st.stats` - **/st stats**: Displays your gameplay statistics.<br />Requires `st.stats`
- **/slogin**: Used to login if server password enabled.<br />Requires `st.slogin`
- **/st save-all**: Saves the players, worlds data on the server.<br />Requires `st.save` - **/st save-all**: Saves the players, worlds data on the server.<br />Requires `st.save`
- **/st pmanager** <LOAD/UNLOAD>: A built-in plugin manager.<br />Requires `st.pmanager.*` - **/st pmanager** <LOAD/UNLOAD>: A built-in plugin manager.<br />Requires `st.pmanager.*`
- **/st pmanager load** <PLUGIN-NAME>: Plugin loading.<br />Requires `st.pmanager.load (can be inherited from st.pmanager.*)` - **/st pmanager load** <PLUGIN-NAME>: Plugin loading.<br />Requires `st.pmanager.load (can be inherited from st.pmanager.*)`
- **/st pmanager unload** <PLUGIN-NAME>: Plugin unload.<br />Requires `st.pmanager.unload (can be inherited from st.pmanager.*)` - **/st pmanager unload** <PLUGIN-NAME>: Plugin unload.<br />Requires `st.pmanager.unload (can be inherited from st.pmanager.*)`
- **/st reload**: Plugin settings reload.<br />Requires `st.reload` - **/st reload**: Plugin settings reload.<br />Requires `st.reload`
## SimplifyTools - Permissions
- `st.slogin.skip` - If has this permission the user dont have to provide server password upon connect if enabled.
## SimplifyTools - Wildcard Permissions ## SimplifyTools - Wildcard Permissions
- **st.*** - Wildcard permission for all commands, permissions for this plugin. - **st.*** - Wildcard permission for all commands, permissions for this plugin.

BIN
docs/img/ST.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
docs/img/SimplifyTools.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

23
pom.xml
View File

@ -6,7 +6,7 @@
<groupId>hu.ditservices</groupId> <groupId>hu.ditservices</groupId>
<artifactId>SimplifyTools</artifactId> <artifactId>SimplifyTools</artifactId>
<version>1.2.0</version> <version>1.2.5-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>SimplifyTools</name> <name>SimplifyTools</name>
@ -91,10 +91,6 @@
<id>spigot-repo</id> <id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url> <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository> </repository>
<repository>
<id>spigot</id>
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
</repository>
<repository> <repository>
<id>papermc</id> <id>papermc</id>
<url>https://papermc.io/repo/repository/maven-public/</url> <url>https://papermc.io/repo/repository/maven-public/</url>
@ -114,6 +110,11 @@
</repositories> </repositories>
<dependencies> <dependencies>
<dependency>
<groupId>com.tchristofferson</groupId>
<artifactId>ConfigUpdater</artifactId>
<version>2.2-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>com.jeff_media</groupId> <groupId>com.jeff_media</groupId>
<artifactId>SpigotUpdateChecker</artifactId> <artifactId>SpigotUpdateChecker</artifactId>
@ -130,19 +131,15 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.19.3-R0.1-SNAPSHOT</version> <version>1.21.5-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- from downloaded craftbukkit-x.xx.x.jar\META-INF\versions\ --> <!-- from downloaded craftbukkit-x.xx.x.jar\META-INF\versions\ -->
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>com.comphenix.protocol</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>ProtocolLib</artifactId>
<version>1.19.3-R0.1-SNAPSHOT</version> <version>5.1.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,241 +0,0 @@
package com.tchristofferson.configupdater;
import com.google.common.base.Preconditions;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
public class ConfigUpdater {
//Used for separating keys in the keyBuilder inside parseComments method
private static final char SEPARATOR = '.';
public static void update(Plugin plugin, String resourceName, File toUpdate, String... ignoredSections) throws IOException {
update(plugin, resourceName, toUpdate, Arrays.asList(ignoredSections));
}
public static void update(Plugin plugin, String resourceName, File toUpdate, List<String> ignoredSections) throws IOException {
Preconditions.checkArgument(toUpdate.exists(), "The toUpdate file doesn't exist!");
FileConfiguration defaultConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(plugin.getResource(resourceName), StandardCharsets.UTF_8));
FileConfiguration currentConfig = YamlConfiguration.loadConfiguration(toUpdate);
Map<String, String> comments = parseComments(plugin, resourceName, defaultConfig);
Map<String, String> ignoredSectionsValues = parseIgnoredSections(toUpdate, currentConfig, comments, ignoredSections == null ? Collections.emptyList() : ignoredSections);
// will write updated config file "contents" to a string
StringWriter writer = new StringWriter();
write(defaultConfig, currentConfig, new BufferedWriter(writer), comments, ignoredSectionsValues);
String value = writer.toString(); // config contents
Path toUpdatePath = toUpdate.toPath();
if (!value.equals(new String(Files.readAllBytes(toUpdatePath), StandardCharsets.UTF_8))) { // if updated contents are not the same as current file contents, update
Files.write(toUpdatePath, value.getBytes(StandardCharsets.UTF_8));
}
}
private static void write(FileConfiguration defaultConfig, FileConfiguration currentConfig, BufferedWriter writer, Map<String, String> comments, Map<String, String> ignoredSectionsValues) throws IOException {
//Used for converting objects to yaml, then cleared
FileConfiguration parserConfig = new YamlConfiguration();
keyLoop: for (String fullKey : defaultConfig.getKeys(true)) {
String indents = KeyBuilder.getIndents(fullKey, SEPARATOR);
if (ignoredSectionsValues.isEmpty()) {
writeCommentIfExists(comments, writer, fullKey, indents);
} else {
for (Map.Entry<String, String> entry : ignoredSectionsValues.entrySet()) {
if (entry.getKey().equals(fullKey)) {
writer.write(ignoredSectionsValues.get(fullKey) + "\n");
continue keyLoop;
} else if (KeyBuilder.isSubKeyOf(entry.getKey(), fullKey, SEPARATOR)) {
continue keyLoop;
}
}
writeCommentIfExists(comments, writer, fullKey, indents);
}
Object currentValue = currentConfig.get(fullKey);
if (currentValue == null)
currentValue = defaultConfig.get(fullKey);
String[] splitFullKey = fullKey.split("[" + SEPARATOR + "]");
String trailingKey = splitFullKey[splitFullKey.length - 1];
if (currentValue instanceof ConfigurationSection) {
writer.write(indents + trailingKey + ":");
if (!((ConfigurationSection) currentValue).getKeys(false).isEmpty())
writer.write("\n");
else
writer.write(" {}\n");
continue;
}
parserConfig.set(trailingKey, currentValue);
String yaml = parserConfig.saveToString();
yaml = yaml.substring(0, yaml.length() - 1).replace("\n", "\n" + indents);
String toWrite = indents + yaml + "\n";
parserConfig.set(trailingKey, null);
writer.write(toWrite);
}
String danglingComments = comments.get(null);
if (danglingComments != null)
writer.write(danglingComments);
writer.close();
}
//Returns a map of key comment pairs. If a key doesn't have any comments it won't be included in the map.
private static Map<String, String> parseComments(Plugin plugin, String resourceName, FileConfiguration defaultConfig) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getResource(resourceName)));
Map<String, String> comments = new LinkedHashMap<>();
StringBuilder commentBuilder = new StringBuilder();
KeyBuilder keyBuilder = new KeyBuilder(defaultConfig, SEPARATOR);
String line;
while ((line = reader.readLine()) != null) {
String trimmedLine = line.trim();
//Only getting comments for keys. A list/array element comment(s) not supported
if (trimmedLine.startsWith("-")) {
continue;
}
if (trimmedLine.isEmpty() || trimmedLine.startsWith("#")) {//Is blank line or is comment
commentBuilder.append(trimmedLine).append("\n");
} else {//is a valid yaml key
keyBuilder.parseLine(trimmedLine);
String key = keyBuilder.toString();
//If there is a comment associated with the key it is added to comments map and the commentBuilder is reset
if (commentBuilder.length() > 0) {
comments.put(key, commentBuilder.toString());
commentBuilder.setLength(0);
}
//Remove the last key from keyBuilder if current path isn't a config section or if it is empty to prepare for the next key
if (!keyBuilder.isConfigSectionWithKeys()) {
keyBuilder.removeLastKey();
}
}
}
reader.close();
if (commentBuilder.length() > 0)
comments.put(null, commentBuilder.toString());
return comments;
}
private static Map<String, String> parseIgnoredSections(File toUpdate, FileConfiguration currentConfig, Map<String, String> comments, List<String> ignoredSections) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(toUpdate));
Map<String, String> ignoredSectionsValues = new LinkedHashMap<>(ignoredSections.size());
KeyBuilder keyBuilder = new KeyBuilder(currentConfig, SEPARATOR);
StringBuilder valueBuilder = new StringBuilder();
String currentIgnoredSection = null;
String line;
lineLoop : while ((line = reader.readLine()) != null) {
String trimmedLine = line.trim();
if (trimmedLine.isEmpty() || trimmedLine.startsWith("#"))
continue;
if (trimmedLine.startsWith("-")) {
for (String ignoredSection : ignoredSections) {
boolean isIgnoredParent = ignoredSection.equals(keyBuilder.toString());
if (isIgnoredParent || keyBuilder.isSubKeyOf(ignoredSection)) {
valueBuilder.append("\n").append(line);
continue lineLoop;
}
}
}
keyBuilder.parseLine(trimmedLine);
String fullKey = keyBuilder.toString();
//If building the value for an ignored section and this line is no longer a part of the ignored section,
// write the valueBuilder, reset it, and set the current ignored section to null
if (currentIgnoredSection != null && !KeyBuilder.isSubKeyOf(currentIgnoredSection, fullKey, SEPARATOR)) {
ignoredSectionsValues.put(currentIgnoredSection, valueBuilder.toString());
valueBuilder.setLength(0);
currentIgnoredSection = null;
}
for (String ignoredSection : ignoredSections) {
boolean isIgnoredParent = ignoredSection.equals(fullKey);
if (isIgnoredParent || keyBuilder.isSubKeyOf(ignoredSection)) {
if (valueBuilder.length() > 0)
valueBuilder.append("\n");
String comment = comments.get(fullKey);
if (comment != null) {
String indents = KeyBuilder.getIndents(fullKey, SEPARATOR);
valueBuilder.append(indents).append(comment.replace("\n", "\n" + indents));//Should end with new line (\n)
valueBuilder.setLength(valueBuilder.length() - indents.length());//Get rid of trailing \n and spaces
}
valueBuilder.append(line);
//Set the current ignored section for future iterations of while loop
//Don't set currentIgnoredSection to any ignoredSection sub-keys
if (isIgnoredParent)
currentIgnoredSection = fullKey;
break;
}
}
}
reader.close();
if (valueBuilder.length() > 0)
ignoredSectionsValues.put(currentIgnoredSection, valueBuilder.toString());
return ignoredSectionsValues;
}
private static void writeCommentIfExists(Map<String, String> comments, BufferedWriter writer, String fullKey, String indents) throws IOException {
String comment = comments.get(fullKey);
//Comments always end with new line (\n)
if (comment != null)
//Replaces all '\n' with '\n' + indents except for the last one
writer.write(indents + comment.substring(0, comment.length() - 1).replace("\n", "\n" + indents) + "\n");
}
//Input: 'key1.key2' Result: 'key1'
private static void removeLastKey(StringBuilder keyBuilder) {
if (keyBuilder.length() == 0)
return;
String keyString = keyBuilder.toString();
//Must be enclosed in brackets in case a regex special character is the separator
String[] split = keyString.split("[" + SEPARATOR + "]");
//Makes sure begin index isn't < 0 (error). Occurs when there is only one key in the path
int minIndex = Math.max(0, keyBuilder.length() - split[split.length - 1].length() - 1);
keyBuilder.replace(minIndex, keyBuilder.length(), "");
}
private static void appendNewLine(StringBuilder builder) {
if (builder.length() > 0)
builder.append("\n");
}
}

View File

@ -1,116 +0,0 @@
package com.tchristofferson.configupdater;
import org.bukkit.configuration.file.FileConfiguration;
public class KeyBuilder implements Cloneable {
private final FileConfiguration config;
private final char separator;
private final StringBuilder builder;
public KeyBuilder(FileConfiguration config, char separator) {
this.config = config;
this.separator = separator;
this.builder = new StringBuilder();
}
private KeyBuilder(KeyBuilder keyBuilder) {
this.config = keyBuilder.config;
this.separator = keyBuilder.separator;
this.builder = new StringBuilder(keyBuilder.toString());
}
public void parseLine(String line) {
line = line.trim();
String[] currentSplitLine = line.split(":");
String key = currentSplitLine[0].replace("'", "").replace("\"", "");
//Checks keyBuilder path against config to see if the path is valid.
//If the path doesn't exist in the config it keeps removing last key in keyBuilder.
while (builder.length() > 0 && !config.contains(builder.toString() + separator + key)) {
removeLastKey();
}
//Add the separator if there is already a key inside keyBuilder
//If currentSplitLine[0] is 'key2' and keyBuilder contains 'key1' the result will be 'key1.' if '.' is the separator
if (builder.length() > 0)
builder.append(separator);
//Appends the current key to keyBuilder
//If keyBuilder is 'key1.' and currentSplitLine[0] is 'key2' the resulting keyBuilder will be 'key1.key2' if separator is '.'
builder.append(key);
}
public String getLastKey() {
if (builder.length() == 0)
return "";
return builder.toString().split("[" + separator + "]")[0];
}
public boolean isEmpty() {
return builder.length() == 0;
}
//Checks to see if the full key path represented by this instance is a sub-key of the key parameter
public boolean isSubKeyOf(String parentKey) {
return isSubKeyOf(parentKey, builder.toString(), separator);
}
//Checks to see if subKey is a sub-key of the key path this instance represents
public boolean isSubKey(String subKey) {
return isSubKeyOf(builder.toString(), subKey, separator);
}
public static boolean isSubKeyOf(String parentKey, String subKey, char separator) {
if (parentKey.isEmpty())
return false;
return subKey.startsWith(parentKey)
&& subKey.substring(parentKey.length()).startsWith(String.valueOf(separator));
}
public static String getIndents(String key, char separator) {
String[] splitKey = key.split("[" + separator + "]");
StringBuilder builder = new StringBuilder();
for (int i = 1; i < splitKey.length; i++) {
builder.append(" ");
}
return builder.toString();
}
public boolean isConfigSection() {
String key = builder.toString();
return config.isConfigurationSection(key);
}
public boolean isConfigSectionWithKeys() {
String key = builder.toString();
return config.isConfigurationSection(key) && !config.getConfigurationSection(key).getKeys(false).isEmpty();
}
//Input: 'key1.key2' Result: 'key1'
public void removeLastKey() {
if (builder.length() == 0)
return;
String keyString = builder.toString();
//Must be enclosed in brackets in case a regex special character is the separator
String[] split = keyString.split("[" + separator + "]");
//Makes sure begin index isn't < 0 (error). Occurs when there is only one key in the path
int minIndex = Math.max(0, builder.length() - split[split.length - 1].length() - 1);
builder.replace(minIndex, builder.length(), "");
}
@Override
public String toString() {
return builder.toString();
}
@Override
protected KeyBuilder clone() {
return new KeyBuilder(this);
}
}

View File

@ -1,22 +1,17 @@
package hu.ditservices; package hu.ditservices;
import hu.ditservices.handlers.DITTabCompleter; import hu.ditservices.handlers.*;
import hu.ditservices.handlers.SaveHandler; import hu.ditservices.listeners.*;
import hu.ditservices.handlers.TabHandler;
import hu.ditservices.utils.*; import hu.ditservices.utils.*;
import hu.ditservices.utils.Math; import hu.ditservices.utils.Math;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import hu.ditservices.commands.DitCmd;
import hu.ditservices.listeners.ChatEvents;
import hu.ditservices.listeners.LogChat;
import hu.ditservices.listeners.LogCommand;
import hu.ditservices.listeners.LogConnect;
import com.tchristofferson.configupdater.ConfigUpdater; import com.tchristofferson.configupdater.ConfigUpdater;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@ -26,117 +21,227 @@ import com.jeff_media.updatechecker.UserAgentBuilder;
import java.io.*; import java.io.*;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.util.Collections; import java.util.*;
import java.util.Objects;
import java.util.logging.Logger; import java.util.logging.Logger;
public final class STPlugin extends JavaPlugin implements CommandExecutor, Listener { public final class STPlugin extends JavaPlugin implements CommandExecutor, Listener {
private static STPlugin instance; private static STPlugin instance;
private final Logger log = Bukkit.getLogger(); private final Logger log = Bukkit.getLogger();
public FileConfiguration config = getConfig(); private FileConfiguration config;
public long ServerStartTime; public long ServerStartTime;
private YamlConfiguration langConfig;
private ServerPasswordData serverPasswordData;
@Override @Override
public void onEnable() { public void onEnable() {
instance = this; instance = this;
if (this.initPlugin()) {
this.log.info(ChatColor.stripColor(this.getPrefix())+"Started running.");
}
}
@Override
public FileConfiguration getConfig() {
//TODO Implement defaults everywhere when config is not loaded for some reasons
if (this.config != null) {
return this.config;
}
return super.getConfig();
}
private void registerEvents() {
getServer().getPluginManager().registerEvents(this, this);
getServer().getPluginManager().registerEvents(new LogChat(this), this);
getServer().getPluginManager().registerEvents(new LogCommand(this), this);
getServer().getPluginManager().registerEvents(new LogConnect(this), this);
if (this.config.isSet("CustomAdvancement.enabled") && this.config.getBoolean("CustomAdvancement.enabled")) {
getServer().getPluginManager().registerEvents(new ChatEvents(this), this);
this.log.info(ChatColor.stripColor(this.getPrefix()) + "Custom Advancement Messages enabled!");
}
if (this.config.isSet("ServerPassword.enabled") && this.config.getBoolean("ServerPassword.enabled")) {
this.serverPasswordData = new ServerPasswordData(this);
PluginCommand sloginCommand = this.getCommand("slogin");
sloginCommand.setExecutor(new LoginCommandHandler(this));
getServer().getPluginManager().registerEvents(new ServerPasswordEvents(this), this);
this.log.info(ChatColor.stripColor(this.getPrefix()) + "Server Password enabled!");
}
}
private void scheduleTasks() {
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new TPS(), 0, 1);
if (this.config.getBoolean("ClearDropItems.enabled")) {
new ClearDropItemsTask(this).runTaskTimer(this, 20L, 20L);
this.log.info(ChatColor.stripColor(this.getPrefix()) + "Clear dropped items enabled!");
}
if (this.config.getBoolean("Saving.enabled") && this.config.getInt("Saving.interval") > 0) {
long intervalTicks = Math.convert(Math.Convert.SECONDS, Math.Convert.TICKS, instance.config.getInt("Saving.interval"));
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new SaveHandler(), 0L, intervalTicks);
}
}
private void initUpdateChecker() {
new UpdateChecker(this, UpdateCheckSource.GITHUB_RELEASE_TAG, "LabodiDavid/SimplifyTools")
.setDownloadLink("https://github.com/LabodiDavid/SimplifyTools/releases")
.setDonationLink("https://paypal.me/labodidavid")
.setChangelogLink("https://github.com/LabodiDavid/SimplifyTools/blob/main/docs/ChangeLog.md")
.setNotifyOpsOnJoin(true)
.setNotifyByPermissionOnJoin("st.admin")
.setUserAgent(new UserAgentBuilder().addPluginNameAndVersion())
.checkEveryXHours(24)
.checkNow();
}
private void initMetrics() {
Metrics metrics = new Metrics(this, 15108);
}
private boolean initPlugin() {
try { try {
this.Init(); this.ServerStartTime = ManagementFactory.getRuntimeMXBean().getStartTime();
if (Version.ServerVersion.isCurrentLower(Version.ServerVersion.v1_12_R1)) {
throw new Exception("The server version is not supported! Update to to atleast 1.12 version to use this plugin!");
}
if (Version.ServerVersion.isCurrentHigher(Version.ServerVersion.v1_21_5_R1)) {
this.log.warning(ChatColor.stripColor(this.getPrefix()) + "You are running a server version which is not tested with this plugin, errors can be occur!");
}
if (this.reload()) {
TabHandler tab = new TabHandler();
PluginCommand stCommand = this.getCommand("st");
stCommand.setExecutor(new CommandHandler(this));
stCommand.setTabCompleter(new DITTabCompleter());
registerEvents();
scheduleTasks();
initUpdateChecker();
initMetrics();
return true;
} else {
return false;
}
} catch (Exception e) { } catch (Exception e) {
this.log.warning("[SimplifyTools] - INITIALIZATION ERROR: "+e.getMessage()); this.log.warning(ChatColor.stripColor(this.getPrefix()) + "INITIALIZATION ERROR: " + e.getMessage());
this.log.warning("[SimplifyTools] - Plugin disabled!"); this.log.warning(ChatColor.stripColor(this.getPrefix()) + "Plugin disabled!");
this.setEnabled(false); this.setEnabled(false);
return; return false;
}
//this.dplug = new DitPluginManager(this);
this.log.info(this.getPrefix()+"Started running.");
}
private void Init() throws Exception {
this.ServerStartTime = ManagementFactory.getRuntimeMXBean().getStartTime();
if (Version.ServerVersion.isCurrentLower(Version.ServerVersion.v1_12_R1)){
throw new Exception("The server version is not supported! Update to a version between 1.12 - 1.19.3 to run this plugin.");
}
if (this.Reload()){
TabHandler tab = new TabHandler();
PluginCommand ditCmd = this.getCommand("st");
ditCmd.setExecutor(new DitCmd(this));
ditCmd.setTabCompleter(new DITTabCompleter());
getServer().getPluginManager().registerEvents(this, this);
getServer().getPluginManager().registerEvents(new LogChat(this), this);
getServer().getPluginManager().registerEvents(new LogCommand(this), this);
getServer().getPluginManager().registerEvents(new LogConnect(this), this);
if (this.config.isSet("CustomAdvancement.enabled") && this.config.getBoolean("CustomAdvancement.enabled")){
getServer().getPluginManager().registerEvents(new ChatEvents(this), this);
this.log.info(this.getPrefix()+"Custom Advancement Messages enabled!");
}
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new TPS(), 0, 1);
if (this.config.getBoolean("Saving.enabled") && this.config.getInt("Saving.interval")>0){
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new SaveHandler(), 0L, Math.convert(Math.Convert.SECONDS,Math.Convert.TICKS,instance.config.getInt("Saving.interval")));
}
new UpdateChecker(this, UpdateCheckSource.GITHUB_RELEASE_TAG, "LabodiDavid/SimplifyTools")
.setDownloadLink("https://github.com/LabodiDavid/SimplifyTools/releases")
.setDonationLink("https://paypal.me/labodidavid")
.setChangelogLink("https://github.com/LabodiDavid/SimplifyTools/blob/main/docs/ChangeLog.md")
.setNotifyOpsOnJoin(true)
.setNotifyByPermissionOnJoin("st.admin")
.setUserAgent(new UserAgentBuilder().addPluginNameAndVersion())
.checkEveryXHours(24)
.checkNow();
Metrics metrics = new Metrics(this, 15108);
} }
} }
/**
* Gets the plugin's prefix.
*
* @return String
*/
public String getPrefix(){ public String getPrefix(){
if (this.config.isSet("Prefix") && !Objects.requireNonNull(this.config.getString("Prefix")).isEmpty()){ if (this.config.isSet("Prefix") && !Objects.requireNonNull(this.config.getString("Prefix")).isEmpty()) {
return ChatColor.translateAlternateColorCodes('&', this.config.getString("Prefix")); return ChatColor.translateAlternateColorCodes('&', this.config.getString("Prefix"));
}else{ }else{
return ChatColor.translateAlternateColorCodes('&',"&a[&fSimplify&7Tools&2] &4- &f"); return ChatColor.translateAlternateColorCodes('&',"&a[&fSimplify&7Tools&2] &4- &f");
} }
} }
/**
* Returns the main plugin instance.
*
* @return STPlugin
*/
public static STPlugin getInstance(){ public static STPlugin getInstance(){
return instance; return instance;
} }
public static String getUptime(){ /**
int uptime = (int)(System.currentTimeMillis() - instance.ServerStartTime)/1000; * Gets the server's uptime in a human readable format.
String returnText = ""; *
* @return String
*/
public static String getUptime() {
long uptime = (System.currentTimeMillis() - instance.ServerStartTime) / 1000;
StringBuilder returnText = new StringBuilder();
// Get remaining seconds from total minutes. int days = (int) (uptime / 86400);
int seconds = uptime % 60; int hours = (int) ((uptime % 86400) / 3600);
// Convert to minutes, get remaining minutes from total hours. int minutes = (int) ((uptime % 3600) / 60);
int minutes = (uptime / 60) % 60; int seconds = (int) (uptime % 60);
// Convert to hours, get remaining hours from total days.
int hours = (uptime / 3600) % 24;
// Convert to days.
int days = uptime / 86400;
if (days>1){ if (days > 1) {
returnText = returnText+ days+" days "; returnText.append(days).append(" days ");
} }
if (hours>1){ if (hours > 1) {
returnText = returnText+ hours+ " hours "; returnText.append(hours).append(" hours ");
} }
if (minutes>1){ if (minutes > 1) {
returnText = returnText+ minutes+ " min "; returnText.append(minutes).append(" min ");
} }
if (seconds>1){ if (seconds > 1) {
returnText = returnText+ seconds+ "s "; returnText.append(seconds).append("s ");
} }
return returnText; return returnText.toString();
} }
public boolean Reload(){ public ServerPasswordData getServerPasswordData() {
return this.serverPasswordData;
}
private void copyDefaultLang(String filename, File langFolder) {
File outFile = new File(langFolder, filename);
if (!outFile.exists()) {
try (InputStream in = getResource(filename);
OutputStream out = new FileOutputStream(outFile)) {
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
} catch (IOException e) {
this.log.warning(ChatColor.stripColor(this.getPrefix()) + e.getMessage());
}
}
}
private void initLocalization() throws IOException {
File langFolder = new File(getDataFolder(), "lang");
if (!langFolder.exists()) {
langFolder.mkdirs();
}
String[] languages = {"en", "hu"};
for (String l : languages) {
File langFile = new File(langFolder, l + ".yml");
if (!langFile.exists()) {
copyDefaultLang(l + ".yml", langFolder);
}
ConfigUpdater.update(this, l + ".yml", langFile, Collections.emptyList());
}
String lang = this.config.getString("language", "en");
File langFile = new File(getDataFolder(), "lang" + File.separator + lang + ".yml");
if (!langFile.exists()) {
getLogger().warning("Language file for '" + lang + "' not found. Falling back to English.");
langFile = new File(getDataFolder(), "lang" + File.separator + "en.yml");
}
this.langConfig = YamlConfiguration.loadConfiguration(langFile);
}
public String getTranslatedText(String key) {
return langConfig.getString(key, "Translation not found: " + key);
}
public boolean reload(){
File configFile = new File(getDataFolder(), "config.yml"); File configFile = new File(getDataFolder(), "config.yml");
try { try {
@ -145,15 +250,21 @@ public final class STPlugin extends JavaPlugin implements CommandExecutor, Liste
} }
ConfigUpdater.update(this, "config.yml", configFile, Collections.emptyList()); ConfigUpdater.update(this, "config.yml", configFile, Collections.emptyList());
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); this.log.warning(ChatColor.stripColor(this.getPrefix()) + e.getMessage());
} }
reloadConfig(); reloadConfig();
this.config = getConfig(); this.config = getConfig();
try {
this.initLocalization();
} catch (IOException e) {
this.log.warning(ChatColor.stripColor(this.getPrefix()) + e.getMessage());
}
return true; return true;
} }
@Override @Override
public void onDisable() { public void onDisable() {
System.out.println(this.getPrefix()+" stopped."); this.log.info(ChatColor.stripColor(this.getPrefix()) + "Stopped running.");
} }
} }

View File

@ -1,123 +0,0 @@
package hu.ditservices.commands;
import hu.ditservices.utils.TPS;
import hu.ditservices.STPlugin;
import hu.ditservices.utils.Cooldown;
import hu.ditservices.utils.Version;
import org.bukkit.ChatColor;
import org.bukkit.command.*;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
public class DitCmd implements CommandExecutor {
private final String noArgMsg;
private final STPlugin plugin;
private final Cooldown cd;
private final FileConfiguration config;
public DitCmd(final STPlugin instance){
this.plugin = instance;
this.noArgMsg = plugin.getPrefix()+ ChatColor.DARK_RED + "To list all SimplifyTools commands use the '/help SIMPLIFYTOOLS' command!";
this.cd = new Cooldown(plugin);
this.config = plugin.config;
}
public boolean addToCoolDown(CommandSender sender){
if (sender instanceof Player){
Player p = (Player) sender;
this.cd.Add(p);
return true;
}
return false;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (command.getName().equals("st")){
if (cd.Check(sender)){
if (command.getName().equals("st") && args.length==0)
{
this.addToCoolDown(sender);
sender.sendMessage(plugin.getPrefix()+ChatColor.GREEN+"Version: "+plugin.getDescription().getVersion());
sender.sendMessage(this.noArgMsg);
return true;
}
if (command.getName().equals("st") && args[0].contains("help"))
{
sender.sendMessage(plugin.getPrefix()+ChatColor.GREEN+"Version: "+plugin.getDescription().getVersion());
sender.sendMessage(this.noArgMsg);
return true;
}
if (command.getName().equals("st") && args[0].contains("settings"))
{
this.addToCoolDown(sender);
sender.sendMessage(plugin.getPrefix()+ ChatColor.GREEN+" === Plugin Information === ");
sender.sendMessage(plugin.getPrefix()+ChatColor.GREEN+"Plugin Version: "+plugin.getDescription().getVersion());
sender.sendMessage(plugin.getPrefix()+ChatColor.GREEN+"Server Version: "+ Version.ServerVersion.getCurrent().toString());
sender.sendMessage(ChatColor.GREEN+" -------- Features -------- ");
sender.sendMessage(plugin.getPrefix()+ChatColor.GREEN+"Tab customization: "+(config.getBoolean("Tab.enabled") ? ChatColor.GREEN+"Enabled" : ChatColor.RED+"Disabled"));
sender.sendMessage(plugin.getPrefix()+ChatColor.GREEN+"Custom Advancement Msg: "+(config.getBoolean("CustomAdvancement.enabled") ? ChatColor.GREEN+"Enabled" : ChatColor.RED+"Disabled"));
sender.sendMessage(ChatColor.GREEN+" ========================== ");
return true;
}
if (command.getName().equals("st") && args[0].contains("reload") && sender.hasPermission("st.reload")){
if(plugin.Reload()){
this.addToCoolDown(sender);
sender.sendMessage(plugin.getPrefix()+ChatColor.GREEN+"Successfully reload!");
sender.sendMessage(plugin.getPrefix()+ChatColor.RED+"Notice: Restart your server if the settings didn't applied.");
return true;
}
}
if (command.getName().equals("st") && args[0].contains("tps") && sender.hasPermission("st.tps")){
this.addToCoolDown(sender);
sender.sendMessage(plugin.getPrefix()+ChatColor.GREEN+"Plugin Calculated TPS: "+TPS.getColor()+String.format("%.2f", TPS.getTPS()));
return true;
}
if (command.getName().equalsIgnoreCase("st") && args[0].contains("pmanager")){
if (sender.hasPermission("st.pmanager.unload") || sender.hasPermission("st.pmanager.load") || sender.hasPermission("st.pmanager")) {
this.addToCoolDown(sender);
if (args.length==1){
sender.sendMessage(plugin.getPrefix()+ChatColor.DARK_RED+"Invalid arguments!");
return true;
}
if (args[1].equalsIgnoreCase("load")) {
//PluginCmd.handleLoad(sender,args);
PluginCmd.LoadPlugin(sender,args);
}
if (args[1].equalsIgnoreCase("unload")) {
//PluginCmd.handleUnload(sender,args);
PluginCmd.UnloadPlugin(sender, args);
}
}
}
if (command.getName().equalsIgnoreCase("st") && args[0].contains("save-all") && sender.hasPermission("st.save")){
this.addToCoolDown(sender);
return SaveCmd.Run(sender);
}
if (command.getName().equalsIgnoreCase("st") && args[0].contains("ping") && sender.hasPermission("st.ping")){
this.addToCoolDown(sender);
return PingCmd.Run(sender);
}
if (command.getName().equalsIgnoreCase("st") && args[0].contains("stats") && sender.hasPermission("st.stats")){
this.addToCoolDown(sender);
return StatCmd.Run(sender);
}
}else{
cd.CDText(sender);
}
}
return true;
}
}

View File

@ -6,13 +6,13 @@ import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public class PingCmd { public class PingCommand {
public static boolean Run(CommandSender sender) { public static boolean Run(CommandSender sender) {
STPlugin plugin = STPlugin.getInstance(); STPlugin plugin = STPlugin.getInstance();
if (sender instanceof Player) { if (sender instanceof Player) {
Player player = (Player) sender; Player player = (Player) sender;
try { try {
player.sendMessage(plugin.getPrefix() + "Your response time to the server: " + Server.getPlayerPing(player) + " ms"); player.sendMessage(plugin.getPrefix() + plugin.getTranslatedText("cmd.ping") + Server.getPlayerPing(player) + " ms");
return true; return true;
} catch (IllegalArgumentException | SecurityException e) { } catch (IllegalArgumentException | SecurityException e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -7,34 +7,34 @@ import hu.ditservices.STPlugin;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
public class PluginCmd { public class PluginManagerCommand {
public static boolean LoadPlugin(CommandSender sender, String[] args){ public static boolean LoadPlugin(CommandSender sender, String[] args){
Plugin plugin = Bukkit.getPluginManager().getPlugin(args[2]); Plugin plugin = Bukkit.getPluginManager().getPlugin(args[2]);
if (plugin == null) { if (plugin == null) {
sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin not exist!"); sender.sendMessage(STPlugin.getInstance().getPrefix()+ STPlugin.getInstance().getTranslatedText("pmanager.not.exist"));
return false; return false;
} }
if (plugin.isEnabled()){ if (plugin.isEnabled()){
sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin "+plugin.getName()+" already enabled!"); sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin "+plugin.getName()+STPlugin.getInstance().getTranslatedText("pmanager.already.enabled"));
return true; return true;
} }
Bukkit.getPluginManager().enablePlugin(plugin); Bukkit.getPluginManager().enablePlugin(plugin);
sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin "+plugin.getName()+" successfully enabled!"); sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin "+plugin.getName()+STPlugin.getInstance().getTranslatedText("pmanager.success.enabled"));
return true; return true;
} }
public static boolean UnloadPlugin(CommandSender sender, String[] args){ public static boolean UnloadPlugin(CommandSender sender, String[] args){
Plugin plugin = Bukkit.getPluginManager().getPlugin(args[2]); Plugin plugin = Bukkit.getPluginManager().getPlugin(args[2]);
if (plugin == null) { if (plugin == null) {
sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin not exist!"); sender.sendMessage(STPlugin.getInstance().getPrefix()+STPlugin.getInstance().getTranslatedText("pmanager.not.exist"));
return false; return false;
} }
if (!plugin.isEnabled()){ if (!plugin.isEnabled()){
sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin "+plugin.getName()+" already disabled!"); sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin "+plugin.getName()+STPlugin.getInstance().getTranslatedText("pmanager.already.disabled"));
return true; return true;
} }
Bukkit.getPluginManager().disablePlugin(plugin); Bukkit.getPluginManager().disablePlugin(plugin);
sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin "+plugin.getName()+" successfully disabled!"); sender.sendMessage(STPlugin.getInstance().getPrefix()+"Plugin "+plugin.getName()+STPlugin.getInstance().getTranslatedText("pmanager.success.disabled"));
return true; return true;
} }

View File

@ -1,21 +0,0 @@
package hu.ditservices.commands;
import hu.ditservices.STPlugin;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
public class SaveCmd {
public static boolean Run(CommandSender sender){
STPlugin plugin = STPlugin.getInstance();
String p = plugin.config.getString("Saving.broadcastMsgProgress").replace("{PREFIX}",plugin.getPrefix());
String d = plugin.config.getString("Saving.broadcastMsgDone").replace("{PREFIX}",plugin.getPrefix());
Bukkit.broadcast(p,"st.st");
for(World w : Bukkit.getServer().getWorlds()){
w.save();
}
Bukkit.savePlayers();
Bukkit.broadcast(d,"st.st");
return true;
}
}

View File

@ -0,0 +1,38 @@
package hu.ditservices.commands;
import hu.ditservices.STPlugin;
import org.bukkit.Bukkit;
import org.bukkit.World;
public class SaveCommand {
/**
* Saves all worlds and players data on the main thread.
*
* @return boolean
*/
public static boolean Run() {
STPlugin plugin = STPlugin.getInstance();
String prefix = plugin.getPrefix();
String progressMsg = plugin.getConfig().getString("Saving.broadcastMsgProgress").replace("{PREFIX}", prefix);
String doneMsg = plugin.getConfig().getString("Saving.broadcastMsgDone").replace("{PREFIX}", prefix);
// Notify players of save progress
Bukkit.broadcast(progressMsg, "st.st");
// Schedule task to run on the main thread
Bukkit.getScheduler().runTask(plugin, () -> {
// Save all worlds
for (World world : Bukkit.getServer().getWorlds()) {
world.save(); // Runs on main thread
}
// Save player data
Bukkit.savePlayers(); // Also runs on main thread
// Notify players of save completion
Bukkit.broadcast(doneMsg, "st.st");
});
return true;
}
}

View File

@ -0,0 +1,28 @@
package hu.ditservices.commands;
import hu.ditservices.STPlugin;
import hu.ditservices.utils.Version;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
public class SettingsCommand {
public static boolean Run(CommandSender sender) {
STPlugin plugin = STPlugin.getInstance();
String enabled = plugin.getTranslatedText("settings.enabled");
String disabled = plugin.getTranslatedText("settings.disabled");
sender.sendMessage( ChatColor.GREEN+" === Plugin Information === " + "\n"
+ ChatColor.GREEN + "Plugin " + plugin.getTranslatedText("version.pre.text") + ChatColor.translateAlternateColorCodes('&',"&a[&fSimplify&7Tools&2] &4- &f") + plugin.getDescription().getVersion() + "\n"
+ ChatColor.GREEN + plugin.getTranslatedText("settings.server") + plugin.getTranslatedText("version.pre.text") + Version.ServerVersion.getCurrent().toString() + "\n"
+ ChatColor.GREEN + " -------- " + plugin.getTranslatedText("settings.features") +" -------- " + "\n"
+ ChatColor.GREEN + plugin.getTranslatedText("settings.feature.tab") + (plugin.getConfig().getBoolean("Tab.enabled") ? ChatColor.GREEN + enabled : ChatColor.RED + disabled) + "\n"
+ ChatColor.GREEN + plugin.getTranslatedText("settings.feature.CustomAdvancementMsg") + (plugin.getConfig().getBoolean("CustomAdvancement.enabled") ? ChatColor.GREEN + enabled : ChatColor.RED + disabled) + "\n"
+ ChatColor.GREEN + plugin.getTranslatedText("settings.feature.AutoSave") + (plugin.getConfig().getBoolean("Saving.enabled") ? ChatColor.GREEN + enabled : ChatColor.RED + disabled) + "\n"
+ ChatColor.GREEN + plugin.getTranslatedText("settings.feature.pmanager") + (plugin.getConfig().getBoolean("PluginManager.enabled") ? ChatColor.GREEN + enabled : ChatColor.RED + disabled) + "\n"
+ ChatColor.GREEN + " ========================== "
);
return true;
}
}

View File

@ -1,23 +0,0 @@
package hu.ditservices.commands;
import hu.ditservices.STPlugin;
import org.bukkit.ChatColor;
import org.bukkit.Statistic;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class StatCmd {
public static boolean Run(CommandSender sender){
Player player = (Player) sender;
player.sendMessage(STPlugin.getInstance().getPrefix()+ ChatColor.GREEN+" === Your statistics === ");
player.sendMessage(ChatColor.AQUA+"Connects: "+(player.getStatistic(Statistic.LEAVE_GAME)+1));
player.sendMessage(ChatColor.AQUA+"Deaths: "+player.getStatistic(Statistic.DEATHS));
player.sendMessage(ChatColor.AQUA+"Mob kills: "+player.getStatistic(Statistic.MOB_KILLS));
player.sendMessage(ChatColor.AQUA+"Player kills: "+player.getStatistic(Statistic.PLAYER_KILLS));
player.sendMessage(ChatColor.AQUA+"Sleep count: "+player.getStatistic(Statistic.SLEEP_IN_BED));
player.sendMessage(ChatColor.AQUA+"Enchant count: "+player.getStatistic(Statistic.ITEM_ENCHANTED));
player.sendMessage(ChatColor.GREEN+" =================== ");
return true;
}
}

View File

@ -0,0 +1,33 @@
package hu.ditservices.commands;
import hu.ditservices.STPlugin;
import org.bukkit.ChatColor;
import org.bukkit.Statistic;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class StatCommand {
public static boolean Run(CommandSender sender){
Player player = (Player) sender;
// Calculate total play time from ticks (Minecraft runs at 20 ticks per second)
long totalTicks = player.getStatistic(Statistic.TOTAL_WORLD_TIME);
long totalSeconds = totalTicks / 20;
long hours = totalSeconds / 3600;
long minutes = (totalSeconds % 3600) / 60;
long seconds = totalSeconds % 60;
STPlugin plugin = STPlugin.getInstance();
plugin.getTranslatedText("");
player.sendMessage(STPlugin.getInstance().getPrefix() + ChatColor.GREEN + " === "+plugin.getTranslatedText("stats.header")+" === ");
player.sendMessage(ChatColor.AQUA+plugin.getTranslatedText("stats.connects") + (player.getStatistic(Statistic.LEAVE_GAME)+1));
player.sendMessage(ChatColor.AQUA+plugin.getTranslatedText("stats.deaths") + player.getStatistic(Statistic.DEATHS));
player.sendMessage(ChatColor.AQUA+plugin.getTranslatedText("stats.MobKills") + player.getStatistic(Statistic.MOB_KILLS));
player.sendMessage(ChatColor.AQUA+plugin.getTranslatedText("stats.PlayerKills") + player.getStatistic(Statistic.PLAYER_KILLS));
player.sendMessage(ChatColor.AQUA+plugin.getTranslatedText("stats.sleeps") + player.getStatistic(Statistic.SLEEP_IN_BED));
player.sendMessage(ChatColor.AQUA+plugin.getTranslatedText("stats.enchants") + player.getStatistic(Statistic.ITEM_ENCHANTED));
player.sendMessage(ChatColor.AQUA + plugin.getTranslatedText("stats.totaltime") + hours + plugin.getTranslatedText("stats.hour") + minutes + plugin.getTranslatedText("stats.minutes") + seconds + plugin.getTranslatedText("stats.seconds"));
player.sendMessage(ChatColor.GREEN+" =================== ");
return true;
}
}

View File

@ -0,0 +1,76 @@
package hu.ditservices.handlers;
import hu.ditservices.STPlugin;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.List;
public class ClearDropItemsTask extends BukkitRunnable {
private final STPlugin plugin;
private int countdown;
private final int interval; // In seconds
private final List<String> exceptItemList;
private final List<String> exceptWorldList;
private final boolean shouldBroadcast;
public ClearDropItemsTask(STPlugin plugin) {
this.plugin = plugin;
this.interval = plugin.getConfig().getInt("ClearDropItems.interval", 300);
this.countdown = this.interval;
// Get the exception list from the config (should be a list of item type names, e.g., ["DIAMOND", "GOLD_INGOT"])
this.exceptItemList = plugin.getConfig().getStringList("ClearDropItems.except");
this.exceptWorldList = plugin.getConfig().getStringList("ClearDropItems.skipWorlds");
this.shouldBroadcast = plugin.getConfig().getBoolean("ClearDropItems.broadcastMsg", true);
}
@Override
public void run() {
if (this.shouldBroadcast) {
if (countdown == 60) {
Bukkit.broadcastMessage(plugin.getPrefix() + ChatColor.RED + plugin.getTranslatedText("cleardropitems.oneMin"));
}
if (countdown == 10) {
Bukkit.broadcastMessage(plugin.getPrefix() + ChatColor.RED + plugin.getTranslatedText("cleardropitems.tenSec"));
}
}
if (countdown <= 0) {
int removed = 0;
for (World world : Bukkit.getWorlds()) {
if (this.exceptWorldList.contains(world.getName())) {
continue;
}
for (Entity entity : world.getEntities()) {
if (entity instanceof Item) {
Item item = (Item) entity;
String itemType = item.getItemStack().getType().toString();
// Check if the item is in the exception list
boolean isException = this.exceptItemList.stream()
.anyMatch(ex -> ex.equalsIgnoreCase(itemType));
if (!isException) {
item.remove();
removed++;
}
}
}
}
if (this.shouldBroadcast) {
Bukkit.broadcastMessage(plugin.getPrefix() + ChatColor.GREEN + plugin.getTranslatedText("cleardropitems.cleared").replace("%REMOVECOUNT%",String.valueOf(removed)));
}
// Reset the countdown to the interval for the next cycle
countdown = interval;
} else {
countdown--;
}
}
}

View File

@ -0,0 +1,113 @@
package hu.ditservices.handlers;
import hu.ditservices.commands.*;
import hu.ditservices.utils.TPS;
import hu.ditservices.STPlugin;
import hu.ditservices.utils.Cooldown;
import hu.ditservices.utils.Version;
import org.bukkit.ChatColor;
import org.bukkit.command.*;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
public class CommandHandler implements CommandExecutor {
private final String noArgMsg;
private final STPlugin plugin;
private final Cooldown cd;
private final FileConfiguration config;
public CommandHandler(final STPlugin instance) {
this.plugin = instance;
this.noArgMsg = plugin.getPrefix() + ChatColor.DARK_RED + plugin.getTranslatedText("list.help");
this.cd = new Cooldown(plugin);
this.config = plugin.getConfig();
}
public boolean addToCoolDown(CommandSender sender) {
if (sender instanceof Player) {
Player p = (Player) sender;
this.cd.Add(p);
return true;
}
return false;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (command.getName().equals("st")){
if (cd.Check(sender)){
if (command.getName().equals("st")) {
this.addToCoolDown(sender);
}
if (command.getName().equals("st") && (args.length == 0 || args[0].contains("help")))
{
sender.sendMessage(plugin.getPrefix() + ChatColor.GREEN+plugin.getTranslatedText("version.pre.text") + plugin.getDescription().getVersion());
sender.sendMessage(this.noArgMsg);
return true;
}
if (command.getName().equals("st") && args[0].contains("settings"))
{
return SettingsCommand.Run(sender);
}
if (command.getName().equals("st") && args[0].contains("reload") && sender.hasPermission("st.reload")){
if(plugin.reload()){
sender.sendMessage(plugin.getPrefix()+ChatColor.GREEN+"Successfully reload!" + "\n"
+ plugin.getPrefix() + ChatColor.RED + plugin.getTranslatedText("notice.settings.not.applied"));
return true;
}
}
if (command.getName().equals("st") && args[0].contains("tps") && sender.hasPermission("st.tps")) {
sender.sendMessage(plugin.getPrefix() + ChatColor.GREEN+plugin.getTranslatedText("plugin.calculated.tps")+TPS.getColor()+String.format("%.2f", TPS.getTPS()));
return true;
}
if (command.getName().equalsIgnoreCase("st") && args[0].contains("pmanager")) {
if (sender.hasPermission("st.pmanager.unload") || sender.hasPermission("st.pmanager.load") || sender.hasPermission("st.pmanager")) {
if (args.length==1){
sender.sendMessage(plugin.getPrefix() + ChatColor.DARK_RED+plugin.getTranslatedText("invalid.arguments"));
return true;
}
if (config.getBoolean("PluginManager.enabled")) {
if (args[1].equalsIgnoreCase("load")) {
//PluginCmd.handleLoad(sender,args);
PluginManagerCommand.LoadPlugin(sender,args);
}
if (args[1].equalsIgnoreCase("unload")) {
//PluginCmd.handleUnload(sender,args);
PluginManagerCommand.UnloadPlugin(sender, args);
}
} else {
sender.sendMessage(plugin.getPrefix() + ChatColor.DARK_RED + plugin.getTranslatedText("pmanager.disabled"));
return true;
}
}
}
if (command.getName().equalsIgnoreCase("st") && args[0].contains("save-all") && sender.hasPermission("st.save")) {
return SaveCommand.Run();
}
if (command.getName().equalsIgnoreCase("st") && args[0].contains("ping") && sender.hasPermission("st.ping")) {
return PingCommand.Run(sender);
}
if (command.getName().equalsIgnoreCase("st") && args[0].contains("stats") && sender.hasPermission("st.stats")) {
return StatCommand.Run(sender);
}
}else{
cd.CDText(sender);
}
}
return true;
}
}

View File

@ -1,5 +1,6 @@
package hu.ditservices.handlers; package hu.ditservices.handlers;
import hu.ditservices.STPlugin;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.*; import org.bukkit.command.*;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
@ -44,40 +45,44 @@ public class DITTabCompleter implements TabCompleter {
return result; return result;
} }
if (args.length >= 2) { if (args.length >= 2) {
for (String a : arguments) { for (String a : arguments) {
vizsg_2 = false; vizsg_2 = false;
if (a.contains(" ")){ if (a.contains(" ")){
vizsg_list = Arrays.asList(a.split(" ")); vizsg_list = Arrays.asList(a.split(" "));
vizsg_2 = true; vizsg_2 = true;
} }
if (vizsg_2 && args.length ==2){ // length-1 if (vizsg_2 && args.length ==2){ // length-1
idea.add(vizsg_list.get(1)); idea.add(vizsg_list.get(1));
} }
if (vizsg_2&& args[1].startsWith(vizsg_list.get(1))) { if (vizsg_2&& args[1].startsWith(vizsg_list.get(1))) {
idea.add(vizsg_list.get(1)); idea.add(vizsg_list.get(1));
} }
} }
if (args[0].equalsIgnoreCase("pmanager")&& args[1].equalsIgnoreCase("unload") || args[1].equalsIgnoreCase("load")) { if (args[0].equalsIgnoreCase("pmanager") && args[1].equalsIgnoreCase("unload") || args[1].equalsIgnoreCase("load")) {
if (args.length == 3) { if ((args.length == 3) && STPlugin.getInstance().getConfig().getBoolean("PluginManager.enabled") &
result.clear(); (commandSender.hasPermission("st.pmanager")
PluginManager pm = Bukkit.getServer().getPluginManager(); || commandSender.hasPermission("st.pmanager.load")
for (Plugin pl : pm.getPlugins()) { || commandSender.hasPermission("st.pmanager.unload"))
if (pl.getName().toLowerCase().startsWith(args[2].toLowerCase()) && args[1].equalsIgnoreCase("unload")) { ) {
result.clear();
PluginManager pm = Bukkit.getServer().getPluginManager();
for (Plugin pl : pm.getPlugins()) {
if (pl.getName().toLowerCase().startsWith(args[2].toLowerCase()) && args[1].equalsIgnoreCase("unload")) {
result.add(pl.getName());
}
if (!pl.isEnabled()){
if (pl.getName().toLowerCase().startsWith(args[2].toLowerCase()) && args[1].equalsIgnoreCase("load")) {
result.add(pl.getName()); result.add(pl.getName());
} }
if (!pl.isEnabled()){
if (pl.getName().toLowerCase().startsWith(args[2].toLowerCase()) && args[1].equalsIgnoreCase("load")) {
result.add(pl.getName());
}
}
} }
return result;
} }
return result;
} }
return idea; }
return idea;
} }
} }
return null; return null;
} }
} }

View File

@ -1,185 +0,0 @@
package hu.ditservices.handlers;
/*
import hu.ditservices.DITSystem;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.PluginCommand;
import org.bukkit.command.SimpleCommandMap;
import org.bukkit.event.Event;
import org.bukkit.plugin.*;
import java.io.File;
import java.lang.reflect.Field;
import java.util.*;
public class DitPluginManager {
private static DITSystem plugin;
public DitPluginManager(DITSystem instance){
plugin = instance;
}
public static int load(final String pluginName) {
PluginManager pm = Bukkit.getServer().getPluginManager();
boolean there = false;
for (Plugin pl : pm.getPlugins()){
if (pl.getName().toLowerCase().startsWith(pluginName)){
there = true;
}
}
if (there)
{ return 1;} //plugin already exists
else {
String name = "";
String path = plugin.getDataFolder().getParent();
File folder = new File(path);
ArrayList<File> files = new ArrayList<File>();
File[] listOfFiles = folder.listFiles();
for (File compare : listOfFiles) {
if (compare.isFile()) {
try {
name = plugin.getPluginLoader().getPluginDescription(compare).getName();
} catch (InvalidDescriptionException e) {
plugin.getLogger().warning("[Loading Plugin] " + compare.getName() + " didn't match");
}
if (name.toLowerCase().startsWith(pluginName.toLowerCase())) {
files.add(compare);
try {
Bukkit.getServer().getPluginManager().loadPlugin(compare);
} catch (UnknownDependencyException e) {
return 2; //missing dependent plugin
} catch (InvalidPluginException e) {
return -1; //not a plugin
} catch (InvalidDescriptionException e) {
return 3; //invalid description
}
}
}
}
Plugin[] plugins = pm.getPlugins();
for (Plugin pl : plugins) {
for (File compare : files) {
try {
if (pl.getName().equalsIgnoreCase(plugin.getPluginLoader().getPluginDescription(compare).getName()))
if (!pl.isEnabled()){
pm.enablePlugin(pl);
}else { return 5; }
} catch (InvalidDescriptionException e) {
e.printStackTrace();
}
}
}
}
return 0; //success
}
@SuppressWarnings("unchecked")
public static int unload(String pluginName) {
pluginName = pluginName.toLowerCase().trim();
PluginManager manager = Bukkit.getServer().getPluginManager();
SimplePluginManager spm = (SimplePluginManager) manager;
SimpleCommandMap commandMap = null;
List<Plugin> plugins = null;
Map<String, Plugin> lookupNames = null;
Map<String, Command> knownCommands = null;
Map<Event, SortedSet<RegisteredListener>> listeners = null;
boolean reloadlisteners = true;
try {
if (spm != null) {
Field pluginsField = spm.getClass().getDeclaredField("plugins");
pluginsField.setAccessible(true);
plugins = (List<Plugin>) pluginsField.get(spm);
Field lookupNamesField = spm.getClass().getDeclaredField("lookupNames");
lookupNamesField.setAccessible(true);
lookupNames = (Map<String, Plugin>) lookupNamesField.get(spm);
try {
Field listenersField = spm.getClass().getDeclaredField("listeners");
listenersField.setAccessible(true);
listeners = (Map<Event, SortedSet<RegisteredListener>>) listenersField.get(spm);
} catch (Exception e) {
reloadlisteners = false;
}
Field commandMapField = spm.getClass().getDeclaredField("commandMap");
commandMapField.setAccessible(true);
commandMap = (SimpleCommandMap) commandMapField.get(spm);
Field knownCommandsField = commandMap.getClass().getDeclaredField("knownCommands");
knownCommandsField.setAccessible(true);
knownCommands = (Map<String, Command>) knownCommandsField.get(commandMap);
}
} catch (Exception e) {
e.printStackTrace();
}
boolean in = false;
for (Plugin pl : Bukkit.getServer().getPluginManager().getPlugins()) {
if (in)
break;
if (pl.getName().toLowerCase().startsWith(pluginName.toLowerCase())) {
if (pl.isEnabled()) {
manager.disablePlugin(pl);
if (plugins != null && plugins.contains(pl))
plugins.remove(pl);
if (lookupNames != null && lookupNames.containsKey(pl.getName())) {
lookupNames.remove(pl.getName());
}
if (listeners != null && reloadlisteners) {
for (SortedSet<RegisteredListener> set : listeners.values()) {
for (Iterator<RegisteredListener> it = set.iterator(); it.hasNext(); ) {
RegisteredListener value = it.next();
if (value.getPlugin() == pl) {
it.remove();
}
}
}
}
if (commandMap != null) {
for (Iterator<Map.Entry<String, Command>> it = knownCommands.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, Command> entry = it.next();
if (entry.getValue() instanceof PluginCommand) {
PluginCommand c = (PluginCommand) entry.getValue();
if (c.getPlugin() == pl) {
c.unregister(commandMap);
it.remove();
}
}
}
}
for (Plugin plu : Bukkit.getServer().getPluginManager().getPlugins()) {
if (plu.getDescription().getDepend() != null) {
for (String depend : plu.getDescription().getDepend()) {
if (depend.equalsIgnoreCase(pl.getName())) {
plugin.getLogger().info("[Unloading Plugin] " + plu.getName() + " must be disabled!");
unload(plu.getName());
return 1; //dependencies also disabled
}
}
}
}
in = true;
} else { return 5; }
}
}
if (!in) {
plugin.getLogger().info("Not an existing plugin");
return -1; //non-existent
}
System.gc();
return 0; //success
}
}
*/

View File

@ -0,0 +1,63 @@
package hu.ditservices.handlers;
import hu.ditservices.STPlugin;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.UUID;
public class LoginCommandHandler implements CommandExecutor {
private final STPlugin plugin;
public LoginCommandHandler(STPlugin instance) {
this.plugin = instance;
}
// Method to authenticate the player
public boolean authenticate(Player player, String password) {
if (plugin.getServerPasswordData().getServerPassword().equals(password)) {
if (plugin.getConfig().getBoolean("ServerPassword.preventInventory")) {
player.getInventory().setContents(plugin.getServerPasswordData().getInventoryMap().get(player.getUniqueId()));
player.getInventory().setArmorContents(plugin.getServerPasswordData().getArmorMap().get(player.getUniqueId()));
}
plugin.getServerPasswordData().getAuthenticatedPlayers().put(player.getUniqueId(), true);
return true;
}
return false;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players can execute this command.");
return true;
}
Player player = (Player) sender;
UUID pUuid = player.getUniqueId();
if (args.length != 1) {
player.sendMessage(plugin.getTranslatedText("cmd.usage.login"));
return true;
}
if (plugin.getServerPasswordData().getAuthenticatedPlayers().getOrDefault(pUuid,false)) {
player.sendMessage(ChatColor.GREEN + plugin.getTranslatedText("serverpassword.already.auth"));
return true;
}
if (this.authenticate(player, args[0])) {
player.sendMessage(ChatColor.GREEN + plugin.getTranslatedText("serverpassword.success.auth"));
plugin.getServerPasswordData().getInventoryMap().remove(pUuid);
plugin.getServerPasswordData().getArmorMap().remove(pUuid);
} else {
player.sendMessage(ChatColor.RED + plugin.getTranslatedText("serverpassword.incorrect"));
}
return true;
}
}

View File

@ -1,33 +1,10 @@
package hu.ditservices.handlers; package hu.ditservices.handlers;
import hu.ditservices.STPlugin; import hu.ditservices.commands.SaveCommand;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
public class SaveHandler implements Runnable{ public class SaveHandler implements Runnable{
STPlugin plugin = STPlugin.getInstance();
@Override @Override
public void run() { public void run() {
SaveCommand.Run();
String p = plugin.config.isSet("Saving.broadcastMsgProgress") ? plugin.config.getString("Saving.broadcastMsgProgress").replace("{PREFIX}",plugin.getPrefix()) : plugin.getPrefix()+"Auto save in progress..";
String d = plugin.config.isSet("Saving.broadcastMsgDone") ? plugin.config.getString("Saving.broadcastMsgDone").replace("{PREFIX}",plugin.getPrefix()) : plugin.getPrefix()+"Auto save done.";
if (Bukkit.getOnlinePlayers().size()>0){
for (Player player : Bukkit.getOnlinePlayers()){
player.sendMessage(p);
}
}
plugin.getLogger().info(p);
for(World w : Bukkit.getServer().getWorlds()){
w.save();
}
Bukkit.savePlayers();
if (Bukkit.getOnlinePlayers().size()>0){
for (Player player : Bukkit.getOnlinePlayers()){
player.sendMessage(d);
}
}
plugin.getLogger().info(d);
} }
} }

View File

@ -1,10 +1,13 @@
package hu.ditservices.handlers; package hu.ditservices.handlers;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import hu.ditservices.STPlugin; import hu.ditservices.STPlugin;
import hu.ditservices.utils.*;
import hu.ditservices.utils.Math; import hu.ditservices.utils.Math;
import hu.ditservices.utils.reflection.ClazzContainer; import hu.ditservices.utils.Server;
import hu.ditservices.utils.reflection.Reflection; import hu.ditservices.utils.TPS;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -13,8 +16,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class TabHandler { public class TabHandler {
public final List<String> headers = new ArrayList<>(); public final List<WrappedChatComponent> headerComponents = new ArrayList<>();
public final List<String> footers = new ArrayList<>(); public final List<WrappedChatComponent> footerComponents = new ArrayList<>();
private Integer refreshRate; private Integer refreshRate;
@ -30,27 +33,21 @@ public class TabHandler {
private int count2 = 0; //footers private int count2 = 0; //footers
private Object packet; private Object packet;
public TabHandler() throws Exception { public TabHandler() {
this.plugin = STPlugin.getInstance(); this.plugin = STPlugin.getInstance();
if(this.init()){ if(this.init()){
if (headers.isEmpty() && footers.isEmpty()){ if (headerComponents.isEmpty() && footerComponents.isEmpty()){
plugin.getLogger().warning(plugin.getPrefix()+"TAB customization disabled because empty customization config!"); plugin.getLogger().warning(ChatColor.stripColor(plugin.getPrefix()) + "TAB customization disabled because empty customization config or feature related errors!");
return; return;
} }
plugin.getLogger().info("- TAB customization enabled!");
this.updateTab(); this.updateTab();
/*packet = plugin.getProtocolManager().createPacket(PacketType.Play.Server.PLAYER_LIST_HEADER_FOOTER);
boolean both = headers.size() > 0 && footers.size() > 0;
boolean header = !both && headers.size() > 0;
boolean footer = !both && footers.size() > 0;*/
//scheduleSyncRepeatingTask
//Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new TabRunnable(this),20, Math.convert(Math.Convert.SECONDS,Math.Convert.TICKS,this.refreshRate));
} }
} }
private boolean init() {
private boolean init() throws Exception {
if (plugin.getConfig().getBoolean("Tab.enabled")){ if (plugin.getConfig().getBoolean("Tab.enabled")){
int availProcessors = Server.getCpuCores(); int availProcessors = Server.getCpuCores();
@ -110,76 +107,50 @@ public class TabHandler {
private void updateTab(){ private void updateTab(){
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> { Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
try { try {
if (Bukkit.getOnlinePlayers().size()==0){ if (Bukkit.getOnlinePlayers().isEmpty()){
return; return;
} }
if (count1 >= headers.size()) { if (count1 >= headerComponents.size()) {
count1 = 0; count1 = 0;
} }
if (count2 >= footers.size()) { if (count2 >= footerComponents.size()) {
count2 = 0; count2 = 0;
} }
//Re adding all lines where we replaced something like the RAM usage to every refresh //Re adding all lines where we replaced something like the RAM usage to every refresh
//display current value. (We check those lines in the init()) //display current value. (We check those lines in the init())
if (DynamicHeaders.size() > 0 && count1 < DynamicHeaders.size()) { if (!DynamicHeaders.isEmpty() && count1 < DynamicHeaders.size()) {
if (DynamicHeaders.get(count1) == count1) { if (DynamicHeaders.get(count1) == count1) {
addHeaderFooter(true, headeranimList.get(count1), true, count1); addHeaderFooter(true, headeranimList.get(count1), true, count1);
} }
} }
if (DynamicFooters.size() > 0 && count2 < DynamicFooters.size()) { if (!DynamicFooters.isEmpty() && count2 < DynamicFooters.size()) {
if (DynamicFooters.get(count2) == count2) { if (DynamicFooters.get(count2) == count2) {
addHeaderFooter(false, footeranimList.get(count2), true, count2); addHeaderFooter(false, footeranimList.get(count2), true, count2);
} }
} }
/*
if (both){
plugin.getLogger().info("DEBUG: Sending both (header) JSON: "+WrappedChatComponent.fromHandle(headers.get(count1)).getJson());
plugin.getLogger().info("DEBUG: Sending both (footer) JSON: "+WrappedChatComponent.fromHandle(footers.get(count2)).getJson());
packet.getChatComponents().write(0, WrappedChatComponent.fromHandle(headers.get(count1))).write(1,WrappedChatComponent.fromHandle(footers.get(count2))); ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
}else{ PacketContainer packet = protocolManager.createPacket(com.comphenix.protocol.PacketType.Play.Server.PLAYER_LIST_HEADER_FOOTER);
if (header){
plugin.getLogger().info("DEBUG: Sending header JSON: "+WrappedChatComponent.fromHandle(headers.get(count1)).getJson());
packet.getChatComponents().write(0, WrappedChatComponent.fromHandle(headers.get(count1))).write(1,WrappedChatComponent.fromText("{\"text\":\"\"}")); packet.getChatComponents().write(0, headerComponents.get(count1));
}else{ packet.getChatComponents().write(1, footerComponents.get(count2));
if (footer){
plugin.getLogger().info("DEBUG: Sending footer JSON: "+WrappedChatComponent.fromHandle(footers.get(count2)).getJson());
packet.getChatComponents().write(0,WrappedChatComponent.fromText("{\"text\":\"\"}")).write(1,WrappedChatComponent.fromHandle(footers.get(count2))); for (Player player : Bukkit.getOnlinePlayers()) {
} protocolManager.sendServerPacket(player, packet);
}
}
if (Bukkit.getOnlinePlayers().size() > 0) {
for (Player player : Bukkit.getOnlinePlayers()) {
plugin.getProtocolManager().sendServerPacket(player, packet);
}
}*/
if (Version.ServerVersion.isCurrentEqualOrLower(Version.ServerVersion.v1_12_R1)) {
packet = ClazzContainer.buildPacketPlayOutPlayerListHeaderFooter(headers.get(count1),footers.get(count2));
for (Player player : Bukkit.getOnlinePlayers()){
Reflection.sendPacket(player,packet);
}
}else{
for (Player player : Bukkit.getOnlinePlayers()) {
player.setPlayerListHeaderFooter(headers.get(count1),footers.get(count2));
}
} }
if (headers.size() > 1) { if (headerComponents.size() > 1) {
count1++; count1++;
} }
if (footers.size() > 1) { if (footerComponents.size() > 1) {
count2++; count2++;
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); plugin.getLogger().warning(ChatColor.stripColor(plugin.getPrefix()) + e.getMessage());
} }
},0,Math.convert(Math.Convert.SECONDS,Math.Convert.TICKS,this.refreshRate)); },0,Math.convert(Math.Convert.SECONDS,Math.Convert.TICKS,this.refreshRate));
@ -191,40 +162,30 @@ public class TabHandler {
* Manages the adding of the tab line and the final formatting of the text. * Manages the adding of the tab line and the final formatting of the text.
* @param header If true the text will be added to the header, otherwise to the footer. * @param header If true the text will be added to the header, otherwise to the footer.
* @param text The formatted tab line text. * @param text The formatted tab line text.
* @param dynamic If the text contains a replace which need to run every tab refresh then it's true. * @param dynamic If the text contains a replacement which need to run every tab refresh then it's true.
* @param index Index of the 'dynamic' line. This is an overloading so there we need the index[0] element. * @param index Index of the 'dynamic' line. This is an overloading so there we need the index[0] element.
*/ */
private void addHeaderFooter(boolean header,String text,boolean dynamic,int... index) throws Exception { private void addHeaderFooter(boolean header,String text,boolean dynamic,int... index) {
try { try {
//JsonObject json = new JsonObject();
//json.addProperty("text",format(text));
String Json = "{\"text\": \""+format(text)+"\"}"; String Json = "{\"text\": \""+format(text)+"\"}";
//String Json = format(text); WrappedChatComponent tabText = WrappedChatComponent.fromJson(Json);
//Json = Json.trim();
//plugin.getLogger().info("JSON!: "+Json);
Object tabText = Reflection.asChatSerializer(Json);
//plugin.getLogger().info("DEBUG: Adding JSON: "+Json);
if (header){ if (header){
if (dynamic){ if (dynamic){
headerComponents.set(index[0], tabText);
headers.set(index[0], Reflection.getChatSerializerString(tabText));
//headers.set(index[0],Json);
}else { }else {
//headers.add(Json); headerComponents.add(tabText);
headers.add(Reflection.getChatSerializerString(tabText));
} }
}else{ }else{
if (dynamic){ if (dynamic){
//footers.set(index[0],Json); footerComponents.set(index[0], tabText);
footers.set(index[0], Reflection.getChatSerializerString(tabText)); } else {
}else { footerComponents.add(tabText);
//footers.add(Json);
footers.add(Reflection.getChatSerializerString(tabText));
} }
} }
} catch (Exception e){ } catch (Exception e){
e.printStackTrace(); plugin.getLogger().warning(ChatColor.stripColor(plugin.getPrefix()) + e.getMessage());
} }
} }
@ -261,7 +222,7 @@ public class TabHandler {
msg = msg.replace("{MOTD}", plugin.getServer().getMotd()); //LegacyComponentSerializer.legacyAmpersand().serialize(plugin.getServer().motd().asComponent()) msg = msg.replace("{MOTD}", plugin.getServer().getMotd()); //LegacyComponentSerializer.legacyAmpersand().serialize(plugin.getServer().motd().asComponent())
} }
if (msg.contains("{TPS}")){ if (msg.contains("{TPS}")){
msg = msg.replace("{TPS}",String.format("%.2f", TPS.getTPS())); msg = msg.replace("{TPS}",String.valueOf(java.lang.Math.round(TPS.getTPS())));
} }
return ChatColor.translateAlternateColorCodes('&',msg); return ChatColor.translateAlternateColorCodes('&',msg);
} }

View File

@ -14,10 +14,12 @@ import hu.ditservices.utils.AdvancementHelper;
public class ChatEvents implements Listener { public class ChatEvents implements Listener {
private STPlugin plugin; private STPlugin plugin;
private FileConfiguration config; private FileConfiguration config;
public ChatEvents(STPlugin instance){ public ChatEvents(STPlugin instance){
this.plugin = instance; this.plugin = instance;
this.config = plugin.config; this.config = plugin.getConfig();
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onAdvance(PlayerAdvancementDoneEvent e){ public void onAdvance(PlayerAdvancementDoneEvent e){
if (config.isSet("CustomAdvancement.enabled") && config.getBoolean("CustomAdvancement.enabled")){ if (config.isSet("CustomAdvancement.enabled") && config.getBoolean("CustomAdvancement.enabled")){

View File

@ -15,7 +15,7 @@ public class LogChat implements Listener {
FileConfiguration config; FileConfiguration config;
public LogChat(STPlugin instance){ public LogChat(STPlugin instance){
this.plugin = instance; this.plugin = instance;
this.config = plugin.config; this.config = plugin.getConfig();
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onChat(AsyncPlayerChatEvent event){ public void onChat(AsyncPlayerChatEvent event){

View File

@ -16,7 +16,7 @@ public class LogCommand implements Listener {
public LogCommand(STPlugin instance){ public LogCommand(STPlugin instance){
this.plugin = instance; this.plugin = instance;
this.config = plugin.config; this.config = plugin.getConfig();
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onCommand(PlayerCommandPreprocessEvent event){ public void onCommand(PlayerCommandPreprocessEvent event){

View File

@ -19,10 +19,10 @@ public class LogConnect implements Listener {
FileConfiguration config; FileConfiguration config;
public LogConnect(STPlugin instance){ public LogConnect(STPlugin instance){
this.plugin = instance; this.plugin = instance;
this.config = plugin.config; this.config = plugin.getConfig();
if (config.getBoolean("CustomMsg.enabled")){ if (config.getBoolean("CustomMsg.enabled")) {
this.JoinMsg = this.config.isSet("CustomMsg.connect") ? this.config.getString("CustomMsg.connect") : "{PREFIX}{NAME} &aconnected to the server."; this.JoinMsg = this.config.isSet("CustomMsg.connect") ? this.config.getString("CustomMsg.connect") : "{PREFIX}{NAME} &aconnected to the server.";
this.LeaveMsg = this.config.isSet("CustomMsg.connect") ? this.config.getString("CustomMsg.disconnect") : "{PREFIX}{NAME} leaved the game."; this.LeaveMsg = this.config.isSet("CustomMsg.connect") ? this.config.getString("CustomMsg.disconnect") : "{PREFIX}{NAME} left the game.";
} }
} }

View File

@ -0,0 +1,127 @@
package hu.ditservices.listeners;
import hu.ditservices.STPlugin;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.UUID;
public class ServerPasswordEvents implements Listener {
private STPlugin plugin;
private FileConfiguration config;
public ServerPasswordEvents(STPlugin instance){
this.plugin = instance;
this.config = plugin.getConfig();
}
private boolean skipIfOpPlayer(Player player)
{
return (player.isOp() && config.getBoolean("ServerPassword.exceptOps")) || player.hasPermission("st.slogin.skip");
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
if (skipIfOpPlayer(player)) {
return;
}
if ((!config.getBoolean("ServerPassword.rememberUntilRestart"))
|| (!plugin.getServerPasswordData().getAuthenticatedPlayers().getOrDefault(player.getUniqueId(),false))) {
plugin.getServerPasswordData().getAuthenticatedPlayers().put(player.getUniqueId(),false);
if (config.getBoolean("ServerPassword.preventInventory")) {
// Store and clear inventory
plugin.getServerPasswordData().getInventoryMap().put(player.getUniqueId(), player.getInventory().getContents());
plugin.getServerPasswordData().getArmorMap().put(player.getUniqueId(), player.getInventory().getArmorContents());
player.getInventory().clear();
player.getInventory().setArmorContents(null);
}
player.sendMessage(ChatColor.RED + plugin.getTranslatedText("serverpassword.enabled"));
player.sendMessage(plugin.getTranslatedText("serverpassword.note"));
BukkitRunnable authReminder = new BukkitRunnable() {
@Override
public void run() {
// Check if the player is authenticated, default to false if not present.
if (plugin.getServerPasswordData().getAuthenticatedPlayers().getOrDefault(player.getUniqueId(), false)) {
this.cancel();
return;
}
player.sendMessage(ChatColor.RED + plugin.getTranslatedText("serverpassword.login"));
}
};
authReminder.runTaskTimer(plugin, 0L, 100L);
}
}
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
if (skipIfOpPlayer(event.getPlayer())) {
return;
}
if ((!plugin.getServerPasswordData().getAuthenticatedPlayers().getOrDefault(event.getPlayer().getUniqueId(),false))
&& config.getBoolean("ServerPassword.preventMove")) {
event.setCancelled(true);
}
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
if (skipIfOpPlayer(event.getPlayer())) {
return;
}
if ((!plugin.getServerPasswordData().getAuthenticatedPlayers().getOrDefault(event.getPlayer().getUniqueId(),false))
&& config.getBoolean("ServerPassword.preventBuild")) {
event.setCancelled(true);
}
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
if (skipIfOpPlayer(event.getPlayer())) {
return;
}
if ((!plugin.getServerPasswordData().getAuthenticatedPlayers().getOrDefault(event.getPlayer().getUniqueId(),false))
&& config.getBoolean("ServerPassword.preventBuild")) {
event.setCancelled(true);
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
if (skipIfOpPlayer(player)) {
return;
}
if (plugin.getServerPasswordData().getAuthenticatedPlayers().getOrDefault(uuid, false)) {
if (!config.getBoolean("ServerPassword.rememberUntilRestart")) {
plugin.getServerPasswordData().getAuthenticatedPlayers().remove(uuid);
}
} else {
if (plugin.getConfig().getBoolean("ServerPassword.preventInventory")) {
if (plugin.getServerPasswordData().getInventoryMap().containsKey(uuid)) {
player.getInventory().setContents(plugin.getServerPasswordData().getInventoryMap().get(uuid));
plugin.getServerPasswordData().getInventoryMap().remove(uuid);
}
if (plugin.getServerPasswordData().getArmorMap().containsKey(uuid)) {
player.getInventory().setArmorContents(plugin.getServerPasswordData().getArmorMap().get(uuid));
plugin.getServerPasswordData().getArmorMap().remove(uuid);
}
}
}
}
}

View File

@ -1,6 +1,7 @@
package hu.ditservices.utils; package hu.ditservices.utils;
import hu.ditservices.STPlugin; import hu.ditservices.STPlugin;
import org.bukkit.ChatColor;
import org.bukkit.GameRule; import org.bukkit.GameRule;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
@ -115,24 +116,26 @@ public class AdvancementHelper {
if (config.isSet("CustomAdvancement.formats.challenge")) { if (config.isSet("CustomAdvancement.formats.challenge")) {
out_type[2] = config.getString("CustomAdvancement.formats.challenge"); out_type[2] = config.getString("CustomAdvancement.formats.challenge");
} }
String disablemsg = plugin.getPrefix()+"Disabling vanilla advancement messages for ";
List<World> worlds = this.plugin.getServer().getWorlds();
Method setRuleMethod, getRuleMethod;
try { try {
String disableMsg = ChatColor.stripColor(plugin.getPrefix()) + "Disabling vanilla advancement messages for ";
List<World> worlds = this.plugin.getServer().getWorlds();
Method setRuleMethod, getRuleMethod;
for (World w : worlds) { for (World w : worlds) {
if (Version.ServerVersion.isCurrentEqualOrLower(Version.ServerVersion.v1_12_R1)){ if (Version.ServerVersion.isCurrentEqualOrLower(Version.ServerVersion.v1_12_R1)){
getRuleMethod = w.getClass().getDeclaredMethod("getGameRuleValue", String.class); getRuleMethod = w.getClass().getDeclaredMethod("getGameRuleValue", String.class);
if (getRuleMethod.invoke(w,"announceAdvancements")=="true"){ if (getRuleMethod.invoke(w,"announceAdvancements")=="true"){
setRuleMethod = w.getClass().getDeclaredMethod("setGameRuleValue", String.class, String.class); setRuleMethod = w.getClass().getDeclaredMethod("setGameRuleValue", String.class, String.class);
setRuleMethod.invoke(w,"announceAdvancements", "false"); setRuleMethod.invoke(w,"announceAdvancements", "false");
this.plugin.getLogger().info(disablemsg + w.getName()); this.plugin.getLogger().info(disableMsg + w.getName());
} }
}else{ }else{
getRuleMethod = w.getClass().getDeclaredMethod("getGameRuleValue", GameRule.class); getRuleMethod = w.getClass().getDeclaredMethod("getGameRuleValue", GameRule.class);
if ((boolean)getRuleMethod.invoke(w,GameRule.ANNOUNCE_ADVANCEMENTS)){ if ((boolean)getRuleMethod.invoke(w,GameRule.ANNOUNCE_ADVANCEMENTS)){
setRuleMethod = w.getClass().getDeclaredMethod("setGameRule", GameRule.class, Object.class); setRuleMethod = w.getClass().getDeclaredMethod("setGameRule", GameRule.class, Object.class);
setRuleMethod.invoke(w,GameRule.ANNOUNCE_ADVANCEMENTS,false); setRuleMethod.invoke(w,GameRule.ANNOUNCE_ADVANCEMENTS,false);
this.plugin.getLogger().info(disablemsg + w.getName()); this.plugin.getLogger().info(disableMsg + w.getName());
} }
} }

View File

@ -19,7 +19,7 @@ public class Cooldown {
public Cooldown(STPlugin instance){ public Cooldown(STPlugin instance){
this.plugin = instance; this.plugin = instance;
this.config = plugin.config; this.config = plugin.getConfig();
if (config.isSet("Cooldown.seconds")){ if (config.isSet("Cooldown.seconds")){
int cd = this.delay; int cd = this.delay;
if (cd!=config.getInt("Cooldown.seconds")){ if (cd!=config.getInt("Cooldown.seconds")){

View File

@ -1,7 +1,5 @@
package hu.ditservices.utils; package hu.ditservices.utils;
import java.io.IOException;
public class Math { public class Math {
public enum Convert { public enum Convert {
TICKS,SECONDS,MINUTES,HOURS TICKS,SECONDS,MINUTES,HOURS

View File

@ -1,6 +1,8 @@
package hu.ditservices.utils; package hu.ditservices.utils;
import hu.ditservices.STPlugin;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.lang.Math; import java.lang.Math;
@ -50,7 +52,8 @@ public class Server {
} }
return player.getPing(); return player.getPing();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); STPlugin plugin = STPlugin.getInstance();
plugin.getLogger().warning(ChatColor.stripColor(plugin.getPrefix()) + e.getMessage());
return -1; return -1;
} }
} }

View File

@ -0,0 +1,40 @@
package hu.ditservices.utils;
import hu.ditservices.STPlugin;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class ServerPasswordData {
private STPlugin plugin;
public ServerPasswordData(STPlugin instance) {
this.plugin = instance;
}
// Maps to store inventory, armor, and authentication status
private final Map<UUID, ItemStack[]> inventoryMap = new HashMap<>();
private final Map<UUID, ItemStack[]> armorMap = new HashMap<>();
private final Map<UUID, Boolean> authenticatedPlayers = new HashMap<>();
// Getter for the inventory map
public Map<UUID, ItemStack[]> getInventoryMap() {
return inventoryMap;
}
// Getter for the armor map
public Map<UUID, ItemStack[]> getArmorMap() {
return armorMap;
}
// Getter for the authenticated players map
public Map<UUID, Boolean> getAuthenticatedPlayers() {
return authenticatedPlayers;
}
public String getServerPassword() {
return this.plugin.getConfig().getString("ServerPassword.password");
}
}

View File

@ -1,5 +1,10 @@
package hu.ditservices.utils; package hu.ditservices.utils;
import hu.ditservices.STPlugin;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import java.lang.reflect.Method;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class Version { public class Version {
@ -26,7 +31,19 @@ public class Version {
v1_18_R1, v1_18_R1,
v1_18_R2, v1_18_R2,
v1_19_R1, v1_19_R1,
v1_19_R2; v1_19_R2,
v1_20_R1,
v1_20_R2,
v1_20_3_R1,
v1_20_4_R1,
v1_20_5_R1,
v1_20_6_R1,
v1_21_R1,
v1_21_1_R1,
v1_21_2_R1,
v1_21_3_R1,
v1_21_4_R1,
v1_21_5_R1;
private int value; private int value;
@ -57,13 +74,67 @@ public class Version {
return current; return current;
} }
public static String[] getArrayVersion() { /*public static String[] getArrayVersion() {
if (arrayVersion == null) { if (arrayVersion == null) {
arrayVersion = org.bukkit.Bukkit.getServer().getClass().getPackage().getName().split("\\."); arrayVersion = org.bukkit.Bukkit.getServer().getClass().getPackage().getName().split("\\.");
} }
return arrayVersion;
}*/
public static String[] getArrayVersion() {
if (arrayVersion == null) {
String version = null;
try {
// Check if the Paper method getMinecraftVersion exists
Method minecraftVersionMethod = Bukkit.getServer().getClass().getMethod("getMinecraftVersion");
if (minecraftVersionMethod != null) {
version = (String) minecraftVersionMethod.invoke(Bukkit.getServer());
}
} catch (NoSuchMethodException e) {
// The method doesn't exist in this server version; fall back below.
} catch (Exception e) {
STPlugin plugin = STPlugin.getInstance();
plugin.getLogger().warning(ChatColor.stripColor(plugin.getPrefix()) + e.getMessage());
}
// Fallback: use Bukkit version if no version was obtained or it's empty.
if (version == null || version.trim().isEmpty()) {
version = Bukkit.getServer().getBukkitVersion();
// Remove any suffix (e.g., "-R0.1-SNAPSHOT") for consistency.
int dashIndex = version.indexOf('-');
if (dashIndex != -1) {
version = version.substring(0, dashIndex);
}
}
// Construct a legacy-style version string.
String legacyVersion = "v" + version.replace('.', '_') + "_R1";
arrayVersion = new String[] { legacyVersion };
}
return arrayVersion; return arrayVersion;
} }
/*public static String[] getArrayVersion() {
if (arrayVersion == null) {
String packageName = org.bukkit.Bukkit.getServer().getClass().getPackage().getName();
String[] splitPackageName = packageName.split("\\.");
// Check if the splitPackageName length is more than 3
if (splitPackageName.length > 3) {
arrayVersion = new String[] {splitPackageName[3]};
} else {
// Handle the case for newer versions
String version = "UNKNOWN";
try {
version = org.bukkit.Bukkit.getServer().getVersion().split("\\(MC: ")[1].split("\\)")[0];
} catch (Exception e) {
e.printStackTrace();
}
arrayVersion = new String[] {"v" + version.replace('.', '_') + "_R1"};
}
}
return arrayVersion;
}*/
public static boolean isCurrentEqualOrHigher(ServerVersion v) { public static boolean isCurrentEqualOrHigher(ServerVersion v) {
return getCurrent().value >= v.value; return getCurrent().value >= v.value;

View File

@ -1,93 +0,0 @@
package hu.ditservices.utils.reflection;
import hu.ditservices.utils.Version;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public final class ClazzContainer {
private static Class<?> packet, ChatComponentTextClass, CraftPlayerClass, IChatBaseComponentClass, PacketPlayOutPlayerListHeaderFooterClass;
private static Object ChatComponentText, IChatBaseComponent;
static {
try {
IChatBaseComponentClass = classByName("net.minecraft.network.chat", "IChatBaseComponent");
packet = classByName("net.minecraft.network.protocol", "Packet");
} catch (Exception e){
e.printStackTrace();
}
}
public ClazzContainer(){
}
public static Class<?> classByName(String newPackageName, String name) throws ClassNotFoundException {
if (Version.ServerVersion.isCurrentLower(Version.ServerVersion.v1_17_R1) || newPackageName == null) {
newPackageName = "net.minecraft.server." + Version.ServerVersion.getArrayVersion()[3];
}
return Class.forName(newPackageName + "." + name);
}
public static Object buildChatComponentText(String text) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Constructor<?> constructor;
if (Version.ServerVersion.isCurrentEqualOrHigher(Version.ServerVersion.v1_17_R1)){
if (ChatComponentTextClass == null){
ChatComponentTextClass = Reflection.getClass("net.minecraft.network.chat.ChatComponentText");
}
constructor = ChatComponentTextClass.getConstructor(String.class);
return constructor.newInstance(text);
}else{
if (ChatComponentTextClass == null){
ChatComponentTextClass = Reflection.getClass("net.minecraft.server.%v.ChatComponentText");
}
constructor = Reflection.getClass("net.minecraft.server.%v.ChatComponentText").getConstructor(String.class);
return constructor.newInstance(text);
}
}
public static Object buildPacketPlayOutPlayerListHeaderFooter(Object header, Object footer) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Constructor<?> constructor;
Field headerField;
Field footerField;
Object packet;
if (Version.ServerVersion.isCurrentEqualOrHigher(Version.ServerVersion.v1_17_R1)){
if (PacketPlayOutPlayerListHeaderFooterClass == null){
PacketPlayOutPlayerListHeaderFooterClass = Reflection.getClass("net.minecraft.network.protocol.game.PacketPlayOutPlayerListHeaderFooter");
}
}else{
if (PacketPlayOutPlayerListHeaderFooterClass == null){
PacketPlayOutPlayerListHeaderFooterClass = Reflection.getClass("net.minecraft.server.%v.PacketPlayOutPlayerListHeaderFooter");
}
}
if (Version.ServerVersion.isCurrentEqualOrLower(Version.ServerVersion.v1_12_R1)){
constructor = PacketPlayOutPlayerListHeaderFooterClass.getConstructor();
packet = constructor.newInstance();
try {
headerField = packet.getClass().getDeclaredField("a");
headerField.setAccessible(true);
headerField.set(packet, buildChatComponentText((String) header));
footerField = packet.getClass().getDeclaredField("b");
footerField.setAccessible(true);
footerField.set(packet, buildChatComponentText((String) footer));
} catch (Exception e){
e.printStackTrace();
}
}else{
constructor = PacketPlayOutPlayerListHeaderFooterClass.getConstructor(IChatBaseComponentClass,IChatBaseComponentClass);
packet = constructor.newInstance(header,footer);
}
return packet;
}
public static Class<?> getIChatBaseComponent() {
return IChatBaseComponentClass;
}
public static Class<?> getPacket() {
return packet;
}
}

View File

@ -1,122 +0,0 @@
package hu.ditservices.utils.reflection;
import hu.ditservices.utils.Version;
import org.bukkit.entity.Player;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Reflection {
private static Method playerHandleMethod, sendPacketMethod, chatSerializerMethodA,chatSerializerMethodgetString;
private static Field playerConnectionField;
private static Class<?> chatSerializer;
private Reflection(){}
public static Class<?> getClass(String name) {
try {
return Class.forName(name.replace("%v",Version.ServerVersion.getCurrent().toString()));
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
public static Class<?> getCraftClass(String className) throws ClassNotFoundException {
return Class.forName("org.bukkit.craftbukkit." + Version.ServerVersion.getArrayVersion()[3] + "." + className);
}
public static Object getPlayerHandle(Player player) throws Exception {
if (playerHandleMethod == null) {
playerHandleMethod = player.getClass().getDeclaredMethod("getHandle");
}
return playerHandleMethod.invoke(player);
}
public static void sendPacket(Player player, Object packet) {
if (player == null) {
return;
}
try {
Object playerHandle = getPlayerHandle(player);
if (playerConnectionField == null) {
playerConnectionField = playerHandle.getClass().getDeclaredField(
(Version.ServerVersion.isCurrentEqualOrHigher(Version.ServerVersion.v1_17_R1) ? "b" : "playerConnection"));
}
Object playerConnection = playerConnectionField.get(playerHandle);
if (sendPacketMethod == null) {
sendPacketMethod = playerConnection.getClass().getDeclaredMethod(
Version.ServerVersion.isCurrentEqualOrHigher(Version.ServerVersion.v1_18_R1) ? "a" : "sendPacket",
ClazzContainer.getPacket());
}
sendPacketMethod.invoke(playerConnection, packet);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getChatSerializerString(Object serializer) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
if (chatSerializerMethodgetString==null){
if (Version.ServerVersion.isCurrentEqualOrLower(Version.ServerVersion.v1_12_R1)){
chatSerializerMethodgetString = ClazzContainer.getIChatBaseComponent().getDeclaredMethod("getText");
}else{
chatSerializerMethodgetString = ClazzContainer.getIChatBaseComponent().getDeclaredMethod("getString");
}
}
return (String) chatSerializerMethodgetString.invoke(serializer);
//return (String) ClazzContainer.getIChatBaseComponent().cast(chatSerializerMethodgetString.invoke(serializer));
}
public static Object asChatSerializer(String json) throws Exception {
try {
if (Version.ServerVersion.isCurrentEqualOrHigher(Version.ServerVersion.v1_17_R1)){
if (chatSerializer==null){
chatSerializer = Class.forName("net.minecraft.network.chat.IChatBaseComponent$ChatSerializer");
}
}else{
if (chatSerializer==null){
chatSerializer = Class.forName("net.minecraft.server." + Version.ServerVersion.getArrayVersion()[3] + ".IChatBaseComponent$ChatSerializer");
}
}
if (chatSerializerMethodA == null) {
chatSerializerMethodA = chatSerializer.getMethod("a", String.class);
}
} catch (Exception e){
e.printStackTrace();
}
return chatSerializerMethodA.invoke(chatSerializer,json);
//return ClazzContainer.getIChatBaseComponent().cast(chatSerializerMethodA.invoke(chatSerializer, json));
}
/*public static Class<?> getNMSClassRegex(String nmsClass) {
String version = null;
Pattern pat = Pattern.compile("net\\.minecraft\\.(?:server)?\\.(v(?:\\d_)+R\\d)");
for (Package p : Package.getPackages()) {
String name = p.getName();
Matcher m = pat.matcher(name);
if (m.matches()) version = m.group(1);
}
if (version == null) return null;
try {
return Class.forName(String.format(nmsClass, version));
} catch (ClassNotFoundException e) {
return null;
}
}*/
}

View File

@ -11,6 +11,9 @@
# ██████╔╝██║██║░╚═╝░██║██║░░░░░███████╗██║██║░░░░░░░░██║░░░░░░██║░░░╚█████╔╝╚█████╔╝███████╗██████╔╝ # ██████╔╝██║██║░╚═╝░██║██║░░░░░███████╗██║██║░░░░░░░░██║░░░░░░██║░░░╚█████╔╝╚█████╔╝███████╗██████╔╝
# ╚═════╝░╚═╝╚═╝░░░░░╚═╝╚═╝░░░░░╚══════╝╚═╝╚═╝░░░░░░░░╚═╝░░░░░░╚═╝░░░░╚════╝░░╚════╝░╚══════╝╚═════╝░ # ╚═════╝░╚═╝╚═╝░░░░░╚═╝╚═╝░░░░░╚══════╝╚═╝╚═╝░░░░░░░░╚═╝░░░░░░╚═╝░░░░╚════╝░░╚════╝░╚══════╝╚═════╝░
# #
# Localization options
# Currently these languages included by default: en, hu. You can add another language in the lang folder.
language: 'en'
# Logging options # Logging options
# If you enable one of them, a txt file will be created every day automatically with the current date. # If you enable one of them, a txt file will be created every day automatically with the current date.
Log: Log:
@ -61,25 +64,62 @@ Tab:
CustomMsg: CustomMsg:
enabled: false enabled: false
connect: '{PREFIX}{NAME} &aconnected to the server.' connect: '{PREFIX}{NAME} &aconnected to the server.'
disconnect: '{PREFIX}{NAME} leaved the game.' disconnect: '{PREFIX}{NAME} left the game.'
# Auto Save options # Auto Save options
# Saves Worlds/Users data to disk. # Saves Worlds/Users data to disk.
# Note: You can do a save like this with the /st save-all command. # Note: You can do a save like this with the /st save-all command.
# NOTICE: You will need a full MC server restart when you want to apply new settings here. # NOTICE: You will need a full MC server restart when you want to apply new settings here.
Saving: Saving:
enabled: true enabled: false
onDisconnect: true # When a player disconnects onDisconnect: true # When a player disconnects
interval: 1800 # Auto saving interval in SECONDS. If this set to zero it means disabled. interval: 1800 # Auto saving interval in SECONDS. If this set to zero it means disabled.
broadcastMsgProgress: '{PREFIX}Auto save in progress..' broadcastMsgProgress: '{PREFIX}Auto save in progress..'
broadcastMsgDone: '{PREFIX}Auto save done.' broadcastMsgDone: '{PREFIX}Auto save done.'
# Server Password options
# You can configure a same password for all players on the server.
# Players not logged in can't move, cant build/destroy.
ServerPassword:
enabled: false
password: 'changeme'
exceptOps: true # Server operators don't need to login.
rememberUntilRestart: true # Set this to 'false' to player need to provide password each login.
# Otherwise, each player need to provide password only once until the server is restarted.
# Below settings are preventing the related actions until the password was not given by the player if the setting is 'true'.
preventInventory: true
preventMove: true
preventBuild: true
# Dropped items clearing options
ClearDropItems:
enabled: false
interval: 300 # Interval in seconds between each clear cycle
broadcastMsg: true # Broadcasts alerts before clearing 1 minutes and 10 seconds before and when cleared. Set this to 'false' to make cleaning silently.
# Dropped items that should always be kept (never cleared)
except:
- DIAMOND
- GOLD_INGOT
# - COAL
# - IRON_INGOT
# - BREAD
# Worlds to skip (dropped items in these worlds won't be cleared)
skipWorlds:
- world_nether
- world_the_end
# Cooldown options (only applicable for this plugin!) # Cooldown options (only applicable for this plugin!)
Cooldown: Cooldown:
enabled: true enabled: true
# The time must be passed between using this plugin commands. # The time must be passed between using this plugin commands.
seconds: 2 #The command cooldown in seconds seconds: 1 #The command cooldown in seconds
Msg: '{PREFIX} Please wait {SECONDS} seconds!' # The message when the user spamming a command Msg: '{PREFIX} Please wait {SECONDS} seconds!' # The message when the user spamming a command
#
# Plugin Manager - Enable/Disable plugins without server restart
# Attention! It may cause errors in other plugins if you use this feature, not recommended!
# If this is set to 'true' you can use the /st pmanager commands. Set it to 'false' to prevent its use.
#
PluginManager:
enabled: false
# Miscellaneous # Miscellaneous
Prefix: '&a[&fSimplify&7Tools&2] &4- &f' Prefix: '&a[&fSimplify&7Tools&2] &4- &f' # The prefix which is inserted to the beginning of every plugin message.

42
src/main/resources/en.yml Normal file
View File

@ -0,0 +1,42 @@
version.pre.text: "Version: "
action.success.reload: "Successfully reload!"
notice.settings.not.applied: "Notice: Restart your server if the settings didn't applied."
plugin.calculated.tps: "Plugin Calculated TPS: "
invalid.arguments: "Invalid arguments!"
pmanager.disabled: "Plugin manager commands are disabled in the config!"
serverpassword.enabled: "There is server password enabled on this server!"
serverpassword.note: "Note: This means the same password for all players."
serverpassword.login: "Please login using /slogin <password>"
serverpassword.already.auth: "You are already authenticated."
serverpassword.success.auth: "You have been authenticated."
serverpassword.incorrect: "Incorrect password. Try again."
cmd.usage.login: "Usage: /slogin <PASSWORD>"
settings.server: "Server "
settings.features: "Features"
settings.enabled: "Enabled"
settings.disabled: "Disabled"
settings.feature.tab: "Tab customization: "
settings.feature.CustomAdvancementMsg: "Custom Advancement Msg: "
settings.feature.AutoSave: "Auto saving: "
settings.feature.pmanager: "Plugin manager: "
stats.header: "Your statistics"
stats.connects: "Connects: "
stats.deaths: "Deaths: "
stats.MobKills: "Mob kills: "
stats.PlayerKills: "Player kills: "
stats.sleeps: "Sleeps: "
stats.enchants: "Enchants: "
stats.totaltime: "Total Play Time: "
stats.hour: "h "
stats.minutes: "m "
stats.seconds: "s"
cmd.ping: "Your response time to the server: "
pmanager.not.exist: "Plugin not exist!"
pmanager.already.enabled: " already enabled!"
pmanager.success.enabled: " successfully enabled!"
pmanager.already.disabled: " already disabled!"
pmanager.success.disabled: " successfully disabled!"
list.help: "To list all SimplifyTools commands use the '/help SIMPLIFYTOOLS' command!"
cleardropitems.oneMin: "Attention: Dropped items will be cleared in 1 minute!"
cleardropitems.tenSec: "Attention: Dropped items will be cleared in 10 seconds!"
cleardropitems.cleared: "Dropped items have been cleared (%REMOVECOUNT% items removed)."

42
src/main/resources/hu.yml Normal file
View File

@ -0,0 +1,42 @@
version.pre.text: "Verzió: "
action.success.reload: "Sikeres újratöltés!"
notice.settings.not.applied: "Figyelem: Indítsd újra a szervert, ha a beállítások nem alkalmazódtak."
plugin.calculated.tps: "Plugin által kalkulált TPS: "
invalid.arguments: "Érvénytelen argumentek!"
pmanager.disabled: "A plugin-kezelő le van tiltva a konfigban!"
serverpassword.enabled: "Ezen a szerveren szerver jelszó van bekapcsolva!"
serverpassword.note: "Figyelem: Ez azt jelenti, hogy mindenki számára ugyanazt a jelszót kell megadni!"
serverpassword.login: "Kérlek, lépj be ezzel: /slogin <jelszó>"
serverpassword.already.auth: "Már bejelentkeztél."
serverpassword.success.auth: "Sikeresen bejelentkeztél!"
serverpassword.incorrect: "Rossz jelszó. Próbáld újra."
cmd.usage.login: "Használat: /slogin <JELSZÓ>"
settings.server: "Szerver "
settings.features: "Tulajdonságok "
settings.enabled: "Bekapcsolva"
settings.disabled: "Kikapcsolva"
settings.feature.tab: "Tablista testreszabás: "
settings.feature.CustomAdvancementMsg: "Teljesítmény-elérés üzenet testreszabás: "
settings.feature.AutoSave: "Automatikus mentés: "
settings.feature.pmanager: "Plugin kezelő: "
stats.header: "A statisztikáid"
stats.connects: "Belépések: "
stats.deaths: "Halálok: "
stats.MobKills: "Mob ölések: "
stats.PlayerKills: "Játékos ölések: "
stats.sleeps: "Alvások: "
stats.enchants: "Enchantolások: "
stats.totaltime: "Összes játékidő: "
stats.hour: "ó "
stats.minutes: "p "
stats.seconds: "mp"
cmd.ping: "A válaszidőd a szerverhez: "
pmanager.not.exist: "Plugin nem létezik!"
pmanager.already.enabled: " már eddig is engedélyezve volt!"
pmanager.success.enabled: " sikeresen engedélyezve!"
pmanager.already.disabled: " már kivolt kapcsolva eddig is!"
pmanager.success.disabled: " sikeresen kikapcsolva!"
list.help: "Használd a '/help SIMPLIFYTOOLS' parancsot a plugin parancsainak listázásához!"
cleardropitems.oneMin: "Figyelem! Az eldobott tárgyak 1 perc múlva törlésre kerülnek!"
cleardropitems.tenSec: "Figyelem! Az eldobott tárgyak 10 másodpercen belül törlésre kerülnek!"
cleardropitems.cleared: "Az eldobott tárgyak törlésre kerültek. (%REMOVECOUNT% tárgy lett eltávolítva)."

View File

@ -7,7 +7,7 @@ load: POSTWORLD
description: SimplifyTools - An All-in-one helper plugin. description: SimplifyTools - An All-in-one helper plugin.
author: SimplifyDave author: SimplifyDave
website: https://ditservices.hu website: https://ditservices.hu
#depend: [ProtocolLib] depend: [ ProtocolLib ]
commands: commands:
st: st:
description: The default command for the plugin. description: The default command for the plugin.
@ -53,8 +53,18 @@ commands:
description: Plugin settings reload. description: Plugin settings reload.
usage: "/st reload" usage: "/st reload"
permission: st.reload permission: st.reload
slogin:
description: Server password login.
usage: "/slogin <PASSWORD>"
permission: st.slogin
permissions: permissions:
st.slogin:
description: The server password login command.
default: true
st.slogin.skip:
description: If has this permission the user dont have to provide server password upon connect.
default: op
st.help: st.help:
description: Enables the help command. description: Enables the help command.
default: true default: true