diff --git a/build.gradle.kts b/build.gradle.kts index 4753748..f8cac5a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,121 @@ -group = "io.github.adrianvic" -version = "1.2" - plugins { - `java-library` + java + id("xyz.jpenilla.run-paper") version "2.3.1" } +group = "org.adrianvictor" +version = System.getenv("VERSION") ?: "unknown" +val buildEnv = System.getenv("BUILD_CHANNEL") + ?: if (System.getenv("JITPACK") != null) "jitpack" else "local" + +repositories { + mavenCentral() + maven("https://repo.papermc.io/repository/maven-public/") +} + +/* ----------------------------------------- */ +/* SUPPORTED VERSIONS */ +/* ----------------------------------------- */ + +val mcVersions = listOf( + "b1_7_3", + "r1_21" +) + +/* ----------------------------------------- */ +/* CREATE SOURCE SET PER VERSION */ +/* ----------------------------------------- */ + +//tasks.withType { +// inputs.property("version", project.version) +// +// filesMatching("plugin.yml") { +// expand("version" to project.version) +// } +//} + +mcVersions.forEach { ver -> + val ss = sourceSets.create(ver) { + java.srcDir("src/$ver/java") + + resources.setSrcDirs( + listOf( + "src/$ver/resources", + "src/main/resources" + ) + ) + + compileClasspath += sourceSets["main"].output + runtimeClasspath += output + compileClasspath + } + + if (ver == "r1_21") { + configurations[ss.compileOnlyConfigurationName] + .extendsFrom(configurations["compileOnly"]) + } +} + +/* ----------------------------------------- */ +/* DEPENDENCIES */ +/* ----------------------------------------- */ + dependencies { - compileOnly(files("libs/craftbukkit-1060.jar")) + add("compileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") + add("r1_21CompileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") + add("b1_7_3CompileOnly", files("libs/craftbukkit-1060.jar")) +} + +/* ----------------------------------------- */ +/* BUILD TASKS */ +/* ----------------------------------------- */ + +mcVersions.forEach { ver -> + tasks.register("jar${ver.replace(".", "_").replace("-", "_").replace("/", "_").capitalize()}") { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(sourceSets["main"].output) + from(sourceSets[ver].output) + archiveClassifier.set(ver) + + manifest { + attributes( + "TLib-Impl-Version" to ver, + "TLib-Environment" to buildEnv + ) + } + + } +} + +tasks.register("buildAll") { + dependsOn(tasks.withType()) +} + +tasks.register("bundleAll") { + from(sourceSets["main"].output) + mcVersions.forEach { ver -> + from(sourceSets[ver].output) + } + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + archiveClassifier.set("all-implementations") + archiveVersion.set(project.version.toString()) + + manifest { + attributes( + "Implemented-Versions" to mcVersions.joinToString(",") + ) + } +} + +/* ----------------------------------------- */ +/* JAVA SETTINGS */ +/* ----------------------------------------- */ + +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) +} + +tasks.withType { + options.encoding = "UTF-8" } \ No newline at end of file diff --git a/src/b1_7_3/java/org/adrianvictor/lib/configuration/Configuration.java b/src/b1_7_3/java/org/adrianvictor/lib/configuration/Configuration.java new file mode 100644 index 0000000..04a8461 --- /dev/null +++ b/src/b1_7_3/java/org/adrianvictor/lib/configuration/Configuration.java @@ -0,0 +1,135 @@ +package org.adrianvictor.lib.configuration; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Map; + +public class Configuration implements org.adrianvictor.lib.configuration.provider.ConfigurationProvider { + org.bukkit.util.config.Configuration config; + + @Override + public void load(File file) { + config = new org.bukkit.util.config.Configuration(file); + } + + @Override + public void load(String contents) throws IOException { + String timestamp = LocalDateTime.now() + .format(DateTimeFormatter.ofPattern("HH-mm-dd-MM-yyyy")); + Path temp = Files.createTempFile("tlib-configprovider-tmp-%s".formatted(timestamp), ".yml"); + Files.writeString(temp, contents); + File file = temp.toFile(); + load(file); + } + + @Override + public void load(Reader reader) throws IOException { + String timestamp = LocalDateTime.now() + .format(DateTimeFormatter.ofPattern("HH-mm-dd-MM-yyyy")); + Path temp = Files.createTempFile("tlib-configprovider-tmp-%s".formatted(timestamp), ".yml"); + + try (BufferedWriter writer = Files.newBufferedWriter(temp)) { + reader.transferTo(writer); + } + + File file = temp.toFile(); + load(file); + } + + @Override + public boolean save(File file) { + return config.save(); + } + + @Override + public boolean save() { + return config.save(); + } + + @Override + public String saveToString() { + return config.toString(); + } + + @Override + public Object getProperty(String path) { + return config.getProperty(path); + } + + @Override + public void setProperty(String path, Object value) { + config.setProperty(path, value); + } + + @Override + public Map getAll() { + return config.getAll(); + } + + @Override + public boolean getBoolean(String path, boolean def) { + return config.getBoolean(path, def); + } + + @Override + public List getBooleanList(String path, List def) { + return config.getBooleanList(path, def); + } + + @Override + public double getDouble(String path, double def) { + return config.getDouble(path, def); + } + + @Override + public List getDoubleList(String path, List def) { + return config.getDoubleList(path, def); + } + + @Override + public int getInt(String path, int def) { + return config.getInt(path, def); + } + + @Override + public String getString(String path) { + return config.getString(path); + } + + @Override + public String getString(String path, String def) { + return config.getString(path, def); + } + + @Override + public List getStringList(String path, List def) { + return config.getStringList(path, def); + } + + @Override + public List getIntList(String path, List def) { + return config.getIntList(path, def); + } + + @Override + public List getKeys(String path) { + return config.getKeys(path); + } + + @Override + public List getKeys() { + return config.getKeys(); + } + + @Override + public List getList(String path) { + return config.getList(path); + } +} diff --git a/src/b1_7_3/java/org/adrianvictor/lib/text/TextColor.java b/src/b1_7_3/java/org/adrianvictor/lib/text/TextColor.java new file mode 100644 index 0000000..c150502 --- /dev/null +++ b/src/b1_7_3/java/org/adrianvictor/lib/text/TextColor.java @@ -0,0 +1,10 @@ +package org.adrianvictor.lib.text; + +import org.bukkit.ChatColor; + +public class TextColor implements org.adrianvictor.lib.text.provider.TextColorProvider { + @Override + public String colorize(String colorCode) { + return ChatColor.valueOf(colorCode).toString(); + } +} diff --git a/src/main/java/gd/rf/adrianvictor/lib/Color.java b/src/main/java/gd/rf/adrianvictor/lib/Color.java deleted file mode 100644 index 9c351b1..0000000 --- a/src/main/java/gd/rf/adrianvictor/lib/Color.java +++ /dev/null @@ -1,31 +0,0 @@ -package gd.rf.adrianvictor.lib; - -import org.bukkit.ChatColor; - -public class Color { - public static String formatColors(String message) { - return message.replaceAll("&", "§"); - } - - public static Object[] ignoreColors(String message) { - String parsed = message.replaceAll("&([0-9a-fk-or])", ""); - Boolean changed = parsed.equals(message); - return new Object[] {parsed, changed}; - } - - public static String rainbow(String message) { - ChatColor[] rainbowColors = { ChatColor.RED, ChatColor.GOLD, ChatColor.YELLOW, ChatColor.GREEN, ChatColor.AQUA, ChatColor.BLUE, ChatColor.LIGHT_PURPLE }; - int colorIndex = 0; - String coloredMessage = ""; - - for (char c : message.toCharArray()) { - ChatColor currentColor = rainbowColors[colorIndex]; - coloredMessage += currentColor + String.valueOf(c); - colorIndex++; - if (colorIndex >= rainbowColors.length) { - colorIndex = 0; - } - } - return coloredMessage; - } -} diff --git a/src/main/java/gd/rf/adrianvictor/lib/ConfigurationEx.java b/src/main/java/gd/rf/adrianvictor/lib/ConfigurationEx.java deleted file mode 100644 index d6672d5..0000000 --- a/src/main/java/gd/rf/adrianvictor/lib/ConfigurationEx.java +++ /dev/null @@ -1,141 +0,0 @@ -package gd.rf.adrianvictor.lib; - -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.util.config.Configuration; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; - -/** - * Utility class for managing plugin configuration files. - *

- * This class extends {@link ConfigurationEx} to provide custom methods for loading, saving, and managing - * configuration files. It automatically handles the creation of parent directories and copies default configuration - * files from the plugin's resources if they do not exist. - *

- * Note: This class allows for flexible management of multiple configuration files, specified by their file name. - */ -public class ConfigurationEx extends Configuration { - - private final File configFile; - private Log logger; - JavaPlugin plugin; - - /** - * Constructs a new instance of {@code ConfigUtil}. - * - * @param _plugin the plugin instance using this configuration utility - * @param fileName the name of the configuration file to manage (e.g., "config.yml", "settings.yml") - */ - public ConfigurationEx(JavaPlugin _plugin, String fileName, Log _logger) { - super(new File(_plugin.getDataFolder(), fileName)); - plugin = _plugin; - logger = _logger; - this.configFile = new File(plugin.getDataFolder(), fileName); - } - - /** - * Loads the configuration file. - *

    - *
  • Creates parent directories if they do not exist.
  • - *
  • Copies the default configuration file from the plugin's resources if the configuration file does not exist.
  • - *
  • Attempts to load the configuration by calling the superclass' {@code load()} method.
  • - *
  • Logs errors if the configuration file cannot be loaded.
  • - *
- */ - @Override - public void load() { - createParentDirectories(); - - if (!configFile.exists()) { - copyDefaultConfig(); - } - - try { - super.load(); - } catch (Exception e) { - logger.severe(String.format("Failed to load config '%s': %s", configFile.getName(), e.getMessage())); - } - } - - /** - * Creates the parent directories for the configuration file if they do not exist. - *

- * Logs an error if the directories cannot be created. - */ - private void createParentDirectories() { - try { - Files.createDirectories(configFile.getParentFile().toPath()); - } catch (IOException e) { - logger.severe(String.format("Failed to generate default config directory: %s", e.getMessage())); - } - } - - /** - * Copies the default configuration file from the plugin's resources to the target location. - *

- * This method looks for a file in the plugin's resources with the same name as the configuration file being managed. - * If found, it copies this file to the plugin's data folder. - *

- * Logs an error if the default configuration file cannot be found or copied. - */ - private void copyDefaultConfig() { - // Load the config from the JAR directly (it is located at the root level) - String resourcePath = "/" + configFile.getName(); // Root path of JAR - - try (InputStream input = plugin.getClass().getResourceAsStream(resourcePath)) { - if (input == null) { - logger.severe(String.format("Default config '%s' wasn't found in the JAR.", configFile.getName())); - return; - } - - Files.copy(input, configFile.toPath()); - if (Files.exists(configFile.toPath())) { - logger.info(String.format("Default config '%s' generated successfully.", configFile.getName())); - } else { - logger.warning("We tried to generate the default config file, but it was not found even after the creation. Maybe your permissions are broken?"); - } - } catch (IOException e) { - logger.severe(String.format("Failed to generate default config '%s': %s", configFile.getName(), e.getMessage())); - } - } - - /** - * Loads the configuration file and logs the result. - *

- * Logs a message indicating whether the configuration was loaded successfully. - */ - public void loadConfig() { - try { - this.load(); - logger.info(String.format("Config '%s' loaded successfully.", configFile.getName())); - } catch (Exception e) { - logger.severe(String.format("Failed to load config '%s': %s", configFile.getName(), e.getMessage())); - } - } - - /** - * Saves the configuration file and logs the result. - *

- * Logs a message indicating whether the configuration was saved successfully. - */ - public void saveConfig() { - try { - this.save(); - logger.info(String.format("Config '%s' saved successfully.", configFile.getName())); - } catch (Exception e) { - logger.severe(String.format("Failed to save config '%s': %s", configFile.getName(), e.getMessage())); - } - } - - /** - * Returns the configuration file managed by this utility. - * - * @return the configuration file - */ - public File getConfig() { - return configFile; - } -} \ No newline at end of file diff --git a/src/main/java/gd/rf/adrianvictor/lib/Log.java b/src/main/java/gd/rf/adrianvictor/lib/Log.java deleted file mode 100644 index e276349..0000000 --- a/src/main/java/gd/rf/adrianvictor/lib/Log.java +++ /dev/null @@ -1,39 +0,0 @@ -package gd.rf.adrianvictor.lib; -import static org.bukkit.Bukkit.getServer; - -import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.plugin.java.JavaPlugin; - -public class Log { - JavaPlugin plugin; - PluginDescriptionFile pdf; - - public Log(JavaPlugin _plugin) { - plugin = _plugin; - pdf = plugin.getDescription(); - } - - public void info(String message) { - getServer().getLogger().info("[" + pdf.getName() + "] " + message); - } - - public void infoc(String message) { - getServer().getLogger().info("[" + pdf.getName() + "] " + Color.formatColors(message)); - } - - public void warning(String message) { - getServer().getLogger().warning("[" + pdf.getName() + "] " + message); - } - - public void warningc(String message) { - getServer().getLogger().warning("[" + pdf.getName() + "] " + Color.formatColors(message)); - } - - public void severe(String message) { - getServer().getLogger().severe("[" + pdf.getName() + "] " + message); - } - - public void severec(String message) { - getServer().getLogger().severe("[" + pdf.getName() + "] " + Color.formatColors(message)); - } -} \ No newline at end of file diff --git a/src/main/java/gd/rf/adrianvictor/lib/Main.java b/src/main/java/gd/rf/adrianvictor/lib/Main.java deleted file mode 100644 index b5d59f0..0000000 --- a/src/main/java/gd/rf/adrianvictor/lib/Main.java +++ /dev/null @@ -1,18 +0,0 @@ -package gd.rf.adrianvictor.lib; -import org.bukkit.plugin.java.JavaPlugin; - -public class Main extends JavaPlugin { - - Log logger; - - @Override - public void onDisable() { - logger.info("is being disabled."); - } - - @Override - public void onEnable() { - logger = new Log(this); - logger.info("is loading."); - } -} \ No newline at end of file diff --git a/src/main/java/gd/rf/adrianvictor/lib/PlayerEx.java b/src/main/java/gd/rf/adrianvictor/lib/PlayerEx.java deleted file mode 100644 index d5388df..0000000 --- a/src/main/java/gd/rf/adrianvictor/lib/PlayerEx.java +++ /dev/null @@ -1,8 +0,0 @@ -package gd.rf.adrianvictor.lib; -import org.bukkit.entity.Player; - -public class PlayerEx { - public static void strikeLightning(Player player) { - player.getWorld().strikeLightning(player.getLocation()); - } -} diff --git a/src/main/java/org/adrianvictor/lib/Main.java b/src/main/java/org/adrianvictor/lib/Main.java new file mode 100644 index 0000000..c8cb630 --- /dev/null +++ b/src/main/java/org/adrianvictor/lib/Main.java @@ -0,0 +1,45 @@ +package org.adrianvictor.lib; +import org.adrianvictor.lib.reflection.ImplementationRegistry; +import org.adrianvictor.lib.reflection.VersionMatcher; +import org.bukkit.plugin.java.JavaPlugin; + +public class Main extends JavaPlugin { + VersionMatcher matcher; + String serverVersion; + ImplementationRegistry registry; + private static Main instance; + + @Override + public void onDisable() { + getLogger().info("is being disabled."); + } + + @Override + public void onEnable() { + getLogger().info("is loading."); + + instance = this; + matcher = new VersionMatcher(); + serverVersion = matcher.getServerVersion(); + + String classSuffix = matcher.getClassSuffix("release", serverVersion); + + if (classSuffix == null) { + classSuffix = matcher.getClassSuffix("beta", serverVersion); + } + + if (classSuffix == null) { + throw new IllegalStateException("No suitable implementation found for version " + serverVersion); + } + + registry = new ImplementationRegistry(classSuffix); + } + + public static Main getInstance() { + return instance; + } + + public ImplementationRegistry getRegistry() { + return registry; + } +} \ No newline at end of file diff --git a/src/main/java/org/adrianvictor/lib/configuration/Configuration.java b/src/main/java/org/adrianvictor/lib/configuration/Configuration.java new file mode 100644 index 0000000..e641f75 --- /dev/null +++ b/src/main/java/org/adrianvictor/lib/configuration/Configuration.java @@ -0,0 +1,10 @@ +package org.adrianvictor.lib.configuration; + +import org.adrianvictor.lib.Main; +import org.adrianvictor.lib.configuration.provider.ConfigurationProvider; + +public class Configuration { + public static ConfigurationProvider create() { + return Main.getInstance().getRegistry().getInstance(ConfigurationProvider.class, "org.adrianvictor.lib.configuraion"); + } +} \ No newline at end of file diff --git a/src/main/java/org/adrianvictor/lib/configuration/exception/InvalidConfigurationException.java b/src/main/java/org/adrianvictor/lib/configuration/exception/InvalidConfigurationException.java new file mode 100644 index 0000000..eda57f7 --- /dev/null +++ b/src/main/java/org/adrianvictor/lib/configuration/exception/InvalidConfigurationException.java @@ -0,0 +1,11 @@ +package org.adrianvictor.lib.configuration.exception; + +public class InvalidConfigurationException extends Exception { + public InvalidConfigurationException(String message) { + super(message); + } + + public InvalidConfigurationException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/adrianvictor/lib/configuration/provider/ConfigurationProvider.java b/src/main/java/org/adrianvictor/lib/configuration/provider/ConfigurationProvider.java new file mode 100644 index 0000000..718212e --- /dev/null +++ b/src/main/java/org/adrianvictor/lib/configuration/provider/ConfigurationProvider.java @@ -0,0 +1,33 @@ +package org.adrianvictor.lib.configuration.provider; + +import org.adrianvictor.lib.configuration.exception.InvalidConfigurationException; + +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.util.List; +import java.util.Map; + +public interface ConfigurationProvider { + void load(File file) throws IOException, InvalidConfigurationException; + void load(String contents) throws IOException, InvalidConfigurationException; + void load(Reader reader) throws IOException, InvalidConfigurationException; + boolean save(File file); + boolean save(); + String saveToString(); + Object getProperty(String path); + void setProperty(String path, Object value); + Map getAll(); + boolean getBoolean(String path, boolean def); + List getBooleanList(String path, List def); + double getDouble(String path, double def); + List getDoubleList(String path, List def); + int getInt(String path, int def); + String getString(String path); + String getString(String path, String def); + List getStringList(String path, List def); + List getIntList(String path, List def); + List getKeys(String path); + List getKeys(); + List getList(String path); +} \ No newline at end of file diff --git a/src/main/java/org/adrianvictor/lib/reflection/ImplementationRegistry.java b/src/main/java/org/adrianvictor/lib/reflection/ImplementationRegistry.java new file mode 100644 index 0000000..fcdf626 --- /dev/null +++ b/src/main/java/org/adrianvictor/lib/reflection/ImplementationRegistry.java @@ -0,0 +1,24 @@ +package org.adrianvictor.lib.reflection; + +public class ImplementationRegistry { + + private final String classSuffix; + + public ImplementationRegistry(String classSuffix) { + this.classSuffix = classSuffix; + } + + public T getInstance(Class interfaceClass, String packagePath) { + String implClassName = packagePath.replace( + "org.adrianvictor.lib", + "org.adrianvictor.lib.impl." + classSuffix + ); + + try { + Class implClass = Class.forName(implClassName); + return interfaceClass.cast(implClass.getDeclaredConstructor().newInstance()); + } catch (ReflectiveOperationException e) { + throw new IllegalStateException("Cannot load " + implClassName, e); + } + } +} diff --git a/src/main/java/org/adrianvictor/lib/reflection/VersionMatcher.java b/src/main/java/org/adrianvictor/lib/reflection/VersionMatcher.java new file mode 100644 index 0000000..6c80828 --- /dev/null +++ b/src/main/java/org/adrianvictor/lib/reflection/VersionMatcher.java @@ -0,0 +1,116 @@ +package org.adrianvictor.lib.reflection; + +import org.bukkit.Bukkit; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class VersionMatcher { + + public VersionMatcher() {} + + private record Entry(String pattern, String classSuffix) {} + + public String getClassSuffix(String type, String serverVersion) { + if (type == null || serverVersion == null) { + return null; + } + + Map> map = populateMap(); + List entries = map.get(type.toLowerCase()); + if (entries == null || entries.isEmpty()) { + return null; + } + + // Exact match + for (Entry e : entries) { + if (safeMatches(e.pattern, serverVersion)) { + return e.classSuffix; + } + } + + // Fallback to closest version + List sorted = new ArrayList<>(entries); + Collections.sort(sorted, (a, b) -> compareVersions(a.pattern, b.pattern)); + + Entry oldest = sorted.get(0); + Entry newest = sorted.get(sorted.size() - 1); + + int cmpOldest = compareVersions(serverVersion, oldest.pattern); + int cmpNewest = compareVersions(serverVersion, newest.pattern); + + if (cmpOldest < 0) { + return oldest.classSuffix; + } else if (cmpNewest > 0) { + return newest.classSuffix; + } + + return newest.classSuffix; + } + + public String getServerVersion() { + String rawVersion = null; + try { + rawVersion = Bukkit.getMinecraftVersion(); + } catch (NoSuchMethodError ignored) {} + + if (rawVersion == null || rawVersion.isEmpty()) { + String v = Bukkit.getVersion(); + int start = v.lastIndexOf("MC: "); + if (start != -1) { + rawVersion = v.substring(start + 4, v.length() - 1); + } else { + rawVersion = "unknown"; + } + } + + return rawVersion; + } + + private Map> populateMap() { + Map> map = new HashMap<>(); + map.put("release", List.of( + new Entry("^1\\.21\\..*$", "r1_21") + )); + map.put("beta", List.of( + new Entry("^1\\.7\\.3$", "b1_7_3") + )); + return map; + } + + private int compareVersions(String v1, String v2) { + String clean1 = v1.replaceAll("[^0-9.]", ""); + String clean2 = v2.replaceAll("[^0-9.]", ""); + + String[] a1 = clean1.split("\\."); + String[] a2 = clean2.split("\\."); + + int len = Math.max(a1.length, a2.length); + for (int i = 0; i < len; i++) { + int n1 = i < a1.length ? parseInt(a1[i]) : 0; + int n2 = i < a2.length ? parseInt(a2[i]) : 0; + if (n1 != n2) { + return n1 - n2; + } + } + return 0; + } + + private int parseInt(String s) { + try { + return Integer.parseInt(s); + } catch (NumberFormatException e) { + return 0; + } + } + + private static boolean safeMatches(String expression, String against) { + String cleanPattern = expression.trim(); + Pattern pattern = Pattern.compile(cleanPattern, Pattern.CASE_INSENSITIVE); + return pattern.matcher(against).matches(); + } +} \ No newline at end of file diff --git a/src/main/java/org/adrianvictor/lib/text/TextColor.java b/src/main/java/org/adrianvictor/lib/text/TextColor.java new file mode 100644 index 0000000..98ca014 --- /dev/null +++ b/src/main/java/org/adrianvictor/lib/text/TextColor.java @@ -0,0 +1,10 @@ +package org.adrianvictor.lib.text; + +import org.adrianvictor.lib.Main; +import org.adrianvictor.lib.text.provider.TextColorProvider; + +public class TextColor { + public static TextColorProvider create() { + return Main.getInstance().getRegistry().getInstance(TextColorProvider.class, "org.adrianvictor.lib.text"); + } +} diff --git a/src/main/java/org/adrianvictor/lib/text/TextColorUtils.java b/src/main/java/org/adrianvictor/lib/text/TextColorUtils.java new file mode 100644 index 0000000..ba0fe58 --- /dev/null +++ b/src/main/java/org/adrianvictor/lib/text/TextColorUtils.java @@ -0,0 +1,31 @@ +package org.adrianvictor.lib.text; + +import org.adrianvictor.lib.text.provider.TextColorProvider; + +public class TextColorUtils { + private static final TextColorProvider provider = TextColor.create(); + + public static String formatColors(String message) { + return message.replace("&", "§"); + } + + public static String ignoreColors(String message) { + return message.replaceAll("&([0-9a-fk-or])", ""); + } + + public static String rainbow(String message) { + String[] colorNames = {"RED", "GOLD", "YELLOW", "GREEN", "AQUA", "BLUE", "LIGHT_PURPLE"}; + int colorIndex = 0; + String coloredMessage = ""; + + for (char c : message.toCharArray()) { + String currentColor = provider.colorize(colorNames[colorIndex]); + coloredMessage += currentColor + c; + colorIndex++; + if (colorIndex >= colorNames.length) { + colorIndex = 0; + } + } + return coloredMessage; + } +} diff --git a/src/main/java/gd/rf/adrianvictor/lib/Text.java b/src/main/java/org/adrianvictor/lib/text/TextUtils.java similarity index 86% rename from src/main/java/gd/rf/adrianvictor/lib/Text.java rename to src/main/java/org/adrianvictor/lib/text/TextUtils.java index 82c2f0b..84033bf 100644 --- a/src/main/java/gd/rf/adrianvictor/lib/Text.java +++ b/src/main/java/org/adrianvictor/lib/text/TextUtils.java @@ -1,10 +1,8 @@ -package gd.rf.adrianvictor.lib; +package org.adrianvictor.lib.text; import java.util.Random; -import org.bukkit.ChatColor; - -public class Text { +public class TextUtils { public static String generateRandomString(int length) { String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; Random random = new Random(); diff --git a/src/main/java/org/adrianvictor/lib/text/provider/TextColorProvider.java b/src/main/java/org/adrianvictor/lib/text/provider/TextColorProvider.java new file mode 100644 index 0000000..a106e58 --- /dev/null +++ b/src/main/java/org/adrianvictor/lib/text/provider/TextColorProvider.java @@ -0,0 +1,5 @@ +package org.adrianvictor.lib.text.provider; + +public interface TextColorProvider { + String colorize(String colorCode); +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 643f8ef..5585d53 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,8 @@ +name: tenkumaLib author: tenkuma database: false -main: gd.rf.adrianvictor.lib.Main -name: tenkumaLib +main: org.adrianvictor.lib.Main startup: startup -url: https://adrianvictor.rf.gd -version: '1.0' \ No newline at end of file +url: https://adrianvic.github.io +version: '2.0' +api-version: '1.13' \ No newline at end of file diff --git a/src/r1_21/java/org/adrianvictor/lib/configuration/Configuration.java b/src/r1_21/java/org/adrianvictor/lib/configuration/Configuration.java new file mode 100644 index 0000000..a6eb3d0 --- /dev/null +++ b/src/r1_21/java/org/adrianvictor/lib/configuration/Configuration.java @@ -0,0 +1,153 @@ +package org.adrianvictor.lib.configuration; + +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.util.*; + +public class Configuration implements org.adrianvictor.lib.configuration.provider.ConfigurationProvider { + YamlConfiguration config = new YamlConfiguration(); + File configFile; + + @Override + public void load(File file) throws IOException, org.adrianvictor.lib.configuration.exception.InvalidConfigurationException { + try { + config.load(file); + configFile = file; + } catch (InvalidConfigurationException e) { + throw new org.adrianvictor.lib.configuration.exception.InvalidConfigurationException(e.getMessage()); + } + } + + @Override + public void load(String contents) throws IOException, org.adrianvictor.lib.configuration.exception.InvalidConfigurationException { + try { + config.load(contents); + } catch (InvalidConfigurationException e) { + throw new org.adrianvictor.lib.configuration.exception.InvalidConfigurationException(e.getMessage()); + } + } + + @Override + public void load(Reader reader) throws IOException, org.adrianvictor.lib.configuration.exception.InvalidConfigurationException { + try { + config.load(reader); + } catch (InvalidConfigurationException e) { + throw new org.adrianvictor.lib.configuration.exception.InvalidConfigurationException(e.getMessage()); + } + } + + @Override + public boolean save(File file) { + try { + config.save(file); + return true; + } catch (IOException e) { + return false; + } + } + + @Override + public boolean save() { + try { + config.save(configFile); + return true; + } catch (IOException e) { + return false; + } + } + + @Override + public String saveToString() { + return config.saveToString(); + } + + @Override + public Object getProperty(String path) { + return config.get(path); + } + + @Override + public void setProperty(String path, Object value) { + config.set(path, value); + } + + @Override + public Map getAll() { + assert config.getRoot() != null; + return config.getRoot().getValues(true); + } + + @Override + public boolean getBoolean(String path, boolean def) { + return config.getBoolean(path, def); + } + + @Override + public List getBooleanList(String path, List def) { + List result = config.getBooleanList(path); + if (result.isEmpty()) result = def; + return result; + } + + @Override + public double getDouble(String path, double def) { + return config.getDouble(path, def); + } + + @Override + public List getDoubleList(String path, List def) { + List result = config.getDoubleList(path); + if (result.isEmpty()) result = def; + return result; + } + + @Override + public int getInt(String path, int def) { + return config.getInt(path, def); + } + + @Override + public String getString(String path) { + return config.getString(path); + } + + @Override + public String getString(String path, String def) { + return config.getString(path, def); + } + + @Override + public List getStringList(String path, List def) { + List result = config.getStringList(path); + if (result.isEmpty()) result = def; + return result; + } + + @Override + public List getIntList(String path, List def) { + List result = config.getIntegerList(path); + if (result.isEmpty()) result = def; + return result; + } + + @Override + public List getKeys(String path) { + Set set = Objects.requireNonNull(config.getConfigurationSection(path)).getKeys(true); + return set.stream().toList(); + } + + @Override + public List getKeys() { + Set set = Objects.requireNonNull(config.getRoot()).getKeys(true); + return set.stream().toList(); + } + + @Override + public List getList(String path) { + return Collections.singletonList(config.getList(path)); + } +} diff --git a/src/r1_21/java/org/adrianvictor/lib/text/TextColor.java b/src/r1_21/java/org/adrianvictor/lib/text/TextColor.java new file mode 100644 index 0000000..f1b76dc --- /dev/null +++ b/src/r1_21/java/org/adrianvictor/lib/text/TextColor.java @@ -0,0 +1,10 @@ +package org.adrianvictor.lib.text; + +import net.kyori.adventure.text.format.NamedTextColor; + +public class TextColor implements org.adrianvictor.lib.text.provider.TextColorProvider { + @Override + public String colorize(String colorCode) { + return NamedTextColor.NAMES.valueOr(colorCode, NamedTextColor.WHITE).toString(); + } +}