diff --git a/pom.xml b/pom.xml index 92f00dc3..b9355d7b 100644 --- a/pom.xml +++ b/pom.xml @@ -114,14 +114,14 @@ commons-io commons-io - 2.8.0 + 2.11.0 compile org.apache.commons commons-lang3 - 3.11 + 3.12.0 compile @@ -132,12 +132,6 @@ compile - - com.github.speedxx - Mojangson - 1957eef8d6 - - org.bstats bstats-bukkit @@ -239,7 +233,7 @@ org.jetbrains annotations - 20.1.0 + 22.0.0 compile @@ -253,7 +247,7 @@ org.junit.jupiter junit-jupiter - 5.4.2 + 5.7.2 compile @@ -332,7 +326,7 @@ org.apache.maven.plugins maven-antrun-plugin - 1.8 + 3.0.0 default-cli diff --git a/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java b/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java index c44d06c5..e2b621af 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/MovementValidator.java @@ -1,17 +1,16 @@ package me.totalfreedom.totalfreedommod; -import ca.momothereal.mojangson.ex.MojangsonParseException; -import ca.momothereal.mojangson.value.MojangsonCompound; -import ca.momothereal.mojangson.value.MojangsonValue; +import com.google.common.collect.Multimap; import io.papermc.lib.PaperLib; -import java.util.List; + +import java.util.Collection; +import java.util.Map; import java.util.Objects; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.NBTTagList; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack; +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; @@ -20,6 +19,7 @@ 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; public class MovementValidator extends FreedomService { @@ -133,55 +133,49 @@ public class MovementValidator extends FreedomService private Boolean exploitItem(ItemStack item) { - net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(item); - NBTTagList modifiers = getAttributeList(nmsStack); - MojangsonCompound compound = new MojangsonCompound(); - boolean foundNegative = false; - boolean foundPositive = false; - try + if (item == null) { - String mod = modifiers.toString(); - String fancy = ("{" + (mod.substring(1, mod.length() - 1).replace("{", "").replace("}", "")) + "}"); - compound.read(fancy); - for (String key : compound.keySet()) + return false; + } + + ItemMeta meta = item.getItemMeta(); + if (meta != null) + { + Multimap attributes = meta.getAttributeModifiers(); + if (attributes != null) { - if (Objects.equals(key, "Amount")) //null-safe .equals() + Map> attrMap = attributes.asMap(); + + // For every attribute... + for (Attribute attr : attributes.keySet()) { - @SuppressWarnings("rawtypes") - List values = compound.get(key); - for (MojangsonValue val : values) + // Default values + boolean posInf = false; + boolean negInf = false; + + // For every AttributeModifier... + for (AttributeModifier modifier : attrMap.get(attr)) { - if (val.getValue().toString().equals("Infinityd")) + // Are they ∞ or -∞? + if (modifier.getAmount() == Double.POSITIVE_INFINITY) { - foundPositive = true; + posInf = true; } - if (val.getValue().toString().equals("-Infinityd")) + else if (modifier.getAmount() == Double.NEGATIVE_INFINITY) { - foundNegative = true; + negInf = true; } } + + // Are both values set as true? + if (posInf && negInf) + { + return true; + } } } - } - catch (MojangsonParseException e) - { - e.printStackTrace(); - } - return foundNegative && foundPositive; - } - - private NBTTagList getAttributeList(net.minecraft.server.v1_16_R3.ItemStack stack) - { - if (stack.getTag() == null) - { - stack.setTag(new NBTTagCompound()); } - NBTTagList attr = stack.getTag().getList("AttributeModifiers", 10); - if (attr == null) - { - stack.getTag().set("AttributeModifiers", new NBTTagList()); - } - return stack.getTag().getList("AttributeModifiers", 10); + return false; } } \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java index c6b38381..2b0c7cc4 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java @@ -1,8 +1,8 @@ package me.totalfreedom.totalfreedommod.command; -import java.util.ArrayList; -import java.util.List; import java.util.Objects; + +import com.earth2me.essentials.User; import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.punishments.Punishment; @@ -60,28 +60,39 @@ public class Command_ban extends FreedomCommand } final String username; - final List ips = new ArrayList<>(); + final String ip; final Player player = getPlayer(args[0]); if (player == null) { - final PlayerData entry = plugin.pl.getData(args[0]); - - if (entry == null) + // Gets the IP using Essentials data if available + if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null) { - msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly."); - return true; + User essUser = plugin.esb.getEssentialsUser(args[0]); + // + username = essUser.getName(); + ip = essUser.getLastLoginAddress(); + } + // Last resort - Getting the first result from the username itself + else + { + PlayerData entry = plugin.pl.getData(args[0]); + if (entry == null) + { + msg(PLAYER_NOT_FOUND); + return true; + } + else + { + username = entry.getName(); + ip = entry.getIps().get(0); + } } - - username = entry.getName(); - ips.addAll(entry.getIps()); } else { - final PlayerData entry = plugin.pl.getData(player); username = player.getName(); - //ips.addAll(entry.getIps());/ - ips.add(FUtil.getIp(player)); + ip = FUtil.getIp(player); // Deop player.setOp(false); @@ -126,7 +137,6 @@ public class Command_ban extends FreedomCommand // Ban player Ban ban; - if (player != null) { ban = Ban.forPlayer(player, sender, null, reason); @@ -135,12 +145,8 @@ public class Command_ban extends FreedomCommand { ban = Ban.forPlayerName(username, sender, null, reason); } + ban.addIp(ip); - for (String ip : ips) - { - ban.addIp(ip); - ban.addIp(FUtil.getFuzzyIp(ip)); - } plugin.bm.addBan(ban); @@ -154,7 +160,7 @@ public class Command_ban extends FreedomCommand { bcast.append(" - Reason: ").append(ChatColor.YELLOW).append(reason); } - msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + StringUtils.join(ips, ", ")); + msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + ip); FUtil.adminAction(sender.getName(), bcast.toString(), true); } @@ -172,7 +178,7 @@ public class Command_ban extends FreedomCommand } // Log ban - plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.BAN, reason)); + plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.BAN, reason)); return true; } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java index d6711948..8e6f4187 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java @@ -1,6 +1,5 @@ package me.totalfreedom.totalfreedommod.command; -import java.util.Objects; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.config.ConfigEntry; @@ -43,7 +42,7 @@ public class Command_doom extends FreedomCommand FUtil.adminAction(sender.getName(), "Casting oblivion over " + player.getName(), true); FUtil.bcastMsg(player.getName() + " will be completely obliviated!", ChatColor.RED); - final String ip = Objects.requireNonNull(player.getAddress()).getAddress().getHostAddress().trim(); + final String ip = FUtil.getIp(player); // Remove from admin Admin admin = getAdmin(player); @@ -76,10 +75,7 @@ public class Command_doom extends FreedomCommand // Ban player Ban ban = Ban.forPlayer(player, sender); ban.setReason((reason == null ? "FUCKOFF" : reason)); - for (String playerIp : plugin.pl.getData(player).getIps()) - { - ban.addIp(playerIp); - } + ban.addIp(ip); plugin.bm.addBan(ban); // Set gamemode to survival diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tban.java deleted file mode 100644 index c4c4c62f..00000000 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tban.java +++ /dev/null @@ -1,143 +0,0 @@ -package me.totalfreedom.totalfreedommod.command; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import me.totalfreedom.totalfreedommod.banning.Ban; -import me.totalfreedom.totalfreedommod.player.PlayerData; -import me.totalfreedom.totalfreedommod.punishments.Punishment; -import me.totalfreedom.totalfreedommod.punishments.PunishmentType; -import me.totalfreedom.totalfreedommod.rank.Rank; -import me.totalfreedom.totalfreedommod.util.FUtil; -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH, blockHostConsole = true) -@CommandParameters(description = "Temporarily bans a player for five minutes.", usage = "/ [-q] [reason]", aliases = "noob") -public class Command_tban extends FreedomCommand -{ - - @Override - public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) - { - if (args.length == 0) - { - return false; - } - - boolean quiet = args[0].equalsIgnoreCase("-q"); - if (quiet) - { - args = org.apache.commons.lang3.ArrayUtils.subarray(args, 1, args.length); - - if (args.length < 1) - { - return false; - } - } - - final String username; - - final Player player = getPlayer(args[0]); - final PlayerData entry; - if (player == null) - { - entry = plugin.pl.getData(args[0]); - - if (entry == null) - { - msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly."); - return true; - } - - username = entry.getName(); - } - else - { - entry = plugin.pl.getData(player); - username = player.getName(); - } - final List ips = new ArrayList<>(entry.getIps()); - - String reason = null; - if (args.length > 1) - { - reason = StringUtils.join(args, " ", 1, args.length); - } - - StringBuilder kick = new StringBuilder() - .append(ChatColor.RED) - .append("You have been temporarily banned for five minutes. Please read totalfreedom.me for more info."); - - if (!quiet) - { - // Strike with lightning - if (player != null) - { - final Location targetPos = player.getLocation(); - for (int x = -1; x <= 1; x++) - { - for (int z = -1; z <= 1; z++) - { - final Location strike_pos = new Location(targetPos.getWorld(), targetPos.getBlockX() + x, targetPos.getBlockY(), targetPos.getBlockZ() + z); - Objects.requireNonNull(targetPos.getWorld()).strikeLightning(strike_pos); - } - } - - // Kill player - player.setHealth(0.0); - - if (reason != null) - { - FUtil.adminAction(sender.getName(), "Tempbanning " + player.getName() + " for 5 minutes - Reason: " + reason, true); - kick.append("\n") - .append(ChatColor.RED) - .append("Reason: ") - .append(ChatColor.GOLD) - .append(reason); - } - else - { - FUtil.adminAction(sender.getName(), "Tempbanning " + player.getName() + " for 5 minutes", true); - } - } - } - else - { - if (player != null) - { - if (reason != null) - { - msg("Quietly temporarily banned " + player.getName() + " for 5 minutes."); - kick.append("\n") - .append(ChatColor.RED) - .append("Reason: ") - .append(ChatColor.GOLD) - .append(reason); - } - } - } - - // Ban player - Ban ban = Ban.forPlayerName(username, sender, FUtil.parseDateOffset("5m"), reason); - for (String ip : ips) - { - ban.addIp(ip); - } - plugin.bm.addBan(ban); - - // Kick player - if (player != null) - { - player.kickPlayer(kick.toString()); - } - - // Log ban - plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.TEMPBAN, reason)); - return true; - } -} \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java index dfc412ce..3789f40b 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java @@ -1,10 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; -import java.util.List; import java.util.Objects; + +import com.earth2me.essentials.User; import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.punishments.Punishment; @@ -21,7 +21,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH) -@CommandParameters(description = "Temporarily ban someone.", usage = "/ [-q] [duration] [reason]") +@CommandParameters(description = "Temporarily ban someone.", usage = "/ [-q] [duration] [reason]", aliases = "tban,noob") public class Command_tempban extends FreedomCommand { @@ -47,49 +47,72 @@ public class Command_tempban extends FreedomCommand } final String username; - final List ips = new ArrayList<>(); + final String ip; final Player player = getPlayer(args[0]); - final PlayerData entry; + PlayerData entry; if (player == null) { - entry = plugin.pl.getData(args[0]); - - if (entry == null) + // Gets the IP using Essentials data if available + if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null) { - msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly."); - return true; + User essUser = plugin.esb.getEssentialsUser(args[0]); + // + username = essUser.getName(); + ip = essUser.getLastLoginAddress(); + } + // Last resort - Getting the first result from the username itself + else + { + entry = plugin.pl.getData(args[0]); + if (entry == null) + { + msg(PLAYER_NOT_FOUND); + return true; + } + else + { + username = entry.getName(); + ip = entry.getIps().get(0); + } } - - username = entry.getName(); - ips.addAll(entry.getIps()); } else { - entry = plugin.pl.getData(player); username = player.getName(); - ips.add(FUtil.getIp(player)); + ip = FUtil.getIp(player); } final StringBuilder message = new StringBuilder("Temporarily banned " + username); - Date expires = FUtil.parseDateOffset("30m"); + // Default expiration date is 5 minutes + Date expires = FUtil.parseDateOffset("5m"); + + // Parses what comes after as a duration + if (args.length > 1) + { + try + { + expires = FUtil.parseDateOffset(args[1]); + } + catch (NumberFormatException error) + { + msg("Invalid duration: " + args[1], ChatColor.RED); + return true; + } + } + message.append(" until ").append(date_format.format(expires)); + // If a reason appears to exist, set it. String reason = null; - if (args.length >= 2) + if (args.length > 2) { - Date parsed_offset = FUtil.parseDateOffset(args[1]); - reason = StringUtils.join(ArrayUtils.subarray(args, parsed_offset == null ? 1 : 2, args.length), " ") + " (" + sender.getName() + ")"; - if (parsed_offset != null) - { - expires = parsed_offset; - } + reason = StringUtils.join(ArrayUtils.subarray(args, 2, args.length), " ") + " (" + sender.getName() + ")"; message.append(", Reason: \"").append(reason).append("\""); } Ban ban; - if (player != null) { ban = Ban.forPlayer(player, sender, expires, reason); @@ -98,11 +121,8 @@ public class Command_tempban extends FreedomCommand { ban = Ban.forPlayerName(username, sender, expires, reason); } + ban.addIp(ip); - for (String ip : ips) - { - ban.addIp(ip); - } plugin.bm.addBan(ban); if (!quiet) @@ -119,6 +139,8 @@ public class Command_tempban extends FreedomCommand Objects.requireNonNull(targetPos.getWorld()).strikeLightningEffect(strike_pos); } } + + player.kickPlayer(ban.bakeKickMessage()); } FUtil.adminAction(sender.getName(), message.toString(), true); @@ -128,19 +150,15 @@ public class Command_tempban extends FreedomCommand msg("Quietly temporarily banned " + username + "."); } - if (player != null) + for (Player p : Bukkit.getOnlinePlayers()) { - player.kickPlayer(ban.bakeKickMessage()); - for (Player p : Bukkit.getOnlinePlayers()) + if (FUtil.getIp(p).equals(ip)) { - if (FUtil.getIp(p).equals(FUtil.getIp(player))) - { - p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned."); - } + p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned."); } } - plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.TEMPBAN, reason)); + plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.TEMPBAN, reason)); return true; } } \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java index b6ca9452..daf3b32c 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java @@ -1,12 +1,9 @@ package me.totalfreedom.totalfreedommod.command; -import java.util.ArrayList; -import java.util.List; -import me.totalfreedom.totalfreedommod.banning.Ban; +import com.earth2me.essentials.User; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.util.FUtil; -import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -22,20 +19,33 @@ public class Command_unban extends FreedomCommand if (args.length > 0) { String username; - final PlayerData entry = plugin.pl.getData(args[0]); + String ip; - if (entry == null) + // Gets the IP using Essentials data if available + if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null) { - msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly."); - return true; + User essUser = plugin.esb.getEssentialsUser(args[0]); + // + username = essUser.getName(); + ip = essUser.getLastLoginAddress(); + } + // Secondary method - using Essentials if available + else + { + final PlayerData entry = plugin.pl.getData(args[0]); + if (entry == null) + { + msg(PLAYER_NOT_FOUND); + return true; + } + username = entry.getName(); + ip = entry.getIps().get(0); } - username = entry.getName(); - final List ips = new ArrayList<>(entry.getIps()); - FUtil.adminAction(sender.getName(), "Unbanning " + username, true); - msg(username + " has been unbanned along with the following IPs: " + StringUtils.join(ips, ", ")); plugin.bm.removeBan(plugin.bm.getByUsername(username)); + plugin.bm.removeBan(plugin.bm.getByIp(ip)); + msg(username + " has been unbanned along with the IP: " + ip); if (args.length >= 2) { @@ -45,20 +55,6 @@ public class Command_unban extends FreedomCommand msg("Restored edits for: " + username); } } - - for (String ip : ips) - { - Ban ban = plugin.bm.getByIp(ip); - if (ban != null) - { - plugin.bm.removeBan(ban); - } - ban = plugin.bm.getByIp(FUtil.getFuzzyIp(ip)); - if (ban != null) - { - plugin.bm.removeBan(ban); - } - } return true; } return false;