Add Interactable

I also optimized the logic for weather detection in ToggleDownfallCommand.java
This commit is contained in:
JeremyStar™ 2024-05-01 11:55:56 +02:00
parent 5c8f198e30
commit 433b5fa0be
Signed by: JeremyStarTM
GPG key ID: E366BAEF67E4704D
14 changed files with 278 additions and 123 deletions

View file

@ -55,9 +55,15 @@ public abstract class CommandBase implements CommandExecutor {
}
}
// Command code
// Command code (from Bukkit, handled internally)
@Override
public abstract boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args);
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
getCommand(new Interactable(sender), command, label, args);
return true;
}
// Command code (abstracted)
public abstract void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args);
// Command completion
public abstract TabCompleter getCompletion();

View file

@ -0,0 +1,140 @@
package de.pickshadow.plugin.classes;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.classes.exceptions.NotAPlayerException;
import de.pickshadow.plugin.utils.Miscellaneous;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.WeatherType;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permission;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Locale;
import java.util.UUID;
public class Interactable {
// Data
private UUID uuid;
private Player player;
private boolean isConsole;
// Constructors
public Interactable(@NotNull UUID uuid) {
this.uuid = uuid;
isConsole = false;
}
public Interactable(@NotNull Player player) {
uuid = player.getUniqueId();
this.player = player;
isConsole = false;
}
public Interactable(@NotNull CommandSender sender) {
if (sender instanceof ConsoleCommandSender) {
isConsole = true;
} else {
player = (Player) sender;
uuid = player.getUniqueId();
}
}
// Getters
public boolean isConsole() {
return isConsole;
}
public UUID getUniqueId() throws NotAPlayerException {
if (isConsole) throw new NotAPlayerException();
return uuid;
}
public boolean hasPermission(Permission permission) {
if (isConsole) return true;
else return player.hasPermission(permission);
}
public boolean hasPermission(String permission) {
if (isConsole) return true;
else return player.hasPermission(permission);
}
public String getClientBrand() {
if (isConsole) return "tty";
else return player.getClientBrandName();
}
public Component getDisplayName() {
if (isConsole) return Miscellaneous.format("<BRANDING>", Types.FormatType.NONE);
else return player.displayName();
}
public Locale getLocale() {
if (isConsole) return Locale.US;
else return player.locale();
}
public String getName() {
if (isConsole) return "CONSOLE";
else return player.getName();
}
public int getPing() {
if (isConsole) return 0;
else return player.getPing();
}
public WeatherType getWeather() throws NotAPlayerException {
if (isConsole) throw new NotAPlayerException();
else {
if (player.getWorld().isClearWeather()) return WeatherType.CLEAR;
else if (player.getWorld().isThundering()) return WeatherType.DOWNFALL;
else {
ObjHolder.logger.crash(getClass(), "Invalid weather type (not clear or downfall)");
return null;
}
}
}
public Location getRespawnLocation() {
if (isConsole) return new Location(Bukkit.getWorlds().get(0), 0, -64, 0);
else return player.getRespawnLocation();
}
public float getFallDistance() {
if (isConsole) return 0f;
else return player.getFallDistance();
}
public World getWorld() throws NotAPlayerException {
if (isConsole) throw new NotAPlayerException();
else return player.getWorld();
}
// Setters
public void setDisplayName(@Nullable Component name) {
if (!isConsole) player.displayName(name);
}
public void setRespawnLocation(@NotNull Location location) {
setRespawnLocation(location, false);
}
public void setRespawnLocation(@NotNull Location location, boolean force) {
if (!isConsole) player.setRespawnLocation(location, force);
}
public void setFallDistance(float fallDistance) {
if (!isConsole) player.setFallDistance(fallDistance);
}
// Other methods
public void message(Component message) {
if (isConsole) Bukkit.getConsoleSender().sendMessage(message);
else player.sendMessage(message);
}
public void message(String message) {
message(MiniMessage.miniMessage().deserialize(message));
}
public void sudo(String chatMessage) {
if (isConsole) Bukkit.dispatchCommand(Bukkit.getConsoleSender(), chatMessage);
else player.chat(chatMessage);
}
public void teleport(Entity entity) {
teleport(entity.getLocation());
}
public void teleport(Location location) {
if (!isConsole) player.teleport(location);
}
}

View file

@ -19,6 +19,7 @@
package de.pickshadow.plugin.classes;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.classes.exceptions.NotAPlayerException;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.ApiStatus;
@ -44,6 +45,9 @@ public class PlayerData {
public PlayerData(@NotNull Player player) {
playerId = player.getUniqueId();
}
public PlayerData(@NotNull Interactable intact) throws NotAPlayerException {
playerId = intact.getUniqueId();
}
// Used for loading player data off disk
@ApiStatus.Internal
public PlayerData() {}

View file

@ -0,0 +1,7 @@
package de.pickshadow.plugin.classes.exceptions;
public class NotAPlayerException extends Exception {
public NotAPlayerException() {
super();
}
}

View file

@ -20,11 +20,11 @@ package de.pickshadow.plugin.commands;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.classes.CommandBase;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.classes.Types;
import de.pickshadow.plugin.utils.Miscellaneous;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.jetbrains.annotations.NotNull;
@ -34,8 +34,7 @@ public class BroadcastCommand extends CommandBase {
commandNames = new String[]{ "broadcast" };
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
public void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
StringBuilder message = new StringBuilder();
for (String arg : args) {
if (message.isEmpty()) {
@ -45,7 +44,6 @@ public class BroadcastCommand extends CommandBase {
}
}
Bukkit.broadcast(Miscellaneous.format(String.valueOf(message), Types.FormatType.NONE, true));
return true;
}
public TabCompleter getCompletion() {

View file

@ -1,13 +1,14 @@
package de.pickshadow.plugin.commands;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.base.Translation;
import de.pickshadow.plugin.classes.CommandBase;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.utils.Miscellaneous;
import de.pickshadow.plugin.utils.TabCompletionHelper;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -17,10 +18,8 @@ public class ClearChatCommand extends CommandBase {
commandNames = new String[]{ "clearchat" };
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
for (Player player : Bukkit.getOnlinePlayers()) player.sendMessage(MiniMessage.miniMessage().deserialize("\n".repeat(10000)).append(Miscellaneous.format(Translation.CLEARCHAT.replace("%sender%", sender.getName()))));
return true;
public void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
for (Player player : Bukkit.getOnlinePlayers()) player.sendMessage(MiniMessage.miniMessage().deserialize("\n".repeat(10000)).append(Miscellaneous.format(Translation.CLEARCHAT.replace("%sender%", intact.getName()))));
}
@Override

View file

@ -21,11 +21,11 @@ package de.pickshadow.plugin.commands;
import de.pickshadow.plugin.classes.CommandBase;
import de.pickshadow.plugin.base.Translation;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.classes.Types;
import de.pickshadow.plugin.utils.Miscellaneous;
import de.pickshadow.plugin.utils.TabCompletionHelper;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.jetbrains.annotations.NotNull;
@ -37,14 +37,9 @@ public class DiscordCommand extends CommandBase {
commandNames = new String[]{ "discord" };
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (Objects.equals(ObjHolder.config.inviteLink, "")) {
sender.sendMessage(Miscellaneous.format(Translation.DISCORD_UNAVAILABLE, Types.FormatType.ERROR));
} else {
sender.sendMessage(Miscellaneous.format(Translation.DISCORD_INVITE.replace("%invite%", ObjHolder.config.inviteLink)));
}
return true;
public void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (Objects.equals(ObjHolder.config.inviteLink, "")) intact.message(Miscellaneous.format(Translation.DISCORD_UNAVAILABLE, Types.FormatType.ERROR));
else intact.message(Miscellaneous.format(Translation.DISCORD_INVITE.replace("%invite%", ObjHolder.config.inviteLink)));
}
public TabCompleter getCompletion() {

View file

@ -20,12 +20,12 @@ package de.pickshadow.plugin.commands;
import de.pickshadow.plugin.classes.CommandBase;
import de.pickshadow.plugin.base.Translation;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.classes.Types;
import de.pickshadow.plugin.utils.Miscellaneous;
import de.pickshadow.plugin.utils.TabCompletionHelper;
import org.bukkit.Location;
import org.bukkit.command.*;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class HomeCommand extends CommandBase {
@ -33,19 +33,15 @@ public class HomeCommand extends CommandBase {
commandNames = new String[]{ "home"};
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (Miscellaneous.isCommandSentByConsole(sender, true)) return true;
Player player = (Player) sender;
Location coords = player.getRespawnLocation();
if (coords == null) {
player.sendMessage(Miscellaneous.format(Translation.HOME_MISSING, Types.FormatType.ERROR));
} else {
player.sendMessage(Miscellaneous.format(Translation.HOME_TELEPORT));
player.setFallDistance(0f);
player.teleport(coords);
public void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (Miscellaneous.isCommandSentByConsole(intact, true)) return;
Location coords = intact.getRespawnLocation();
if (coords == null) intact.message(Miscellaneous.format(Translation.HOME_MISSING, Types.FormatType.ERROR));
else {
intact.message(Miscellaneous.format(Translation.HOME_TELEPORT));
intact.setFallDistance(0f);
intact.teleport(coords);
}
return true;
}
public TabCompleter getCompletion() {

View file

@ -21,6 +21,7 @@ package de.pickshadow.plugin.commands;
import de.pickshadow.plugin.BuildConfiguration;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.classes.CommandBase;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.classes.PlayerData;
import de.pickshadow.plugin.base.Translation;
import de.pickshadow.plugin.classes.Types;
@ -28,7 +29,6 @@ import de.pickshadow.plugin.utils.Miscellaneous;
import de.pickshadow.plugin.utils.TabCompletionHelper;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -42,11 +42,11 @@ public class MsgCommand extends CommandBase {
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (Miscellaneous.isCommandSentByConsole(sender, true)) return true;
public void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (Miscellaneous.isCommandSentByConsole(intact, true)) return;
// Define shared variables
Player player = (Player) sender;
Player player = (Player) intact;
Player reciever;
StringBuilder message = new StringBuilder();
@ -56,19 +56,19 @@ public class MsgCommand extends CommandBase {
// Check args size
if (args.length < 2) {
player.sendMessage(Miscellaneous.format(Translation.GLOBAL_NOT_ENOUGH_ARGUMENTS.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
return true;
return;
}
// Get reciever and check if online
reciever = Bukkit.getPlayerExact(args[0]);
if (reciever == null) {
player.sendMessage(Miscellaneous.format(Translation.GLOBAL_PLAYER_NOT_ONLINE.replace("%player%", args[0])));
return true;
return;
}
// Check if performing self messaging
if (!BuildConfiguration.allowSelfMessaging && player.getUniqueId() == reciever.getUniqueId()) {
player.sendMessage(Miscellaneous.format(Translation.MSG_NO_SELF_MESSAGING, Types.FormatType.ERROR));
return true;
return;
}
// Update player data
@ -89,21 +89,21 @@ public class MsgCommand extends CommandBase {
}
// Send message
player.sendMessage(Miscellaneous.format(Translation.MSG_TO.replace("%sender%", player.getName()).replace("%reciever%", reciever.getName()).replace("%message%", message), Types.FormatType.NONE, true));
if (!(!BuildConfiguration.allowSelfMessaging && player.getUniqueId() == reciever.getUniqueId())) reciever.sendMessage(Miscellaneous.format(Translation.MSG_FROM.replace("%sender%", player.getName()).replace("%reciever%", reciever.getName()).replace("%message%", message), Types.FormatType.NONE, true));
player.sendMessage(Miscellaneous.format(Translation.MSG_TO.replace("%intact%", player.getName()).replace("%reciever%", reciever.getName()).replace("%message%", message), Types.FormatType.NONE, true));
if (!(!BuildConfiguration.allowSelfMessaging && player.getUniqueId() == reciever.getUniqueId())) reciever.sendMessage(Miscellaneous.format(Translation.MSG_FROM.replace("%intact%", player.getName()).replace("%reciever%", reciever.getName()).replace("%message%", message), Types.FormatType.NONE, true));
break;
case "reply":
case "r":
// Check args size
if (args.length < 1) {
player.sendMessage(Miscellaneous.format(Translation.GLOBAL_NOT_ENOUGH_ARGUMENTS.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
return true;
return;
}
// Get last messaged player
PlayerData playerData = ObjHolder.playerDataLoader.getPlayerData(player.getUniqueId());
if (playerData.lastMessagedPlayer == null) {
player.sendMessage(Miscellaneous.format(Translation.MSG_NO_LAST_MESSAGED_PLAYER, Types.FormatType.ERROR));
return true;
return;
}
reciever = Bukkit.getPlayer(playerData.lastMessagedPlayer);
if (reciever == null) {
@ -116,7 +116,7 @@ public class MsgCommand extends CommandBase {
// Check if performing self messaging
if (!BuildConfiguration.allowSelfMessaging && player.getUniqueId() == reciever.getUniqueId()) {
player.sendMessage(Miscellaneous.format(Translation.MSG_NO_SELF_MESSAGING, Types.FormatType.ERROR));
return true;
return;
}
// Build message string from args
@ -129,13 +129,12 @@ public class MsgCommand extends CommandBase {
}
// Send message
sender.sendMessage(Miscellaneous.format(Translation.MSG_TO.replace("%sender%", player.getName()).replace("%reciever%", reciever.getName()).replace("%message%", message), Types.FormatType.NONE, true));
if (!(!BuildConfiguration.allowSelfMessaging && player.getUniqueId() == reciever.getUniqueId())) reciever.sendMessage(Miscellaneous.format(Translation.MSG_FROM.replace("%sender%", player.getName()).replace("%reciever%", reciever.getName()).replace("%message%", message), Types.FormatType.NONE, true));
intact.message(Miscellaneous.format(Translation.MSG_TO.replace("%intact%", player.getName()).replace("%reciever%", reciever.getName()).replace("%message%", message), Types.FormatType.NONE, true));
if (!(!BuildConfiguration.allowSelfMessaging && player.getUniqueId() == reciever.getUniqueId())) reciever.sendMessage(Miscellaneous.format(Translation.MSG_FROM.replace("%intact%", player.getName()).replace("%reciever%", reciever.getName()).replace("%message%", message), Types.FormatType.NONE, true));
break;
default:
logger.crash("Invalid command '" + label + "' for " + getClass().getName());
}
return true;
}
public TabCompleter getCompletion() {

View file

@ -21,12 +21,12 @@ package de.pickshadow.plugin.commands;
import de.pickshadow.plugin.classes.CommandBase;
import de.pickshadow.plugin.base.Translation;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.classes.Types;
import de.pickshadow.plugin.classes.Configuration;
import de.pickshadow.plugin.utils.Miscellaneous;
import de.pickshadow.plugin.utils.TabCompletionHelper;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@ -41,71 +41,70 @@ public class PluginCommand extends CommandBase {
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!sender.hasPermission("pickshadow.commands.pssp") || args.length < 1) {
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_INFO));
return true;
public void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!intact.hasPermission("pickshadow.commands.pssp") || args.length < 1) {
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_INFO));
return;
}
switch (args[0]) {
case "reloadconfig":
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_CONFIG));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_CONFIG));
Configuration newConfig = ObjHolder.configLoader.loadConfig();
if (newConfig == null) {
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_CONFIG_FAIL, Types.FormatType.ERROR));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_CONFIG_FAIL, Types.FormatType.ERROR));
} else {
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_CONFIG_SUCCESS));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_CONFIG_SUCCESS));
ObjHolder.config = newConfig;
}
break;
case "reloaddata":
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_DATA));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_DATA));
UUID[] failedReloads = ObjHolder.playerDataLoader.reloadPlayerData();
if (failedReloads.length == 0) {
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_DATA_SUCCESS));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_DATA_SUCCESS));
} else {
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_DATA_FAIL.replace("%uuids%", Arrays.toString(failedReloads)), Types.FormatType.ERROR));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_RELOAD_DATA_FAIL.replace("%uuids%", Arrays.toString(failedReloads)), Types.FormatType.ERROR));
}
break;
case "gc":
Thread gcThread = new Thread(() -> {
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_GARBAGECOLLECT));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_GARBAGECOLLECT));
Miscellaneous.gc();
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_GARBAGECOLLECT_FINISHED));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_GARBAGECOLLECT_FINISHED));
});
gcThread.start();
break;
case "playerinfo":
if (Miscellaneous.isCommandSentByConsole(sender, true)) break;
if (Miscellaneous.isCommandSentByConsole(intact, true)) break;
Player player = (Player) sender;
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_PLAYERINFO.replace("%playerdata%", ObjHolder.playerDataLoader.getPlayerData(player.getUniqueId()).convertToString())));
Player player = (Player) intact;
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_PLAYERINFO.replace("%playerdata%", ObjHolder.playerDataLoader.getPlayerData(player.getUniqueId()).convertToString())));
break;
case "scheduler":
if (args.length < 2) {
sender.sendMessage(Miscellaneous.format(Translation.GLOBAL_NOT_ENOUGH_ARGUMENTS.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
return true;
intact.message(Miscellaneous.format(Translation.GLOBAL_NOT_ENOUGH_ARGUMENTS.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
return;
}
switch (args[1]) {
case "minutely":
case "minute":
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_SCHEDULER.replace("%timeframe%", "minutely")));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_SCHEDULER.replace("%timeframe%", "minutely")));
ObjHolder.scheduler.executeScheduler(Types.SchedulerType.MINUTELY);
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_SCHEDULER_DONE.replace("%timeframe%", "minutely")));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_SCHEDULER_DONE.replace("%timeframe%", "minutely")));
break;
case "hourly":
case "hour":
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_SCHEDULER.replace("%timeframe%", "hourly")));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_SCHEDULER.replace("%timeframe%", "hourly")));
ObjHolder.scheduler.executeScheduler(Types.SchedulerType.HOURLY);
sender.sendMessage(Miscellaneous.format(Translation.PLUGINCOMMAND_SCHEDULER_DONE.replace("%timeframe%", "hourly")));
intact.message(Miscellaneous.format(Translation.PLUGINCOMMAND_SCHEDULER_DONE.replace("%timeframe%", "hourly")));
break;
default: sender.sendMessage(Miscellaneous.format(Translation.GLOBAL_INVALID_ARGUMENT.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
default: intact.message(Miscellaneous.format(Translation.GLOBAL_INVALID_ARGUMENT.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
}
break;
default: sender.sendMessage(Miscellaneous.format(Translation.GLOBAL_INVALID_ARGUMENT.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
default: intact.message(Miscellaneous.format(Translation.GLOBAL_INVALID_ARGUMENT.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
}
return true;
}
public TabCompleter getCompletion() {

View file

@ -20,13 +20,13 @@ package de.pickshadow.plugin.commands;
import de.pickshadow.plugin.classes.CommandBase;
import de.pickshadow.plugin.base.Translation;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.classes.Types;
import de.pickshadow.plugin.utils.Miscellaneous;
import de.pickshadow.plugin.utils.TabCompletionHelper;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.jetbrains.annotations.NotNull;
@ -39,23 +39,23 @@ public class SystemInformationCommand extends CommandBase {
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
public void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
switch (label) {
case "sysinfo":
case "info":
case "stats":
if (args.length == 0) {
sender.sendMessage(Objects.requireNonNull(getMessage(0)));
intact.message(Objects.requireNonNull(getMessage(0)));
} else {
switch (args[0]) {
case "memory":
sender.sendMessage(Objects.requireNonNull(getMessage(1)));
intact.message(Objects.requireNonNull(getMessage(1)));
break;
case "performance":
sender.sendMessage(Objects.requireNonNull(getMessage(2)));
intact.message(Objects.requireNonNull(getMessage(2)));
break;
default:
sender.sendMessage(Miscellaneous.format(Translation.GLOBAL_INVALID_ARGUMENT.replace("%usage%", command.getUsage())));
intact.message(Miscellaneous.format(Translation.GLOBAL_INVALID_ARGUMENT.replace("%usage%", command.getUsage())));
break;
}
}
@ -63,19 +63,18 @@ public class SystemInformationCommand extends CommandBase {
case "ram":
case "mem":
case "memory":
sender.sendMessage(Objects.requireNonNull(getMessage(1)));
intact.message(Objects.requireNonNull(getMessage(1)));
break;
case "tps":
case "mspt":
case "perf":
sender.sendMessage(Objects.requireNonNull(getMessage(2)));
intact.message(Objects.requireNonNull(getMessage(2)));
break;
default:
sender.sendMessage(Miscellaneous.format(Translation.GLOBAL_EXCEPTION, Types.FormatType.ERROR));
intact.message(Miscellaneous.format(Translation.GLOBAL_EXCEPTION, Types.FormatType.ERROR));
logger.error("Invalid label \"" + label + "\"");
break;
}
return true;
}
private Component getMessage(int messageType) {

View file

@ -3,13 +3,12 @@ package de.pickshadow.plugin.commands;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.base.Translation;
import de.pickshadow.plugin.classes.CommandBase;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.classes.exceptions.NotAPlayerException;
import de.pickshadow.plugin.utils.Miscellaneous;
import de.pickshadow.plugin.utils.TabCompletionHelper;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Locale;
@ -21,28 +20,27 @@ public class ToggleDownfallCommand extends CommandBase {
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (Miscellaneous.isCommandSentByConsole(sender, true)) return true;
Player player = (Player) sender;
World world = player.getWorld();
public void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (Miscellaneous.isCommandSentByConsole(intact, true)) return;
if (world.isClearWeather()) world.setClearWeatherDuration(new Random().nextInt(6000));
else if (world.isThundering()) {
world.setThundering(true);
world.setThunderDuration(new Random().nextInt(6000));
} else {
logger.error("Invalid weather state. isClearWeather() and isThundering() are false.");
player.sendMessage(Miscellaneous.format(Translation.GLOBAL_EXCEPTION));
return true;
try {
switch (intact.getWeather()) {
case DOWNFALL:
intact.getWorld().setClearWeatherDuration(new Random().nextInt(6000));
case CLEAR:
intact.getWorld().setThundering(true);
intact.getWorld().setThunderDuration(new Random().nextInt(6000));
default: logger.crash("Invalid weather type '" + String.valueOf(intact.getWeather()) + "'");
}
} catch (NotAPlayerException e) {
logger.crash("Tried to operate on console Interactable (THIS SHOULD BE IMPOSSIBLE!)", e.getStackTrace());
}
if (ObjHolder.config.useOldMcTranslationForToggleDownfall) {
if (player.locale() == Locale.GERMANY) player.sendMessage("Der Niederschlag wurde umgestellt.");
else player.sendMessage("Toggled downfall.");
if (intact.getLocale() == Locale.GERMANY) intact.message("Der Niederschlag wurde umgestellt.");
else intact.message("Toggled downfall.");
}
else player.sendMessage(Miscellaneous.format(Translation.TOGGLEDOWNFALL));
return true;
else intact.message(Miscellaneous.format(Translation.TOGGLEDOWNFALL));
}
@Override

View file

@ -21,6 +21,7 @@ package de.pickshadow.plugin.commands;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.classes.CommandBase;
import de.pickshadow.plugin.base.Translation;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.classes.Types;
import de.pickshadow.plugin.utils.Miscellaneous;
import de.pickshadow.plugin.utils.TabCompletionHelper;
@ -44,33 +45,42 @@ public class TrollCommand extends CommandBase {
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (Miscellaneous.isCommandSentByConsole(sender, true)) return true;
Player player = (Player) sender;
public void getCommand(@NotNull Interactable intact, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
/*
TODO
========
The 'target' needs to be rewritten to be a Interactable at some point.
Player works, but Interactable would be better.
*/
if (Miscellaneous.isCommandSentByConsole(intact, true)) return;
if (args.length < 2) {
player.sendMessage(Miscellaneous.format(Translation.GLOBAL_NOT_ENOUGH_ARGUMENTS.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
return true;
intact.message(Miscellaneous.format(Translation.GLOBAL_NOT_ENOUGH_ARGUMENTS.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
return;
}
Player target = Bukkit.getPlayerExact(args[0]);
if (target == null) {
player.sendMessage(Miscellaneous.format(Translation.GLOBAL_PLAYER_NOT_ONLINE.replace("%player%", args[0]), Types.FormatType.ERROR));
return true;
intact.message(Miscellaneous.format(Translation.GLOBAL_PLAYER_NOT_ONLINE.replace("%player%", args[0]), Types.FormatType.ERROR));
return;
}
switch (args[1]) {
case "demo":
player.sendMessage(Miscellaneous.format(Translation.TROLL_DEMO.replace("%target%", args[0])));
intact.message(Miscellaneous.format(Translation.TROLL_DEMO.replace("%target%", args[0])));
target.showDemoScreen();
break;
case "credits":
player.sendMessage(Miscellaneous.format(Translation.TROLL_CREDITS.replace("%target%", args[0])));
intact.message(Miscellaneous.format(Translation.TROLL_CREDITS.replace("%target%", args[0])));
target.showWinScreen();
break;
case "guardian":
player.sendMessage(Miscellaneous.format(Translation.TROLL_GUARDIAN.replace("%target%", args[0])));
intact.message(Miscellaneous.format(Translation.TROLL_GUARDIAN.replace("%target%", args[0])));
target.showElderGuardian();
break;
case "hack":
player.sendMessage(Miscellaneous.format(Translation.TROLL_HACK.replace("%target%", args[0])));
intact.message(Miscellaneous.format(Translation.TROLL_HACK.replace("%target%", args[0])));
String base = "<dark_red><bold><obfuscated>";
MiniMessage mm = MiniMessage.miniMessage();
target.showTitle(Title.title(mm.deserialize(base + "S=)E8tuv9ZM^P)TJZMVP);ZTP)MZIZM989pv(UZ;."), mm.deserialize(""), Title.Times.times(Duration.ofMillis(0L), Duration.ofSeconds(5L), Duration.ofMillis(0L))));
@ -100,7 +110,7 @@ public class TrollCommand extends CommandBase {
}, 20L);
break;
case "malware":
player.sendMessage(Miscellaneous.format(Translation.TROLL_MALWARE.replace("%target%", args[0])));
intact.message(Miscellaneous.format(Translation.TROLL_MALWARE.replace("%target%", args[0])));
for (int i = 0; i < 127; i++) {
int finalI = i;
if (finalI == 100) {
@ -117,26 +127,25 @@ public class TrollCommand extends CommandBase {
}
break;
case "creeper":
player.sendMessage(Miscellaneous.format(Translation.TROLL_CREEPER.replace("%target%", args[0])));
intact.message(Miscellaneous.format(Translation.TROLL_CREEPER.replace("%target%", args[0])));
target.playSound(Sound.sound(Key.key("entity.creeper.primed"), Sound.Source.MASTER, 1f, 1f));
break;
case "heavens":
player.sendMessage(Miscellaneous.format(Translation.TROLL_HEAVENS.replace("%target%", args[0])));
intact.message(Miscellaneous.format(Translation.TROLL_HEAVENS.replace("%target%", args[0])));
Location locationHeavens = target.getLocation();
locationHeavens.setY(10000);
target.teleport(locationHeavens);
break;
case "crash":
player.sendMessage(Miscellaneous.format(Translation.TROLL_CRASH.replace("%target%", args[0])));
intact.message(Miscellaneous.format(Translation.TROLL_CRASH.replace("%target%", args[0])));
for (int i = 0; i < 100001; i++) {
target.spawnParticle(Particle.EXPLOSION_HUGE, target.getLocation(), 100000);
}
break;
default:
player.sendMessage(Miscellaneous.format(Translation.GLOBAL_INVALID_ARGUMENT.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
intact.message(Miscellaneous.format(Translation.GLOBAL_INVALID_ARGUMENT.replace("%usage%", command.getUsage()), Types.FormatType.ERROR));
break;
}
return true;
}
public TabCompleter getCompletion() {

View file

@ -20,12 +20,12 @@ package de.pickshadow.plugin.utils;
import de.pickshadow.plugin.base.Translation;
import de.pickshadow.plugin.base.ObjHolder;
import de.pickshadow.plugin.classes.Interactable;
import de.pickshadow.plugin.classes.Types;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.jetbrains.annotations.NotNull;
import java.lang.ref.WeakReference;
@ -73,8 +73,14 @@ public class Miscellaneous {
return isCommandSentByConsole(sender, false);
}
public static boolean isCommandSentByConsole(CommandSender sender, boolean issueError) {
if (sender instanceof ConsoleCommandSender) {
if (issueError) sender.sendMessage(Miscellaneous.format(Translation.GLOBAL_NOT_A_PLAYER, Types.FormatType.ERROR));
return isCommandSentByConsole(new Interactable(sender), issueError);
}
public static boolean isCommandSentByConsole(Interactable intact) {
return isCommandSentByConsole(intact, false);
}
public static boolean isCommandSentByConsole(Interactable intact, boolean issueError) {
if (intact.isConsole()) {
if (issueError) intact.message(Miscellaneous.format(Translation.GLOBAL_NOT_A_PLAYER, Types.FormatType.ERROR));
return true;
}
return false;