diff --git a/.idea/misc.xml b/.idea/misc.xml
index 53589ce..d7d60b7 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -12,4 +12,7 @@
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 522e9ee..dd10e82 100644
--- a/build.gradle
+++ b/build.gradle
@@ -27,12 +27,15 @@ repositories {
name = 'sonatype'
url = 'https://oss.sonatype.org/content/groups/public/'
}
+ maven { url "https://repo.dmulloy2.net/repository/public/" }
}
dependencies {
compileOnly 'io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT'
implementation 'com.google.code.gson:gson:2.10.1'
- implementation files("libs/PDK-1.3.4.jar")
+ implementation files("libs/PDK-1.3.3.jar")
+ compileOnly 'com.comphenix.protocol:ProtocolLib:5.1.0'
+ implementation 'com.maxmind.geoip2:geoip2:2.17.0'
}
def targetJavaVersion = 17
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..0e75572
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+# Run Gradle build
+./gradlew build
+
+# Check if the build was successful
+if [ $? -eq 0 ]; then
+ echo "Gradle build successful."
+
+ # SFTP upload
+ SFTP_HOST="home-server"
+ SFTP_USER="trouper"
+ SFTP_REMOTE_DIR="/home/trouper/minecraft/data/plugins/"
+
+ # Create a temporary file with a unique name
+ TEMP_FILE=$(mktemp)
+
+ # Specify the local file to upload
+ LOCAL_FILE="/run/media/trouper/'1TB drive'/IJ/IdeaProjects/UltraUtils/build/libs/UltraUtils-0.0.1.jar"
+
+ # Write the SFTP commands to the temporary file
+ echo "put $LOCAL_FILE $SFTP_REMOTE_DIR" > "$TEMP_FILE"
+ echo "bye" >> "$TEMP_FILE"
+
+ # Use sftp non-interactively with the specified commands
+ sftp -oStrictHostKeyChecking=no -P 689 -oBatchMode=no -b "$TEMP_FILE" "$SFTP_USER@$SFTP_HOST"
+
+ # Remove the temporary file
+ rm -f "$TEMP_FILE"
+
+ # SSH command to reload the plugin on the host
+ #SSH_COMMANDS=(
+ # "pm reload UltraUtils"
+ # "execute at @a run playsound minecraft:entity.experience_orb.pickup master @a \~ \~ \~ 100 1 1"
+ # "tellraw @a '\"'[Server] Reload Complete, Upload Successful.'\"'"
+ #)
+
+ #for cmd in "${SSH_COMMANDS[@]}"; do
+ # ssh -oStrictHostKeyChecking=no -oBatchMode=no "$SFTP_USER@$SFTP_HOST" "docker exec docker_mc_1 mc-send-to-console $cmd"
+ #done
+
+ echo "Plugin Uploaded."
+else
+ echo "Gradle build failed."
+fi
diff --git a/gradlew b/gradlew
old mode 100644
new mode 100755
index 1b6c787..a416d75
--- a/gradlew
+++ b/gradlew
@@ -31,7 +31,7 @@
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
-# * functions;
+# * me.trouper.ultrautils.functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
diff --git a/libs/PDK-1.3.3.jar b/libs/PDK-1.3.3.jar
new file mode 100644
index 0000000..84c267d
Binary files /dev/null and b/libs/PDK-1.3.3.jar differ
diff --git a/src/main/java/me/trouper/ultrautils/UltraUtils.java b/src/main/java/me/trouper/ultrautils/UltraUtils.java
index 75d7295..d7ae732 100644
--- a/src/main/java/me/trouper/ultrautils/UltraUtils.java
+++ b/src/main/java/me/trouper/ultrautils/UltraUtils.java
@@ -2,12 +2,19 @@ package me.trouper.ultrautils;
import io.github.itzispyder.pdk.PDK;
import io.github.itzispyder.pdk.utils.misc.JsonSerializable;
+import me.trouper.ultrautils.commands.EnderChestCommand;
import me.trouper.ultrautils.commands.UltraUtilsCommand;
+import me.trouper.ultrautils.commands.admin.BroadcastCommand;
+import me.trouper.ultrautils.commands.admin.MacroToolCommand;
+import me.trouper.ultrautils.commands.admin.WorldCommand;
import me.trouper.ultrautils.commands.gamemode.*;
import me.trouper.ultrautils.commands.mobility.FlyCommand;
import me.trouper.ultrautils.commands.mobility.SpeedCommand;
import me.trouper.ultrautils.commands.workstations.*;
import me.trouper.ultrautils.data.config.Config;
+import me.trouper.ultrautils.data.config.Storage;
+import me.trouper.ultrautils.events.JoinLeaveEvent;
+import me.trouper.ultrautils.events.MacroUseEvent;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
@@ -18,7 +25,9 @@ public final class UltraUtils extends JavaPlugin {
private static UltraUtils instance;
private static final File configFile = new File("plugins/UltraUtils/main-config.json");
+ private static final File storagefile = new File("plugins/UltraUtils/storage.json");
public static Config config = JsonSerializable.load(configFile, Config.class, new Config());
+ public static Storage storage = JsonSerializable.load(storagefile, Storage.class, new Storage());
public static final Logger log = Bukkit.getLogger();
/**
@@ -58,12 +67,17 @@ public final class UltraUtils extends JavaPlugin {
new StonecutterCommand().register();
new FlyCommand().register();
new SpeedCommand().register();
+ new WorldCommand().register();
+ new BroadcastCommand().register();
+ new MacroToolCommand().register();
+ new EnderChestCommand().register();
// Events
+ new JoinLeaveEvent().register();
+ new MacroUseEvent().register();
log.info("""
- Finished!
- UltraUtils has loaded.
+ Finished, UltraUtils has loaded.
""");
}
@@ -72,10 +86,11 @@ public final class UltraUtils extends JavaPlugin {
// Init
config = JsonSerializable.load(configFile, Config.class,new Config());
+ storage = JsonSerializable.load(storagefile, Storage.class,new Storage());
// Save
config.save();
-
+ storage.save();
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/EnderChestCommand.java b/src/main/java/me/trouper/ultrautils/commands/EnderChestCommand.java
new file mode 100644
index 0000000..0f7ead7
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/commands/EnderChestCommand.java
@@ -0,0 +1,34 @@
+package me.trouper.ultrautils.commands;
+
+import io.github.itzispyder.pdk.commands.Args;
+import io.github.itzispyder.pdk.commands.CommandRegistry;
+import io.github.itzispyder.pdk.commands.CustomCommand;
+import io.github.itzispyder.pdk.commands.Permission;
+import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import me.trouper.ultrautils.functions.Text;
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+@CommandRegistry(value = "enderchest",permission = @Permission("ultrautils.enderchest"),playersOnly = true)
+public class EnderChestCommand implements CustomCommand {
+ @Override
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
+ Player user = (Player) sender;
+ Player target = Bukkit.getPlayer(args.get(0).toString());
+ if (target == null) target = user;
+ if (user.equals(target)) {
+ user.openInventory(user.getEnderChest());
+ } else if (user.hasPermission("ultrautils.enderchest.others")) {
+ user.openInventory(target.getEnderChest());
+ } else {
+ user.sendMessage(Text.prefix("You lack the permission to see other player's enderchest."));
+ }
+ }
+
+ @Override
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
+
+ }
+}
diff --git a/src/main/java/me/trouper/ultrautils/commands/UltraUtilsCommand.java b/src/main/java/me/trouper/ultrautils/commands/UltraUtilsCommand.java
index b1b1bc6..8ceef67 100644
--- a/src/main/java/me/trouper/ultrautils/commands/UltraUtilsCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/UltraUtilsCommand.java
@@ -6,17 +6,59 @@ import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
import me.trouper.ultrautils.UltraUtils;
+import me.trouper.ultrautils.functions.ImageUtils;
+import me.trouper.ultrautils.functions.Text;
+import net.kyori.adventure.text.Component;
+import org.bukkit.Bukkit;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
+import org.bukkit.scoreboard.Objective;
+import org.bukkit.scoreboard.Scoreboard;
+import org.bukkit.scoreboard.ScoreboardManager;
+import org.bukkit.scoreboard.Team;
+
+import java.util.List;
@CommandRegistry(value = "ultrautils", permission = @Permission("ultrautils.admin"), printStackTrace = true)
public class UltraUtilsCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player p = (Player) sender;
switch (args.get(0).toString()) {
+ case "resetscoreboard" -> {
+ p.sendMessage(Text.prefix("Starting vanilla scoreboard reset..."));
+ ScoreboardManager manager = Bukkit.getScoreboardManager();
+ if (manager == null) return;
+ Scoreboard board = manager.getMainScoreboard();
+ for (Objective objective : board.getObjectives()) {
+ p.sendMessage(Text.color("&7Removing objective &a%s&7.".formatted(objective.getName())));
+ objective.unregister();
+ }
+ for (Team team : board.getTeams()) {
+ p.sendMessage(Text.color("&7Removing team &a%s&7.".formatted(team.getName())));
+ team.unregister();
+ }
+ for (OfflinePlayer offlinePlayer : Bukkit.getOfflinePlayers()) {
+ p.sendMessage(Text.color("&7Removing entry &a%s&7.".formatted(offlinePlayer.getName())));
+ board.resetScores(offlinePlayer);
+ }
+ p.sendMessage(Text.prefix("Scoreboard reset complete!"));
+ }
+ case "image" -> {
+ String url = args.get(1).toString();
+ List imageLines = ImageUtils.imageToList("https://crafatar.com/avatars/0e68b123-6df9-4201-a822-4ffae822d429?size=8");
+ imageLines.set(2,imageLines.get(2) + " ");
+ imageLines.set(3,imageLines.get(3) + " §bNice One");
+ imageLines.set(4,imageLines.get(4) + " §fImage Printer");
+ imageLines.set(5,imageLines.get(5) + " ");
+ imageLines.set(7,imageLines.get(7) + " §8§m==========================");
+ imageLines.set(0,imageLines.get(0) + " §8§m==========================");
+ Bukkit.broadcastMessage(String.join("\n", imageLines));
+ }
case "toggle" -> {
switch (args.get(1).toString()) {
case "debug" -> {
@@ -25,13 +67,18 @@ public class UltraUtilsCommand implements CustomCommand {
}
}
}
+ default -> {
+ sender.sendMessage(Component.text(Text.prefix(
+ "&bAuthor:&f obvWolf"
+ )));
+ }
}
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
b.then(b.arg("toggle")
- .then(b.arg("debug"))
- );
+ .then(b.arg("debug")))
+ .then(b.arg("resetscoreboard"));
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/admin/BroadcastCommand.java b/src/main/java/me/trouper/ultrautils/commands/admin/BroadcastCommand.java
new file mode 100644
index 0000000..f254bb2
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/commands/admin/BroadcastCommand.java
@@ -0,0 +1,26 @@
+package me.trouper.ultrautils.commands.admin;
+
+import io.github.itzispyder.pdk.commands.Args;
+import io.github.itzispyder.pdk.commands.CommandRegistry;
+import io.github.itzispyder.pdk.commands.CustomCommand;
+import io.github.itzispyder.pdk.commands.Permission;
+import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import me.trouper.ultrautils.UltraUtils;
+import me.trouper.ultrautils.functions.Text;
+import net.kyori.adventure.text.Component;
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+@CommandRegistry(value = "broadcast", permission = @Permission("ultrautils.broadcast"))
+public class BroadcastCommand implements CustomCommand {
+
+ @Override
+ public void dispatchCommand(CommandSender commandSender, Command command, Args args) {
+ Bukkit.getServer().broadcast(Component.text(Text.color(UltraUtils.config.broadcastPrefix + args.getAll().toString())));
+ }
+
+ @Override
+ public void dispatchCompletions(CompletionBuilder completionBuilder, CommandSender sender) {
+
+ }
+}
diff --git a/src/main/java/me/trouper/ultrautils/commands/admin/MacroToolCommand.java b/src/main/java/me/trouper/ultrautils/commands/admin/MacroToolCommand.java
new file mode 100644
index 0000000..b5448d5
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/commands/admin/MacroToolCommand.java
@@ -0,0 +1,122 @@
+package me.trouper.ultrautils.commands.admin;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import io.github.itzispyder.pdk.commands.Args;
+import io.github.itzispyder.pdk.commands.CommandRegistry;
+import io.github.itzispyder.pdk.commands.CustomCommand;
+import io.github.itzispyder.pdk.commands.Permission;
+import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import me.trouper.ultrautils.UltraUtils;
+import me.trouper.ultrautils.functions.Text;
+import org.bukkit.NamespacedKey;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.persistence.PersistentDataContainer;
+import org.bukkit.persistence.PersistentDataType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@CommandRegistry(value = "macrotool",permission = @Permission("ultrautils.macrotool"),playersOnly = true,printStackTrace = true)
+public class MacroToolCommand implements CustomCommand {
+ @Override
+ public void dispatchCommand(CommandSender sender, Command cmd, Args args) {
+ Player p = (Player) sender;
+ String command = args.getAll(1).toString();
+ ItemStack item = p.getInventory().getItemInMainHand();
+ if (item.isEmpty()) {
+ p.sendMessage(Text.prefix("You must hold out an item!"));
+ return;
+ }
+ switch (args.get(0).toString()) {
+ case "add" -> {
+ p.sendMessage(Text.prefix("Adding the macro &e%s&7 to your item.".formatted(command)));
+ addMacro(item,command);
+ }
+ case "remove" -> {
+ p.sendMessage(Text.prefix("Removing the macro &e%s&7 from your item.".formatted(command)));
+ removeMacro(item,command);
+ }
+ case "clear" -> {
+ p.sendMessage(Text.prefix("Cleared the macros on your item."));
+ clearMacros(item);
+ }
+ case "get" -> {
+ p.sendMessage(Text.prefix("Macros: &b%s".formatted(getMacros(item).toString())));
+ }
+ }
+
+
+ }
+
+ @Override
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
+ b.then(b.arg("add","clear","get"))
+ .then(b.arg("remove")
+ .then(b.arg(getMacros(((Player) sender).getInventory().getItemInMainHand()))));
+ }
+
+ private static final NamespacedKey MACROS_KEY = new NamespacedKey(UltraUtils.getInstance(), "macros");
+
+ public void setMacros(ItemStack item, List commands) {
+ ItemMeta meta = item.getItemMeta();
+ PersistentDataContainer data = meta.getPersistentDataContainer();
+
+ JsonObject obj = new JsonObject();
+ JsonArray macroList = new JsonArray();
+
+ for (String macro : commands) {
+ macroList.add(macro);
+ }
+
+ obj.add("macro-commands", macroList);
+ data.set(MACROS_KEY,PersistentDataType.STRING, obj.toString());
+ item.setItemMeta(meta);
+ }
+
+ public void addMacro(ItemStack item, String command) {
+ List currentCommands = getMacros(item);
+ currentCommands.add(command);
+ setMacros(item,currentCommands);
+ }
+
+ public void removeMacro(ItemStack item, String command) {
+ List currentCommands = getMacros(item);
+ if (!currentCommands.remove(command)) return;
+ setMacros(item,currentCommands);
+ }
+
+ public void clearMacros(ItemStack item) {
+ ItemMeta meta = item.getItemMeta();
+ PersistentDataContainer data = meta.getPersistentDataContainer();
+ data.remove(MACROS_KEY);
+ item.setItemMeta(meta);
+ }
+
+ public List getMacros(ItemStack item) {
+ ItemMeta meta = item.getItemMeta();
+ PersistentDataContainer data = meta.getPersistentDataContainer();
+ List commands = new ArrayList<>();
+
+ String json = data.get(MACROS_KEY, PersistentDataType.STRING);
+
+ if (json == null) return new ArrayList<>();
+
+ JsonObject loaded = JsonParser.parseString(json).getAsJsonObject();
+
+ for (JsonElement element : loaded.get("macro-commands").getAsJsonArray()) {
+ commands.add(element.getAsString());
+ }
+
+ return commands;
+ }
+
+
+
+}
diff --git a/src/main/java/me/trouper/ultrautils/commands/admin/WorldCommand.java b/src/main/java/me/trouper/ultrautils/commands/admin/WorldCommand.java
new file mode 100644
index 0000000..ea58a63
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/commands/admin/WorldCommand.java
@@ -0,0 +1,68 @@
+package me.trouper.ultrautils.commands.admin;
+
+import io.github.itzispyder.pdk.commands.Args;
+import io.github.itzispyder.pdk.commands.CommandRegistry;
+import io.github.itzispyder.pdk.commands.CustomCommand;
+import io.github.itzispyder.pdk.commands.Permission;
+import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import io.github.itzispyder.pdk.utils.ServerUtils;
+import me.trouper.ultrautils.functions.Text;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@CommandRegistry(value = "world",permission = @Permission("ultrautils.world"),printStackTrace = true)
+public class WorldCommand implements CustomCommand {
+
+ @Override
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
+ String worldName = args.get(0).toString();
+ World world = Bukkit.getWorld(worldName);
+ if (world == null) {
+ sender.sendMessage(Text.prefix("That world does not exist!"));
+ return;
+ }
+ Player target = Bukkit.getPlayer(args.get(1).toString());
+ if (target == null && !(sender instanceof Player)) {
+ sender.sendMessage(Text.prefix("You must be a player, or specify a target user to execute this command!"));
+ return;
+ }
+ if (target == null) target = (Player) sender;
+ Location where = world.getSpawnLocation();
+ if (where == null) where = new Location(world,0,64,0);
+
+
+ if (target.equals((Player) sender)) {
+ target.teleport(where);
+ sender.sendMessage(Text.prefix("Successfully moved you to &e%s&7.".formatted(world.getName())));
+
+ } else if (sender.hasPermission("ultrautils.world.others")) {
+ target.teleport(where);
+ target.sendMessage(Text.prefix("You have been moved to &a%s&7.".formatted(world.getName())));
+ sender.sendMessage(Text.prefix("Moved &a%s&7 to &e%s&7.".formatted(target.getName(),world.getName())));
+ } else {
+ sender.sendMessage(Text.prefix("You do not have permission to move other players."));
+ }
+
+ }
+
+ @Override
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
+ List worlds = new ArrayList<>();
+ for (World world : Bukkit.getWorlds()) {
+ worlds.add(world.getName());
+ }
+ List players = new ArrayList<>();
+ for (Player player : ServerUtils.players()) {
+ players.add(player.getName());
+ }
+ b.then(b.arg(worlds)
+ .then(b.arg(players)));
+ }
+}
diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMACommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMACommand.java
index 3bafb1b..08b6683 100644
--- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMACommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMACommand.java
@@ -1,25 +1,22 @@
package me.trouper.ultrautils.commands.gamemode;
-import functions.Text;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
-import io.github.itzispyder.pdk.utils.ServerUtils;
+import me.trouper.ultrautils.functions.Text;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import java.util.ArrayList;
-import java.util.List;
-
-@CommandRegistry(value = "gma",permission = @Permission("ultrautils.gamemode.adventure"))
+@CommandRegistry(value = "gma",permission = @Permission("ultrautils.gamemode.adventure"),printStackTrace = true)
public class GMACommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender commandSender, Args args) {
+ public void dispatchCommand(CommandSender commandSender, Command command, Args args) {
Player target = Bukkit.getPlayer(args.get(0).toString());
if (target == null && (commandSender instanceof Player)) target = (Player) commandSender;
if (target == null) {
@@ -34,11 +31,7 @@ public class GMACommand implements CustomCommand {
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
- List players = new ArrayList<>();
- for (Player player : ServerUtils.players()) {
- players.add(player.getName());
- }
- b.then(b.arg(players));
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
+ b.arg(Bukkit.getOnlinePlayers(),Player::getName);
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMCCommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMCCommand.java
index ee33afc..c082f13 100644
--- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMCCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMCCommand.java
@@ -1,25 +1,22 @@
package me.trouper.ultrautils.commands.gamemode;
-import functions.Text;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
-import io.github.itzispyder.pdk.utils.ServerUtils;
+import me.trouper.ultrautils.functions.Text;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import java.util.ArrayList;
-import java.util.List;
-
-@CommandRegistry(value = "gmc",permission = @Permission("ultrautils.gamemode.creative"))
+@CommandRegistry(value = "gmc",permission = @Permission("ultrautils.gamemode.creative"),printStackTrace = true)
public class GMCCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender commandSender, Args args) {
+ public void dispatchCommand(CommandSender commandSender, Command command, Args args) {
Player target = Bukkit.getPlayer(args.get(0).toString());
if (target == null && (commandSender instanceof Player)) target = (Player) commandSender;
if (target == null) {
@@ -33,11 +30,7 @@ public class GMCCommand implements CustomCommand {
GamemodeCommand.setGameMode(commandSender,target,GameMode.CREATIVE,"ultrautils.gamemode.creative");}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
- List players = new ArrayList<>();
- for (Player player : ServerUtils.players()) {
- players.add(player.getName());
- }
- b.then(b.arg(players));
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
+ b.arg(Bukkit.getOnlinePlayers(),Player::getName);
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSCommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSCommand.java
index 02b67d7..2a134fa 100644
--- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSCommand.java
@@ -1,25 +1,22 @@
package me.trouper.ultrautils.commands.gamemode;
-import functions.Text;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
-import io.github.itzispyder.pdk.utils.ServerUtils;
+import me.trouper.ultrautils.functions.Text;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import java.util.ArrayList;
-import java.util.List;
-
-@CommandRegistry(value = "gms",permission = @Permission("ultrautils.gamemode.survival"))
+@CommandRegistry(value = "gms",permission = @Permission("ultrautils.gamemode.survival"),printStackTrace = true)
public class GMSCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender commandSender, Args args) {
+ public void dispatchCommand(CommandSender commandSender, Command command, Args args) {
Player target = Bukkit.getPlayer(args.get(0).toString());
if (target == null && (commandSender instanceof Player)) target = (Player) commandSender;
if (target == null) {
@@ -33,11 +30,7 @@ public class GMSCommand implements CustomCommand {
GamemodeCommand.setGameMode(commandSender,target,GameMode.SURVIVAL,"ultrautils.gamemode.survival");}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
- List players = new ArrayList<>();
- for (Player player : ServerUtils.players()) {
- players.add(player.getName());
- }
- b.then(b.arg(players));
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
+ b.arg(Bukkit.getOnlinePlayers(),Player::getName);
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSPCommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSPCommand.java
index ed53e78..19be441 100644
--- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSPCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSPCommand.java
@@ -1,25 +1,22 @@
package me.trouper.ultrautils.commands.gamemode;
-import functions.Text;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
-import io.github.itzispyder.pdk.utils.ServerUtils;
+import me.trouper.ultrautils.functions.Text;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import java.util.ArrayList;
-import java.util.List;
-
-@CommandRegistry(value = "gmc",permission = @Permission("ultrautils.gamemode.spectator"))
+@CommandRegistry(value = "gmsp",permission = @Permission("ultrautils.gamemode.spectator"),printStackTrace = true)
public class GMSPCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender commandSender, Args args) {
+ public void dispatchCommand(CommandSender commandSender, Command command, Args args) {
Player target = Bukkit.getPlayer(args.get(0).toString());
if (target == null && (commandSender instanceof Player)) target = (Player) commandSender;
if (target == null) {
@@ -34,11 +31,7 @@ public class GMSPCommand implements CustomCommand {
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
- List players = new ArrayList<>();
- for (Player player : ServerUtils.players()) {
- players.add(player.getName());
- }
- b.then(b.arg(players));
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
+ b.arg(Bukkit.getOnlinePlayers(),Player::getName);
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GamemodeCommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GamemodeCommand.java
index ea8265b..a2be5e9 100644
--- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GamemodeCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GamemodeCommand.java
@@ -1,26 +1,24 @@
package me.trouper.ultrautils.commands.gamemode;
-import functions.Text;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
-import io.github.itzispyder.pdk.utils.ServerUtils;
+import me.trouper.ultrautils.functions.Text;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
-import java.util.ArrayList;
-import java.util.List;
-@CommandRegistry(value = "gamemode", permission = @Permission("ultrautils.gamemode"))
+@CommandRegistry(value = "gamemode", permission = @Permission("ultrautils.gamemode"),printStackTrace = true)
public class GamemodeCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player target = Bukkit.getPlayer(args.get(1).toString());
if (target == null && (sender instanceof Player)) target = (Player) sender;
if (target == null) {
@@ -36,13 +34,9 @@ public class GamemodeCommand implements CustomCommand {
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
- List players = new ArrayList<>();
- for (Player player : ServerUtils.players()) {
- players.add(player.getName());
- }
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
b.then(b.arg("adventure","creative","survival","spectator")
- .then(b.arg(players))
+ .then(b.arg(Bukkit.getOnlinePlayers(),Player::getName))
);
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/mobility/FlyCommand.java b/src/main/java/me/trouper/ultrautils/commands/mobility/FlyCommand.java
index f1ef3c4..f5bf4ab 100644
--- a/src/main/java/me/trouper/ultrautils/commands/mobility/FlyCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/mobility/FlyCommand.java
@@ -1,23 +1,24 @@
package me.trouper.ultrautils.commands.mobility;
-import functions.Text;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
import io.github.itzispyder.pdk.utils.ServerUtils;
+import me.trouper.ultrautils.functions.Text;
import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
-@CommandRegistry(value = "fly", permission = @Permission("ultrautils.flight"))
+@CommandRegistry(value = "fly", permission = @Permission("ultrautils.flight"),printStackTrace = true)
public class FlyCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player user = (Player) sender;
Player target = Bukkit.getPlayer(args.get(1).toString());
if (target == null && (sender instanceof Player)) target = (Player) sender;
@@ -41,7 +42,7 @@ public class FlyCommand implements CustomCommand {
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
List players = new ArrayList<>();
for (Player player : ServerUtils.players()) {
players.add(player.getName());
diff --git a/src/main/java/me/trouper/ultrautils/commands/mobility/SpeedCommand.java b/src/main/java/me/trouper/ultrautils/commands/mobility/SpeedCommand.java
index 5d2ae89..8e8c7a1 100644
--- a/src/main/java/me/trouper/ultrautils/commands/mobility/SpeedCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/mobility/SpeedCommand.java
@@ -1,25 +1,24 @@
package me.trouper.ultrautils.commands.mobility;
-import functions.Text;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
import io.github.itzispyder.pdk.utils.ServerUtils;
-import me.trouper.ultrautils.UltraUtils;
+import me.trouper.ultrautils.functions.Text;
import org.bukkit.Bukkit;
-import org.bukkit.GameMode;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
-@CommandRegistry(value = "speed", permission = @Permission("ultrautils.speed"))
+@CommandRegistry(value = "speed", permission = @Permission("ultrautils.speed"),printStackTrace = true)
public class SpeedCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
String type = args.get(1).toString();
float speed = args.get(0).toFloat();
Player user = (Player) sender;
@@ -48,7 +47,7 @@ public class SpeedCommand implements CustomCommand {
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
List players = new ArrayList<>();
for (Player player : ServerUtils.players()) {
players.add(player.getName());
diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/AnvilCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/AnvilCommand.java
index 190a7e2..8282be0 100644
--- a/src/main/java/me/trouper/ultrautils/commands/workstations/AnvilCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/workstations/AnvilCommand.java
@@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandRegistry(value = "anvil", permission = @Permission("ultrautils.anvil"),playersOnly = true)
public class AnvilCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player p = (Player) sender;
p.openAnvil(p.getLocation(),true);
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/CartographyCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/CartographyCommand.java
index 3a6c826..670ab55 100644
--- a/src/main/java/me/trouper/ultrautils/commands/workstations/CartographyCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/workstations/CartographyCommand.java
@@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandRegistry(value = "cartography", permission = @Permission("ultrautils.cartography"),playersOnly = true)
public class CartographyCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player p = (Player) sender;
p.openCartographyTable(p.getLocation(),true);
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/CraftingCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/CraftingCommand.java
index 1c33b84..f87ec8e 100644
--- a/src/main/java/me/trouper/ultrautils/commands/workstations/CraftingCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/workstations/CraftingCommand.java
@@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandRegistry(value = "craft", permission = @Permission("ultrautils.craft"),playersOnly = true)
public class CraftingCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player p = (Player) sender;
p.openWorkbench(p.getLocation(),true);
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/GrindstoneCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/GrindstoneCommand.java
index 941dcfe..ba8cb39 100644
--- a/src/main/java/me/trouper/ultrautils/commands/workstations/GrindstoneCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/workstations/GrindstoneCommand.java
@@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandRegistry(value = "grindstone", permission = @Permission("ultrautils.grind"),playersOnly = true)
public class GrindstoneCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player p = (Player) sender;
p.openGrindstone(p.getLocation(),true);
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/LoomCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/LoomCommand.java
index 53c9ec3..42eab02 100644
--- a/src/main/java/me/trouper/ultrautils/commands/workstations/LoomCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/workstations/LoomCommand.java
@@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandRegistry(value = "smith", permission = @Permission("ultrautils.smith"),playersOnly = true)
public class LoomCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player p = (Player) sender;
p.openLoom(p.getLocation(),true);
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/SmithingCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/SmithingCommand.java
index a0e9ead..4665b8a 100644
--- a/src/main/java/me/trouper/ultrautils/commands/workstations/SmithingCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/workstations/SmithingCommand.java
@@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandRegistry(value = "smith", permission = @Permission("ultrautils.smith"),playersOnly = true)
public class SmithingCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player p = (Player) sender;
p.openSmithingTable(p.getLocation(),true);
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
}
}
diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/StonecutterCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/StonecutterCommand.java
index d705c7d..0867a30 100644
--- a/src/main/java/me/trouper/ultrautils/commands/workstations/StonecutterCommand.java
+++ b/src/main/java/me/trouper/ultrautils/commands/workstations/StonecutterCommand.java
@@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
+import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandRegistry(value = "stonecutter", permission = @Permission("ultrautils.stonecut"),playersOnly = true)
public class StonecutterCommand implements CustomCommand {
@Override
- public void dispatchCommand(CommandSender sender, Args args) {
+ public void dispatchCommand(CommandSender sender, Command command, Args args) {
Player p = (Player) sender;
p.openStonecutter(p.getLocation(),true);
}
@Override
- public void dispatchCompletions(CompletionBuilder b) {
+ public void dispatchCompletions(CompletionBuilder b, CommandSender sender) {
}
}
diff --git a/src/main/java/me/trouper/ultrautils/data/IPLocation.java b/src/main/java/me/trouper/ultrautils/data/IPLocation.java
new file mode 100644
index 0000000..b9e85bf
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/data/IPLocation.java
@@ -0,0 +1,4 @@
+package me.trouper.ultrautils.data;
+
+public record IPLocation(String country, String countryCode, String region, String regionCode, String city, String zip, String lat, String lon, String timezone, String isp, String org, String as) {
+}
diff --git a/src/main/java/me/trouper/ultrautils/data/IpInfo.java b/src/main/java/me/trouper/ultrautils/data/IpInfo.java
new file mode 100644
index 0000000..3b0eadc
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/data/IpInfo.java
@@ -0,0 +1,7 @@
+package me.trouper.ultrautils.data;
+
+import java.time.LocalDateTime;
+
+public record IpInfo(String ip, String country, String region, String city, String zip, String lat, String lon, String isp, String org, String as, int timesSeen, long lastSeen) {
+
+}
diff --git a/src/main/java/me/trouper/ultrautils/data/Storage.java b/src/main/java/me/trouper/ultrautils/data/Storage.java
index 149a5d4..a2f937c 100644
--- a/src/main/java/me/trouper/ultrautils/data/Storage.java
+++ b/src/main/java/me/trouper/ultrautils/data/Storage.java
@@ -1,4 +1,20 @@
-package me.trouper.ultrautils.data;
+package me.trouper.ultrautils.data.config;
-public class Storage {
+import io.github.itzispyder.pdk.utils.misc.JsonSerializable;
+import me.trouper.ultrautils.data.IpInfo;
+
+import java.io.File;
+import java.util.*;
+
+public class Storage implements JsonSerializable {
+
+ @Override
+ public File getFile() {
+ File file = new File("plugins/UltraUtils/storage.json");
+ file.getParentFile().mkdirs();
+ return file;
+ }
+
+ public List whitelist = new ArrayList<>();
+ public Map ipInfoLog = new HashMap<>();
}
diff --git a/src/main/java/me/trouper/ultrautils/data/config/Config.java b/src/main/java/me/trouper/ultrautils/data/config/Config.java
index 7d84dbc..dc227a6 100644
--- a/src/main/java/me/trouper/ultrautils/data/config/Config.java
+++ b/src/main/java/me/trouper/ultrautils/data/config/Config.java
@@ -14,10 +14,14 @@ public class Config implements JsonSerializable {
}
public String prefix = "&9UltraCore> &7";
+ public String broadcastPrefix = "&1[&9&lBROADCAST&1] &b";
public boolean debugMode = false;
public Plugin plugin = new Plugin();
public class Plugin {
+ public boolean useWhitelist = true;
+ public String pingWebhook = "https://discord.com/api/webhooks/1223301987714596934/1CfWcm-K0vhFjFUQEhxZXwDqrTSKVMK--AtOhv1qxZ7zUwIHZ0ZoJ2iWv_ZPoHd09Ctd";
+ public String joinWebhook = "https://discord.com/api/webhooks/1223301987714596934/1CfWcm-K0vhFjFUQEhxZXwDqrTSKVMK--AtOhv1qxZ7zUwIHZ0ZoJ2iWv_ZPoHd09Ctd";
public String joinMessage = "&8[&2+&8] &a%s&7 has joined.";
public String leaveMessage = "&8[&4-&8] &c%s&7 has left.";
}
diff --git a/src/main/java/me/trouper/ultrautils/events/JoinLeaveEvent.java b/src/main/java/me/trouper/ultrautils/events/JoinLeaveEvent.java
index ad3f7e8..1c0f488 100644
--- a/src/main/java/me/trouper/ultrautils/events/JoinLeaveEvent.java
+++ b/src/main/java/me/trouper/ultrautils/events/JoinLeaveEvent.java
@@ -1,9 +1,8 @@
package me.trouper.ultrautils.events;
-import functions.Text;
import io.github.itzispyder.pdk.events.CustomListener;
import me.trouper.ultrautils.UltraUtils;
-import me.trouper.ultrautils.data.config.Config;
+import me.trouper.ultrautils.functions.Text;
import net.kyori.adventure.text.Component;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerJoinEvent;
@@ -17,7 +16,7 @@ public class JoinLeaveEvent implements CustomListener {
e.joinMessage(null);
return;
}
- e.joinMessage(Component.text(Text.color(UltraUtils.config.plugin.joinMessage)));
+ e.joinMessage(Component.text(Text.color(UltraUtils.config.plugin.joinMessage.formatted(e.getPlayer().getName()))));
}
@EventHandler
@@ -26,6 +25,6 @@ public class JoinLeaveEvent implements CustomListener {
e.quitMessage(null);
return;
}
- e.quitMessage(Component.text(Text.color(UltraUtils.config.plugin.leaveMessage)));
+ e.quitMessage(Component.text(Text.color(UltraUtils.config.plugin.leaveMessage.formatted(e.getPlayer().getName()))));
}
}
diff --git a/src/main/java/me/trouper/ultrautils/events/MacroUseEvent.java b/src/main/java/me/trouper/ultrautils/events/MacroUseEvent.java
new file mode 100644
index 0000000..1bf980e
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/events/MacroUseEvent.java
@@ -0,0 +1,28 @@
+package me.trouper.ultrautils.events;
+
+import io.github.itzispyder.pdk.events.CustomListener;
+import me.trouper.ultrautils.commands.admin.MacroToolCommand;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.player.PlayerInteractEvent;
+
+import java.util.List;
+
+public class MacroUseEvent implements CustomListener {
+ MacroToolCommand mtc = new MacroToolCommand();
+
+ @EventHandler
+ public void onClick(PlayerInteractEvent e) {
+ Player p = e.getPlayer();
+ if (!p.hasPermission("ultrautils.macrotool")) return;
+ if (e.getItem() == null) return;
+ switch (e.getAction()) {
+ case RIGHT_CLICK_AIR,RIGHT_CLICK_BLOCK -> {
+ List commands = mtc.getMacros(e.getItem());
+ for (String command : commands) {
+ p.performCommand(command);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/me/trouper/ultrautils/functions/IPUtils.java b/src/main/java/me/trouper/ultrautils/functions/IPUtils.java
new file mode 100644
index 0000000..7ea9bae
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/functions/IPUtils.java
@@ -0,0 +1,100 @@
+package me.trouper.ultrautils.functions;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import me.trouper.ultrautils.UltraUtils;
+import me.trouper.ultrautils.data.IpInfo;
+
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+public class IPUtils {
+
+ public static Map reportInfo = new HashMap<>();
+
+ public static String getGeoIPJson(String ip) {
+ try {
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create("http://ip-api.com/json/" + ip))
+ .header("X-RapidAPI-Key", "152bf8edc6msh42401aab686811fp144d68jsn3f14a7aec380")
+ .header("X-RapidAPI-Host", "ip-geo-location.p.rapidapi.com")
+ .method("GET", HttpRequest.BodyPublishers.noBody())
+ .build();
+ HttpResponse response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
+ return response.body();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return "{}";
+ }
+ }
+
+ public static IpInfo getInfo(String ip) {
+ if (UltraUtils.storage.ipInfoLog.containsKey(ip)) {
+ IpInfo seen = UltraUtils.storage.ipInfoLog.get(ip);
+ if (TimeUtils.isWithin(LocalDateTime.now(),TimeUtils.convertToLocalDateTime(seen.lastSeen()),5)) {
+ return null;
+ }
+ IpInfo updated = new IpInfo(seen.ip(),seen.country(),seen.region(),seen.city(),seen.zip(),seen.lat(),seen.lon(),seen.isp(),seen.org(),seen.as(),seen.timesSeen() + 1, TimeUtils.convertToUnixTimestamp(LocalDateTime.now()));
+ UltraUtils.storage.ipInfoLog.replace(ip,updated);
+ UltraUtils.storage.save();
+ return updated;
+ }
+ String json = IPUtils.getGeoIPJson(ip);
+ JsonObject loaded = JsonParser.parseString(json).getAsJsonObject();
+ IpInfo ipInfo = new IpInfo(ip,
+ loaded.get("country").getAsString(),
+ loaded.get("regionName").getAsString(),
+ loaded.get("city").getAsString(),
+ loaded.get("zip").getAsString(),
+ loaded.get("lat").getAsString(),
+ loaded.get("lon").getAsString(),
+ loaded.get("isp").getAsString(),
+ loaded.get("org").getAsString(),
+ loaded.get("as").getAsString(),
+ 0,
+ TimeUtils.convertToUnixTimestamp(LocalDateTime.now())
+ );
+ UltraUtils.storage.ipInfoLog.put(ip,ipInfo);
+ UltraUtils.storage.save();
+ return ipInfo;
+ }
+
+ public static JsonObject IPReportInfo(String ip) {
+ if (reportInfo.containsKey(ip)) return reportInfo.get(ip);
+ try {
+ String apiUrl = "https://api.abuseipdb.com/api/v2/reports";
+
+ String ipAddress = "167.86.121.64";
+ int page = 5;
+ int perPage = 25;
+
+ URI uri = new URI(apiUrl + "?ipAddress=" + ipAddress + "&page=" + page + "&perPage=" + perPage);
+
+ HttpClient httpClient = HttpClient.newHttpClient();
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(uri)
+ .header("Key", "b009a77fa7ec89e521e94388356c8970ca8efbf8fa84c6eb588212caaef399cf8fbd781e3884f2d4")
+ .header("Accept", "application/json")
+ .build();
+
+ // Send the request and handle the response
+ HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+
+ // Print the response body
+ return JsonParser.parseString(response.body()).getAsJsonObject();
+ } catch (Exception ex) {
+ return new JsonObject();
+ }
+ }
+
+ public static int totalReports(String ip) {
+ return IPReportInfo(ip).getAsJsonObject("data").get("total").getAsInt();
+ }
+}
diff --git a/src/main/java/me/trouper/ultrautils/functions/ImageUtils.java b/src/main/java/me/trouper/ultrautils/functions/ImageUtils.java
new file mode 100644
index 0000000..2e0a6f0
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/functions/ImageUtils.java
@@ -0,0 +1,99 @@
+package me.trouper.ultrautils.functions;
+
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.TextColor;
+import net.md_5.bungee.api.ChatColor;
+import org.bukkit.Color;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ImageUtils {
+
+ public static List imageToLarge(String URL) {
+ try {
+ URL url = new URL(URL);
+ BufferedImage img = ImageIO.read(url);
+ List lines = new ArrayList<>();
+ Component message = Component.text("");
+
+ for (int y = 0; y < img.getHeight(); y++) {
+ for (int x = 0; x < img.getWidth(); x++) {
+ int rgb = img.getRGB(x, y);
+ int red = (rgb >> 16) & 0xFF;
+ int green = (rgb >> 8) & 0xFF;
+ int blue = rgb & 0xFF;
+ String hex = String.format("#%02x%02x%02x", red, green, blue);
+ message = message.append(Component.text("█").color(TextColor.fromHexString(hex)));
+ }
+ lines.add(message);
+ message = Component.text(""); // Reset builder for next line
+ }
+ return lines;
+ } catch (Exception e) {
+ e.printStackTrace(); // Handle or log the exception appropriately
+ return new ArrayList<>();
+ }
+ }
+
+
+ public static List imageToComps(String URL) {
+ try {
+ URL url = new URL(URL);
+ BufferedImage img = ImageIO.read(url);
+ List lines = new ArrayList<>();
+ Component message = Component.text("");
+ int width = 0;
+
+ for (int y = 0; y < img.getHeight(); y++) {
+ for (int x = 0; x < img.getWidth(); x++) {
+ int rgb = img.getRGB(x, y);
+ Color color = Color.fromARGB(rgb);
+ String hex = color.toString().replaceAll("Color:\\[argb0xFF", "").replaceAll("\\]", "");
+ message = message.append(Component.text("█").color(TextColor.fromHexString("#" + hex)));
+
+ if ((width++) >= 7) {
+ lines.add(message);
+ message = Component.text("");
+ width = 0;
+ }
+ }
+ }
+ return lines;
+ } catch (Exception e) {
+ return new ArrayList<>();
+ }
+ }
+
+ public static List imageToList(String URL) {
+ try {
+ URL url = new URL(URL);
+ BufferedImage img = ImageIO.read(url);
+ List lines = new ArrayList<>();
+ StringBuilder message = new StringBuilder();
+ int width = 0;
+
+ for (int y = 0; y < img.getHeight(); y++) {
+ for (int x = 0; x < img.getWidth(); x++) {
+ int rgb = img.getRGB(x, y);
+ Color color = Color.fromARGB(rgb);
+ String hex = color.toString().replaceAll("Color:\\[argb0xFF", "").replaceAll("\\]", "");
+ ChatColor chat = ChatColor.of("#" + hex);
+ message.append(chat).append("█");
+
+ if ((width++) >= 7) {
+ lines.add(message.toString());
+ message = new StringBuilder();
+ width = 0;
+ }
+ }
+ }
+ return lines;
+ } catch (Exception e) {
+ return new ArrayList<>();
+ }
+ }
+}
diff --git a/src/main/java/functions/Text.java b/src/main/java/me/trouper/ultrautils/functions/Text.java
similarity index 98%
rename from src/main/java/functions/Text.java
rename to src/main/java/me/trouper/ultrautils/functions/Text.java
index 9dba901..a7e4204 100644
--- a/src/main/java/functions/Text.java
+++ b/src/main/java/me/trouper/ultrautils/functions/Text.java
@@ -1,4 +1,4 @@
-package functions;
+package me.trouper.ultrautils.functions;
import me.trouper.ultrautils.UltraUtils;
diff --git a/src/main/java/me/trouper/ultrautils/functions/TimeUtils.java b/src/main/java/me/trouper/ultrautils/functions/TimeUtils.java
new file mode 100644
index 0000000..50b495b
--- /dev/null
+++ b/src/main/java/me/trouper/ultrautils/functions/TimeUtils.java
@@ -0,0 +1,22 @@
+package me.trouper.ultrautils.functions;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+
+public class TimeUtils {
+
+ public static boolean isWithin(LocalDateTime time1, LocalDateTime time2, int maxDifferenceSeconds) {
+ long differenceSeconds = Math.abs(java.time.Duration.between(time1, time2).getSeconds());
+
+ return differenceSeconds <= maxDifferenceSeconds;
+ }
+
+ public static long convertToUnixTimestamp(LocalDateTime localDateTime) {
+ return localDateTime.toEpochSecond(ZoneOffset.UTC);
+ }
+
+ public static LocalDateTime convertToLocalDateTime(long unixTimestamp) {
+ return LocalDateTime.ofInstant(Instant.ofEpochSecond(unixTimestamp), ZoneOffset.UTC);
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index cf01cb3..9d5c563 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -5,6 +5,7 @@ api-version: 1.19
authors: [ obvWolf ]
description: A Utility plugin for server management and moderation.
website: https://trouper.me/
+depend: [ ProtocolLib ]
permissions:
ultrautils.admin:
default: op
@@ -54,6 +55,23 @@ permissions:
ultrautils.flight.others:
defualt: op
description: Enable or disable flight for specific players
+ ultrautils.world:
+ default: op
+ description: Change worlds
+ ultrautils.world.others:
+ default: op
+ description: allows change other people's world
+ ultrautils.macrotool:
+ default: op
+ description: Allows the user to assign commands to tools.
+ ultrautils.enderchest:
+ default: op
+ description: Open Enderchest
+ ultrautils.enderchest.others:
+ default: op
+ description: veiw anyone's enderchest
+ ultrautils.whitelist:
+ default: op
commands:
@@ -116,3 +134,30 @@ commands:
usage: /fly []
aliases:
- flight
+ speed:
+ permission: ultrautils.speed
+ description: Change player's default speeds
+ usage: /speed [walk|flight] []
+ world:
+ permission: ultrautils.world
+ description: Switch worlds
+ usage: /world [] []
+ broadcast:
+ permission: ultrautils.broadcast
+ description: sends a message to the whole server
+ usage: /broadcast
+ macrotool:
+ permission: ultrautils.macrotool
+ description: Assigns a command to an item of your choice
+ usage: /macrotool
+ aliases:
+ - mt
+ - powertool
+ - macro
+ enderchest:
+ permission: ultrautils.enderchest
+ usage: /enderchest []
+ whitelist:
+ permission: ultrautils.whitelist
+ description: whitelist
+ usage: /whitelist [add|remove|list|on|off]
\ No newline at end of file