diff --git a/build.gradle b/build.gradle index feb9f35..4ca1ddd 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } version project.properties["pluginVersion"] -targetCompatibility = sourceCompatibility = JavaVersion.VERSION_11 +targetCompatibility = sourceCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() @@ -13,10 +13,7 @@ repositories { [ "https://jitpack.io", "https://papermc.io/repo/repository/maven-public/", - "https://oss.sonatype.org/content/groups/public/", - "https://repo.extendedclip.com/content/repositories/placeholderapi/", - "http://repo.comphenix.net/content/repositories/releases/", - "http://repo.comphenix.net/content/repositories/snapshots/" + "https://os1.oss.sonatype.org/content/groups/public/" ].each { s -> maven { url s @@ -27,24 +24,15 @@ repositories { dependencies { //provided [ - "com.destroystokyo.paper:paper-api:1.16.4-R0.1-SNAPSHOT", - "net.md-5:bungeecord-api:1.16-R0.4-SNAPSHOT", - "io.github.waterfallmc:waterfall-api:1.16-R0.4-SNAPSHOT", - "me.clip:placeholderapi:2.10.9", - files("libs/spigot-1.16.5.jar"), - files("libs/spigot-1.16.4.jar") + "io.papermc.paper:paper-api:1.18-R0.1-SNAPSHOT", ].each {s -> compileOnly s } - compileOnly ("com.github.dmulloy2:ProtocolLib:4.5.1") { - exclude group: "com.comphenix.executors" - } - //compile [ - "org.jetbrains:annotations:20.1.0", - "org.reflections:reflections:0.9.12" + "org.jetbrains:annotations:23.0.0", + "org.reflections:reflections:0.10.2" ].each {s -> implementation s } @@ -63,6 +51,17 @@ shadowJar { } } +apply plugin: 'maven-publish' +apply plugin: 'signing' + +signing { + sign configurations.archives +} + +group = "io.github.simplexdevelopment" +archivesBaseName = "simplex-core" +version = "1.0.0" + processResources { //update resources when building doFirst { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bb8b2fc..ffed3a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/io/github/simplexdev/api/IBan.java b/src/main/java/io/github/simplexdev/api/IBan.java index 01eab24..802dc40 100644 --- a/src/main/java/io/github/simplexdev/api/IBan.java +++ b/src/main/java/io/github/simplexdev/api/IBan.java @@ -1,6 +1,7 @@ package io.github.simplexdev.api; import io.github.simplexdev.simplexcore.ban.BanType; +import net.kyori.adventure.text.Component; import java.util.Date; import java.util.UUID; @@ -10,7 +11,7 @@ public interface IBan { String getSender(); - String getBanReason(); + Component getBanReason(); String getBanId(); diff --git a/src/main/java/io/github/simplexdev/api/IGUI.java b/src/main/java/io/github/simplexdev/api/IGUI.java index f294979..1c3336b 100644 --- a/src/main/java/io/github/simplexdev/api/IGUI.java +++ b/src/main/java/io/github/simplexdev/api/IGUI.java @@ -1,6 +1,7 @@ package io.github.simplexdev.api; import io.github.simplexdev.api.func.ClickAction; +import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; @@ -74,10 +75,10 @@ public interface IGUI { * Creates a new ItemStack instance to place in the inventory provided by the interface instance. * @param material The item material * @param name The name of the item - * @param lore Optional item descriptions + * @param lore Optional item descriptions, as components. * @return The newly created item */ - ItemStack newItem(@NotNull Material material, @NotNull String name, String... lore); + ItemStack newItem(@NotNull Material material, @NotNull String name, Component... lore); /** * Creates a new ItemStack instance to place in the inventory provided by the interface instance. diff --git a/src/main/java/io/github/simplexdev/api/func/VoidSupplier.java b/src/main/java/io/github/simplexdev/api/func/VoidSupplier.java index 9911313..3e912bf 100644 --- a/src/main/java/io/github/simplexdev/api/func/VoidSupplier.java +++ b/src/main/java/io/github/simplexdev/api/func/VoidSupplier.java @@ -1,10 +1,12 @@ package io.github.simplexdev.api.func; +import org.jetbrains.annotations.NotNull; + @FunctionalInterface public interface VoidSupplier { void get(); - default VoidSupplier after(VoidSupplier supplier) { + default VoidSupplier after(@NotNull VoidSupplier supplier) { supplier.get(); return this; } diff --git a/src/main/java/io/github/simplexdev/simplexcore/CoreState.java b/src/main/java/io/github/simplexdev/simplexcore/CoreState.java index 11d09fe..5c2469b 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/CoreState.java +++ b/src/main/java/io/github/simplexdev/simplexcore/CoreState.java @@ -7,18 +7,10 @@ public class CoreState { public CoreState(SimplexCorePlugin plugin) { this.plugin = plugin; switch (getState()) { - case ON: - message = "The Core is currently ON"; - break; - case SUSPENDED: - message = "The Core is currently SUSPENDED. Please report this to the developer."; - break; - case DEBUG: - message = "The Core is currently in DEBUG mode. Do not use this if you don't know what you're doing."; - break; - case VOLATILE: - message = "The Core state is currently unknown! Please report this to the developer!"; - break; + case ON -> message = "The Core is currently ON"; + case SUSPENDED -> message = "The Core is currently SUSPENDED. Please report this to the developer."; + case DEBUG -> message = "The Core is currently in DEBUG mode. Do not use this if you don't know what you're doing."; + case VOLATILE -> message = "The Core state is currently unknown! Please report this to the developer!"; } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/ban/Ban.java b/src/main/java/io/github/simplexdev/simplexcore/ban/Ban.java index 9a51f04..86516d5 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/ban/Ban.java +++ b/src/main/java/io/github/simplexdev/simplexcore/ban/Ban.java @@ -9,6 +9,7 @@ import io.github.simplexdev.simplexcore.listener.SimplexListener; import io.github.simplexdev.simplexcore.module.SimplexModule; import io.github.simplexdev.simplexcore.utils.TickedTime; import io.github.simplexdev.simplexcore.utils.Utilities; +import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; @@ -33,7 +34,7 @@ public abstract class Ban implements IBan { private final SimplexModule plugin; private final String banId; - private final String banReason; + private final Component banReason; /** * Creates a new Ban Entry. @@ -79,7 +80,7 @@ public abstract class Ban implements IBan { * @param banDate The date when the ban was created. * @param banDuration How long the ban should last. */ - public Ban(SimplexModule plugin, Player player, CommandSender sender, BanType type, String banId, String banReason, Date banDate, long banDuration) { + public Ban(SimplexModule plugin, Player player, CommandSender sender, BanType type, String banId, Component banReason, Date banDate, long banDuration) { this.plugin = plugin; this.player = player; this.sender = sender; @@ -92,18 +93,20 @@ public abstract class Ban implements IBan { /** * Writes the Ban to a file. - * @param separateFiles Whether or not to create individual files for players or store them all in one bans.yml file. + * @param separateFiles Whether to create individual files for players or store + * them all in one bans.yml file. */ public void writeToFile(boolean separateFiles) { File fileLocation = new File(plugin.getParentFolder(), "bans"); + Yaml yaml; if (separateFiles) { - Yaml yaml = new YamlFactory(plugin).from(null, fileLocation, player.getName() + ".yml"); + yaml = new YamlFactory(plugin).from(null, fileLocation, player.getName() + ".yml"); ConfigurationSection section = yaml.getConfig().createSection(getOffender().toString()); section.set("name", player.getName()); section.set("ban_id", banId); section.set("sender", sender.getName()); - section.set("reason", banReason); + section.set("reason", banReason.toString()); section.set("duration", banDuration); section.set("date", banDate.getTime()); section.set("type", type.toString()); @@ -112,14 +115,13 @@ public abstract class Ban implements IBan { } catch (IOException e) { plugin.getLogger().severe(e.getMessage()); } - yaml.reload(); } else { - Yaml yaml = new YamlFactory(plugin).from(null, fileLocation, "bans.yml"); + yaml = new YamlFactory(plugin).from(null, fileLocation, "bans.yml"); ConfigurationSection section = yaml.getConfig().createSection(getOffender().toString()); section.set("name", player.getName()); section.set("ban_id", banId); section.set("sender", sender.getName()); - section.set("reason", banReason); + section.set("reason", banReason.toString()); section.set("duration", banDuration); section.set("date", banDate.getTime()); section.set("type", type.toString()); @@ -128,7 +130,7 @@ public abstract class Ban implements IBan { } catch (IOException ex) { plugin.getLogger().severe(ex.getMessage()); } - yaml.reload(); } + yaml.reload(); } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/ban/BanFactory.java b/src/main/java/io/github/simplexdev/simplexcore/ban/BanFactory.java index 74aa487..1214cdb 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/ban/BanFactory.java +++ b/src/main/java/io/github/simplexdev/simplexcore/ban/BanFactory.java @@ -4,12 +4,15 @@ import io.github.simplexdev.api.IBan; import io.github.simplexdev.api.func.VoidSupplier; import io.github.simplexdev.simplexcore.chat.Messages; import io.github.simplexdev.simplexcore.config.Yaml; -import io.github.simplexdev.simplexcore.config.YamlFactory; import io.github.simplexdev.simplexcore.module.SimplexModule; import io.github.simplexdev.simplexcore.utils.TickedTime; import io.github.simplexdev.simplexcore.utils.Utilities; +import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.Date; @@ -24,7 +27,7 @@ public final class BanFactory { private final Date banDate; private final BanType type; private final String banId; - private String banReason; + private Component banReason; private long banDuration; public BanFactory(SimplexModule plugin, Player player, CommandSender sender, Date banDate, BanType type) { @@ -46,13 +49,13 @@ public final class BanFactory { * @param banReason The reason for the ban. By default, this uses Messages#BAN for the message. * @return The current instance of BanFactory. */ - public BanFactory defineOptional(long banDuration, String banReason) { + public BanFactory defineOptional(long banDuration, Component banReason) { this.banDuration = banDuration; this.banReason = banReason; return this; } - public void write(Yaml yaml, IBan ban) { + public void write(@NotNull Yaml yaml, @NotNull IBan ban) { yaml.set(pathway("offender"), ban.getOffender()); yaml.set(pathway("sender"), ban.getSender()); yaml.set(pathway("duration"), ban.getBanDuration()); @@ -63,7 +66,8 @@ public final class BanFactory { yaml.create(); } - public Yaml read(File yamlFile) { + @Contract(pure = true) + public @Nullable Yaml read(File yamlFile) { return null; } @@ -72,7 +76,8 @@ public final class BanFactory { * * @return A new ban instance. */ - public Ban create() { + @Contract(" -> new") + public @NotNull Ban create() { return new Ban(plugin, player, sender, type, banDuration) { @Override public UUID getOffender() { @@ -85,7 +90,7 @@ public final class BanFactory { } @Override - public String getBanReason() { + public Component getBanReason() { return banReason; } @@ -115,19 +120,23 @@ public final class BanFactory { // TODO } - public IBan getBan(String banId) { + @Contract(pure = true) + public @Nullable IBan getBan(String banId) { return null; } - public IBan getBan(Player player) { + @Contract(pure = true) + public @Nullable IBan getBan(Player player) { return null; } - public IBan getBan(UUID offenderUUID) { + @Contract(pure = true) + public @Nullable IBan getBan(UUID offenderUUID) { return null; } - private VoidSupplier assignBanDuration(Long... time) { + @Contract(pure = true) + private @NotNull VoidSupplier assignBanDuration(Long... time) { return () -> { if (type.equals(BanType.PERMANENT)) { banDuration = TickedTime.YEAR * 99; @@ -145,7 +154,7 @@ public final class BanFactory { }; } - private String createBanId() { + private @NotNull String createBanId() { return Utilities.generateBanId(type); } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/ban/BanManager.java b/src/main/java/io/github/simplexdev/simplexcore/ban/BanManager.java index 1b46305..67104d7 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/ban/BanManager.java +++ b/src/main/java/io/github/simplexdev/simplexcore/ban/BanManager.java @@ -7,6 +7,7 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.event.EventHandler; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Date; @@ -19,11 +20,9 @@ import static org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result; public final class BanManager extends SimplexListener { private final Map banMap = new HashMap<>(); - private final SimplexModule plugin; BanManager(SimplexModule plugin) { - this.plugin = plugin; - register(this, plugin); + super(plugin); } public void addBan(Ban ban) { @@ -47,7 +46,7 @@ public final class BanManager extends SimplexListener { } @EventHandler - public void banHandler(AsyncPlayerPreLoginEvent event) { + public void banHandler(@NotNull AsyncPlayerPreLoginEvent event) { UUID player = event.getUniqueId(); OfflinePlayer op = Bukkit.getOfflinePlayer(player); Ban ban = getBan(op); diff --git a/src/main/java/io/github/simplexdev/simplexcore/ban/BanType.java b/src/main/java/io/github/simplexdev/simplexcore/ban/BanType.java index 5cad1c1..6eeffce 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/ban/BanType.java +++ b/src/main/java/io/github/simplexdev/simplexcore/ban/BanType.java @@ -1,5 +1,7 @@ package io.github.simplexdev.simplexcore.ban; +import org.jetbrains.annotations.NotNull; + public enum BanType { PERMANENT("P-"), TEMPORARY("T-"), @@ -12,7 +14,7 @@ public enum BanType { this.prefix = prefix; } - public static String value(BanType type) { + public static @NotNull String value(@NotNull BanType type) { if (type.equals(PERMANENT)) { return "Permanent"; } else if (type.equals(TEMPORARY)) { @@ -22,7 +24,7 @@ public enum BanType { } } - public static BanType getFromId(String banId) { + public static BanType getFromId(@NotNull String banId) { if (banId.startsWith("P")) { return PERMANENT; } else if (banId.startsWith("T")) { diff --git a/src/main/java/io/github/simplexdev/simplexcore/block/AbstractSign.java b/src/main/java/io/github/simplexdev/simplexcore/block/AbstractSign.java index 6cec7c9..3c6c3a5 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/block/AbstractSign.java +++ b/src/main/java/io/github/simplexdev/simplexcore/block/AbstractSign.java @@ -5,6 +5,7 @@ import io.github.simplexdev.api.func.VoidSupplier; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Sign; +import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.List; @@ -19,7 +20,7 @@ public abstract class AbstractSign implements IUsableSign { protected VoidSupplier executeScript = null; protected boolean canInteract = false; - protected AbstractSign(Sign sign) { + protected AbstractSign(@NotNull Sign sign) { this.sign = sign; this.location = sign.getLocation(); this.world = sign.getWorld(); diff --git a/src/main/java/io/github/simplexdev/simplexcore/chat/ChatUtils.java b/src/main/java/io/github/simplexdev/simplexcore/chat/ChatUtils.java index 6792d16..eb54b35 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/chat/ChatUtils.java +++ b/src/main/java/io/github/simplexdev/simplexcore/chat/ChatUtils.java @@ -1,17 +1,20 @@ package io.github.simplexdev.simplexcore.chat; -import net.md_5.bungee.api.chat.TextComponent; +import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; public final class ChatUtils { - protected final CommandSender target; - protected final TextComponentFactory factory = new TextComponentFactory(); + private final CommandSender target; + private final TextComponentFactory factory = new TextComponentFactory(); private ChatUtils(T target) { this.target = target; } - public static ChatUtils target(T target) { + @Contract("_ -> new") + public static @NotNull ChatUtils msgTarget(T target) { return new ChatUtils(target); } @@ -19,21 +22,11 @@ public final class ChatUtils { target.sendMessage(message); } - public void msg(TextComponent component) { - target.spigot().sendMessage(component); + public void msg(Component component) { + target.sendMessage(component); } - public void err(Messages message) { + public void err(@NotNull Messages message) { target.sendMessage(message.getMessage()); } - - public void color(String message) { - target.sendMessage(factory.colorize(message)); - } - - public void color(TextComponent component) { - target.sendMessage(factory.colorize(component.getText())); - } - - } diff --git a/src/main/java/io/github/simplexdev/simplexcore/chat/Messages.java b/src/main/java/io/github/simplexdev/simplexcore/chat/Messages.java index 64db902..aefb045 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/chat/Messages.java +++ b/src/main/java/io/github/simplexdev/simplexcore/chat/Messages.java @@ -1,22 +1,23 @@ package io.github.simplexdev.simplexcore.chat; -import io.github.simplexdev.simplexcore.CoreState; +import net.kyori.adventure.text.Component; public enum Messages { - NO_PERMS("You do not have permission to use this command!"), - DISCORD("https://discord.gg/Rumx5dTJuf"), - BAN("You have been banned from this server."), - KICK("You have been kicked by a moderator."), - AFK_KICK("You were kicked to ensure space for active players."), - PERMBAN("You are permanently banned from this server."); + NO_PERMS(Component.text("You do not have permission to use this command!")), + DISCORD(Component.text("https://discord.gg/Rumx5dTJuf")), + BAN(Component.text("You have been banned from this server.")), + KICK(Component.text("You have been kicked by a moderator.")), + AFK_KICK(Component.text("You were kicked to ensure space for active players.")), + PERMBAN(Component.text("You are permanently banned from this server.")); - String message; - Messages(String message) { + final Component message; + + Messages(Component message) { this.message = message; } - public String getMessage() { + public Component getMessage() { return message; } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/chat/TextComponentFactory.java b/src/main/java/io/github/simplexdev/simplexcore/chat/TextComponentFactory.java index 7df45ac..df3a9a5 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/chat/TextComponentFactory.java +++ b/src/main/java/io/github/simplexdev/simplexcore/chat/TextComponentFactory.java @@ -1,72 +1,43 @@ package io.github.simplexdev.simplexcore.chat; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.chat.hover.content.Text; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public final class TextComponentFactory { @NotNull public TextComponent textComponent(@NotNull String message) { - TextComponent component = new TextComponent(); - component.setText(message); - return component; + return Component.text(message); } @NotNull - public TextComponent clickableComponent(@NotNull String message, @NotNull String clickAction, @NotNull ClickEvent.Action actionType) { - TextComponent comp = new TextComponent(); - ClickEvent onClick = new ClickEvent(actionType, clickAction); - comp.setText(message); - comp.setClickEvent(onClick); - return comp; + public Component clickableComponent(@NotNull String message, @NotNull String clickAction, @NotNull ClickEvent.Action actionType) { + Component comp = Component.text(message); + ClickEvent onClick = ClickEvent.clickEvent(actionType, clickAction); + return comp.clickEvent(onClick); } @NotNull - public TextComponent coloredComponent(@NotNull String message, @Nullable ChatColor color) { - TextComponent component = new TextComponent(); - if (color != null) component.setColor(color); - component.setText(message); - return component; + public Component addColor(@NotNull Component component, @NotNull TextColor color) { + return component.color(color); } @NotNull - public TextComponent clickableColored(@NotNull String message, @NotNull String clickMessage, @NotNull ClickEvent.Action actionType, @Nullable ChatColor color) { - TextComponent comp = new TextComponent(); - ClickEvent onClick = new ClickEvent(actionType, clickMessage); - if (color != null) comp.setColor(color); - comp.setText(message); - comp.setClickEvent(onClick); - return comp; + public Component resetColor(@NotNull Component component) { + return component.color(TextColor.fromHexString("#FFFFFF")); } @NotNull - public TextComponent addColor(@NotNull TextComponent component, @NotNull ChatColor color) { - component.setColor(color); - return component; - } - - @NotNull - public TextComponent resetColor(@NotNull TextComponent component) { - component.setColor(ChatColor.RESET); - return component; - } - - @NotNull - public TextComponent hoverableText(@NotNull String message, @NotNull String hoverMessage, @NotNull HoverEvent.Action action) { - TextComponent comp = new TextComponent(); - comp.setText(message); - Text text = new Text(hoverMessage); - HoverEvent event = new HoverEvent(action, text); - comp.setHoverEvent(event); - return comp; - } - - @NotNull - public String colorize(@NotNull String message) { - return ChatColor.translateAlternateColorCodes('&', message); + public Component hoverText(@NotNull String message, @NotNull String hoverMessage) { + Component comp = Component.text(message); + Component msg = Component.text(hoverMessage); + HoverEvent event = HoverEvent.showText(msg); + return comp.hoverEvent(event); } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/command/CommandLoader.java b/src/main/java/io/github/simplexdev/simplexcore/command/CommandLoader.java index 3f3e0ae..f9b7e40 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/command/CommandLoader.java +++ b/src/main/java/io/github/simplexdev/simplexcore/command/CommandLoader.java @@ -2,6 +2,7 @@ package io.github.simplexdev.simplexcore.command; import io.github.simplexdev.api.annotations.CommandInfo; import io.github.simplexdev.simplexcore.SimplexCorePlugin; +import io.github.simplexdev.simplexcore.chat.TextComponentFactory; import io.github.simplexdev.simplexcore.module.SimplexModule; import io.github.simplexdev.simplexcore.utils.ReflectionTools; import org.bukkit.command.CommandExecutor; @@ -35,7 +36,6 @@ public final class CommandLoader { /** * Prepares the CommandLoader to load your plugin's commands from its own package location. - * This is synchronized, so it only registers commands from one plugin at a time. * All your commands MUST be placed in their own package. *

* If your command classes do not have the {@link CommandInfo} annotation, they will not be loaded. @@ -78,6 +78,8 @@ public final class CommandLoader { throw new CommandLoaderException("Please run CommandLoader#classpath(SimplexModule, Class) first!"); } + TextComponentFactory factory = new TextComponentFactory(); + reflections.getTypesAnnotatedWith(CommandInfo.class).forEach(annotated -> { CommandInfo info = annotated.getDeclaredAnnotation(CommandInfo.class); @@ -105,7 +107,7 @@ public final class CommandLoader { command.setExecutor(getExecutorFromName(info.name())); command.setLabel(info.name().toLowerCase()); command.setPermission(info.permission()); - command.setPermissionMessage(info.permissionMessage()); + command.permissionMessage(factory.textComponent(info.permissionMessage())); command.setTabCompleter(getTabFromName(info.name())); command.setUsage(info.usage()); registry.registerCommand(command); diff --git a/src/main/java/io/github/simplexdev/simplexcore/command/SimplexCommand.java b/src/main/java/io/github/simplexdev/simplexcore/command/SimplexCommand.java index 140d8d0..b8bb195 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/command/SimplexCommand.java +++ b/src/main/java/io/github/simplexdev/simplexcore/command/SimplexCommand.java @@ -3,6 +3,9 @@ package io.github.simplexdev.simplexcore.command; import io.github.simplexdev.simplexcore.SimplexCorePlugin; import io.github.simplexdev.simplexcore.module.SimplexModule; import io.github.simplexdev.simplexcore.utils.Utilities; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentBuilder; +import net.kyori.adventure.text.JoinConfiguration; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -14,6 +17,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; public abstract class SimplexCommand implements CommandExecutor, TabCompleter { private final SimplexModule plugin; @@ -71,23 +75,47 @@ public abstract class SimplexCommand implements CommandExecutor, TabCompleter { * @param player The Player to send a message to * @param messages The messages to send. */ - public void playerMsg(Player player, String... messages) { + public void playerMsg(@NotNull Player player, String... messages) { StringBuilder builder = new StringBuilder(); Utilities.forEach(messages, builder::append); - player.sendMessage(builder.toString()); + player.sendMessage(Component.text(builder.toString())); } /** * Send a message or a group of messages to a {@link CommandSender} - * If you want the messages to send on new lines, put \n at the end of each message to send. + * If you want the messages to send on separate lines, + * put \n at the end of each message to send. * * @param sender The CommandSender to send a message to. * @param messages The messages to send. */ - public void msg(CommandSender sender, String... messages) { + public void msg(@NotNull CommandSender sender, String... messages) { StringBuilder builder = new StringBuilder(); Utilities.forEach(messages, builder::append); - sender.sendMessage(builder.toString()); + sender.sendMessage(Component.text(builder.toString())); + } + + /** + * Send a component or a group of components to a {@link CommandSender}. + * If you want the components to occupy separate lines, + * use the separator boolean. + * + * @param sender The CommandSender to send components to + * @param components The components to send. + */ + public void msg(@NotNull CommandSender sender, boolean separator, Component... components) { + if (separator) { + AtomicReference primary = new AtomicReference<>(Component.text("")); + AtomicReference temp = new AtomicReference<>(Component.text("")); + Utilities.forEach(components, component -> { + temp.set(Component.newline().append(component)); + primary.set(primary.get().append(temp.get())); + }); // The way I'm doing this is probably unnecessary, but I did it anyway. + sender.sendMessage(primary.get()); + return; + } + + sender.sendMessage(Component.join(JoinConfiguration.builder().build(), components)); } @Nullable diff --git a/src/main/java/io/github/simplexdev/simplexcore/command/defaults/Command_info.java b/src/main/java/io/github/simplexdev/simplexcore/command/defaults/Command_info.java index b9de62e..c9f25e0 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/command/defaults/Command_info.java +++ b/src/main/java/io/github/simplexdev/simplexcore/command/defaults/Command_info.java @@ -4,6 +4,7 @@ import io.github.simplexdev.api.annotations.CommandInfo; import io.github.simplexdev.simplexcore.chat.Messages; import io.github.simplexdev.simplexcore.command.SimplexCommand; import io.github.simplexdev.simplexcore.module.SimplexModule; +import net.kyori.adventure.text.Component; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/io/github/simplexdev/simplexcore/command/defaults/DefaultCommand.java b/src/main/java/io/github/simplexdev/simplexcore/command/defaults/DefaultCommand.java index 7443e01..f580a26 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/command/defaults/DefaultCommand.java +++ b/src/main/java/io/github/simplexdev/simplexcore/command/defaults/DefaultCommand.java @@ -3,6 +3,7 @@ package io.github.simplexdev.simplexcore.command.defaults; import io.github.simplexdev.api.annotations.CommandInfo; import io.github.simplexdev.simplexcore.command.SimplexCommand; import io.github.simplexdev.simplexcore.module.SimplexModule; +import net.kyori.adventure.text.Component; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -15,7 +16,7 @@ public final class DefaultCommand extends SimplexCommand { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - sender.sendMessage("If you are seeing this when running your command, your command didn't register properly."); + msg(sender, "If you are seeing this when running your command, your command didn't register properly."); return true; } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/config/Yaml.java b/src/main/java/io/github/simplexdev/simplexcore/config/Yaml.java index e33d6a2..5dad12a 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/config/Yaml.java +++ b/src/main/java/io/github/simplexdev/simplexcore/config/Yaml.java @@ -7,6 +7,8 @@ import io.github.simplexdev.simplexcore.module.SimplexModule; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; @@ -22,7 +24,7 @@ public final class Yaml implements IConfig { private File file; // Package private ;) - Yaml(SimplexModule plugin, String fileName, File directory, String resourcePath) { + Yaml(SimplexModule plugin, @NotNull String fileName, File directory, String resourcePath) { if (!fileName.endsWith(".yml")) { fileName += ".yml"; } @@ -38,71 +40,74 @@ public final class Yaml implements IConfig { } @Override - public final void set(Path path, Object value) { + public final void set(@NotNull Path path, Object value) { this.getConfig().set(path.getPath(), value); } - public boolean contains(Path path) { + public boolean contains(@NotNull Path path) { return this.getConfig().contains(path.getPath()); } - public ConfigurationSection getConfigurationSection(Path path) { + public ConfigurationSection getConfigurationSection(@NotNull Path path) { return this.getConfig().getConfigurationSection(path.getPath()); } - public List getStringList(Path path) { + public @NotNull List getStringList(@NotNull Path path) { return this.getConfig().getStringList(path.getPath()); } - public long getLong(Path path) { + public long getLong(@NotNull Path path) { return this.getConfig().getLong(path.getPath()); } - public List getList(Path path) { + public List getList(@NotNull Path path) { return this.getConfig().getList(path.getPath()); } - public boolean getBoolean(Path path) { + public boolean getBoolean(@NotNull Path path) { return this.getConfig().getBoolean(path.getPath()); } - public int getInt(Path path) { + public int getInt(@NotNull Path path) { return this.getConfig().getInt(path.getPath()); } - public double getDouble(Path path) { + public double getDouble(@NotNull Path path) { return this.getConfig().getDouble(path.getPath()); } - public String getString(Path path) { + public String getString(@NotNull Path path) { return this.getConfig().getString(path.getPath()); } - public long getLong(Path path, long def) { + public long getLong(@NotNull Path path, long def) { return this.getConfig().getLong(path.getPath(), def); } - public List getList(Path path, List def) { + @Contract("_, !null -> !null") + public List getList(@NotNull Path path, List def) { return this.getConfig().getList(path.getPath(), def); } - public boolean getBoolean(Path path, boolean def) { + public boolean getBoolean(@NotNull Path path, boolean def) { return this.getConfig().getBoolean(path.getPath(), def); } - public int getInt(Path path, int def) { + public int getInt(@NotNull Path path, int def) { return this.getConfig().getInt(path.getPath(), def); } - public double getDouble(Path path, double def) { + public double getDouble(@NotNull Path path, double def) { return this.getConfig().getDouble(path.getPath(), def); } - public String getString(Path path, String def) { + @Contract("_, !null -> !null") + public String getString(@NotNull Path path, String def) { return this.getConfig().getString(path.getPath(), def); } - public Object get(Path path, Object def) { + @Contract("_, !null -> !null") + public Object get(@NotNull Path path, Object def) { return this.getConfig().get(path.getPath(), def); } diff --git a/src/main/java/io/github/simplexdev/simplexcore/config/YamlFactory.java b/src/main/java/io/github/simplexdev/simplexcore/config/YamlFactory.java index 86f0f60..f2c796c 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/config/YamlFactory.java +++ b/src/main/java/io/github/simplexdev/simplexcore/config/YamlFactory.java @@ -4,6 +4,8 @@ import io.github.simplexdev.simplexcore.module.SimplexModule; import io.github.simplexdev.simplexcore.utils.Trio; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import java.io.File; @@ -17,22 +19,26 @@ public final class YamlFactory { this.plugin = plugin; } - public Yaml from(String resourcePath, File directory, String fileName) { + @Contract("_, _, _ -> new") + public @NotNull Yaml from(String resourcePath, File directory, String fileName) { this.resourcePath = resourcePath; this.directory = directory; this.fileName = fileName; return new Yaml(plugin, fileName, directory, resourcePath); } - public FileConfiguration load(File yamlFile) { + @Contract("_ -> new") + public @NotNull FileConfiguration load(File yamlFile) { return YamlConfiguration.loadConfiguration(yamlFile); } - public Yaml setDefaultPathways() { + @Contract(" -> new") + public @NotNull Yaml setDefaultPathways() { return from("config.yml", plugin.getDataFolder(), "config.yml"); } - public Trio pathways() { + @Contract(value = " -> new", pure = true) + public @NotNull Trio pathways() { return new Trio<>(resourcePath, directory, fileName); } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/crafting/ItemBuilder.java b/src/main/java/io/github/simplexdev/simplexcore/crafting/ItemBuilder.java index 08d6a05..08f02de 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/crafting/ItemBuilder.java +++ b/src/main/java/io/github/simplexdev/simplexcore/crafting/ItemBuilder.java @@ -9,6 +9,7 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -90,7 +91,7 @@ public class ItemBuilder { * Create a new AttributeModifier for an ItemStack's ItemMeta. * @param name The name of the modifier. * @param amount The amount to add - * @param scalar Whether or not it should add as a number or a magnitude. + * @param scalar Whether it should add as a number or a magnitude. * @return A new AttributeModifier. */ public AttributeModifier add(String name, double amount, boolean scalar) { @@ -117,7 +118,7 @@ public class ItemBuilder { /** * @param stack The item to work from. */ - public Worker(ItemStack stack) { + public Worker(@NotNull ItemStack stack) { this.stack = stack; this.meta = stack.getItemMeta(); } @@ -127,7 +128,7 @@ public class ItemBuilder { * @param lore The item lore to add. * @return An appendable worker instance. */ - public final Worker addLore(String... lore) { + public Worker addLore(String... lore) { meta.setLore(Arrays.asList(lore)); stack.setItemMeta(meta); return this; @@ -138,7 +139,7 @@ public class ItemBuilder { * @param customName The new name of the item. * @return An appendable worker instance. */ - public final Worker setName(String customName) { + public Worker setName(String customName) { meta.setDisplayName(customName); stack.setItemMeta(meta); return this; @@ -150,7 +151,7 @@ public class ItemBuilder { * @param level The level of the enchantment. This is non-restrictive. * @return An appendable worker instance. */ - public final Worker addEnchant(Enchantment enchantment, int level) { + public Worker addEnchant(Enchantment enchantment, int level) { meta.addEnchant(enchantment, level, true); stack.setItemMeta(meta); return this; @@ -162,7 +163,7 @@ public class ItemBuilder { * @param modifier The type of attribute modifier to use. * @return An appendable worker instance. */ - public final Worker addAttribute(Attribute attribute, AttributeModifier modifier) { + public Worker addAttribute(Attribute attribute, AttributeModifier modifier) { meta.addAttributeModifier(attribute, modifier); stack.setItemMeta(meta); return this; @@ -173,7 +174,7 @@ public class ItemBuilder { * @param flags Any amount of ItemFlags to add to the item. * @return An appendable worker instance. */ - public final Worker addItemFlags(ItemFlag... flags) { + public Worker addItemFlags(ItemFlag... flags) { meta.addItemFlags(flags); stack.setItemMeta(meta); return this; @@ -184,17 +185,17 @@ public class ItemBuilder { * @param amount The amount of items this stack should represent. * @return An appendable worker instance. */ - public final Worker setAmount(int amount) { + public Worker setAmount(int amount) { stack.setAmount(amount); return this; } - public final Worker setType(Material material) { + public Worker setType(Material material) { stack.setType(material); return this; } - public final Worker setUnbreakable(boolean unbreakable) { + public Worker setUnbreakable(boolean unbreakable) { meta.setUnbreakable(unbreakable); stack.setItemMeta(meta); return this; @@ -203,14 +204,14 @@ public class ItemBuilder { /** * @return The final item. */ - public final ItemStack getItem() { + public ItemStack getItem() { return stack; } /** * @return The ItemMeta of the item. */ - public final ItemMeta getItemMeta() { + public ItemMeta getItemMeta() { return meta; } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/crafting/RecipeBuilder.java b/src/main/java/io/github/simplexdev/simplexcore/crafting/RecipeBuilder.java index f3bc05d..503f2ec 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/crafting/RecipeBuilder.java +++ b/src/main/java/io/github/simplexdev/simplexcore/crafting/RecipeBuilder.java @@ -12,6 +12,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapelessRecipe; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,7 +36,8 @@ public final class RecipeBuilder { * @param isShaped Whether or not the recipe is shaped or shapeless. * @return A new appendable RecipeBuilder Worker instance based on the given parameters. */ - public final Worker newRecipe(ItemStack result, String recipeName, boolean isShaped) { + @Contract("_, _, _ -> new") + public @NotNull Worker newRecipe(ItemStack result, String recipeName, boolean isShaped) { return new Worker(result, recipeName, isShaped); } @@ -60,7 +62,7 @@ public final class RecipeBuilder { this.shaped = isShaped; } - private ShapelessRecipe nosha() { + private @NotNull ShapelessRecipe nosha() { ShapelessRecipe recipe = new ShapelessRecipe(key, stack); if (materials.size() > 9 || materials.isEmpty()) return recipe; materials.forEach(recipe::addIngredient); @@ -68,7 +70,7 @@ public final class RecipeBuilder { return recipe; } - private ShapedRecipe sha() { + private @NotNull ShapedRecipe sha() { ShapedRecipe recipe = new ShapedRecipe(key, stack); if (ingredients.isEmpty()) return recipe; recipe.shape(shape); diff --git a/src/main/java/io/github/simplexdev/simplexcore/gui/AbstractGUI.java b/src/main/java/io/github/simplexdev/simplexcore/gui/AbstractGUI.java index 288a499..be5fb3b 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/gui/AbstractGUI.java +++ b/src/main/java/io/github/simplexdev/simplexcore/gui/AbstractGUI.java @@ -2,6 +2,7 @@ package io.github.simplexdev.simplexcore.gui; import io.github.simplexdev.api.func.ClickAction; import io.github.simplexdev.api.IGUI; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -13,35 +14,34 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; public abstract class AbstractGUI implements InventoryHolder, IGUI { private final Inventory INV; private final Map actions; private final UUID uuid; - private final Map> pagesByGUI = new HashMap<>(); - - private final List validSize = new ArrayList<>(){{ - add(9); - add(18); - add(27); - add(36); - add(45); - add(54); - }}; - - private int pages = 0; public static final Map invByUUId = new HashMap<>(); public static final Map openInvs = new HashMap<>(); + private final Map pages = new HashMap<>(); public AbstractGUI(int size, String name) { uuid = UUID.randomUUID(); + List validSize = new ArrayList<>() {{ + add(9); + add(18); + add(27); + add(36); + add(45); + add(54); + }}; if (!validSize.contains(size)) { - throw new NumberFormatException("Inventory sizes must be a multiple of nine!"); + throw new NumberFormatException("Inventory sizes must be a multiple of nine, and no larger than 54."); } - INV = Bukkit.createInventory(null, size, name); + INV = Bukkit.createInventory(null, size, Component.text(name)); actions = new HashMap<>(); invByUUId.put(getInvUUId(), this); + pages.put(0, this); } @Override @@ -91,16 +91,25 @@ public abstract class AbstractGUI implements InventoryHolder, IGUI { invByUUId.remove(getInvUUId()); } + // Maybe just use pages.size() ? public void addPage(AbstractGUI page) { - pages += 1; + pages.put(pages.size() + 1, page); } public void deletePage(AbstractGUI page) { - if (pages == 0) { + if (pages.isEmpty()) { return; } - pages -= 1; + AtomicInteger key = new AtomicInteger(0); + pages.forEach((key1, value) -> { + if (page.equals(value)) { + key.set(key1); + } + }); + if (key.get() != 0) { + pages.remove(key, page); + } } public static Map getInvByUUId() { @@ -117,21 +126,21 @@ public abstract class AbstractGUI implements InventoryHolder, IGUI { } @Override - public ItemStack newItem(@NotNull Material material, @NotNull String name, String... lore) { + public ItemStack newItem(@NotNull Material material, @NotNull String name, Component... lore) { ItemStack item = new ItemStack(material, 1); ItemMeta meta = item.getItemMeta(); if (meta == null) { return item; } - meta.setDisplayName(name); - ArrayList metaLore = new ArrayList<>(Arrays.asList(lore)); - meta.setLore(metaLore); + meta.displayName(Component.text(name)); + ArrayList metaLore = new ArrayList<>(Arrays.asList(lore)); + meta.lore(metaLore); item.setItemMeta(meta); return item; } @Override public ItemStack newItem(@NotNull Material material, @NotNull String name) { - return newItem(material, name, ""); + return newItem(material, name, Component.text("")); } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/gui/GUIHandler.java b/src/main/java/io/github/simplexdev/simplexcore/gui/GUIHandler.java index 744fcce..dbb1ddd 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/gui/GUIHandler.java +++ b/src/main/java/io/github/simplexdev/simplexcore/gui/GUIHandler.java @@ -9,21 +9,21 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.jetbrains.annotations.NotNull; import java.util.UUID; public final class GUIHandler extends SimplexListener { public GUIHandler(SimplexModule plugin) { - register(this, plugin); + super(plugin); } @EventHandler(priority = EventPriority.NORMAL) - public void invClick(InventoryClickEvent event) { - if (!(event.getWhoClicked() instanceof Player)) { + public void invClick(@NotNull InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof Player player)) { return; } - Player player = (Player) event.getWhoClicked(); UUID pID = player.getUniqueId(); UUID invUUID = AbstractGUI.getOpenInvs().get(pID); @@ -38,7 +38,7 @@ public final class GUIHandler extends SimplexListener { } @EventHandler(priority = EventPriority.NORMAL) - public void onClose(InventoryCloseEvent event) { + public void onClose(@NotNull InventoryCloseEvent event) { Player player = (Player) event.getPlayer(); AbstractGUI.getOpenInvs().remove(player.getUniqueId()); } diff --git a/src/main/java/io/github/simplexdev/simplexcore/listener/SimplexListener.java b/src/main/java/io/github/simplexdev/simplexcore/listener/SimplexListener.java index 6a2dfa3..fc12f08 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/listener/SimplexListener.java +++ b/src/main/java/io/github/simplexdev/simplexcore/listener/SimplexListener.java @@ -1,38 +1,18 @@ package io.github.simplexdev.simplexcore.listener; -import io.github.simplexdev.simplexcore.SimplexCorePlugin; import io.github.simplexdev.simplexcore.module.SimplexModule; -import io.github.simplexdev.simplexcore.utils.ReflectionTools; import org.bukkit.event.Listener; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; +import org.jetbrains.annotations.NotNull; public abstract class SimplexListener implements Listener { - /** - * This will register your listener by its class. This requires your class to have a single constructor which takes no parameters. - * This also requires the class in question to extend SimplexListener. - * - * @param cls The class to register. - */ - public static void registerFromClass(Class cls, SimplexModule plugin) { - if (!SimplexListener.class.isAssignableFrom(cls)) { - SimplexCorePlugin.getInstance().getLogger().severe("You can only register subclasses of SimplexListener with this method."); - return; - } + protected final SimplexModule plugin; - Constructor constr = ReflectionTools.getDeclaredConstructor(cls); - register(ReflectionTools.initConstructor(constr), plugin); + public SimplexListener(@NotNull SimplexModule plugin) { + this.plugin = plugin; + plugin.getManager().registerEvents(this, plugin); } - /** - * Registers your listener with the server plugin manager. - * - * @param listener The listener instance - * @param plugin Your plugin instance - * @param Type of which extends SimplexListener. - */ - public static void register(T listener, SimplexModule plugin) { - SimplexCorePlugin.getInstance().getManager().registerEvents(listener, plugin); + protected final SimplexModule getPlugin() { + return plugin; } } diff --git a/src/main/java/io/github/simplexdev/simplexcore/module/ModuleRegistry.java b/src/main/java/io/github/simplexdev/simplexcore/module/ModuleRegistry.java index 9b87c54..bcefa51 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/module/ModuleRegistry.java +++ b/src/main/java/io/github/simplexdev/simplexcore/module/ModuleRegistry.java @@ -3,6 +3,8 @@ package io.github.simplexdev.simplexcore.module; import io.github.simplexdev.api.annotations.ReqType; import io.github.simplexdev.api.annotations.Requires; import io.github.simplexdev.simplexcore.SimplexCorePlugin; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import java.util.HashSet; import java.util.Set; @@ -11,62 +13,19 @@ public final class ModuleRegistry { private static final ModuleRegistry instance = new ModuleRegistry(); private final Set> modules = new HashSet<>(); - protected ModuleRegistry() { + private ModuleRegistry() { } - public static synchronized ModuleRegistry getInstance() { + public static ModuleRegistry getInstance() { return instance; } - public > boolean isPaper(T addon) { - try { - Class.forName(com.destroystokyo.paper.Namespaced.class.getName()); - return true; - } catch (ClassNotFoundException ignored) { - addon.stop(); - SimplexCorePlugin.getInstance().getLogger().severe(addon.getName() + " has been disabled: This module requires Paper!"); - return false; - } - } - - public > boolean isSpigot(T addon) { - try { - Class.forName(org.spigotmc.WatchdogThread.class.getName()); - return true; - } catch (ClassNotFoundException ignored) { - addon.stop(); - SimplexCorePlugin.getInstance().getLogger().severe(addon.getName() + " has been disabled: This module requires Paper!"); - return false; - } - } - - private > boolean isBungee(T addon) { - try { - Class.forName(net.md_5.bungee.Util.class.getName()); - return true; - } catch (ClassNotFoundException ignored) { - addon.stop(); - SimplexCorePlugin.getInstance().getLogger().severe(addon.getName() + " has been disabled: This module requires Bungeecord!"); - return false; - } - } - - private boolean checkAnnotation(Requires info, ReqType type) { + @Contract(pure = true) + private boolean checkAnnotation(@NotNull Requires info, ReqType type) { return info.value() == type; } public > void register(T addon) { - if (addon.getClass().isAnnotationPresent(Requires.class)) { - Requires info = addon.getClass().getDeclaredAnnotation(Requires.class); - if (checkAnnotation(info, ReqType.SPIGOT) - && (!isSpigot(addon) || !isPaper(addon))) { - return; - } - if (checkAnnotation(info, ReqType.BUNGEECORD) - && !isBungee(addon)) { - return; - } - } getModules().add(addon); } diff --git a/src/main/java/io/github/simplexdev/simplexcore/particle/ParticleFactory.java b/src/main/java/io/github/simplexdev/simplexcore/particle/ParticleFactory.java index 6f13f6b..73f4a0e 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/particle/ParticleFactory.java +++ b/src/main/java/io/github/simplexdev/simplexcore/particle/ParticleFactory.java @@ -11,6 +11,7 @@ import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -131,7 +132,7 @@ public final class ParticleFactory { }; } - public void spawnParticleCloud(IParticleEffect effect, Location location) { + public void spawnParticleCloud(IParticleEffect effect, @NotNull Location location) { World world = location.getWorld(); if (world == null) return; AreaEffectCloud cloud = (AreaEffectCloud) world.spawnEntity(location, EntityType.AREA_EFFECT_CLOUD); @@ -145,25 +146,27 @@ public final class ParticleFactory { cloud.setPersistent(true); } - public void spawnDirectionalParticle(Particle particle, Location location, double xDirection, double yDirection, double zDirection) { + public void spawnDirectionalParticle(Particle particle, @NotNull Location location, double xDirection, double yDirection, double zDirection) { World world = location.getWorld(); if (world == null) return; world.spawnParticle(particle, location, 0, xDirection, yDirection, zDirection); } - public void spawnRedstoneParticle(Location location, int count, Particle.DustOptions options) { + public void spawnRedstoneParticle(@NotNull Location location, int count, Particle.DustOptions options) { World world = location.getWorld(); if (world == null) return; world.spawnParticle(Particle.REDSTONE, location, count, options); } - public static Particle.DustOptions options(IParticleEffect effect, float size) { + @Contract("_, _ -> new") + public static Particle.@NotNull DustOptions options(@NotNull IParticleEffect effect, float size) { return new Particle.DustOptions(effect.getParticleColor(), size); } - public static Particle.DustOptions options(int red, int green, int blue, float size) { + @Contract("_, _, _, _ -> new") + public static Particle.@NotNull DustOptions options(int red, int green, int blue, float size) { if (red > 255) { red = 255; } @@ -176,7 +179,7 @@ public final class ParticleFactory { return new Particle.DustOptions(Color.fromRGB(red, green, blue), size); } - public void spawnParticle(IParticleEffect effect, Location location, int count) { + public void spawnParticle(IParticleEffect effect, @NotNull Location location, int count) { World world = location.getWorld(); if (world == null) return; @@ -220,7 +223,7 @@ public final class ParticleFactory { } } - public final SimplexModule getPlugin() { + public SimplexModule getPlugin() { return plugin; } diff --git a/src/main/java/io/github/simplexdev/simplexcore/potion/PotionEffectFactory.java b/src/main/java/io/github/simplexdev/simplexcore/potion/PotionEffectFactory.java index 9e8a9b9..f6f7148 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/potion/PotionEffectFactory.java +++ b/src/main/java/io/github/simplexdev/simplexcore/potion/PotionEffectFactory.java @@ -36,7 +36,7 @@ public final class PotionEffectFactory { * @param effects The {@link PotionEffectType}(s) you want to be included. * @return A new compound effect. */ - public static ICompoundEffect compoundEffect(SimplexModule plugin, String name, int duration, int amplifier, PotionEffectType... effects) { + public static @NotNull ICompoundEffect compoundEffect(SimplexModule plugin, String name, int duration, int amplifier, PotionEffectType... effects) { List list = new ArrayList<>(); Utilities.forEach(effects, effect -> { @@ -83,7 +83,7 @@ public final class PotionEffectFactory { * @param amplifier How strong the potion is. * @return A new {@link PotionEffect}. */ - public static PotionEffect potionEffect(PotionEffectType type, int duration, int amplifier) { + public static @NotNull PotionEffect potionEffect(@NotNull PotionEffectType type, int duration, int amplifier) { return type.createEffect(duration, amplifier); } @@ -91,7 +91,7 @@ public final class PotionEffectFactory { * Applies the compound effect to the defined player. * @param effect The {@link ICompoundEffect} to apply. */ - public void applyCompoundEffect(ICompoundEffect effect) { + public void applyCompoundEffect(@NotNull ICompoundEffect effect) { effect.getEffects().forEach(player::addPotionEffect); map.put(player, effect); } @@ -99,7 +99,7 @@ public final class PotionEffectFactory { /** * Checks if a player currently has a compound effect. * @param effect The {@link ICompoundEffect} to look for - * @return Whether or not the player has the compound effect. + * @return Whether the player has the compound effect. */ public boolean hasPotionEffect(ICompoundEffect effect) { return (map.containsKey(player) && map.get(player).equals(effect)); diff --git a/src/main/java/io/github/simplexdev/simplexcore/sql/Database.java b/src/main/java/io/github/simplexdev/simplexcore/sql/Database.java index 481fac2..3e0d842 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/sql/Database.java +++ b/src/main/java/io/github/simplexdev/simplexcore/sql/Database.java @@ -1,5 +1,7 @@ package io.github.simplexdev.simplexcore.sql; +import org.jetbrains.annotations.Nullable; + import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -75,7 +77,7 @@ public class Database { return false; } - public static String getString(String table, String column, String gate, Object gate_value) { + public static @Nullable String getString(String table, String column, String gate, Object gate_value) { PreparedStatement ps; try { ps = MySQL.getConnection().prepareStatement("SELECT ? FROM ? WHERE ?=?"); @@ -119,7 +121,7 @@ public class Database { return 0; } - public static Double getDouble(String table, String column, String gate, Object gate_value) { + public static @Nullable Double getDouble(String table, String column, String gate, Object gate_value) { PreparedStatement ps; try { ps = MySQL.getConnection().prepareStatement("SELECT ? FROM ? WHERE ?=?"); @@ -185,7 +187,7 @@ public class Database { return 0; } - public static Object get(String table, String column, String gate, Object gate_value) { + public static @Nullable Object get(String table, String column, String gate, Object gate_value) { PreparedStatement ps; try { ps = MySQL.getConnection().prepareStatement("SELECT ? FROM ? WHERE ?=?"); diff --git a/src/main/java/io/github/simplexdev/simplexcore/utils/ReflectionTools.java b/src/main/java/io/github/simplexdev/simplexcore/utils/ReflectionTools.java index 628fe79..0978d89 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/utils/ReflectionTools.java +++ b/src/main/java/io/github/simplexdev/simplexcore/utils/ReflectionTools.java @@ -13,18 +13,19 @@ import java.lang.reflect.Method; import java.util.Set; public final class ReflectionTools { + @Contract("_ -> new") @NotNull - public static Reflections reflect(Class loadFrom) { + public static Reflections reflect(@NotNull Class loadFrom) { return new Reflections(loadFrom.getName()); } @NotNull - public static Set> getAnnotatedClasses(Class loadFrom, Class annotation) { + public static Set> getAnnotatedClasses(@NotNull Class loadFrom, Class annotation) { return new Reflections(loadFrom.getName()).getTypesAnnotatedWith(annotation); } @Nullable - public static Field getField(Class cls, String name) { + public static Field getField(@NotNull Class cls, String name) { try { return asAccessible(cls.getField(name)); } catch (NoSuchFieldException ignored) { @@ -33,7 +34,7 @@ public final class ReflectionTools { } @Nullable - public static Field getDeclaredField(Class cls, String name) { + public static Field getDeclaredField(@NotNull Class cls, String name) { try { return asAccessible(cls.getDeclaredField(name)); } catch (ReflectiveOperationException ignored) { @@ -42,7 +43,7 @@ public final class ReflectionTools { } @Nullable - public static Constructor getConstructor(Class cls, Class... initializers) { + public static Constructor getConstructor(@NotNull Class cls, Class... initializers) { try { return asAccessible(cls.getConstructor(initializers)); } catch (NoSuchMethodException ignored) { @@ -51,7 +52,7 @@ public final class ReflectionTools { } @Nullable - public static Constructor getDeclaredConstructor(Class cls, Class... initializers) { + public static Constructor getDeclaredConstructor(@NotNull Class cls, Class... initializers) { try { return asAccessible(cls.getDeclaredConstructor(initializers)); } catch (NoSuchMethodException ignored) { @@ -60,7 +61,7 @@ public final class ReflectionTools { } @Nullable - public static T initConstructor(Constructor constructor, Object... initializers) { + public static T initConstructor(@NotNull Constructor constructor, Object... initializers) { try { return constructor.newInstance(initializers); } catch (ReflectiveOperationException e) { @@ -69,7 +70,7 @@ public final class ReflectionTools { } @Nullable - public static Method getMethod(Class clazz, String name, Class... params) { + public static Method getMethod(@NotNull Class clazz, String name, Class... params) { try { return asAccessible(clazz.getMethod(name, params)); } catch (NoSuchMethodException e) { @@ -78,7 +79,7 @@ public final class ReflectionTools { } @Nullable - public static Method getDeclaredMethod(Class clazz, String name, Class... params) { + public static Method getDeclaredMethod(@NotNull Class clazz, String name, Class... params) { try { return asAccessible(clazz.getDeclaredMethod(name, params)); } catch (ReflectiveOperationException ignored) { @@ -88,7 +89,7 @@ public final class ReflectionTools { @NotNull @Contract(pure = true) - public static T asAccessible(T object) { + public static T asAccessible(@NotNull T object) { object.setAccessible(true); return object; } diff --git a/src/main/java/io/github/simplexdev/simplexcore/utils/Trio.java b/src/main/java/io/github/simplexdev/simplexcore/utils/Trio.java index 884f623..cb63c27 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/utils/Trio.java +++ b/src/main/java/io/github/simplexdev/simplexcore/utils/Trio.java @@ -2,6 +2,7 @@ package io.github.simplexdev.simplexcore.utils; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; +import org.jetbrains.annotations.NotNull; public final class Trio { private final A primary; @@ -52,7 +53,7 @@ public final class Trio { } @Override - public String toString() { + public @NotNull String toString() { return getPrimary().toString() + "\n" + getSecondary().toString() + diff --git a/src/main/java/io/github/simplexdev/simplexcore/utils/Utilities.java b/src/main/java/io/github/simplexdev/simplexcore/utils/Utilities.java index aed48e7..6cd73fd 100644 --- a/src/main/java/io/github/simplexdev/simplexcore/utils/Utilities.java +++ b/src/main/java/io/github/simplexdev/simplexcore/utils/Utilities.java @@ -4,12 +4,15 @@ import io.github.simplexdev.api.func.Path; import io.github.simplexdev.simplexcore.SimplexCorePlugin; import io.github.simplexdev.simplexcore.ban.BanType; import org.bukkit.Bukkit; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.SplittableRandom; import java.util.function.Consumer; +import java.util.stream.IntStream; import java.util.stream.Stream; public final class Utilities { @@ -36,17 +39,18 @@ public final class Utilities { throw new AssertionError(); } - public static void forEach(T[] array, Consumer action) { + public static void forEach(T @NotNull [] array, Consumer action) { for (T obj : array) { action.accept(obj); } } - public static Stream stream(T[] array) { + @Contract(pure = true) + public static @NotNull Stream stream(T[] array) { return Arrays.stream(array); } - public static String generateBanId(BanType type) { + public static @NotNull String generateBanId(@NotNull BanType type) { final String charList = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"; final String numList = "0123456789"; final int length = charList.length(); @@ -56,10 +60,10 @@ public final class Utilities { sb.append(type.getPrefix()); - for (int x = 0; x < 4; x++) { + IntStream.range(0, 4).forEach(x -> { sb.append(charList.charAt(random.nextInt(length - 1))); sb.append(numList.charAt(numbers.nextInt(lng - 1))); - } + }); sb.setCharAt(2, capitalize(sb.charAt(2))); return sb.toString(); @@ -74,15 +78,17 @@ public final class Utilities { return temp.charAt(0); } - public static Path pathway(String pathway) { + @Contract(pure = true) + public static @NotNull Path pathway(String pathway) { return () -> pathway; } - public static String getNMSVersion() { + public static @NotNull String getNMSVersion() { return Bukkit.getServer().getClass().getPackage().getName().substring(23).replaceFirst("v", ""); } - public static String[] formatVersion(String version) { + @Contract(pure = true) + public static String @NotNull [] formatVersion(@NotNull String version) { return (version).split(":"); }