Gotta combine the gamemode commands

This commit is contained in:
obvWolf
2024-04-08 08:16:51 -05:00
parent c3bce35dc4
commit 5dae610708
36 changed files with 764 additions and 104 deletions

3
.idea/misc.xml generated
View File

@@ -12,4 +12,7 @@
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="UnicodeBrowser">
<option name="fontName" value="JetBrains Mono" />
</component>
</project>

View File

@@ -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

45
build.sh Executable file
View File

@@ -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

2
gradlew vendored Normal file → Executable file
View File

@@ -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»;

BIN
libs/PDK-1.3.3.jar Normal file

Binary file not shown.

View File

@@ -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();
}

View File

@@ -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) {
}
}

View File

@@ -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<String> 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"));
}
}

View File

@@ -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) {
}
}

View File

@@ -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<String> 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<String> currentCommands = getMacros(item);
currentCommands.add(command);
setMacros(item,currentCommands);
}
public void removeMacro(ItemStack item, String command) {
List<String> 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<String> getMacros(ItemStack item) {
ItemMeta meta = item.getItemMeta();
PersistentDataContainer data = meta.getPersistentDataContainer();
List<String> 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;
}
}

View File

@@ -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<String> worlds = new ArrayList<>();
for (World world : Bukkit.getWorlds()) {
worlds.add(world.getName());
}
List<String> players = new ArrayList<>();
for (Player player : ServerUtils.players()) {
players.add(player.getName());
}
b.then(b.arg(worlds)
.then(b.arg(players)));
}
}

View File

@@ -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<String> 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);
}
}

View File

@@ -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<String> 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);
}
}

View File

@@ -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<String> 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);
}
}

View File

@@ -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<String> 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);
}
}

View File

@@ -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<String> 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))
);
}

View File

@@ -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<String> players = new ArrayList<>();
for (Player player : ServerUtils.players()) {
players.add(player.getName());

View File

@@ -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<String> players = new ArrayList<>();
for (Player player : ServerUtils.players()) {
players.add(player.getName());

View File

@@ -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) {
}
}

View File

@@ -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) {
}
}

View File

@@ -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) {
}
}

View File

@@ -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) {
}
}

View File

@@ -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) {
}
}

View File

@@ -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) {
}
}

View File

@@ -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) {
}
}

View File

@@ -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) {
}

View File

@@ -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) {
}

View File

@@ -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<Storage> {
@Override
public File getFile() {
File file = new File("plugins/UltraUtils/storage.json");
file.getParentFile().mkdirs();
return file;
}
public List<UUID> whitelist = new ArrayList<>();
public Map<String, IpInfo> ipInfoLog = new HashMap<>();
}

View File

@@ -14,10 +14,14 @@ public class Config implements JsonSerializable<Config> {
}
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.";
}

View File

@@ -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()))));
}
}

View File

@@ -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<String> commands = mtc.getMacros(e.getItem());
for (String command : commands) {
p.performCommand(command);
}
}
}
}
}

View File

@@ -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<String, JsonObject> 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<String> 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<String> 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();
}
}

View File

@@ -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<Component> imageToLarge(String URL) {
try {
URL url = new URL(URL);
BufferedImage img = ImageIO.read(url);
List<Component> 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<Component> imageToComps(String URL) {
try {
URL url = new URL(URL);
BufferedImage img = ImageIO.read(url);
List<Component> 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<String> imageToList(String URL) {
try {
URL url = new URL(URL);
BufferedImage img = ImageIO.read(url);
List<String> 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<>();
}
}
}

View File

@@ -1,4 +1,4 @@
package functions;
package me.trouper.ultrautils.functions;
import me.trouper.ultrautils.UltraUtils;

View File

@@ -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);
}
}

View File

@@ -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 [<player>]
aliases:
- flight
speed:
permission: ultrautils.speed
description: Change player's default speeds
usage: /speed <int> [walk|flight] [<player>]
world:
permission: ultrautils.world
description: Switch worlds
usage: /world [<world>] [<player>]
broadcast:
permission: ultrautils.broadcast
description: sends a message to the whole server
usage: /broadcast <message>
macrotool:
permission: ultrautils.macrotool
description: Assigns a command to an item of your choice
usage: /macrotool <command>
aliases:
- mt
- powertool
- macro
enderchest:
permission: ultrautils.enderchest
usage: /enderchest [<player>]
whitelist:
permission: ultrautils.whitelist
description: whitelist
usage: /whitelist [add|remove|list|on|off]