From 2c6868505618057fb51b421d657f80c2fe0bd2d0 Mon Sep 17 00:00:00 2001 From: Rhythmic Date: Mon, 6 Apr 2026 17:44:42 -0500 Subject: [PATCH 1/2] start brig work, localehandler change --- pom.xml | 15 +- .../simplexity/simplehomes/SimpleHomes.java | 2 +- .../brigstuff/CommandContextHelper.java | 31 ++ .../commands/brigstuff/Exceptions.java | 40 +++ .../simplehomes/configs/LocaleHandler.java | 325 +++--------------- .../simplehomes/configs/LocaleMessage.java | 95 +++++ .../listeners/PlayerMoveListener.java | 3 +- 7 files changed, 221 insertions(+), 290 deletions(-) create mode 100644 src/main/java/simplexity/simplehomes/commands/brigstuff/CommandContextHelper.java create mode 100644 src/main/java/simplexity/simplehomes/commands/brigstuff/Exceptions.java create mode 100644 src/main/java/simplexity/simplehomes/configs/LocaleMessage.java diff --git a/pom.xml b/pom.xml index 3d82655..ec428f9 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ SimpleHomes - 1.8 + 21 UTF-8 @@ -61,17 +61,16 @@ - - - org.xerial - sqlite-jdbc - 3.45.1.0 - io.papermc.paper paper-api - 1.20.4-R0.1-SNAPSHOT + 1.21.5-R0.1-SNAPSHOT provided + + com.zaxxer + HikariCP + 6.3.0 + diff --git a/src/main/java/simplexity/simplehomes/SimpleHomes.java b/src/main/java/simplexity/simplehomes/SimpleHomes.java index fdabcbe..43f2275 100644 --- a/src/main/java/simplexity/simplehomes/SimpleHomes.java +++ b/src/main/java/simplexity/simplehomes/SimpleHomes.java @@ -59,6 +59,6 @@ private void handleConfig(){ getConfig().options().copyDefaults(true); saveConfig(); ConfigHandler.getInstance().loadConfigValues(); - LocaleHandler.getInstance().loadLocale(); + LocaleHandler.getInstance().reloadLocale(); } } diff --git a/src/main/java/simplexity/simplehomes/commands/brigstuff/CommandContextHelper.java b/src/main/java/simplexity/simplehomes/commands/brigstuff/CommandContextHelper.java new file mode 100644 index 0000000..036b25d --- /dev/null +++ b/src/main/java/simplexity/simplehomes/commands/brigstuff/CommandContextHelper.java @@ -0,0 +1,31 @@ +package simplexity.simplehomes.commands.brigstuff; + +import com.mojang.brigadier.context.CommandContext; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import javax.annotation.Nullable; + +@SuppressWarnings("UnstableApiUsage") +public class CommandContextHelper { + /** + * Gets player sender from command context if one exists, null if none exists + * @param ctx Command Context + * @return Player + */ + @Nullable + public static Player getPlayer(CommandContext ctx) { + if (ctx.getSource().getSender() instanceof Player player) return player; + return null; + } + + /** + * Gets command sender from command context + * @param ctx Command Context + * @return CommandSender + */ + public static CommandSender getCommandSender(CommandContext ctx) { + return ctx.getSource().getSender(); + } +} diff --git a/src/main/java/simplexity/simplehomes/commands/brigstuff/Exceptions.java b/src/main/java/simplexity/simplehomes/commands/brigstuff/Exceptions.java new file mode 100644 index 0000000..e6d1e4d --- /dev/null +++ b/src/main/java/simplexity/simplehomes/commands/brigstuff/Exceptions.java @@ -0,0 +1,40 @@ +package simplexity.simplehomes.commands.brigstuff; + +import com.mojang.brigadier.Message; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import io.papermc.paper.command.brigadier.MessageComponentSerializer; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import simplexity.simplehomes.SimpleHomes; +import simplexity.simplehomes.configs.LocaleMessage; + +public class Exceptions { + + public static final SimpleCommandExceptionType MUST_BE_PLAYER = new SimpleCommandExceptionType(serialize(LocaleMessage.MUST_BE_PLAYER)); + public static final SimpleCommandExceptionType PROVIDE_HOME_NAME = new SimpleCommandExceptionType(serialize(LocaleMessage.PROVIDE_HOME_NAME)); + public static final SimpleCommandExceptionType HOME_ALREADY_EXISTS = new SimpleCommandExceptionType(serialize(LocaleMessage.HOME_ALREADY_EXISTS)); + public static final DynamicCommandExceptionType HOME_NOT_FOUND = new DynamicCommandExceptionType(name -> serialize(LocaleMessage.HOME_NOT_FOUND, name.toString())); + public static final DynamicCommandExceptionType NULL_HOME = new DynamicCommandExceptionType(name -> serialize(LocaleMessage.NULL_HOME, name.toString())); + public static final DynamicCommandExceptionType CANNOT_SET_MORE = new DynamicCommandExceptionType(count -> serialize(LocaleMessage.CANNOT_SET_MORE_HOMES, count.toString())); + public static final DynamicCommandExceptionType CANNOT_USE_COMMAND = new DynamicCommandExceptionType(count -> serialize(LocaleMessage.CANNOT_USE_COMMAND, count.toString())); + + + private static Message serialize(LocaleMessage localeMessage) { + return MessageComponentSerializer.message().serialize( + SimpleHomes.getMiniMessage().deserialize( + localeMessage.getMessage() + )); + } + + private static Message serialize(LocaleMessage localeMessage, String value) { + return MessageComponentSerializer.message().serialize( + SimpleHomes.getMiniMessage().deserialize( + localeMessage.getMessage(), + Placeholder.parsed("value", value), + Placeholder.parsed("name", value) + )); + } + + + +} diff --git a/src/main/java/simplexity/simplehomes/configs/LocaleHandler.java b/src/main/java/simplexity/simplehomes/configs/LocaleHandler.java index 6faf5e7..80be336 100644 --- a/src/main/java/simplexity/simplehomes/configs/LocaleHandler.java +++ b/src/main/java/simplexity/simplehomes/configs/LocaleHandler.java @@ -1,320 +1,85 @@ package simplexity.simplehomes.configs; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; -import org.jetbrains.annotations.NotNull; -import simplexity.simplehomes.Home; import simplexity.simplehomes.SimpleHomes; import java.io.File; import java.io.IOException; -import java.util.logging.Logger; +import java.util.*; public class LocaleHandler { - private final MiniMessage miniMessage = SimpleHomes.getMiniMessage(); + private static LocaleHandler instance; private final String fileName = "locale.yml"; - private final File localeFile = new File(SimpleHomes.getInstance().getDataFolder(), fileName); - private final FileConfiguration localeConfig = new YamlConfiguration(); - private final Logger logger = SimpleHomes.getInstance().getLogger(); - //--------- - private String mustBePlayer, provideHomeName, homeAlreadyExists, homeNotFound, nullHome, cannotSetMoreHomes, - cannotUseCommand, errorHasOccurred, noPermission; - private String insertName, insertWorld, insertXLoc, insertYLoc, insertZLoc, insertOverride, insertBedName; - private String homeSet, homeDeleted, homeTeleported, pluginReloaded, listHeader, listItem, listNoHomes; - private String blacklistedWarning, voidWarning, fireWarning, blocksWarning, lavaWarning, waterWarning; - private String unsupportedDestructive, importHelp, importNotEnoughArgs, onlyConsole, cannotConfirm, timedOut, noValidPlugin, - essentialsNotExist, nothingInsideFolder, playerNotExist, importComplete, importedHomes; - private String pleaseWait, youMoved; + private final File dataFile = new File(SimpleHomes.getInstance().getDataFolder(), fileName); + private FileConfiguration locale = new YamlConfiguration(); private LocaleHandler() { - if (!localeFile.exists()) { - SimpleHomes.getInstance().saveResource(fileName, false); + try { + dataFile.getParentFile().mkdirs(); + dataFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); } + reloadLocale(); } public static LocaleHandler getInstance() { - if (instance == null) instance = new LocaleHandler(); + if (instance == null) { + instance = new LocaleHandler(); + } return instance; } - public FileConfiguration getLocaleConfig() { - return localeConfig; - } - - public void loadLocale() { + public void reloadLocale() { try { - localeConfig.load(localeFile); + locale.load(dataFile); } catch (IOException | InvalidConfigurationException e) { - logger.severe("Issue loading locale.yml"); e.printStackTrace(); } - mustBePlayer = localeConfig.getString("errors.must-be-player", "Sorry, only a player can run that command!"); - provideHomeName = localeConfig.getString("errors.provide-home-name", "Please provide a home name"); - homeAlreadyExists = localeConfig.getString("errors.home-already-exists", "Sorry, you already have a home with that name! Use /sethome -o to overwrite a home"); - homeNotFound = localeConfig.getString("errors.home-not-found", "Home not found"); - nullHome = localeConfig.getString("errors.null-home", "Home '' does not exist"); - cannotSetMoreHomes = localeConfig.getString("errors.cannot-set-more-homes", "You have already set homes- you cannot set any more. Delete one of your current homes to set a new one."); - cannotUseCommand = localeConfig.getString("errors.cannot-use-command", "You currently have more than homes. In order to use you must first delete some homes."); - errorHasOccurred = localeConfig.getString("errors.error-has-occurred", "An error has occurred while running this command. Please contact the server staff to let them know (-SimpleHomes Plugin)"); - noPermission = localeConfig.getString("errors.no-permission", "You do not have permission to use "); - insertName = localeConfig.getString("inserts.name", ""); - insertBedName = localeConfig.getString("inserts.bed-name", ""); - insertWorld = localeConfig.getString("inserts.world", ""); - insertXLoc = localeConfig.getString("inserts.x-loc", "x,"); - insertYLoc = localeConfig.getString("inserts.y-loc", "y,"); - insertZLoc = localeConfig.getString("inserts.z-loc", "z"); - insertOverride = localeConfig.getString("inserts.override", "You can type /home -o in order to teleport anyways"); - listHeader = localeConfig.getString("messages.list-header", "[Homes]"); - listItem = localeConfig.getString("messages.list-item", " - in at "); - listNoHomes = localeConfig.getString("messages.list-no-homes", "You have no homes set"); - homeSet = localeConfig.getString("messages.home-set", "Home has been set"); - homeDeleted = localeConfig.getString("messages.home-deleted", "Home in at has been deleted"); - homeTeleported = localeConfig.getString("messages.home-teleported", "Teleported successfully to "); - pluginReloaded = localeConfig.getString("messages.plugin-reloaded", "SimpleHomes has been reloaded"); - blacklistedWarning = localeConfig.getString("warnings.blacklisted", "There is a blocking your teleport location. "); - voidWarning = localeConfig.getString("warnings.void", "Your home is currently above air. "); - fireWarning = localeConfig.getString("warnings.fire", "Your home is currently on fire "); - blocksWarning = localeConfig.getString("warnings.blocks", "Your home is currently encased in blocks "); - lavaWarning = localeConfig.getString("warnings.lava", "Your home is currently inside of lava "); - waterWarning = localeConfig.getString("warnings.water", "Your home is currently under water "); - unsupportedDestructive = localeConfig.getString("console.unsupported-destructive", """ - ------------------------------------------------------------------------ - You are about to run: / - - THIS ACTION IS DESTRUCTIVE AND WILL OVERWRITE EXISTING HOMES IN SIMPLEHOMES. - THIS ACTION IS NOT SUPPORTED AND MAY CORRUPT SAVE DATA, USE AT YOUR OWN RISK. - - Please confirm this command using / confirm - -----------------------------------------------------------------------------------------"""); - importHelp = localeConfig.getString("console.import-help", """ - ------------------Import Homes Help------------------------------------ - - This command is DESTRUCTIVE and will overwrite homes already set on SimpleHomes - This command is UNSUPPORTED and may CORRUPT SAVE DATA. - >>>>> USE AT YOUR OWN RISK <<<<<. - - Usage: /importhomes [username] - [username] is an optional argument to import specifically that user's homes. - - Valid Plugins: Essentials - - Not all home plugins are supported, to add support submit an issue on GitHub - https://github.com/Simplexity-Development/SimpleHomes/issues - -----------------------------------------------------------------------------------------"""); - importNotEnoughArgs = localeConfig.getString("console.import-not-enough-args", """ - Not enough arguments. - Try importhomes help"""); - onlyConsole = localeConfig.getString("console.only-console", "This command can only be used by the Console."); - cannotConfirm = localeConfig.getString("console.cannot-confirm", "No command was executed recently to confirm."); - timedOut = localeConfig.getString("console.timed-out", "Command timed out, please run again."); - noValidPlugin = localeConfig.getString("console.no-valid-plugin", "No valid plugin was found."); - essentialsNotExist = localeConfig.getString("console.essentials.not-exist", "There is no /plugins/Essentials/userdata folder!"); - nothingInsideFolder = localeConfig.getString("console.essentials.nothing-inside", "There is nothing inside of the /plugins/Essentials/userdata folder."); - playerNotExist = localeConfig.getString("console.essentials.player-not-exist", """ - This player does not exist or does not have an Essentials/userdata file!"); - Player Name: - Retrieved UUID: - Searched File: """); - importComplete = localeConfig.getString("console.import-finished", "Import complete"); - importedHomes = localeConfig.getString("console.saved-homes", "Imported all homes for "); - pleaseWait = localeConfig.getString("delay.please-wait", "Teleporting! Please wait seconds!"); - youMoved = localeConfig.getString("delay.you-moved", "You moved, teleportation has been cancelled"); - } - - - public String getMustBePlayer() { - return mustBePlayer; - } - - public String getProvideHomeName() { - return provideHomeName; - } - - public String getHomeNotFound() { - return homeNotFound; - } - - public String getHomeExists() { - return homeAlreadyExists; - } - - public String getNullHome() { - return nullHome; - } - - public String getHomeSet() { - return homeSet; - } - - public String getHomeDeleted() { - return homeDeleted; - } - - public String getHomeTeleported() { - return homeTeleported; - } - - public String getCannotSetMoreHomes() { - return cannotSetMoreHomes; - } - - public String getPluginReloaded() { - return pluginReloaded; - } - - public String getListHeader() { - return listHeader; - } - - public String getListItem() { - return listItem; - } - - public Component homeComponent(@NotNull Home home, String message) { - Component nameComponent = miniMessage.deserialize(insertName, - Placeholder.unparsed("name", home.name())); - Component worldComponent = miniMessage.deserialize(insertWorld, - Placeholder.unparsed("world", home.location().getWorld().getName())); - Component xComponent = miniMessage.deserialize(insertXLoc, - Placeholder.unparsed("x-loc", String.valueOf(home.location().getBlockX()))); - Component yComponent = miniMessage.deserialize(insertYLoc, - Placeholder.unparsed("y-loc", String.valueOf(home.location().getBlockY()))); - Component zComponent = miniMessage.deserialize(insertZLoc, - Placeholder.unparsed("z-loc", String.valueOf(home.location().getBlockZ()))); - return miniMessage.deserialize(message, - Placeholder.component("name", nameComponent), - Placeholder.component("world", worldComponent), - Placeholder.component("x-loc", xComponent), - Placeholder.component("y-loc", yComponent), - Placeholder.component("z-loc", zComponent)); - } - - public Component bedHomeComponent(@NotNull Home home, String message) { - Component nameComponent = miniMessage.deserialize(insertBedName, - Placeholder.unparsed("name", ConfigHandler.getInstance().getBedHomesName())); - Component worldComponent = miniMessage.deserialize(insertWorld, - Placeholder.unparsed("world", home.location().getWorld().getName())); - Component xComponent = miniMessage.deserialize(insertXLoc, - Placeholder.unparsed("x-loc", String.valueOf(home.location().getBlockX()))); - Component yComponent = miniMessage.deserialize(insertYLoc, - Placeholder.unparsed("y-loc", String.valueOf(home.location().getBlockY()))); - Component zComponent = miniMessage.deserialize(insertZLoc, - Placeholder.unparsed("z-loc", String.valueOf(home.location().getBlockZ()))); - return miniMessage.deserialize(message, - Placeholder.component("name", nameComponent), - Placeholder.component("world", worldComponent), - Placeholder.component("x-loc", xComponent), - Placeholder.component("y-loc", yComponent), - Placeholder.component("z-loc", zComponent)); - } - - public String getListNoHomes() { - return listNoHomes; - } - - public String getBlacklistedWarning() { - return blacklistedWarning; - } - - public String getVoidWarning() { - return voidWarning; - } - - public String getFireWarning() { - return fireWarning; - } - - public String getBlocksWarning() { - return blocksWarning; - } - - public String getLavaWarning() { - return lavaWarning; - } - - public String getWaterWarning() { - return waterWarning; - } - - public String getInsertOverride() { - return insertOverride; - } - - public String getCannotUseCommand() { - return cannotUseCommand; - } - - public String getErrorHasOccurred() { - return errorHasOccurred; - } - - public String getUnsupportedDestructive() { - return unsupportedDestructive; - } - - public String getImportHelp() { - return importHelp; - } - - public String getImportNotEnoughArgs() { - return importNotEnoughArgs; - } - - public String getOnlyConsole() { - return onlyConsole; - } - - public String getCannotConfirm() { - return cannotConfirm; - } - - public String getTimedOut() { - return timedOut; - } - - public String getNoValidPlugin() { - return noValidPlugin; + populateLocale(); + sortLocale(); + saveLocale(); } - public String getPlayerNotExist() { - return playerNotExist; - } - - public String getNothingInsideFolder() { - return nothingInsideFolder; - } - - public String getEssentialsNotExist() { - return essentialsNotExist; - } + private void populateLocale() { + Set missing = new HashSet<>(Arrays.asList(LocaleMessage.values())); + for (LocaleMessage localeMessage : LocaleMessage.values()) { + if (locale.contains(localeMessage.getPath())) { + localeMessage.setMessage(locale.getString(localeMessage.getPath())); + missing.remove(localeMessage); + } + } - public String getImportComplete() { - return importComplete; - } + for (LocaleMessage localeMessage : missing) { + locale.set(localeMessage.getPath(), localeMessage.getMessage()); + } - public String getImportedHomes() { - return importedHomes; - } - public String getPleaseWait() { - return pleaseWait; } - public String getYouMoved() { - return youMoved; + private void sortLocale() { + FileConfiguration newLocale = new YamlConfiguration(); + List keys = new ArrayList<>(); + keys.addAll(locale.getKeys(true)); + Collections.sort(keys); + for (String key : keys) { + newLocale.set(key, locale.getString(key)); + } + locale = newLocale; } - public String getNoPermission() { - return noPermission; + private void saveLocale() { + try { + locale.save(dataFile); + } catch (IOException e) { + e.printStackTrace(); + } } - public String getInsertBedName() { - return insertBedName; - } } + diff --git a/src/main/java/simplexity/simplehomes/configs/LocaleMessage.java b/src/main/java/simplexity/simplehomes/configs/LocaleMessage.java new file mode 100644 index 0000000..9ee0480 --- /dev/null +++ b/src/main/java/simplexity/simplehomes/configs/LocaleMessage.java @@ -0,0 +1,95 @@ +package simplexity.simplehomes.configs; + +public enum LocaleMessage { + MUST_BE_PLAYER("errors.must-be-player", "Sorry, only a player can run that command!"), + PROVIDE_HOME_NAME("errors.provide-home-name", "Please provide a home name"), + HOME_ALREADY_EXISTS("errors.home-already-exists", "Sorry, you already have a home with that name! Use /sethome -o to overwrite a home"), + HOME_NOT_FOUND("errors.home-not-found", "Home not found"), + NULL_HOME("errors.null-home", "Home '' does not exist"), + CANNOT_SET_MORE_HOMES("errors.cannot-set-more-homes", "You have already set homes- you cannot set any more. Delete one of your current homes to set a new one."), + CANNOT_USE_COMMAND("errors.cannot-use-command", "You currently have more than homes. In order to use this command, you must first delete some homes."), + ERROR_HAS_OCCURRED("errors.error-has-occurred", "An error has occurred while running this command. Please contact the server staff to let them know (-SimpleHomes Plugin)"), + NO_PERMISSION("errors.no-permission", "You do not have permission to use "), + INSERT_NAME("inserts.name", ""), + INSERT_BED_NAME("inserts.bed-name", ""), + INSERT_WORLD("inserts.world", ""), + INSERT_X_LOC("inserts.x-loc", "x,"), + INSERT_Y_LOC("inserts.y-loc", "y,"), + INSERT_Z_LOC("inserts.z-loc", "z"), + INSERT_OVERRIDE("inserts.override", "You can type /home -o in order to teleport anyways"), + LIST_HEADER("messages.list-header", "[Homes]"), + LIST_ITEM("messages.list-item", " - in at "), + LIST_NO_HOMES("messages.list-no-homes", "You have no homes set"), + HOME_SET("messages.home-set", "Home has been set"), + HOME_DELETED("messages.home-deleted", "Home in at has been deleted"), + HOME_TELEPORTED("messages.home-teleported", "Teleported successfully to "), + PLUGIN_RELOADED("messages.plugin-reloaded", "SimpleHomes has been reloaded"), + BLACKLISTED_WARNING("warnings.blacklisted", "There is a blocking your teleport location. "), + VOID_WARNING("warnings.void", "Your home is currently above air. "), + FIRE_WARNING("warnings.fire", "Your home is currently on fire "), + BLOCKS_WARNING("warnings.blocks", "Your home is currently encased in blocks "), + LAVA_WARNING("warnings.lava", "Your home is currently inside of lava "), + WATER_WARNING("warnings.water", "Your home is currently under water "), + UNSUPPORTED_DESTRUCTIVE("console.unsupported-destructive", """ + ------------------------------------------------------------------------ + You are about to run: / + + THIS ACTION IS DESTRUCTIVE AND WILL OVERWRITE EXISTING HOMES IN SIMPLEHOMES. + THIS ACTION IS NOT SUPPORTED AND MAY CORRUPT SAVE DATA, USE AT YOUR OWN RISK. + + Please confirm this command using / confirm + -----------------------------------------------------------------------------------------"""), + IMPORT_HELP("console.import-help", """ + ------------------Import Homes Help------------------------------------ + + This command is DESTRUCTIVE and will overwrite homes already set on SimpleHomes + This command is UNSUPPORTED and may CORRUPT SAVE DATA. + >>>>> USE AT YOUR OWN RISK <<<<<. + + Usage: /importhomes [username] + [username] is an optional argument to import specifically that user's homes. + + Valid Plugins: Essentials + + Not all home plugins are supported, to add support submit an issue on GitHub - https://github.com/Simplexity-Development/SimpleHomes/issues + -----------------------------------------------------------------------------------------"""), + IMPORT_NOT_ENOUGH_ARGS("console.import-not-enough-args", """ + Not enough arguments. + Try importhomes help"""), + ONLY_CONSOLE("console.only-console", "This command can only be used by the Console."), + CANNOT_CONFIRM("console.cannot-confirm", "No command was executed recently to confirm."), + TIMED_OUT("console.timed-out", "Command timed out, please run again."), + NO_VALID_PLUGIN("console.no-valid-plugin", "No valid plugin was found."), + ESSENTIALS_NOT_EXIST("console.essentials.not-exist", "There is no /plugins/Essentials/userdata folder!"), + NOTHING_INSIDE_FOLDER("console.essentials.nothing-inside", "There is nothing inside of the /plugins/Essentials/userdata folder."), + PLAYER_NOT_EXIST("console.essentials.player-not-exist", """ + This player does not exist or does not have an Essentials/userdata file!"), + Player Name: + Retrieved UUID: + Searched File: """), + IMPORT_COMPLETE("console.import-finished", "Import complete"), + IMPORTED_HOMES("console.saved-homes", "Imported all homes for "), + PLEASE_WAIT("delay.please-wait", "Teleporting! Please wait seconds!"), + YOU_MOVED("delay.you-moved", "You moved, teleportation has been cancelled"); + + private final String path; + private String message; + + LocaleMessage(String path, String message) { + this.path = path; + this.message = message; + } + + public String getPath() { + return path; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + +} diff --git a/src/main/java/simplexity/simplehomes/listeners/PlayerMoveListener.java b/src/main/java/simplexity/simplehomes/listeners/PlayerMoveListener.java index 08f7e1e..fdc1245 100644 --- a/src/main/java/simplexity/simplehomes/listeners/PlayerMoveListener.java +++ b/src/main/java/simplexity/simplehomes/listeners/PlayerMoveListener.java @@ -9,6 +9,7 @@ import simplexity.simplehomes.commands.HomeCommand; import simplexity.simplehomes.configs.ConfigHandler; import simplexity.simplehomes.configs.LocaleHandler; +import simplexity.simplehomes.configs.LocaleMessage; public class PlayerMoveListener implements Listener { @EventHandler @@ -18,7 +19,7 @@ public void onPlayerMove(PlayerMoveEvent moveEvent) { Location originalLocation = HomeCommand.teleportRequests.get(player); if (originalLocation == null) return; if (originalLocation.distance(player.getLocation()) < ConfigHandler.getInstance().getBufferMovement()) return; - player.sendRichMessage(LocaleHandler.getInstance().getYouMoved()); + player.sendRichMessage(LocaleMessage.YOU_MOVED.getMessage()); HomeCommand.teleportRequests.remove(player); BukkitTask task = HomeCommand.teleportTasks.get(player); task.cancel(); From 89126d7f288c4c22c5d09c72c35ba3585e34e78f Mon Sep 17 00:00:00 2001 From: Peashooter101 Date: Tue, 7 Apr 2026 00:43:07 -0500 Subject: [PATCH 2/2] Initial mod of README for v2.0.0 --- README.md | 77 +++++-- .../simplehomes/commands/HomeCommand.java | 192 +----------------- .../simplehomes/commands/HomeCommandOld.java | 192 ++++++++++++++++++ .../simplehomes/logic/HomeHandler.java | 4 + .../simplehomes/logic/TeleportHandler.java | 4 + .../{ => logic/safety}/SafetyCheck.java | 0 .../{ => logic/safety}/SafetyFlags.java | 0 .../simplehomes/util/HomePermission.java | 19 ++ 8 files changed, 277 insertions(+), 211 deletions(-) create mode 100644 src/main/java/simplexity/simplehomes/commands/HomeCommandOld.java create mode 100644 src/main/java/simplexity/simplehomes/logic/HomeHandler.java create mode 100644 src/main/java/simplexity/simplehomes/logic/TeleportHandler.java rename src/main/java/simplexity/simplehomes/{ => logic/safety}/SafetyCheck.java (100%) rename src/main/java/simplexity/simplehomes/{ => logic/safety}/SafetyFlags.java (100%) create mode 100644 src/main/java/simplexity/simplehomes/util/HomePermission.java diff --git a/README.md b/README.md index dd4287c..d265548 100644 --- a/README.md +++ b/README.md @@ -5,30 +5,65 @@ provides a straightforward interface for home management commands. ## Commands -| Command | Permission | Description | -|----------------|--------------------------|---------------------| -| `/sethome` | `homes.commands.sethome` | Sets a home | -| `/delhome` | `homes.commands.delhome` | Deletes a home | -| `/home` | `homes.commands.home` | Teleports to a home | -| `/homesreload` | `homes.reload` | Reloads the config | -| `/homelist` | `homes.commands.list` | Lists your homes | +| Command | Permission | Description | +|-----------------------|--------------------|------------------------------------| +| `/sethome` | `homes.sethome` | Sets a home | +| `/delhome` | `homes.delhome` | Deletes a home | +| `/home` | `homes.home` | Teleports to a home | +| `/homes` | `homes.list` | Lists your homes | +| `/homes admin reload` | `homes.reload` | Reloads the config | +| `/homes admin tp` | `homes.admin.tp` | Teleports to another player's home | +| `/homes admin list` | `homes.admin.list` | Lists another player's homes | ## Permissions -| Permission | Default | Description | -|--------------------------|---------|----------------------------------------------------------------------------------| -| `homes` | op | Allows base plugin functionality | -| `homes.commands` | op | Allows player to use commands | -| `homes.commands.sethome` | op | Allows player to set home | -| `homes.commands.delhome` | op | Allows player to delete home | -| `homes.commands.home` | op | Allows player to teleport to home | -| `homes.commands.list` | op | Allows you to list your own homes | -| `homes.bed` | op | Allows you to teleport to your bed | -| `homes.count` | op | Base for permission on number of homes you can have | -| `homes.count.` | op | Base for permission on number of homes you can have | -| `homes.count.bypass` | op | Allows for setting infinite homes regardless of how many you have set as the max | -| `homes.reload` | op | Allows reloading the config | -| `homes.safety.bypass` | false | Allows bypassing the safety checks | +| Permission | Default | Description | +|-----------------------|---------|----------------------------------------------------------------------------------| +| `homes.sethome` | true | Allows player to set home | +| `homes.delhome` | true | Allows player to delete home | +| `homes.home` | true | Allows player to teleport to home | +| `homes.list` | true | Allows you to list your own homes | +| `homes.bed` | true | Allows you to teleport to your bed, requires configuration setting | +| `homes.reload` | op | Allows reloading the config | +| `homes.bypass.safety` | false | Allows bypassing the safety checks | +| `homes.bypass.delay` | op | Allows bypassing the teleport delay | +| `homes.bypass.count` | op | Allows for setting infinite homes regardless of how many you have set as the max | + +## Configuring Number of Homes + +The number of homes is determined by permission nodes you create within the `config.yml`. + +```yml +# Configuration for number of homes based on permission +counts: + player: + permission: "homes.count.player" + home-count: 3 + moderator: + permission: "homes.count.mod" + home-count: 5 +``` + +In the above example, we can break down the counts part of the configuration into a few parts: + +```yml +counts: + name: + permission: "string" + home-count: int +``` + +`name` can be anything, just has to be unique. + +`permission` can be any string, just has to be unique across all plugins. + +- We recommend using `homes.count.`. +- This is the permission you will give to a player or group/rank. + +`home-count` should be an integer, the number of homes you want it to be for the player. + +- The highest home-count value given to a player will be applied. This means in the above example, + if a player has both then it will apply a maximum of 5 homes. ## Importing from other plugins diff --git a/src/main/java/simplexity/simplehomes/commands/HomeCommand.java b/src/main/java/simplexity/simplehomes/commands/HomeCommand.java index ad9403e..43d9598 100644 --- a/src/main/java/simplexity/simplehomes/commands/HomeCommand.java +++ b/src/main/java/simplexity/simplehomes/commands/HomeCommand.java @@ -1,192 +1,4 @@ package simplexity.simplehomes.commands; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitTask; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import simplexity.simplehomes.Home; -import simplexity.simplehomes.SafetyCheck; -import simplexity.simplehomes.SafetyFlags; -import simplexity.simplehomes.SimpleHomes; -import simplexity.simplehomes.configs.ConfigHandler; -import simplexity.simplehomes.configs.LocaleHandler; -import simplexity.simplehomes.saving.Cache; -import simplexity.simplehomes.saving.SQLHandler; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class HomeCommand implements TabExecutor { - - private static final String SAFETY_BYPASS = "homes.safety.bypass"; - private static final String DELAY_BYPASS = "homes.delay.bypass"; - public static HashMap teleportRequests = new HashMap<>(); - public static HashMap teleportTasks = new HashMap<>(); - - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - if (!(sender instanceof Player player)) { - sender.sendRichMessage(LocaleHandler.getInstance().getMustBePlayer()); - return false; - } - List playerHomesList = Cache.getInstance().getPlayerHomes(player.getUniqueId()); - //Check for lockout - if (CommandUtils.isLockedOut(player)) { - player.sendRichMessage(LocaleHandler.getInstance().getCannotUseCommand(), - Placeholder.parsed("value", String.valueOf(CommandUtils.maxHomesPermission(player))), - Placeholder.parsed("command", "/home")); - return false; - } - // Get the home to teleport the player to - Home playerHome; - if (args.length == 0) { - playerHome = handleNoArgs(player, playerHomesList); - if (playerHome == null) { - player.sendRichMessage(LocaleHandler.getInstance().getListNoHomes()); - return false; - } - } else { - playerHome = handleHomeSelection(player, playerHomesList, args[0]); - if (playerHome == null) { - player.sendRichMessage(LocaleHandler.getInstance().getHomeNotFound(), - Placeholder.parsed("name", args[0])); - return false; - } - } - // Check that it's safe - if (!shouldTeleport(player, args, playerHome)) return false; - handleTeleport(player, playerHome); - return true; - } - - // If player has a bed home and supplied no args, return a new home from that location and the configured bed home name. - // Otherwise, if they only have one home, return that one. - // Otherwise, return null - - private Home handleNoArgs(Player player, List homesList) { - Location bedHome = getBedLocation(player); - if (bedHome != null) return new Home(ConfigHandler.getInstance().getBedHomesName(), bedHome); - if (homesList.size() == 1) { - return homesList.get(0); - } - return null; - } - - private Home handleHomeSelection(Player player, List homesList, String suppliedName) { - Location bedLocation = getBedLocation(player); - if (suppliedName.equalsIgnoreCase(ConfigHandler.getInstance().getBedHomesName()) && bedLocation != null) { - return new Home(ConfigHandler.getInstance().getBedHomesName(), bedLocation); - } - return CommandUtils.getHomeFromList(homesList, suppliedName); - } - - // Do config, permission, and API checks for bed location - private Location getBedLocation(Player player) { - if (player.getPotentialBedLocation() == null) return null; - if (!ConfigHandler.getInstance().areBedHomesEnabled()) return null; - if (!player.hasPermission(CommandUtils.BED_PERMISSION)) return null; - return player.getPotentialBedLocation(); - } - - // Safety Check - private boolean shouldTeleport(Player player, String[] args, Home home) { - if (player.hasPermission(SAFETY_BYPASS)) return true; - if (CommandUtils.shouldOverride(args)) return true; - int safetyFlags = SafetyCheck.checkSafetyFlags(home.location(), ConfigHandler.getInstance().getBlacklistedBlocks()); - if (safetyFlags == 0) return true; - String safetyWarning = getSafetyWarning(safetyFlags); - if (safetyWarning == null) { - player.sendRichMessage(LocaleHandler.getInstance().getErrorHasOccurred()); - return false; - } - player.sendRichMessage(safetyWarning); - return false; - } - - // Gets the configured messages for the safety warnings - private String getSafetyWarning(int safetyFlags) { - String warning = ""; - if (safetyFlags == 0) return null; - if (SafetyFlags.DAMAGE_RISK.matches(safetyFlags)) { - warning = LocaleHandler.getInstance().getBlacklistedWarning(); - } - if (SafetyFlags.FALLING.matches(safetyFlags)) { - warning = LocaleHandler.getInstance().getVoidWarning(); - } - if (SafetyFlags.FIRE.matches(safetyFlags)) { - warning = LocaleHandler.getInstance().getFireWarning(); - } - if (SafetyFlags.LAVA.matches(safetyFlags)) { - warning = LocaleHandler.getInstance().getLavaWarning(); - } - if (SafetyFlags.NOT_SOLID.matches(safetyFlags)) { - warning = LocaleHandler.getInstance().getVoidWarning(); - } - if (SafetyFlags.SUFFOCATION.matches(safetyFlags)) { - warning = LocaleHandler.getInstance().getBlocksWarning(); - } - if (SafetyFlags.UNDERWATER.matches(safetyFlags)) { - warning = LocaleHandler.getInstance().getWaterWarning(); - } - if (SafetyFlags.UNSTABLE.matches(safetyFlags)) { - warning = LocaleHandler.getInstance().getVoidWarning(); - } - warning = warning + LocaleHandler.getInstance().getInsertOverride(); - return warning; - } - - private void handleTeleport(Player player, Home home) { - if (!ConfigHandler.getInstance().isDelayEnabled()) { - normalTeleport(player, home); - return; - } - if (player.hasPermission(DELAY_BYPASS)) { - normalTeleport(player, home); - return; - } - delayTeleport(player, home); - } - - private void normalTeleport(Player player, Home home) { - player.teleportAsync(home.location()); - player.sendRichMessage(LocaleHandler.getInstance().getHomeTeleported(), - Placeholder.parsed("name", home.name())); - } - - // Runnable that allows delaying the teleport, tied into the player move listener - private void delayTeleport(Player player, Home home) { - player.sendRichMessage(LocaleHandler.getInstance().getPleaseWait(), - Placeholder.parsed("value", String.valueOf(ConfigHandler.getInstance().getTimeInSeconds()))); - teleportRequests.put(player, player.getLocation()); - BukkitTask teleportTask = Bukkit.getScheduler().runTaskLater(SimpleHomes.getInstance(), () -> { - if (!teleportRequests.containsKey(player)) return; - player.teleportAsync(home.location()); - teleportRequests.remove(player); - player.sendRichMessage(LocaleHandler.getInstance().getHomeTeleported(), - Placeholder.parsed("name", home.name())); - }, ConfigHandler.getInstance().getTimeInSeconds() * 20L); - teleportTasks.put(player, teleportTask); - } - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { - if (!(commandSender instanceof Player player)) return List.of(); - List homesList = SQLHandler.getInstance().getHomes(player.getUniqueId()); - List stringList = new ArrayList<>(); - for (Home home : homesList) { - stringList.add(home.name()); - } - if (player.hasPermission(CommandUtils.BED_PERMISSION) && getBedLocation(player) != null) { - stringList.add(ConfigHandler.getInstance().getBedHomesName()); - } - return stringList; - } -} \ No newline at end of file +public class HomeCommand { +} diff --git a/src/main/java/simplexity/simplehomes/commands/HomeCommandOld.java b/src/main/java/simplexity/simplehomes/commands/HomeCommandOld.java new file mode 100644 index 0000000..ad9403e --- /dev/null +++ b/src/main/java/simplexity/simplehomes/commands/HomeCommandOld.java @@ -0,0 +1,192 @@ +package simplexity.simplehomes.commands; + +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitTask; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import simplexity.simplehomes.Home; +import simplexity.simplehomes.SafetyCheck; +import simplexity.simplehomes.SafetyFlags; +import simplexity.simplehomes.SimpleHomes; +import simplexity.simplehomes.configs.ConfigHandler; +import simplexity.simplehomes.configs.LocaleHandler; +import simplexity.simplehomes.saving.Cache; +import simplexity.simplehomes.saving.SQLHandler; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class HomeCommand implements TabExecutor { + + private static final String SAFETY_BYPASS = "homes.safety.bypass"; + private static final String DELAY_BYPASS = "homes.delay.bypass"; + public static HashMap teleportRequests = new HashMap<>(); + public static HashMap teleportTasks = new HashMap<>(); + + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + if (!(sender instanceof Player player)) { + sender.sendRichMessage(LocaleHandler.getInstance().getMustBePlayer()); + return false; + } + List playerHomesList = Cache.getInstance().getPlayerHomes(player.getUniqueId()); + //Check for lockout + if (CommandUtils.isLockedOut(player)) { + player.sendRichMessage(LocaleHandler.getInstance().getCannotUseCommand(), + Placeholder.parsed("value", String.valueOf(CommandUtils.maxHomesPermission(player))), + Placeholder.parsed("command", "/home")); + return false; + } + // Get the home to teleport the player to + Home playerHome; + if (args.length == 0) { + playerHome = handleNoArgs(player, playerHomesList); + if (playerHome == null) { + player.sendRichMessage(LocaleHandler.getInstance().getListNoHomes()); + return false; + } + } else { + playerHome = handleHomeSelection(player, playerHomesList, args[0]); + if (playerHome == null) { + player.sendRichMessage(LocaleHandler.getInstance().getHomeNotFound(), + Placeholder.parsed("name", args[0])); + return false; + } + } + // Check that it's safe + if (!shouldTeleport(player, args, playerHome)) return false; + handleTeleport(player, playerHome); + return true; + } + + // If player has a bed home and supplied no args, return a new home from that location and the configured bed home name. + // Otherwise, if they only have one home, return that one. + // Otherwise, return null + + private Home handleNoArgs(Player player, List homesList) { + Location bedHome = getBedLocation(player); + if (bedHome != null) return new Home(ConfigHandler.getInstance().getBedHomesName(), bedHome); + if (homesList.size() == 1) { + return homesList.get(0); + } + return null; + } + + private Home handleHomeSelection(Player player, List homesList, String suppliedName) { + Location bedLocation = getBedLocation(player); + if (suppliedName.equalsIgnoreCase(ConfigHandler.getInstance().getBedHomesName()) && bedLocation != null) { + return new Home(ConfigHandler.getInstance().getBedHomesName(), bedLocation); + } + return CommandUtils.getHomeFromList(homesList, suppliedName); + } + + // Do config, permission, and API checks for bed location + private Location getBedLocation(Player player) { + if (player.getPotentialBedLocation() == null) return null; + if (!ConfigHandler.getInstance().areBedHomesEnabled()) return null; + if (!player.hasPermission(CommandUtils.BED_PERMISSION)) return null; + return player.getPotentialBedLocation(); + } + + // Safety Check + private boolean shouldTeleport(Player player, String[] args, Home home) { + if (player.hasPermission(SAFETY_BYPASS)) return true; + if (CommandUtils.shouldOverride(args)) return true; + int safetyFlags = SafetyCheck.checkSafetyFlags(home.location(), ConfigHandler.getInstance().getBlacklistedBlocks()); + if (safetyFlags == 0) return true; + String safetyWarning = getSafetyWarning(safetyFlags); + if (safetyWarning == null) { + player.sendRichMessage(LocaleHandler.getInstance().getErrorHasOccurred()); + return false; + } + player.sendRichMessage(safetyWarning); + return false; + } + + // Gets the configured messages for the safety warnings + private String getSafetyWarning(int safetyFlags) { + String warning = ""; + if (safetyFlags == 0) return null; + if (SafetyFlags.DAMAGE_RISK.matches(safetyFlags)) { + warning = LocaleHandler.getInstance().getBlacklistedWarning(); + } + if (SafetyFlags.FALLING.matches(safetyFlags)) { + warning = LocaleHandler.getInstance().getVoidWarning(); + } + if (SafetyFlags.FIRE.matches(safetyFlags)) { + warning = LocaleHandler.getInstance().getFireWarning(); + } + if (SafetyFlags.LAVA.matches(safetyFlags)) { + warning = LocaleHandler.getInstance().getLavaWarning(); + } + if (SafetyFlags.NOT_SOLID.matches(safetyFlags)) { + warning = LocaleHandler.getInstance().getVoidWarning(); + } + if (SafetyFlags.SUFFOCATION.matches(safetyFlags)) { + warning = LocaleHandler.getInstance().getBlocksWarning(); + } + if (SafetyFlags.UNDERWATER.matches(safetyFlags)) { + warning = LocaleHandler.getInstance().getWaterWarning(); + } + if (SafetyFlags.UNSTABLE.matches(safetyFlags)) { + warning = LocaleHandler.getInstance().getVoidWarning(); + } + warning = warning + LocaleHandler.getInstance().getInsertOverride(); + return warning; + } + + private void handleTeleport(Player player, Home home) { + if (!ConfigHandler.getInstance().isDelayEnabled()) { + normalTeleport(player, home); + return; + } + if (player.hasPermission(DELAY_BYPASS)) { + normalTeleport(player, home); + return; + } + delayTeleport(player, home); + } + + private void normalTeleport(Player player, Home home) { + player.teleportAsync(home.location()); + player.sendRichMessage(LocaleHandler.getInstance().getHomeTeleported(), + Placeholder.parsed("name", home.name())); + } + + // Runnable that allows delaying the teleport, tied into the player move listener + private void delayTeleport(Player player, Home home) { + player.sendRichMessage(LocaleHandler.getInstance().getPleaseWait(), + Placeholder.parsed("value", String.valueOf(ConfigHandler.getInstance().getTimeInSeconds()))); + teleportRequests.put(player, player.getLocation()); + BukkitTask teleportTask = Bukkit.getScheduler().runTaskLater(SimpleHomes.getInstance(), () -> { + if (!teleportRequests.containsKey(player)) return; + player.teleportAsync(home.location()); + teleportRequests.remove(player); + player.sendRichMessage(LocaleHandler.getInstance().getHomeTeleported(), + Placeholder.parsed("name", home.name())); + }, ConfigHandler.getInstance().getTimeInSeconds() * 20L); + teleportTasks.put(player, teleportTask); + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { + if (!(commandSender instanceof Player player)) return List.of(); + List homesList = SQLHandler.getInstance().getHomes(player.getUniqueId()); + List stringList = new ArrayList<>(); + for (Home home : homesList) { + stringList.add(home.name()); + } + if (player.hasPermission(CommandUtils.BED_PERMISSION) && getBedLocation(player) != null) { + stringList.add(ConfigHandler.getInstance().getBedHomesName()); + } + return stringList; + } +} \ No newline at end of file diff --git a/src/main/java/simplexity/simplehomes/logic/HomeHandler.java b/src/main/java/simplexity/simplehomes/logic/HomeHandler.java new file mode 100644 index 0000000..e68ca82 --- /dev/null +++ b/src/main/java/simplexity/simplehomes/logic/HomeHandler.java @@ -0,0 +1,4 @@ +package simplexity.simplehomes.logic; + +public class HomeHandler { +} diff --git a/src/main/java/simplexity/simplehomes/logic/TeleportHandler.java b/src/main/java/simplexity/simplehomes/logic/TeleportHandler.java new file mode 100644 index 0000000..b3b136d --- /dev/null +++ b/src/main/java/simplexity/simplehomes/logic/TeleportHandler.java @@ -0,0 +1,4 @@ +package simplexity.simplehomes.logic; + +public class TeleportHandler { +} diff --git a/src/main/java/simplexity/simplehomes/SafetyCheck.java b/src/main/java/simplexity/simplehomes/logic/safety/SafetyCheck.java similarity index 100% rename from src/main/java/simplexity/simplehomes/SafetyCheck.java rename to src/main/java/simplexity/simplehomes/logic/safety/SafetyCheck.java diff --git a/src/main/java/simplexity/simplehomes/SafetyFlags.java b/src/main/java/simplexity/simplehomes/logic/safety/SafetyFlags.java similarity index 100% rename from src/main/java/simplexity/simplehomes/SafetyFlags.java rename to src/main/java/simplexity/simplehomes/logic/safety/SafetyFlags.java diff --git a/src/main/java/simplexity/simplehomes/util/HomePermission.java b/src/main/java/simplexity/simplehomes/util/HomePermission.java new file mode 100644 index 0000000..6fd7773 --- /dev/null +++ b/src/main/java/simplexity/simplehomes/util/HomePermission.java @@ -0,0 +1,19 @@ +package simplexity.simplehomes.util; + +import org.jetbrains.annotations.NotNull; + +public enum Permission { + HOMES_BASE("homes",) + + private final org.bukkit.permissions.Permission permission; + + Permission(org.bukkit.permissions.Permission permission) { + this.permission = permission; + } + + @NotNull + public org.bukkit.permissions.Permission getPermission() { + return permission; + } + +}