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