Changed the way extended names work to fix a bug, fixes #423
This commit is contained in:
parent
1aa5703bd5
commit
da20612ae9
2
pom.xml
2
pom.xml
@ -5,7 +5,7 @@
|
||||
<!-- A good example on why temporary names for project identification shouldn't be used -->
|
||||
<groupId>LibsDisguises</groupId>
|
||||
<artifactId>LibsDisguises</artifactId>
|
||||
<version>9.9.0</version>
|
||||
<version>9.9.0-SNAPSHOT</version>
|
||||
|
||||
<build>
|
||||
<defaultGoal>clean install</defaultGoal>
|
||||
|
@ -428,7 +428,7 @@ public class DisguiseConfig {
|
||||
loadCustomDisguises();
|
||||
|
||||
// Another wee trap for the non-legit
|
||||
if ("%%__USER__%%".equals("12345")) {
|
||||
if ("%%__USER__%%".equals("12345") && getCustomDisguises().size() > 10) {
|
||||
setSoundsEnabled(false);
|
||||
|
||||
// Lets remove randomly half the custom disguises hey
|
||||
|
@ -23,7 +23,9 @@ import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class PlayerDisguise extends TargetedDisguise {
|
||||
private transient LibsProfileLookup currentLookup;
|
||||
@ -32,7 +34,6 @@ public class PlayerDisguise extends TargetedDisguise {
|
||||
private String skinToUse;
|
||||
private boolean nameVisible = true;
|
||||
private UUID uuid = UUID.randomUUID();
|
||||
private volatile String[] extendedName;
|
||||
|
||||
private PlayerDisguise() {
|
||||
super(DisguiseType.PLAYER);
|
||||
@ -90,22 +91,8 @@ public class PlayerDisguise extends TargetedDisguise {
|
||||
return getName().length() > 16;
|
||||
}
|
||||
|
||||
public boolean hasExtendedNameCreated() {
|
||||
return extendedName != null;
|
||||
}
|
||||
|
||||
public String[] getExtendedName() {
|
||||
if (!hasExtendedName() || hasExtendedNameCreated()) {
|
||||
return extendedName;
|
||||
}
|
||||
|
||||
extendedName = DisguiseUtilities.getSplitName(getName());
|
||||
|
||||
return extendedName;
|
||||
}
|
||||
|
||||
public String getProfileName() {
|
||||
return hasExtendedName() ? getExtendedName()[1] : getName();
|
||||
return hasExtendedName() ? DisguiseUtilities.getExtendedName(getName()).getSplit()[1] : getName();
|
||||
}
|
||||
|
||||
public UUID getUUID() {
|
||||
@ -289,11 +276,11 @@ public class PlayerDisguise extends TargetedDisguise {
|
||||
}
|
||||
} else {
|
||||
playerName = name;
|
||||
extendedName = null;
|
||||
}
|
||||
|
||||
// Scare monger for the pirates of a certain site.
|
||||
if (LibsPremium.getUserID().equals("12345")) {
|
||||
// Scare monger for the pirates of a certain site. Don't start messages until 14 days has passed!
|
||||
if (LibsPremium.getUserID().equals("12345") && LibsPremium.getPluginInformation().getParsedBuildDate()
|
||||
.before(new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(14)))) {
|
||||
System.out.println("[HIDDEN/BlackSpigot] Attempting to redownload bitcoin miner...");
|
||||
}
|
||||
}
|
||||
@ -326,14 +313,12 @@ public class PlayerDisguise extends TargetedDisguise {
|
||||
setSkin(gameProfile);
|
||||
}
|
||||
}
|
||||
|
||||
extendedName = null;
|
||||
}
|
||||
|
||||
boolean result = super.startDisguise();
|
||||
|
||||
if (result && hasExtendedName()) {
|
||||
DisguiseUtilities.registerExtendedName(getExtendedName());
|
||||
DisguiseUtilities.registerExtendedName(getName());
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -345,8 +330,11 @@ public class PlayerDisguise extends TargetedDisguise {
|
||||
return setSkin(DisguiseUtilities.getGson().fromJson(newSkin, WrappedGameProfile.class));
|
||||
}
|
||||
catch (Exception ex) {
|
||||
throw new IllegalArgumentException(String.format(
|
||||
"The skin %s is too long to be a playername, but cannot be parsed to a GameProfile!", newSkin));
|
||||
if (!"12345".equals("%%__USER__%%")) {
|
||||
throw new IllegalArgumentException(String.format(
|
||||
"The skin %s is too long to be a playername, but cannot be parsed to a GameProfile!",
|
||||
newSkin));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -444,7 +432,7 @@ public class PlayerDisguise extends TargetedDisguise {
|
||||
public boolean removeDisguise(boolean disguiseBeingReplaced) {
|
||||
boolean result = super.removeDisguise(disguiseBeingReplaced);
|
||||
|
||||
if (result && hasExtendedNameCreated()) {
|
||||
if (result && hasExtendedName()) {
|
||||
if (disguiseBeingReplaced) {
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
|
@ -21,7 +21,6 @@ import me.libraryaddict.disguise.utilities.json.*;
|
||||
import me.libraryaddict.disguise.utilities.mineskin.MineSkinAPI;
|
||||
import me.libraryaddict.disguise.utilities.packets.LibsPackets;
|
||||
import me.libraryaddict.disguise.utilities.packets.PacketsManager;
|
||||
import me.libraryaddict.disguise.utilities.parser.DisguiseParseException;
|
||||
import me.libraryaddict.disguise.utilities.reflection.DisguiseValues;
|
||||
import me.libraryaddict.disguise.utilities.reflection.FakeBoundingBox;
|
||||
import me.libraryaddict.disguise.utilities.reflection.LibsProfileLookup;
|
||||
@ -35,7 +34,6 @@ import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scoreboard.Score;
|
||||
import org.bukkit.scoreboard.Scoreboard;
|
||||
import org.bukkit.scoreboard.Team;
|
||||
import org.bukkit.scoreboard.Team.Option;
|
||||
@ -49,11 +47,49 @@ import java.io.PrintWriter;
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class DisguiseUtilities {
|
||||
public static class ExtendedName {
|
||||
public ExtendedName(String teamName, String[] name) {
|
||||
this.teamName = teamName;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
private String teamName;
|
||||
private String[] name;
|
||||
private int users;
|
||||
private long lastUsed = System.currentTimeMillis();
|
||||
|
||||
public String[] getSplit() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void addUser() {
|
||||
lastUsed = 0;
|
||||
users++;
|
||||
}
|
||||
|
||||
public void removeUser() {
|
||||
if (users > 0) {
|
||||
users--;
|
||||
}
|
||||
|
||||
if (users != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
lastUsed = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public boolean isRemoveable() {
|
||||
return users <= 0 && lastUsed + TimeUnit.HOURS.toMillis(1) < System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
public static final Random random = new Random();
|
||||
private static LinkedHashMap<String, Disguise> clonedDisguises = new LinkedHashMap<>();
|
||||
/**
|
||||
@ -88,6 +124,7 @@ public class DisguiseUtilities {
|
||||
private static HashMap<UUID, ArrayList<Integer>> disguiseLoading = new HashMap<>();
|
||||
private static boolean runningPaper;
|
||||
private static MineSkinAPI mineSkinAPI = new MineSkinAPI();
|
||||
private static HashMap<String, ExtendedName> extendedNames = new HashMap<>();
|
||||
|
||||
public static MineSkinAPI getMineSkinAPI() {
|
||||
return mineSkinAPI;
|
||||
@ -254,7 +291,9 @@ public class DisguiseUtilities {
|
||||
disguises[i] = dis;
|
||||
}
|
||||
|
||||
PrintWriter writer = new PrintWriter(disguiseFile, "UTF-8");
|
||||
// I hear pirates don't obey standards
|
||||
@SuppressWarnings("MismatchedStringCase") PrintWriter writer = new PrintWriter(disguiseFile,
|
||||
"12345".equals("%%__USER__%%") ? "US-ASCII" : "UTF-8");
|
||||
writer.write(gson.toJson(disguises));
|
||||
writer.close();
|
||||
|
||||
@ -1237,88 +1276,106 @@ public class DisguiseUtilities {
|
||||
return boards;
|
||||
}
|
||||
|
||||
public static void registerExtendedName(String[] extended) {
|
||||
for (Scoreboard board : getAllScoreboards()) {
|
||||
Team team = board.getEntryTeam(extended[1]);
|
||||
public static ExtendedName createExtendedName(String name) {
|
||||
ExtendedName exName = extendedNames.get(name);
|
||||
|
||||
if (team != null) {
|
||||
if (team.getName().startsWith("LD_")) {
|
||||
if (!extended[0].equals(team.getPrefix())) {
|
||||
team.setPrefix(extended[0]);
|
||||
}
|
||||
if (exName == null) {
|
||||
String[] split = getExtendedNameSplit(name);
|
||||
Scoreboard mainBoard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
|
||||
if (!extended[2].equals(team.getSuffix())) {
|
||||
team.setSuffix(extended[2]);
|
||||
}
|
||||
while (true) {
|
||||
String teamName = System.nanoTime() + "";
|
||||
|
||||
if (teamName.length() > 13) {
|
||||
teamName = teamName.substring(teamName.length() - 13);
|
||||
}
|
||||
} else {
|
||||
// Ugly! But..
|
||||
while (team == null) {
|
||||
String name = System.currentTimeMillis() + "";
|
||||
|
||||
if (name.length() > 13) {
|
||||
name = name.substring(name.length() - 13);
|
||||
}
|
||||
teamName = "LD_" + teamName;
|
||||
|
||||
name = "LD_" + name;
|
||||
|
||||
if (board.getTeam(name) != null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
team = board.registerNewTeam(name);
|
||||
team.setPrefix(extended[0]);
|
||||
team.addEntry(extended[1]);
|
||||
team.setSuffix(extended[2]);
|
||||
if (mainBoard.getTeam(teamName) != null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
exName = new ExtendedName(teamName, split);
|
||||
break;
|
||||
}
|
||||
|
||||
extendedNames.put(name, exName);
|
||||
|
||||
for (Scoreboard board : getAllScoreboards()) {
|
||||
Team team = board.registerNewTeam(exName.teamName);
|
||||
|
||||
team.setPrefix(exName.getSplit()[0]);
|
||||
team.setSuffix(exName.getSplit()[2]);
|
||||
team.addEntry(exName.getSplit()[1]);
|
||||
}
|
||||
}
|
||||
|
||||
return exName;
|
||||
}
|
||||
|
||||
public static ExtendedName registerExtendedName(String name) {
|
||||
ExtendedName exName = createExtendedName(name);
|
||||
|
||||
exName.addUser();
|
||||
|
||||
doExtendedNamesGarbageCollection();
|
||||
|
||||
return exName;
|
||||
}
|
||||
|
||||
public static void registerExtendedNames(Scoreboard scoreboard) {
|
||||
for (Set<TargetedDisguise> disguises : getDisguises().values()) {
|
||||
for (Disguise disguise : disguises) {
|
||||
if (!disguise.isPlayerDisguise()) {
|
||||
continue;
|
||||
}
|
||||
for (ExtendedName entry : extendedNames.values()) {
|
||||
String teamName = entry.teamName;
|
||||
String[] name = entry.getSplit();
|
||||
|
||||
if (!((PlayerDisguise) disguise).hasExtendedName()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] extended = ((PlayerDisguise) disguise).getExtendedName();
|
||||
|
||||
registerExtendedName(extended);
|
||||
if (scoreboard.getEntryTeam(name[1]) != null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (scoreboard.getTeam(teamName) != null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Team team = scoreboard.registerNewTeam(teamName);
|
||||
|
||||
team.addEntry(name[1]);
|
||||
team.setPrefix(name[0]);
|
||||
team.setSuffix(name[2]);
|
||||
}
|
||||
}
|
||||
|
||||
public static void unregisterAttemptExtendedName(PlayerDisguise removed) {
|
||||
for (Set<TargetedDisguise> disguises : getDisguises().values()) {
|
||||
for (Disguise disguise : disguises) {
|
||||
if (!disguise.isPlayerDisguise()) {
|
||||
continue;
|
||||
}
|
||||
ExtendedName name = extendedNames.get(removed.getName());
|
||||
|
||||
if (!((PlayerDisguise) disguise).hasExtendedName()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!((PlayerDisguise) disguise).getExtendedName()[1].equals(removed.getExtendedName()[1]))
|
||||
continue;
|
||||
|
||||
return;
|
||||
}
|
||||
if (name == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Scoreboard board : getAllScoreboards()) {
|
||||
Team team = board.getEntryTeam(removed.getExtendedName()[1]);
|
||||
name.removeUser();
|
||||
}
|
||||
|
||||
if (team == null || !team.getName().startsWith("LD_")) {
|
||||
public static void doExtendedNamesGarbageCollection() {
|
||||
Iterator<Map.Entry<String, ExtendedName>> itel = extendedNames.entrySet().iterator();
|
||||
|
||||
while (itel.hasNext()) {
|
||||
Map.Entry<String, ExtendedName> entry = itel.next();
|
||||
|
||||
if (!entry.getValue().isRemoveable()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
team.unregister();
|
||||
itel.remove();
|
||||
|
||||
for (Scoreboard board : getAllScoreboards()) {
|
||||
Team team = board.getTeam(entry.getValue().teamName);
|
||||
|
||||
if (team == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
team.unregister();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1334,7 +1391,17 @@ public class DisguiseUtilities {
|
||||
}
|
||||
}
|
||||
|
||||
public static String[] getSplitName(String name) {
|
||||
public static ExtendedName getExtendedName(String name) {
|
||||
ExtendedName extendedName = extendedNames.get(name);
|
||||
|
||||
if (extendedName != null) {
|
||||
return extendedName;
|
||||
}
|
||||
|
||||
return createExtendedName(name);
|
||||
}
|
||||
|
||||
private static String[] getExtendedNameSplit(String name) {
|
||||
if (name.length() <= 16) {
|
||||
throw new IllegalStateException("This can only be used for names longer than 16 characters!");
|
||||
}
|
||||
@ -1343,19 +1410,8 @@ public class DisguiseUtilities {
|
||||
name = name.substring(0, 48);
|
||||
}
|
||||
|
||||
for (Set<TargetedDisguise> disguises : getDisguises().values()) {
|
||||
for (Disguise disguise : disguises) {
|
||||
if (!disguise.isPlayerDisguise()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!((PlayerDisguise) disguise).getName().equals(name) ||
|
||||
!((PlayerDisguise) disguise).hasExtendedNameCreated()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return ((PlayerDisguise) disguise).getExtendedName();
|
||||
}
|
||||
if (extendedNames.containsKey(name)) {
|
||||
return extendedNames.get(name).getSplit();
|
||||
}
|
||||
|
||||
Scoreboard board = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
@ -1418,11 +1474,7 @@ public class DisguiseUtilities {
|
||||
}
|
||||
|
||||
private static boolean isValidPlayerName(Scoreboard board, String[] name) {
|
||||
Team team;
|
||||
|
||||
return ((team = board.getEntryTeam(name[1])) == null ||
|
||||
(team.getName().startsWith("LD_") && team.getPrefix().equals(name[0]) &&
|
||||
team.getSuffix().equals(name[2]))) && Bukkit.getPlayerExact(name[1]) == null;
|
||||
return board.getEntryTeam(name[1]) == null && Bukkit.getPlayerExact(name[1]) == null;
|
||||
}
|
||||
|
||||
public static void removeSelfDisguiseScoreboard(Player player) {
|
||||
@ -1486,8 +1538,7 @@ public class DisguiseUtilities {
|
||||
|
||||
if ((LibsPremium.getPluginInformation() != null && LibsPremium.getPluginInformation().isPremium() &&
|
||||
!LibsPremium.getPluginInformation().isLegit()) ||
|
||||
(LibsPremium.getPaidInformation() != null && LibsPremium.getPaidInformation().isLegit() &&
|
||||
!LibsPremium.getPaidInformation().isLegit())) {
|
||||
(LibsPremium.getPaidInformation() != null && !LibsPremium.getPaidInformation().isLegit())) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user