From 8344e3596eafdff0083e3869da5dab41bb1e6566 Mon Sep 17 00:00:00 2001 From: Taah Date: Thu, 24 Aug 2023 02:40:52 -0700 Subject: [PATCH] Remove checkTab and replace with silentCheckRank add isCancelled checks for MobListener Modify the plugin's YAML file to load before essentials Modify the world command to support the TFM Extras module Add more checks in WorldListener to prevent spawning entities and interacting with anything except openable things (doors, trapdoors, gates) --- server/build.gradle | 4 + .../java/dev/plex/command/PlexCommand.java | 85 ++++++++++++++----- .../dev/plex/command/impl/AdventureCMD.java | 2 +- .../java/dev/plex/command/impl/BanCMD.java | 2 +- .../dev/plex/command/impl/CreativeCMD.java | 2 +- .../java/dev/plex/command/impl/FreezeCMD.java | 2 +- .../java/dev/plex/command/impl/LockupCMD.java | 2 +- .../java/dev/plex/command/impl/MuteCMD.java | 2 +- .../java/dev/plex/command/impl/SmiteCMD.java | 2 +- .../dev/plex/command/impl/SpectatorCMD.java | 2 +- .../dev/plex/command/impl/SurvivalCMD.java | 2 +- .../dev/plex/command/impl/TempbanCMD.java | 2 +- .../java/dev/plex/command/impl/UnbanCMD.java | 2 +- .../dev/plex/command/impl/UnfreezeCMD.java | 2 +- .../java/dev/plex/command/impl/UnmuteCMD.java | 2 +- .../java/dev/plex/command/impl/WorldCMD.java | 42 +++++++-- .../dev/plex/listener/impl/MobListener.java | 5 ++ .../dev/plex/listener/impl/WorldListener.java | 68 ++++++++++++--- 18 files changed, 178 insertions(+), 52 deletions(-) diff --git a/server/build.gradle b/server/build.gradle index bbf8808..add0661 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -55,6 +55,10 @@ paper { required = false load = 'BEFORE' } + 'Essentials' { + required = false + load = 'BEFORE' + } } } diff --git a/server/src/main/java/dev/plex/command/PlexCommand.java b/server/src/main/java/dev/plex/command/PlexCommand.java index efafce8..1efc260 100644 --- a/server/src/main/java/dev/plex/command/PlexCommand.java +++ b/server/src/main/java/dev/plex/command/PlexCommand.java @@ -77,6 +77,16 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC if (register) { + if (getMap().getKnownCommands().containsKey(this.getName().toLowerCase())) + { + getMap().getKnownCommands().remove(this.getName().toLowerCase()); + } + this.getAliases().forEach(s -> { + if (getMap().getKnownCommands().containsKey(s.toLowerCase())) + { + getMap().getKnownCommands().remove(s.toLowerCase()); + } + }); getMap().register("plex", this); } } @@ -287,7 +297,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC { return checkRank((Player) sender, rank, permission); } - if (!sender.getName().equalsIgnoreCase("console")) + /*if (!sender.getName().equalsIgnoreCase("console")) { PlexPlayer plexPlayer = DataUtils.getPlayer(sender.getName()); if (plugin.getSystem().equalsIgnoreCase("ranks")) @@ -308,7 +318,48 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC throw new CommandFailException(PlexUtils.messageString("noPermissionNode", permission)); } } + }*/ + return true; + } + + /** + * Checks whether a sender has enough permissions or is high enough a rank + * + * @param sender A CommandSender + * @param rank The rank to check (if the server is using ranks) + * @param permission The permission to check (if the server is using permissions) + * @return true if the sender has enough permissions + * @see Rank + */ + protected boolean silentCheckRank(CommandSender sender, Rank rank, String permission) + { + PlexLog.debug("Checking {0} with {1}", sender.getName(), permission); + if (!isConsole(sender)) + { + return silentCheckRank((Player) sender, rank, permission); } + /*if (!sender.getName().equalsIgnoreCase("console")) + { + PlexPlayer plexPlayer = DataUtils.getPlayer(sender.getName()); + if (plugin.getSystem().equalsIgnoreCase("ranks")) + { + if (!plexPlayer.getRankFromString().isAtLeast(rank)) + { + throw new CommandFailException(PlexUtils.messageString("noPermissionRank", ChatColor.stripColor(rank.getLoginMessage()))); + } + if (rank.isAtLeast(Rank.ADMIN) && !plexPlayer.isAdminActive()) + { + throw new CommandFailException(PlexUtils.messageString("noPermissionRank", ChatColor.stripColor(rank.getLoginMessage()))); + } + } + else if (plugin.getSystem().equalsIgnoreCase("permissions")) + { + if (!perms.permission().isEmpty() && !plugin.getPermissions().playerHas(null, Bukkit.getOfflinePlayer(plexPlayer.getName()), perms.permission())) + { + throw new CommandFailException(PlexUtils.messageString("noPermissionNode", permission)); + } + } + }*/ return true; } @@ -330,18 +381,14 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC PlexPlayer plexPlayer = getPlexPlayer(player); if (plugin.getSystem().equalsIgnoreCase("ranks")) { - if (!plexPlayer.getRankFromString().isAtLeast(rank)) - { - throw new CommandFailException(PlexUtils.messageString("noPermissionRank", ChatColor.stripColor(rank.getLoginMessage()))); - } - if (rank.isAtLeast(Rank.ADMIN) && !plexPlayer.isAdminActive()) + if (!plexPlayer.getRankFromString().isAtLeast(rank) || (rank.isAtLeast(Rank.ADMIN) && !plexPlayer.isAdminActive())) { throw new CommandFailException(PlexUtils.messageString("noPermissionRank", ChatColor.stripColor(rank.getLoginMessage()))); } } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - if (!perms.permission().isEmpty() && !player.hasPermission(perms.permission())) + if (!permission.isEmpty() && !player.hasPermission(permission)) { throw new CommandFailException(PlexUtils.messageString("noPermissionNode", permission)); } @@ -351,10 +398,6 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC protected boolean silentCheckRank(Player player, Rank rank, String permission) { - if (player instanceof ConsoleCommandSender) - { - return true; - } PlexPlayer plexPlayer = getPlexPlayer(player); if (plugin.getSystem().equalsIgnoreCase("ranks")) { @@ -362,12 +405,12 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - return !perms.permission().isEmpty() && player.hasPermission(permission); + return !permission.isEmpty() && player.hasPermission(permission); } return false; } - /** +/* *//** * Checks whether a sender has enough permissions or is high enough a rank * * @param sender The player object @@ -375,17 +418,17 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC * @param permission The permission to check (if the server is using permissions) * @return true if the sender has enough permissions * @see Rank - */ - protected boolean checkTab(CommandSender sender, Rank rank, String permission) + *//* + protected boolean silentCheckRank(CommandSender sender, Rank rank, String permission) { if (!isConsole(sender)) { - return checkTab((Player) sender, rank, permission); + return silentCheckRank((Player) sender, rank, permission); } return true; } - /** + *//** * Checks whether a player has enough permissions or is high enough a rank * * @param player The player object @@ -393,8 +436,8 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC * @param permission The permission to check (if the server is using permissions) * @return true if the sender has enough permissions * @see Rank - */ - protected boolean checkTab(Player player, Rank rank, String permission) + *//* + protected boolean silentCheckRank(Player player, Rank rank, String permission) { PlexPlayer plexPlayer = getPlexPlayer(player); if (plugin.getSystem().equalsIgnoreCase("ranks")) @@ -403,10 +446,10 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - return !perms.permission().isEmpty() && player.hasPermission(permission); + return !permission.isEmpty() && player.hasPermission(permission); } return true; - } + }*/ /** * Checks if a player is an admin diff --git a/server/src/main/java/dev/plex/command/impl/AdventureCMD.java b/server/src/main/java/dev/plex/command/impl/AdventureCMD.java index a5b5ed3..5bae007 100644 --- a/server/src/main/java/dev/plex/command/impl/AdventureCMD.java +++ b/server/src/main/java/dev/plex/command/impl/AdventureCMD.java @@ -58,7 +58,7 @@ public class AdventureCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - if (checkTab(sender, Rank.ADMIN, "plex.gamemode.adventure.others")) + if (silentCheckRank(sender, Rank.ADMIN, "plex.gamemode.adventure.others")) { return PlexUtils.getPlayerNameList(); } diff --git a/server/src/main/java/dev/plex/command/impl/BanCMD.java b/server/src/main/java/dev/plex/command/impl/BanCMD.java index 2c45247..075a5c1 100644 --- a/server/src/main/java/dev/plex/command/impl/BanCMD.java +++ b/server/src/main/java/dev/plex/command/impl/BanCMD.java @@ -110,6 +110,6 @@ public class BanCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - return args.length == 1 && checkTab(sender, Rank.ADMIN, "plex.ban") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); + return args.length == 1 && silentCheckRank(sender, Rank.ADMIN, "plex.ban") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); } } diff --git a/server/src/main/java/dev/plex/command/impl/CreativeCMD.java b/server/src/main/java/dev/plex/command/impl/CreativeCMD.java index 65e30c1..0f4842a 100644 --- a/server/src/main/java/dev/plex/command/impl/CreativeCMD.java +++ b/server/src/main/java/dev/plex/command/impl/CreativeCMD.java @@ -62,7 +62,7 @@ public class CreativeCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - if (checkTab(sender, Rank.ADMIN, "plex.gamemode.creative.others")) + if (silentCheckRank(sender, Rank.ADMIN, "plex.gamemode.creative.others")) { return PlexUtils.getPlayerNameList(); } diff --git a/server/src/main/java/dev/plex/command/impl/FreezeCMD.java b/server/src/main/java/dev/plex/command/impl/FreezeCMD.java index 592eb66..60bf19e 100644 --- a/server/src/main/java/dev/plex/command/impl/FreezeCMD.java +++ b/server/src/main/java/dev/plex/command/impl/FreezeCMD.java @@ -69,6 +69,6 @@ public class FreezeCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - return args.length == 1 && checkTab(sender, Rank.ADMIN, "plex.freeze") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); + return args.length == 1 && silentCheckRank(sender, Rank.ADMIN, "plex.freeze") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); } } \ No newline at end of file diff --git a/server/src/main/java/dev/plex/command/impl/LockupCMD.java b/server/src/main/java/dev/plex/command/impl/LockupCMD.java index 042d6ef..1aa70a5 100644 --- a/server/src/main/java/dev/plex/command/impl/LockupCMD.java +++ b/server/src/main/java/dev/plex/command/impl/LockupCMD.java @@ -54,6 +54,6 @@ public class LockupCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - return args.length == 1 && checkTab(sender, Rank.ADMIN, "plex.lockup") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); + return args.length == 1 && silentCheckRank(sender, Rank.ADMIN, "plex.lockup") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); } } \ No newline at end of file diff --git a/server/src/main/java/dev/plex/command/impl/MuteCMD.java b/server/src/main/java/dev/plex/command/impl/MuteCMD.java index 9eb3687..f47223d 100644 --- a/server/src/main/java/dev/plex/command/impl/MuteCMD.java +++ b/server/src/main/java/dev/plex/command/impl/MuteCMD.java @@ -62,6 +62,6 @@ public class MuteCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - return args.length == 1 && checkTab(sender, Rank.ADMIN, "plex.mute") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); + return args.length == 1 && silentCheckRank(sender, Rank.ADMIN, "plex.mute") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); } } \ No newline at end of file diff --git a/server/src/main/java/dev/plex/command/impl/SmiteCMD.java b/server/src/main/java/dev/plex/command/impl/SmiteCMD.java index 5538473..196e917 100644 --- a/server/src/main/java/dev/plex/command/impl/SmiteCMD.java +++ b/server/src/main/java/dev/plex/command/impl/SmiteCMD.java @@ -144,7 +144,7 @@ public class SmiteCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - if (checkTab(sender, Rank.ADMIN, "plex.smite") && args.length == 1) + if (silentCheckRank(sender, Rank.ADMIN, "plex.smite") && args.length == 1) { return PlexUtils.getPlayerNameList(); } diff --git a/server/src/main/java/dev/plex/command/impl/SpectatorCMD.java b/server/src/main/java/dev/plex/command/impl/SpectatorCMD.java index 276aee8..ea3fbd5 100644 --- a/server/src/main/java/dev/plex/command/impl/SpectatorCMD.java +++ b/server/src/main/java/dev/plex/command/impl/SpectatorCMD.java @@ -58,7 +58,7 @@ public class SpectatorCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - if (checkTab(sender, Rank.ADMIN, "plex.gamemode.spectator.others")) + if (silentCheckRank(sender, Rank.ADMIN, "plex.gamemode.spectator.others")) { return PlexUtils.getPlayerNameList(); } diff --git a/server/src/main/java/dev/plex/command/impl/SurvivalCMD.java b/server/src/main/java/dev/plex/command/impl/SurvivalCMD.java index 49ede47..33e420d 100644 --- a/server/src/main/java/dev/plex/command/impl/SurvivalCMD.java +++ b/server/src/main/java/dev/plex/command/impl/SurvivalCMD.java @@ -59,7 +59,7 @@ public class SurvivalCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - if (checkTab(sender, Rank.ADMIN, "plex.gamemode.survival.others")) + if (silentCheckRank(sender, Rank.ADMIN, "plex.gamemode.survival.others")) { return PlexUtils.getPlayerNameList(); } diff --git a/server/src/main/java/dev/plex/command/impl/TempbanCMD.java b/server/src/main/java/dev/plex/command/impl/TempbanCMD.java index 8161669..bbae502 100644 --- a/server/src/main/java/dev/plex/command/impl/TempbanCMD.java +++ b/server/src/main/java/dev/plex/command/impl/TempbanCMD.java @@ -98,6 +98,6 @@ public class TempbanCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - return args.length == 1 && checkTab(sender, Rank.ADMIN, "plex.tempban") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); + return args.length == 1 && silentCheckRank(sender, Rank.ADMIN, "plex.tempban") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); } } diff --git a/server/src/main/java/dev/plex/command/impl/UnbanCMD.java b/server/src/main/java/dev/plex/command/impl/UnbanCMD.java index 290e5b7..b6dc697 100644 --- a/server/src/main/java/dev/plex/command/impl/UnbanCMD.java +++ b/server/src/main/java/dev/plex/command/impl/UnbanCMD.java @@ -61,6 +61,6 @@ public class UnbanCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - return args.length == 1 && checkTab(sender, Rank.ADMIN, "plex.unban") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); + return args.length == 1 && silentCheckRank(sender, Rank.ADMIN, "plex.unban") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); } } diff --git a/server/src/main/java/dev/plex/command/impl/UnfreezeCMD.java b/server/src/main/java/dev/plex/command/impl/UnfreezeCMD.java index 523da69..0985d52 100644 --- a/server/src/main/java/dev/plex/command/impl/UnfreezeCMD.java +++ b/server/src/main/java/dev/plex/command/impl/UnfreezeCMD.java @@ -41,6 +41,6 @@ public class UnfreezeCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - return args.length == 1 && checkTab(sender, Rank.ADMIN, "plex.unfreeze") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); + return args.length == 1 && silentCheckRank(sender, Rank.ADMIN, "plex.unfreeze") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); } } diff --git a/server/src/main/java/dev/plex/command/impl/UnmuteCMD.java b/server/src/main/java/dev/plex/command/impl/UnmuteCMD.java index 4d0cc33..e0f74c2 100644 --- a/server/src/main/java/dev/plex/command/impl/UnmuteCMD.java +++ b/server/src/main/java/dev/plex/command/impl/UnmuteCMD.java @@ -41,6 +41,6 @@ public class UnmuteCMD extends PlexCommand @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { - return args.length == 1 && checkTab(sender, Rank.ADMIN, "plex.unfreeze") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); + return args.length == 1 && silentCheckRank(sender, Rank.ADMIN, "plex.unfreeze") ? PlexUtils.getPlayerNameList() : ImmutableList.of(); } } diff --git a/server/src/main/java/dev/plex/command/impl/WorldCMD.java b/server/src/main/java/dev/plex/command/impl/WorldCMD.java index d2db03e..9db4939 100644 --- a/server/src/main/java/dev/plex/command/impl/WorldCMD.java +++ b/server/src/main/java/dev/plex/command/impl/WorldCMD.java @@ -1,27 +1,32 @@ package dev.plex.command.impl; -import com.google.common.collect.ImmutableList; +import dev.plex.Plex; import dev.plex.command.PlexCommand; import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.source.RequiredCommandSource; import dev.plex.rank.enums.Rank; +import dev.plex.util.PlexLog; import net.kyori.adventure.text.Component; +import org.apache.commons.compress.utils.Lists; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; +import java.util.UUID; +import java.util.regex.Pattern; @CommandPermissions(level = Rank.OP, permission = "plex.world", source = RequiredCommandSource.IN_GAME) @CommandParameters(name = "world", description = "Teleport to a world.", usage = "/ ") public class WorldCMD extends PlexCommand { + private static final Pattern UUID_PATTERN = Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"); + @Override protected Component execute(@NotNull CommandSender sender, @Nullable Player playerSender, String[] args) { @@ -30,18 +35,45 @@ public class WorldCMD extends PlexCommand { return usage(); } + World world = getNonNullWorld(args[0]); + boolean playerWorld = args[0].matches("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"); + if (playerWorld && Plex.get().getModuleManager().getModules().stream().anyMatch(plexModule -> plexModule.getPlexModuleFile().getName().equalsIgnoreCase("Module-TFMExtras"))) + { + checkRank(playerSender, Rank.ADMIN, "plex.world.playerworlds"); + } playerSender.teleportAsync(world.getSpawnLocation()); return messageComponent("playerWorldTeleport", world.getName()); } + @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { + final List completions = Lists.newArrayList(); + final Player player = (Player) sender; if (args.length == 1) { - return Bukkit.getWorlds().stream().map(World::getName).collect(Collectors.toList()); + @NotNull List worlds = Bukkit.getWorlds(); + for (World world : worlds) + { + String worldName = world.getName(); + + try + { + final UUID uuid = UUID.fromString(worldName); + if (uuid.equals(player.getUniqueId()) || silentCheckRank(player, Rank.ADMIN, "plex.world.playerworlds")) + { + completions.add(worldName); + } + } + catch (Exception e) + { + completions.add(worldName); + } + } } - return ImmutableList.of(); + + return completions; } } diff --git a/server/src/main/java/dev/plex/listener/impl/MobListener.java b/server/src/main/java/dev/plex/listener/impl/MobListener.java index 9f0182e..fc7d06a 100644 --- a/server/src/main/java/dev/plex/listener/impl/MobListener.java +++ b/server/src/main/java/dev/plex/listener/impl/MobListener.java @@ -11,6 +11,7 @@ import org.bukkit.entity.Ageable; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; @@ -53,6 +54,7 @@ public class MobListener extends PlexListener @EventHandler public void onEntitySpawn(EntitySpawnEvent event) { + if (event.isCancelled()) return; if (event.getEntity().getEntitySpawnReason() == CreatureSpawnEvent.SpawnReason.SPAWNER_EGG) { // for the future, we can instead filter and restrict nbt tags right here. @@ -90,6 +92,7 @@ public class MobListener extends PlexListener @EventHandler(priority = EventPriority.HIGH) public void onEntityClick(PlayerInteractEntityEvent event) { + if (event.isCancelled()) return; Material handItem = event.getPlayer().getEquipment().getItem(event.getHand()).getType(); if (event.getRightClicked() instanceof Ageable entity) { @@ -111,6 +114,8 @@ public class MobListener extends PlexListener @EventHandler(priority = EventPriority.HIGH) public void onPlayerInteract(PlayerInteractEvent event) { + if (event.useItemInHand() == Event.Result.DENY) return; + if (event.useInteractedBlock() == Event.Result.DENY) return; if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (SPAWN_EGGS.contains(event.getMaterial())) diff --git a/server/src/main/java/dev/plex/listener/impl/WorldListener.java b/server/src/main/java/dev/plex/listener/impl/WorldListener.java index 9da6c67..f965998 100644 --- a/server/src/main/java/dev/plex/listener/impl/WorldListener.java +++ b/server/src/main/java/dev/plex/listener/impl/WorldListener.java @@ -1,5 +1,6 @@ package dev.plex.listener.impl; +import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent; import dev.plex.Plex; import dev.plex.listener.PlexListener; import dev.plex.player.PlexPlayer; @@ -12,6 +13,10 @@ import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.World; +import org.bukkit.block.data.Openable; +import org.bukkit.block.data.Powerable; +import org.bukkit.block.data.type.Door; +import org.bukkit.block.data.type.TrapDoor; import org.bukkit.command.Command; import org.bukkit.command.PluginIdentifiableCommand; import org.bukkit.entity.EntityType; @@ -20,9 +25,9 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntitySpawnEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.*; import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -33,7 +38,7 @@ public class WorldListener extends PlexListener { private final List EDIT_COMMANDS = Arrays.asList("bigtree", "ebigtree", "largetree", "elargetree", "break", "ebreak", "antioch", "nuke", "editsign", "tree", "etree"); - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onBlockPlace(BlockPlaceEvent event) { if (!canModifyWorld(event.getPlayer(), true)) @@ -42,7 +47,7 @@ public class WorldListener extends PlexListener } } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onBlockBreak(BlockBreakEvent event) { if (!canModifyWorld(event.getPlayer(), true)) @@ -51,7 +56,45 @@ public class WorldListener extends PlexListener } } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) + public void onInteractWorld(PlayerInteractEvent event) + { + if (event.getInteractionPoint() != null && event.getInteractionPoint().getBlock().getBlockData() instanceof Openable) return; + if (!canModifyWorld(event.getPlayer(), true)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onInteractWorld(PlayerInteractEntityEvent event) + { + if (!canModifyWorld(event.getPlayer(), true)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onInteractWorld(PlayerItemDamageEvent event) + { + if (!canModifyWorld(event.getPlayer(), true)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onInteractWorld(EntityDamageByEntityEvent event) + { + if (!(event.getDamager() instanceof Player player)) return; + if (!canModifyWorld(player, true)) + { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.LOWEST) public void onEntitySpawn(EntitySpawnEvent event) { if (event.getEntityType() != EntityType.SLIME) @@ -87,10 +130,10 @@ public class WorldListener extends PlexListener } } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onWorldTeleport(PlayerTeleportEvent event) { - if (!canEnterWorld(event.getPlayer())) + if (!canEnterWorld(event.getPlayer(), event.getTo().getWorld())) { event.setCancelled(true); } @@ -193,13 +236,12 @@ public class WorldListener extends PlexListener * @param player The player who wants to enter the world * @return Returns true if the person has the ability to enter the world */ - private boolean canEnterWorld(Player player) + private boolean canEnterWorld(Player player, World destination) { PlexPlayer plexPlayer = plugin.getPlayerCache().getPlexPlayerMap().get(player.getUniqueId()); - World world = player.getWorld(); if (plugin.getSystem().equalsIgnoreCase("permissions")) { - String permission = plugin.config.getString("worlds." + world.getName().toLowerCase() + ".entry.permission"); + String permission = plugin.config.getString("worlds." + destination.getName().toLowerCase() + ".entry.permission"); if (permission == null) { return true; @@ -211,9 +253,9 @@ public class WorldListener extends PlexListener } else if (plugin.getSystem().equalsIgnoreCase("ranks")) { - if (plugin.config.contains("worlds." + world.getName().toLowerCase() + ".entry.requiredLevels")) + if (plugin.config.contains("worlds." + destination.getName().toLowerCase() + ".entry.requiredLevels")) { - @NotNull List requiredLevel = plugin.config.getStringList("worlds." + world.getName().toLowerCase() + ".entry.requiredLevels"); + @NotNull List requiredLevel = plugin.config.getStringList("worlds." + destination.getName().toLowerCase() + ".entry.requiredLevels"); if (checkLevel(plexPlayer, requiredLevel.toArray(String[]::new))) { return true; @@ -225,7 +267,7 @@ public class WorldListener extends PlexListener } } - String noEntry = plugin.config.getString("worlds." + world.getName().toLowerCase() + ".entry.message"); + String noEntry = plugin.config.getString("worlds." + destination.getName().toLowerCase() + ".entry.message"); if (noEntry != null) { player.sendMessage(MiniMessage.miniMessage().deserialize(noEntry));