diff --git a/pom.xml b/pom.xml
index 92f00dc3..b5dfe221 100644
--- a/pom.xml
+++ b/pom.xml
@@ -114,7 +114,7 @@
commons-io
commons-io
- 2.8.0
+ 2.11.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;