diff --git a/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java b/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java index e2b621af..764e1515 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java @@ -1,25 +1,17 @@ package me.totalfreedom.totalfreedommod; -import com.google.common.collect.Multimap; import io.papermc.lib.PaperLib; -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeModifier; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; +import org.spigotmc.event.player.PlayerSpawnLocationEvent; public class MovementValidator extends FreedomService { @@ -41,67 +33,36 @@ public class MovementValidator extends FreedomService public void onPlayerTeleport(PlayerTeleportEvent event) { // Check absolute value to account for negatives - if (Math.abs(Objects.requireNonNull(event.getTo()).getX()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getZ()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getY()) >= MAX_XYZ_COORD) + if (isOutOfBounds(event.getTo())) { event.setCancelled(true); // illegal position, cancel it } } + private boolean isOutOfBounds(final Location position) + { + return Math.abs(position.getX()) >= MAX_XYZ_COORD || Math.abs(position.getY()) >= MAX_XYZ_COORD || Math.abs(position.getZ()) >= MAX_XYZ_COORD; + } + @EventHandler(priority = EventPriority.HIGH) public void onPlayerMove(PlayerMoveEvent event) { final Player player = event.getPlayer(); Location from = event.getFrom(); Location to = event.getTo(); - assert to != null; - if (to.getX() >= from.getX() + MAX_DISTANCE_TRAVELED || to.getY() >= from.getY() + MAX_DISTANCE_TRAVELED || to.getZ() >= from.getZ() + MAX_DISTANCE_TRAVELED) + double distance = from.distanceSquared(to); + + if (distance >= MAX_DISTANCE_TRAVELED) { event.setCancelled(true); - player.kickPlayer(ChatColor.RED + "You were moving too quickly!"); + player.kick(Component.text("You were moving too quickly!", NamedTextColor.RED)); } // Check absolute value to account for negatives - if (Math.abs(event.getTo().getX()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getZ()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getY()) >= MAX_XYZ_COORD) + if (isOutOfBounds(event.getTo())) { event.setCancelled(true); PaperLib.teleportAsync(player, player.getWorld().getSpawnLocation()); } - - if (exploitItem(event.getPlayer().getInventory().getHelmet())) - { - event.getPlayer().getInventory().setHelmet(new ItemStack(Material.AIR)); - event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your helmet slot."); - event.setCancelled(true); - } - if (exploitItem(event.getPlayer().getInventory().getBoots())) - { - event.getPlayer().getInventory().setBoots(new ItemStack(Material.AIR)); - event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your boots slot."); - event.setCancelled(true); - } - if (exploitItem(event.getPlayer().getInventory().getLeggings())) - { - event.getPlayer().getInventory().setLeggings(new ItemStack(Material.AIR)); - event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your leggings slot."); - event.setCancelled(true); - } - if (exploitItem(event.getPlayer().getInventory().getChestplate())) - { - event.getPlayer().getInventory().setChestplate(new ItemStack(Material.AIR)); - event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your chestplate slot."); - event.setCancelled(true); - } - if (exploitItem(event.getPlayer().getInventory().getItemInMainHand())) - { - event.getPlayer().getInventory().setItemInMainHand(new ItemStack(Material.AIR)); - event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your hand."); - event.setCancelled(true); - } - if (exploitItem(event.getPlayer().getInventory().getItemInOffHand())) - { - event.getPlayer().getInventory().setItemInOffHand(new ItemStack(Material.AIR)); - event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your offhand."); - event.setCancelled(true); - } } @EventHandler(priority = EventPriority.HIGH) @@ -110,72 +71,28 @@ public class MovementValidator extends FreedomService final Player player = event.getPlayer(); // Validate position - if (Math.abs(player.getLocation().getX()) >= MAX_XYZ_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XYZ_COORD || Math.abs(player.getLocation().getY()) >= MAX_XYZ_COORD) + if (isOutOfBounds(player.getLocation())) { PaperLib.teleportAsync(player, player.getWorld().getSpawnLocation()); // Illegal position, teleport to spawn } } - @EventHandler - public void onPlayerHoldItem(PlayerItemHeldEvent event) + @EventHandler(priority = EventPriority.HIGH) + public void onPlayerSpawn(PlayerSpawnLocationEvent event) { - if (exploitItem(event.getPlayer().getInventory().getItemInMainHand())) - { - event.getPlayer().getInventory().setItemInMainHand(new ItemStack(Material.AIR)); - event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your hand."); - } - if (exploitItem(event.getPlayer().getInventory().getItemInOffHand())) - { - event.getPlayer().getInventory().setItemInOffHand(new ItemStack(Material.AIR)); - event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your offhand."); - } - } + final Location playerSpawn = event.getSpawnLocation(); + final Location worldSpawn = event.getPlayer().getWorld().getSpawnLocation(); - private Boolean exploitItem(ItemStack item) - { - if (item == null) + // If the player's spawn is equal to the world's spawn, there is no need to check. + // This will also prevent any possible feedback loops pertaining to setting an out of bounds world spawn to the same world spawn. + if (playerSpawn == worldSpawn) { - return false; + return; } - ItemMeta meta = item.getItemMeta(); - if (meta != null) + if (isOutOfBounds(worldSpawn)) { - Multimap attributes = meta.getAttributeModifiers(); - if (attributes != null) - { - Map> attrMap = attributes.asMap(); - - // For every attribute... - for (Attribute attr : attributes.keySet()) - { - // Default values - boolean posInf = false; - boolean negInf = false; - - // For every AttributeModifier... - for (AttributeModifier modifier : attrMap.get(attr)) - { - // Are they ∞ or -∞? - if (modifier.getAmount() == Double.POSITIVE_INFINITY) - { - posInf = true; - } - else if (modifier.getAmount() == Double.NEGATIVE_INFINITY) - { - negInf = true; - } - } - - // Are both values set as true? - if (posInf && negInf) - { - return true; - } - } - } - + event.setSpawnLocation(worldSpawn); } - return false; } } \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/blocking/EventBlocker.java b/src/main/java/me/totalfreedom/totalfreedommod/blocking/EventBlocker.java index c9c43050..39fd35f8 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/blocking/EventBlocker.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/blocking/EventBlocker.java @@ -172,7 +172,7 @@ public class EventBlocker extends FreedomService @EventHandler(priority = EventPriority.NORMAL) public void onPlayerDropItem(PlayerDropItemEvent event) { - if (!plugin.al.isAdmin(event.getPlayer())) + if (!plugin.al.isAdmin(event.getPlayer()) && !ConfigEntry.ALLOW_ITEM_DROPS.getBoolean()) { event.setCancelled(true); } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java index 43a37446..545d9e6f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java @@ -19,9 +19,9 @@ public class Command_toggle extends FreedomCommand private final List toggles = Arrays.asList( "waterplace", "fireplace", "lavaplace", "fluidspread", "lavadmg", "firespread", "frostwalk", "firework", "prelog", "lockdown", "petprotect", "entitywipe", "nonuke [range] [count]", - "explosives [radius]", "unsafeenchs", "bells", "armorstands", "masterblocks", "books", "grindstones", - "jukeboxes", "spawners", "4chan", "beehives", "respawnanchors", "autotp", "autoclear", "minecarts", "mp44", - "landmines", "tossmob", "gravity"); + "explosives [radius]", "unsafeenchs", "bells", "armorstands", "masterblocks", "item_drops", + "grindstones", "jukeboxes", "spawners", "4chan", "beehives", "respawnanchors", "autotp", "autoclear", "minecarts", + "mp44", "landmines", "tossmob", "gravity"); @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) @@ -205,6 +205,12 @@ public class Command_toggle extends FreedomCommand break; } + case "item_drops": + { + toggle("Item drops are", ConfigEntry.ALLOW_ITEM_DROPS); + break; + } + case "grindstones": { toggle("Grindstones are", ConfigEntry.ALLOW_GRINDSTONES); @@ -319,4 +325,4 @@ public class Command_toggle extends FreedomCommand } return Collections.emptyList(); } -} \ No newline at end of file +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java index aad8c8aa..d7b6fbdd 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/config/ConfigEntry.java @@ -35,6 +35,7 @@ public enum ConfigEntry ALLOW_GRAVITY(Boolean.class, "allow.gravity"), ALLOW_MASTERBLOCKS(Boolean.class, "allow.masterblocks"), ALLOW_BOOKS(Boolean.class, "allow.books"), + ALLOW_ITEM_DROPS(Boolean.class, "allow.item_drops"), // BLOCKED_CHATCODES(String.class, "blocked_chatcodes"), // diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6631fedb..ac8a4418 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -221,6 +221,7 @@ allow: gravity: false masterblocks: false books: true + item_drops: false blocked_commands: # diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c59fb293..cb414b02 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -18,4 +18,4 @@ libraries: - org.apache.commons:commons-lang3:3.12.0 - commons-io:commons-io:2.11.0 - org.jetbrains:annotations:23.0.0 - - org.javassist:javassist:3.29.1-GA \ No newline at end of file + - org.javassist:javassist:3.29.1-GA