2016-12-01 02:34:34 +01:00
|
|
|
package me.libraryaddict.disguise.disguisetypes;
|
|
|
|
|
|
|
|
import com.comphenix.protocol.ProtocolLibrary;
|
|
|
|
import com.comphenix.protocol.events.PacketContainer;
|
|
|
|
import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction;
|
|
|
|
import com.comphenix.protocol.wrappers.WrappedGameProfile;
|
2020-11-11 00:32:53 +01:00
|
|
|
import lombok.Getter;
|
2020-01-20 01:35:55 +01:00
|
|
|
import me.libraryaddict.disguise.DisguiseConfig;
|
2016-12-01 02:34:34 +01:00
|
|
|
import me.libraryaddict.disguise.LibsDisguises;
|
|
|
|
import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher;
|
|
|
|
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
|
2019-01-03 03:13:03 +01:00
|
|
|
import me.libraryaddict.disguise.utilities.reflection.LibsProfileLookup;
|
2020-07-04 10:33:22 +02:00
|
|
|
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
|
2019-01-03 03:13:03 +01:00
|
|
|
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
|
2017-05-28 00:23:15 +02:00
|
|
|
import org.bukkit.Bukkit;
|
2021-03-29 10:42:41 +02:00
|
|
|
import org.bukkit.command.CommandSender;
|
2017-05-28 00:23:15 +02:00
|
|
|
import org.bukkit.entity.Entity;
|
|
|
|
import org.bukkit.entity.Player;
|
2020-01-20 01:35:55 +01:00
|
|
|
import org.bukkit.scheduler.BukkitRunnable;
|
2017-05-28 00:23:15 +02:00
|
|
|
|
2016-12-01 02:34:34 +01:00
|
|
|
public class PlayerDisguise extends TargetedDisguise {
|
2017-05-28 00:23:15 +02:00
|
|
|
private transient LibsProfileLookup currentLookup;
|
2017-06-02 15:51:03 +02:00
|
|
|
private WrappedGameProfile gameProfile;
|
2020-03-30 09:22:33 +02:00
|
|
|
private String playerName = "Herobrine";
|
2023-04-13 10:38:52 +02:00
|
|
|
private String tablistName;
|
2016-12-01 02:34:34 +01:00
|
|
|
private String skinToUse;
|
2020-01-19 03:48:52 +01:00
|
|
|
private boolean nameVisible = true;
|
2020-05-07 11:27:07 +02:00
|
|
|
/**
|
|
|
|
* Has someone set name visible explicitly?
|
|
|
|
*/
|
|
|
|
private boolean explicitNameVisible = false;
|
2020-09-04 02:49:06 +02:00
|
|
|
private transient DisguiseUtilities.DScoreTeam scoreboardName;
|
2020-11-11 00:32:53 +01:00
|
|
|
@Getter
|
|
|
|
private boolean deadmau5Ears;
|
2016-12-01 02:34:34 +01:00
|
|
|
|
|
|
|
private PlayerDisguise() {
|
|
|
|
super(DisguiseType.PLAYER);
|
|
|
|
}
|
|
|
|
|
|
|
|
public PlayerDisguise(Player player) {
|
|
|
|
this(ReflectionManager.getGameProfile(player));
|
|
|
|
}
|
|
|
|
|
|
|
|
public PlayerDisguise(Player player, Player skinToUse) {
|
|
|
|
this(ReflectionManager.getGameProfile(player), ReflectionManager.getGameProfile(skinToUse));
|
|
|
|
}
|
|
|
|
|
|
|
|
public PlayerDisguise(String name) {
|
2020-03-25 03:53:08 +01:00
|
|
|
this(name, name);
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public PlayerDisguise(String name, String skinToUse) {
|
|
|
|
this();
|
|
|
|
|
2020-06-21 23:26:29 +02:00
|
|
|
if (name.equals(skinToUse)) {
|
|
|
|
WrappedGameProfile profile = getProfile(skinToUse);
|
|
|
|
|
|
|
|
if (profile != null) {
|
|
|
|
setName(profile.getName());
|
|
|
|
setSkin(profile);
|
|
|
|
createDisguise();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-01 02:34:34 +01:00
|
|
|
setName(name);
|
|
|
|
setSkin(skinToUse);
|
|
|
|
|
|
|
|
createDisguise();
|
|
|
|
}
|
|
|
|
|
|
|
|
public PlayerDisguise(WrappedGameProfile gameProfile) {
|
|
|
|
this();
|
|
|
|
|
|
|
|
setName(gameProfile.getName());
|
|
|
|
|
2021-04-24 02:34:24 +02:00
|
|
|
this.gameProfile = ReflectionManager.getGameProfileWithThisSkin(getUUID(), gameProfile.getName(), gameProfile);
|
2016-12-01 02:34:34 +01:00
|
|
|
|
|
|
|
createDisguise();
|
|
|
|
}
|
|
|
|
|
|
|
|
public PlayerDisguise(WrappedGameProfile gameProfile, WrappedGameProfile skinToUse) {
|
|
|
|
this();
|
|
|
|
|
|
|
|
setName(gameProfile.getName());
|
|
|
|
|
2021-04-24 02:34:24 +02:00
|
|
|
this.gameProfile = ReflectionManager.getGameProfile(getUUID(), gameProfile.getName());
|
2016-12-01 02:34:34 +01:00
|
|
|
|
|
|
|
setSkin(skinToUse);
|
|
|
|
|
|
|
|
createDisguise();
|
|
|
|
}
|
|
|
|
|
2020-05-09 11:57:07 +02:00
|
|
|
@Override
|
|
|
|
public double getHeight() {
|
|
|
|
if (getWatcher() == null) {
|
|
|
|
return 1.8;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (getEntity() == null || getWatcher().getModifiedEntityAnimations()[1]) {
|
|
|
|
return getWatcher().isSneaking() ? 1.5 : 1.8;
|
|
|
|
}
|
|
|
|
|
|
|
|
return getEntity() instanceof Player && ((Player) getEntity()).isSneaking() ? 1.5 : 1.8;
|
|
|
|
}
|
|
|
|
|
2020-04-24 09:34:37 +02:00
|
|
|
@Deprecated
|
2020-04-04 08:58:21 +02:00
|
|
|
public DisguiseUtilities.DScoreTeam getScoreboardName() {
|
2020-05-07 11:27:07 +02:00
|
|
|
if (!DisguiseConfig.isScoreboardNames()) {
|
2020-03-30 09:22:33 +02:00
|
|
|
throw new IllegalStateException("Cannot use this method when it's been disabled in config!");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (scoreboardName == null) {
|
2021-02-09 04:15:33 +01:00
|
|
|
if (isUpsideDown() || isDeadmau5Ears()) {
|
2020-09-04 01:11:17 +02:00
|
|
|
scoreboardName = new DisguiseUtilities.DScoreTeam(this, new String[]{"", getProfileName(), ""});
|
2020-05-10 06:35:29 +02:00
|
|
|
} else {
|
2020-09-04 01:11:17 +02:00
|
|
|
scoreboardName = DisguiseUtilities.createExtendedName(this);
|
2020-05-10 06:35:29 +02:00
|
|
|
}
|
2020-03-30 09:22:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return scoreboardName;
|
|
|
|
}
|
|
|
|
|
2020-04-07 06:14:17 +02:00
|
|
|
private void setScoreboardName(String[] split) {
|
2020-11-11 00:32:53 +01:00
|
|
|
if (isUpsideDown() || isDeadmau5Ears()) {
|
2020-05-10 18:48:38 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-04-07 06:14:17 +02:00
|
|
|
getScoreboardName().setSplit(split);
|
|
|
|
}
|
|
|
|
|
2020-04-04 15:24:02 +02:00
|
|
|
private boolean isStaticName(String name) {
|
|
|
|
return name != null && (name.equalsIgnoreCase("Dinnerbone") || name.equalsIgnoreCase("Grumm"));
|
|
|
|
}
|
|
|
|
|
2020-03-30 09:22:33 +02:00
|
|
|
public boolean hasScoreboardName() {
|
2020-05-07 11:27:07 +02:00
|
|
|
if (!DisguiseConfig.isArmorstandsName() && isStaticName(getName())) {
|
2020-04-04 15:24:02 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
return DisguiseConfig.isScoreboardNames();
|
2020-01-20 01:35:55 +01:00
|
|
|
}
|
|
|
|
|
2021-02-01 08:49:27 +01:00
|
|
|
/**
|
|
|
|
* The actual name that'll be sent in the game profile, not the name that they're known as
|
|
|
|
*/
|
2020-01-20 01:35:55 +01:00
|
|
|
public String getProfileName() {
|
2021-02-11 05:56:20 +01:00
|
|
|
return isUpsideDown() ? "Dinnerbone" :
|
2022-01-29 23:55:52 +01:00
|
|
|
isDeadmau5Ears() ? "deadmau5" : hasScoreboardName() ? getScoreboardName().getPlayer() : getName().isEmpty() ? "§r" : getName();
|
2020-01-20 01:35:55 +01:00
|
|
|
}
|
|
|
|
|
2020-01-19 03:48:52 +01:00
|
|
|
public boolean isNameVisible() {
|
|
|
|
return nameVisible;
|
|
|
|
}
|
|
|
|
|
|
|
|
public PlayerDisguise setNameVisible(boolean nameVisible) {
|
2020-05-07 11:27:07 +02:00
|
|
|
return setNameVisible(nameVisible, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
private PlayerDisguise setNameVisible(boolean nameVisible, boolean setInternally) {
|
|
|
|
if (isNameVisible() == nameVisible || (setInternally && explicitNameVisible)) {
|
2020-01-19 03:48:52 +01:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
if (!setInternally) {
|
|
|
|
explicitNameVisible = true;
|
|
|
|
}
|
|
|
|
|
2020-01-19 03:48:52 +01:00
|
|
|
if (isDisguiseInUse()) {
|
2020-05-07 11:27:07 +02:00
|
|
|
if (DisguiseConfig.isArmorstandsName()) {
|
|
|
|
this.nameVisible = nameVisible;
|
2020-05-07 16:34:43 +02:00
|
|
|
sendArmorStands(isNameVisible() ? DisguiseUtilities.reverse(getMultiName()) : new String[0]);
|
2020-05-07 11:27:07 +02:00
|
|
|
} else if (!DisguiseConfig.isScoreboardNames()) {
|
2021-03-29 10:42:41 +02:00
|
|
|
if (removeDisguise()) {
|
2020-03-30 09:22:33 +02:00
|
|
|
this.nameVisible = nameVisible;
|
2020-01-19 03:48:52 +01:00
|
|
|
|
2020-03-30 09:22:33 +02:00
|
|
|
if (!startDisguise()) {
|
|
|
|
throw new IllegalStateException("Unable to restart disguise");
|
|
|
|
}
|
|
|
|
} else {
|
2020-01-19 03:48:52 +01:00
|
|
|
throw new IllegalStateException("Unable to restart disguise");
|
|
|
|
}
|
|
|
|
} else {
|
2020-03-30 09:22:33 +02:00
|
|
|
this.nameVisible = nameVisible;
|
|
|
|
DisguiseUtilities.updateExtendedName(this);
|
2020-01-19 03:48:52 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
this.nameVisible = nameVisible;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2016-12-01 02:34:34 +01:00
|
|
|
@Override
|
|
|
|
public PlayerDisguise addPlayer(Player player) {
|
|
|
|
return (PlayerDisguise) super.addPlayer(player);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise addPlayer(String playername) {
|
|
|
|
return (PlayerDisguise) super.addPlayer(playername);
|
|
|
|
}
|
|
|
|
|
2020-05-10 06:35:29 +02:00
|
|
|
public PlayerDisguise setUpsideDown(boolean upsideDown) {
|
|
|
|
if (isUpsideDown() == upsideDown) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2020-05-12 03:36:39 +02:00
|
|
|
getWatcher().setInternalUpsideDown(upsideDown);
|
2020-05-10 06:35:29 +02:00
|
|
|
|
|
|
|
if (isDisguiseInUse()) {
|
2020-05-10 06:38:36 +02:00
|
|
|
resendDisguise(DisguiseConfig.isArmorstandsName() ? getName() : "Dinnerbone", true);
|
2020-05-10 06:35:29 +02:00
|
|
|
} else {
|
|
|
|
scoreboardName = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2020-11-11 00:32:53 +01:00
|
|
|
public PlayerDisguise setDeadmau5Ears(boolean deadmau5Ears) {
|
|
|
|
if (deadmau5Ears == isDeadmau5Ears()) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.deadmau5Ears = deadmau5Ears;
|
|
|
|
|
|
|
|
if (isDisguiseInUse()) {
|
|
|
|
resendDisguise(DisguiseConfig.isArmorstandsName() ? getName() : "deadmau5", true);
|
|
|
|
} else {
|
|
|
|
scoreboardName = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2016-12-01 02:34:34 +01:00
|
|
|
@Override
|
|
|
|
public PlayerDisguise clone() {
|
|
|
|
PlayerDisguise disguise = new PlayerDisguise();
|
|
|
|
|
2020-05-21 10:48:14 +02:00
|
|
|
if (getWatcher() != null) {
|
|
|
|
disguise.setWatcher(getWatcher().clone(disguise));
|
|
|
|
}
|
|
|
|
|
2017-03-21 07:34:12 +01:00
|
|
|
if (currentLookup == null && gameProfile != null) {
|
2016-12-01 02:34:34 +01:00
|
|
|
disguise.skinToUse = getSkin();
|
2021-04-24 02:34:24 +02:00
|
|
|
disguise.gameProfile = ReflectionManager.getGameProfileWithThisSkin(disguise.getUUID(), getGameProfile().getName(), getGameProfile());
|
2017-03-21 07:34:12 +01:00
|
|
|
} else {
|
2016-12-01 02:34:34 +01:00
|
|
|
disguise.setSkin(getSkin());
|
|
|
|
}
|
|
|
|
|
2020-04-24 09:34:37 +02:00
|
|
|
disguise.setName(getName());
|
2020-05-07 11:27:07 +02:00
|
|
|
disguise.nameVisible = isNameVisible();
|
|
|
|
disguise.explicitNameVisible = explicitNameVisible;
|
2020-05-10 06:35:29 +02:00
|
|
|
disguise.setUpsideDown(isUpsideDown());
|
2020-11-11 00:32:53 +01:00
|
|
|
disguise.setDeadmau5Ears(isDeadmau5Ears());
|
2016-12-01 02:34:34 +01:00
|
|
|
|
2020-04-15 14:55:35 +02:00
|
|
|
clone(disguise);
|
2016-12-01 02:34:34 +01:00
|
|
|
|
|
|
|
return disguise;
|
|
|
|
}
|
|
|
|
|
|
|
|
public WrappedGameProfile getGameProfile() {
|
|
|
|
if (gameProfile == null) {
|
|
|
|
if (getSkin() != null) {
|
2021-04-24 02:34:24 +02:00
|
|
|
gameProfile = ReflectionManager.getGameProfile(getUUID(), getProfileName());
|
2017-03-21 07:34:12 +01:00
|
|
|
} else {
|
2021-04-24 02:34:24 +02:00
|
|
|
gameProfile = ReflectionManager.getGameProfileWithThisSkin(getUUID(), getProfileName(), DisguiseUtilities.getProfileFromMojang(this));
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-02 15:51:03 +02:00
|
|
|
return gameProfile;
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public void setGameProfile(WrappedGameProfile gameProfile) {
|
2021-04-24 02:34:24 +02:00
|
|
|
this.gameProfile = ReflectionManager.getGameProfileWithThisSkin(getUUID(), gameProfile.getName(), gameProfile);
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
|
2020-02-05 02:26:55 +01:00
|
|
|
public String getName() {
|
|
|
|
return playerName;
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
|
2020-01-19 03:48:52 +01:00
|
|
|
public void setName(String name) {
|
2020-04-07 12:05:10 +02:00
|
|
|
if (getName().equals("<Inherit>") && getEntity() != null) {
|
|
|
|
name = getEntity().getCustomName();
|
|
|
|
|
|
|
|
if (name == null || name.isEmpty()) {
|
|
|
|
name = getEntity().getType().name();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-27 07:19:24 +01:00
|
|
|
if (DisguiseConfig.isCopyPlayerTeamInfo() && (DisguiseConfig.getPlayerNameType() == DisguiseConfig.PlayerNameType.TEAMS ||
|
2022-01-29 23:55:52 +01:00
|
|
|
DisguiseConfig.getPlayerNameType() == DisguiseConfig.PlayerNameType.ARMORSTANDS)) {
|
2020-09-26 02:00:44 +02:00
|
|
|
name = DisguiseUtilities.getDisplayName(name);
|
|
|
|
}
|
|
|
|
|
2022-01-29 23:55:52 +01:00
|
|
|
name = DisguiseUtilities.getHexedColors(name);
|
|
|
|
|
2022-07-18 22:24:00 +02:00
|
|
|
if (name == null) {
|
|
|
|
name = "";
|
|
|
|
}
|
|
|
|
|
2020-01-19 03:48:52 +01:00
|
|
|
if (name.equals(playerName)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
int cLimit;
|
|
|
|
|
|
|
|
switch (DisguiseConfig.getPlayerNameType()) {
|
|
|
|
case TEAMS:
|
2020-07-04 10:33:22 +02:00
|
|
|
cLimit = (NmsVersion.v1_13.isSupported() ? 64 : 16) * 2;
|
2020-05-07 11:27:07 +02:00
|
|
|
break;
|
2020-05-07 12:05:34 +02:00
|
|
|
case EXTENDED:
|
2020-07-04 10:33:22 +02:00
|
|
|
cLimit = ((NmsVersion.v1_13.isSupported() ? 64 : 16) * 2) + 16;
|
2020-05-07 11:27:07 +02:00
|
|
|
break;
|
|
|
|
case ARMORSTANDS:
|
|
|
|
cLimit = 256;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
cLimit = 16;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2020-04-07 12:05:10 +02:00
|
|
|
if (name.length() > cLimit) {
|
2020-04-07 11:31:47 +02:00
|
|
|
name = name.substring(0, cLimit);
|
2020-01-20 01:35:55 +01:00
|
|
|
}
|
|
|
|
|
2020-03-30 09:22:33 +02:00
|
|
|
if (isDisguiseInUse()) {
|
2020-05-07 11:27:07 +02:00
|
|
|
if (DisguiseConfig.isArmorstandsName()) {
|
|
|
|
playerName = name;
|
2020-03-25 03:53:08 +01:00
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
setNameVisible(!name.isEmpty(), true);
|
|
|
|
setMultiName(DisguiseUtilities.splitNewLine(name));
|
|
|
|
} else {
|
|
|
|
boolean resendDisguise = false;
|
2020-01-19 03:48:52 +01:00
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
if (DisguiseConfig.isScoreboardNames() && !isStaticName(name)) {
|
|
|
|
DisguiseUtilities.DScoreTeam team = getScoreboardName();
|
|
|
|
String[] split = DisguiseUtilities.getExtendedNameSplit(team.getPlayer(), name);
|
2020-03-30 09:22:33 +02:00
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
resendDisguise = !split[1].equals(team.getPlayer());
|
|
|
|
setScoreboardName(split);
|
|
|
|
}
|
2020-04-04 15:24:02 +02:00
|
|
|
|
2021-01-27 07:19:24 +01:00
|
|
|
resendDisguise = !DisguiseConfig.isScoreboardNames() || isStaticName(name) || isStaticName(getName()) || resendDisguise;
|
2020-03-30 09:22:33 +02:00
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
if (resendDisguise) {
|
2020-05-10 06:35:29 +02:00
|
|
|
resendDisguise(name, false);
|
2020-03-30 09:22:33 +02:00
|
|
|
} else {
|
2020-05-07 11:27:07 +02:00
|
|
|
if (getName().isEmpty() && !name.isEmpty() && !isNameVisible()) {
|
|
|
|
setNameVisible(true, true);
|
|
|
|
} else if (!getName().isEmpty() && name.isEmpty() && isNameVisible()) {
|
|
|
|
setNameVisible(false, true);
|
|
|
|
} else {
|
|
|
|
DisguiseUtilities.updateExtendedName(this);
|
|
|
|
}
|
2020-03-30 09:22:33 +02:00
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
playerName = name;
|
|
|
|
}
|
2020-01-19 03:48:52 +01:00
|
|
|
}
|
2020-04-07 06:14:17 +02:00
|
|
|
|
2023-04-13 10:38:52 +02:00
|
|
|
if (isDisplayedInTab() && tablistName == null) {
|
2022-12-19 18:38:18 +01:00
|
|
|
PacketContainer addTab = ReflectionManager.createTablistPacket(this, PlayerInfoAction.UPDATE_DISPLAY_NAME);
|
2020-04-07 06:14:17 +02:00
|
|
|
|
2022-12-19 18:38:18 +01:00
|
|
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
|
|
|
if (!canSee(player)) {
|
|
|
|
continue;
|
2020-04-07 06:14:17 +02:00
|
|
|
}
|
2022-12-19 18:38:18 +01:00
|
|
|
|
|
|
|
ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab);
|
2020-04-07 06:14:17 +02:00
|
|
|
}
|
|
|
|
}
|
2020-01-19 03:48:52 +01:00
|
|
|
} else {
|
2020-03-30 09:22:33 +02:00
|
|
|
if (scoreboardName != null) {
|
2020-04-04 08:58:21 +02:00
|
|
|
DisguiseUtilities.DScoreTeam team = getScoreboardName();
|
2020-03-30 09:22:33 +02:00
|
|
|
String[] split = DisguiseUtilities.getExtendedNameSplit(team.getPlayer(), name);
|
|
|
|
|
2020-04-07 06:14:17 +02:00
|
|
|
setScoreboardName(split);
|
2020-03-30 09:22:33 +02:00
|
|
|
}
|
|
|
|
|
2020-05-12 22:06:01 +02:00
|
|
|
if (DisguiseConfig.isArmorstandsName()) {
|
2020-05-07 11:27:07 +02:00
|
|
|
setMultiName(DisguiseUtilities.splitNewLine(name));
|
2020-03-25 03:53:08 +01:00
|
|
|
}
|
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
setNameVisible(!name.isEmpty(), true);
|
2020-01-19 03:48:52 +01:00
|
|
|
playerName = name;
|
2020-01-28 05:02:30 +01:00
|
|
|
|
|
|
|
if (gameProfile != null) {
|
2021-04-24 02:34:24 +02:00
|
|
|
gameProfile = ReflectionManager.getGameProfileWithThisSkin(getUUID(), getProfileName(), getGameProfile());
|
2020-01-28 05:02:30 +01:00
|
|
|
}
|
2020-01-19 03:48:52 +01:00
|
|
|
}
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
|
2024-02-19 06:18:07 +01:00
|
|
|
public String getTablistName() {
|
|
|
|
if (tablistName == null) {
|
|
|
|
return getName();
|
|
|
|
}
|
|
|
|
|
|
|
|
return tablistName;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setTablistName(String tablistName) {
|
|
|
|
this.tablistName = tablistName;
|
|
|
|
|
|
|
|
if (!isDisplayedInTab() || !isDisguiseInUse()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
PacketContainer addTab = ReflectionManager.createTablistPacket(this, PlayerInfoAction.UPDATE_DISPLAY_NAME);
|
|
|
|
|
|
|
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
|
|
|
if (!canSee(player)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-10 06:35:29 +02:00
|
|
|
private void resendDisguise(String name, boolean updateTeams) {
|
2021-03-29 10:42:41 +02:00
|
|
|
if (removeDisguise()) {
|
2020-05-10 06:35:29 +02:00
|
|
|
if (getName().isEmpty() && !name.isEmpty()) {
|
|
|
|
setNameVisible(true, true);
|
|
|
|
} else if (!getName().isEmpty() && name.isEmpty()) {
|
|
|
|
setNameVisible(false, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
playerName = name;
|
|
|
|
|
|
|
|
if (updateTeams) {
|
|
|
|
scoreboardName = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gameProfile != null) {
|
2021-04-24 02:34:24 +02:00
|
|
|
gameProfile = ReflectionManager.getGameProfileWithThisSkin(getUUID(), getProfileName(), getGameProfile());
|
2020-05-10 06:35:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!startDisguise()) {
|
|
|
|
throw new IllegalStateException("Unable to restart disguise");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
throw new IllegalStateException("Unable to restart disguise");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-05 02:26:55 +01:00
|
|
|
public String getSkin() {
|
|
|
|
return skinToUse;
|
2016-12-22 02:11:03 +01:00
|
|
|
}
|
|
|
|
|
2016-12-01 02:34:34 +01:00
|
|
|
public PlayerDisguise setSkin(String newSkin) {
|
2020-06-21 23:26:29 +02:00
|
|
|
WrappedGameProfile profile = getProfile(newSkin);
|
|
|
|
|
|
|
|
if (profile != null) {
|
|
|
|
return setSkin(profile);
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
|
2020-05-10 10:17:46 +02:00
|
|
|
if (newSkin != null) {
|
|
|
|
String[] split = DisguiseUtilities.splitNewLine(newSkin);
|
|
|
|
|
|
|
|
if (split.length > 0) {
|
|
|
|
newSkin = split[0];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-07 11:27:07 +02:00
|
|
|
if (newSkin != null && newSkin.length() > 16) {
|
|
|
|
newSkin = null;
|
|
|
|
}
|
|
|
|
|
2020-04-07 06:14:17 +02:00
|
|
|
String oldSkin = skinToUse;
|
2016-12-01 02:34:34 +01:00
|
|
|
skinToUse = newSkin;
|
|
|
|
|
|
|
|
if (newSkin == null) {
|
|
|
|
currentLookup = null;
|
|
|
|
gameProfile = null;
|
2017-03-21 07:34:12 +01:00
|
|
|
} else {
|
2016-12-01 02:34:34 +01:00
|
|
|
if (newSkin.length() > 16) {
|
|
|
|
skinToUse = newSkin.substring(0, 16);
|
|
|
|
}
|
2020-04-07 06:14:17 +02:00
|
|
|
|
|
|
|
if (newSkin.equals(oldSkin)) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isDisguiseInUse()) {
|
|
|
|
currentLookup = new LibsProfileLookup() {
|
|
|
|
@Override
|
|
|
|
public void onLookup(WrappedGameProfile gameProfile) {
|
2020-09-26 02:00:44 +02:00
|
|
|
if (currentLookup != this || gameProfile == null || gameProfile.getProperties().isEmpty()) {
|
2020-04-07 06:14:17 +02:00
|
|
|
return;
|
2020-09-26 02:00:44 +02:00
|
|
|
}
|
2020-04-07 06:14:17 +02:00
|
|
|
|
|
|
|
setSkin(gameProfile);
|
|
|
|
|
|
|
|
currentLookup = null;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-02-01 08:49:27 +01:00
|
|
|
WrappedGameProfile gameProfile = DisguiseUtilities.getProfileFromMojang(this.skinToUse, currentLookup, DisguiseConfig.isContactMojangServers());
|
2020-04-07 06:14:17 +02:00
|
|
|
|
|
|
|
if (gameProfile != null) {
|
|
|
|
setSkin(gameProfile);
|
|
|
|
}
|
|
|
|
}
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the GameProfile, without tampering.
|
|
|
|
*
|
2017-03-21 07:34:12 +01:00
|
|
|
* @param gameProfile GameProfile
|
2016-12-01 02:34:34 +01:00
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public PlayerDisguise setSkin(WrappedGameProfile gameProfile) {
|
|
|
|
if (gameProfile == null) {
|
|
|
|
this.gameProfile = null;
|
|
|
|
this.skinToUse = null;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
currentLookup = null;
|
|
|
|
|
|
|
|
this.skinToUse = gameProfile.getName();
|
2021-04-24 02:34:24 +02:00
|
|
|
this.gameProfile = ReflectionManager.getGameProfileWithThisSkin(getUUID(), getProfileName(), gameProfile);
|
2016-12-01 02:34:34 +01:00
|
|
|
|
2020-04-07 06:14:17 +02:00
|
|
|
refreshDisguise();
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2020-06-21 23:26:29 +02:00
|
|
|
private WrappedGameProfile getProfile(String string) {
|
2021-01-27 07:19:24 +01:00
|
|
|
if (string != null && string.length() > 70 && string.startsWith("{\"id\":") && string.endsWith("}") && string.contains(",\"name\":")) {
|
2020-06-21 23:26:29 +02:00
|
|
|
try {
|
|
|
|
return DisguiseUtilities.getGson().fromJson(string, WrappedGameProfile.class);
|
2020-09-26 02:00:44 +02:00
|
|
|
} catch (Exception ex) {
|
2021-01-27 07:19:24 +01:00
|
|
|
throw new IllegalStateException("Tried to parse " + string + " to a GameProfile, but it has been formatted incorrectly!");
|
2020-06-21 23:26:29 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-04-07 06:14:17 +02:00
|
|
|
private void refreshDisguise() {
|
2021-02-01 08:49:27 +01:00
|
|
|
if (!DisguiseUtilities.isDisguiseInUse(this)) {
|
|
|
|
return;
|
|
|
|
}
|
2016-12-01 02:34:34 +01:00
|
|
|
|
2023-09-29 19:25:18 +02:00
|
|
|
if (DisguiseUtilities.isFancyHiddenTabs() || isDisplayedInTab()) {
|
2023-01-02 20:01:40 +01:00
|
|
|
PacketContainer addTab = ReflectionManager.createTablistAddPackets(this);
|
2022-12-19 18:38:18 +01:00
|
|
|
PacketContainer deleteTab = ReflectionManager.createTablistPacket(this, PlayerInfoAction.REMOVE_PLAYER);
|
2016-12-01 02:34:34 +01:00
|
|
|
|
2022-12-19 18:38:18 +01:00
|
|
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
|
|
|
if (!canSee(player)) {
|
|
|
|
continue;
|
|
|
|
}
|
2016-12-01 02:34:34 +01:00
|
|
|
|
2022-12-19 18:38:18 +01:00
|
|
|
ProtocolLibrary.getProtocolManager().sendServerPacket(player, deleteTab);
|
2023-01-02 20:01:40 +01:00
|
|
|
ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab);
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
}
|
2021-02-01 08:49:27 +01:00
|
|
|
|
|
|
|
DisguiseUtilities.refreshTrackers(this);
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|
|
|
|
|
2020-02-05 02:26:55 +01:00
|
|
|
@Override
|
|
|
|
public PlayerWatcher getWatcher() {
|
|
|
|
return (PlayerWatcher) super.getWatcher();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setWatcher(FlagWatcher newWatcher) {
|
|
|
|
return (PlayerDisguise) super.setWatcher(newWatcher);
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isDisplayedInTab() {
|
|
|
|
return getWatcher().isDisplayedInTab();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setDisplayedInTab(boolean showPlayerInTab) {
|
|
|
|
getWatcher().setDisplayedInTab(showPlayerInTab);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean isPlayerDisguise() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise removePlayer(Player player) {
|
|
|
|
return (PlayerDisguise) super.removePlayer(player);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise removePlayer(String playername) {
|
|
|
|
return (PlayerDisguise) super.removePlayer(playername);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setDisguiseTarget(TargetType newTargetType) {
|
|
|
|
return (PlayerDisguise) super.setDisguiseTarget(newTargetType);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setEntity(Entity entity) {
|
|
|
|
return (PlayerDisguise) super.setEntity(entity);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setHearSelfDisguise(boolean hearSelfDisguise) {
|
|
|
|
return (PlayerDisguise) super.setHearSelfDisguise(hearSelfDisguise);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setHideArmorFromSelf(boolean hideArmor) {
|
|
|
|
return (PlayerDisguise) super.setHideArmorFromSelf(hideArmor);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setHideHeldItemFromSelf(boolean hideHeldItem) {
|
|
|
|
return (PlayerDisguise) super.setHideHeldItemFromSelf(hideHeldItem);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setKeepDisguiseOnPlayerDeath(boolean keepDisguise) {
|
|
|
|
return (PlayerDisguise) super.setKeepDisguiseOnPlayerDeath(keepDisguise);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setModifyBoundingBox(boolean modifyBox) {
|
|
|
|
return (PlayerDisguise) super.setModifyBoundingBox(modifyBox);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setReplaceSounds(boolean areSoundsReplaced) {
|
|
|
|
return (PlayerDisguise) super.setReplaceSounds(areSoundsReplaced);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean startDisguise() {
|
2021-03-29 10:42:41 +02:00
|
|
|
return startDisguise(null);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean startDisguise(CommandSender sender) {
|
2020-03-30 09:22:33 +02:00
|
|
|
if (isDisguiseInUse()) {
|
|
|
|
return false;
|
|
|
|
}
|
2020-02-05 02:26:55 +01:00
|
|
|
|
2020-03-30 09:22:33 +02:00
|
|
|
if (skinToUse != null && gameProfile == null) {
|
|
|
|
currentLookup = new LibsProfileLookup() {
|
|
|
|
@Override
|
|
|
|
public void onLookup(WrappedGameProfile gameProfile) {
|
2020-09-26 02:00:44 +02:00
|
|
|
if (currentLookup != this || gameProfile == null || gameProfile.getProperties().isEmpty()) {
|
2020-03-30 09:22:33 +02:00
|
|
|
return;
|
2020-09-26 02:00:44 +02:00
|
|
|
}
|
2020-02-05 02:26:55 +01:00
|
|
|
|
|
|
|
setSkin(gameProfile);
|
2020-03-30 09:22:33 +02:00
|
|
|
|
|
|
|
currentLookup = null;
|
2020-02-05 02:26:55 +01:00
|
|
|
}
|
2020-03-30 09:22:33 +02:00
|
|
|
};
|
2020-02-05 02:26:55 +01:00
|
|
|
|
2021-02-01 08:49:27 +01:00
|
|
|
WrappedGameProfile gameProfile = DisguiseUtilities.getProfileFromMojang(this.skinToUse, currentLookup, DisguiseConfig.isContactMojangServers());
|
2020-02-05 02:29:04 +01:00
|
|
|
|
2020-03-30 09:22:33 +02:00
|
|
|
if (gameProfile != null) {
|
|
|
|
setSkin(gameProfile);
|
|
|
|
}
|
|
|
|
}
|
2020-02-05 02:29:04 +01:00
|
|
|
|
2020-03-30 09:22:33 +02:00
|
|
|
if (isDynamicName()) {
|
2021-06-07 10:01:27 +02:00
|
|
|
String name;
|
|
|
|
|
|
|
|
if (getEntity() instanceof Player) {
|
|
|
|
name = DisguiseUtilities.translateAlternateColorCodes(DisguiseUtilities.getDisplayName(getEntity()));
|
|
|
|
} else {
|
|
|
|
name = getEntity().getCustomName();
|
|
|
|
}
|
2020-02-05 02:26:55 +01:00
|
|
|
|
2021-02-06 05:15:49 +01:00
|
|
|
if (name == null) {
|
|
|
|
name = "";
|
2020-03-30 09:22:33 +02:00
|
|
|
}
|
2020-02-05 02:26:55 +01:00
|
|
|
|
2020-03-30 09:22:33 +02:00
|
|
|
if (!getName().equals(name)) {
|
2020-02-05 02:26:55 +01:00
|
|
|
setName(name);
|
|
|
|
}
|
2020-03-30 09:22:33 +02:00
|
|
|
} else if (getName().equals("<Inherit>") && getEntity() != null) {
|
|
|
|
String name = getEntity().getCustomName();
|
|
|
|
|
|
|
|
if (name == null || name.isEmpty()) {
|
|
|
|
name = getEntity().getType().name();
|
|
|
|
}
|
|
|
|
|
|
|
|
setName(name);
|
2020-02-05 02:26:55 +01:00
|
|
|
}
|
|
|
|
|
2021-03-29 10:42:41 +02:00
|
|
|
boolean result = super.startDisguise(sender);
|
2020-02-05 02:26:55 +01:00
|
|
|
|
2020-03-30 09:22:33 +02:00
|
|
|
if (result && hasScoreboardName()) {
|
|
|
|
DisguiseUtilities.registerExtendedName(this);
|
2020-02-05 02:26:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2016-12-01 02:34:34 +01:00
|
|
|
@Override
|
|
|
|
public PlayerDisguise setVelocitySent(boolean sendVelocity) {
|
|
|
|
return (PlayerDisguise) super.setVelocitySent(sendVelocity);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise setViewSelfDisguise(boolean viewSelfDisguise) {
|
|
|
|
return (PlayerDisguise) super.setViewSelfDisguise(viewSelfDisguise);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise silentlyAddPlayer(String playername) {
|
|
|
|
return (PlayerDisguise) super.silentlyAddPlayer(playername);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public PlayerDisguise silentlyRemovePlayer(String playername) {
|
|
|
|
return (PlayerDisguise) super.silentlyRemovePlayer(playername);
|
|
|
|
}
|
2020-01-20 01:35:55 +01:00
|
|
|
|
|
|
|
@Override
|
2023-07-05 23:31:13 +02:00
|
|
|
public boolean removeDisguise(CommandSender sender, boolean disguiseBeingReplaced) {
|
|
|
|
boolean result = super.removeDisguise(sender, disguiseBeingReplaced);
|
2020-01-20 01:35:55 +01:00
|
|
|
|
2021-01-27 07:19:24 +01:00
|
|
|
if (!result) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hasScoreboardName()) {
|
2020-01-20 01:35:55 +01:00
|
|
|
if (disguiseBeingReplaced) {
|
|
|
|
new BukkitRunnable() {
|
|
|
|
@Override
|
|
|
|
public void run() {
|
2020-03-30 09:22:33 +02:00
|
|
|
DisguiseUtilities.unregisterExtendedName(PlayerDisguise.this);
|
2020-01-20 01:35:55 +01:00
|
|
|
}
|
|
|
|
}.runTaskLater(LibsDisguises.getInstance(), 5);
|
|
|
|
} else {
|
2020-03-30 09:22:33 +02:00
|
|
|
DisguiseUtilities.unregisterExtendedName(this);
|
2020-01-20 01:35:55 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
2016-12-01 02:34:34 +01:00
|
|
|
}
|