Add setSkin for playerdisguise. This may be removed in future versions
This commit is contained in:
parent
8a9c2fa225
commit
841dab296d
2
pom.xml
2
pom.xml
@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>LibsDisguises</groupId>
|
<groupId>LibsDisguises</groupId>
|
||||||
<artifactId>LibsDisguises</artifactId>
|
<artifactId>LibsDisguises</artifactId>
|
||||||
<version>8.2.4</version>
|
<version>8.2.4-SNAPSHOT</version>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<sourceDirectory>src</sourceDirectory>
|
<sourceDirectory>src</sourceDirectory>
|
||||||
|
@ -439,7 +439,7 @@ public abstract class Disguise {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DisguiseUtilities.removeGameprofile(name);
|
DisguiseUtilities.getGameProfiles().remove(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,15 @@
|
|||||||
package me.libraryaddict.disguise.disguisetypes;
|
package me.libraryaddict.disguise.disguisetypes;
|
||||||
|
|
||||||
|
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
|
||||||
|
import me.libraryaddict.disguise.utilities.LibsProfileLookup;
|
||||||
|
import me.libraryaddict.disguise.utilities.ReflectionManager;
|
||||||
|
import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion;
|
||||||
|
|
||||||
public class PlayerDisguise extends TargetedDisguise {
|
public class PlayerDisguise extends TargetedDisguise {
|
||||||
|
private LibsProfileLookup currentLookup;
|
||||||
|
private Object gameProfile;
|
||||||
private String playerName;
|
private String playerName;
|
||||||
|
private String skinToUse;
|
||||||
|
|
||||||
public PlayerDisguise(String name) {
|
public PlayerDisguise(String name) {
|
||||||
if (name.length() > 16)
|
if (name.length() > 16)
|
||||||
@ -16,9 +24,21 @@ public class PlayerDisguise extends TargetedDisguise {
|
|||||||
this.setReplaceSounds(replaceSounds);
|
this.setReplaceSounds(replaceSounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public PlayerDisguise(String name, String skinToUse) {
|
||||||
|
this(name);
|
||||||
|
setSkin(skinToUse);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlayerDisguise clone() {
|
public PlayerDisguise clone() {
|
||||||
PlayerDisguise disguise = new PlayerDisguise(getName());
|
PlayerDisguise disguise = new PlayerDisguise(getName());
|
||||||
|
if (disguise.currentLookup == null && disguise.gameProfile != null) {
|
||||||
|
disguise.skinToUse = getSkin();
|
||||||
|
disguise.gameProfile = gameProfile;
|
||||||
|
} else {
|
||||||
|
disguise.setSkin(getSkin());
|
||||||
|
}
|
||||||
disguise.setReplaceSounds(isSoundsReplaced());
|
disguise.setReplaceSounds(isSoundsReplaced());
|
||||||
disguise.setViewSelfDisguise(isSelfDisguiseVisible());
|
disguise.setViewSelfDisguise(isSelfDisguiseVisible());
|
||||||
disguise.setHearSelfDisguise(isSelfDisguiseSoundsReplaced());
|
disguise.setHearSelfDisguise(isSelfDisguiseSoundsReplaced());
|
||||||
@ -30,13 +50,66 @@ public class PlayerDisguise extends TargetedDisguise {
|
|||||||
return disguise;
|
return disguise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public Object getGameProfile() {
|
||||||
|
if (getSkin() != null) {
|
||||||
|
if (gameProfile != null) {
|
||||||
|
return gameProfile;
|
||||||
|
}
|
||||||
|
return ReflectionManager.getGameProfile(null, getName());
|
||||||
|
} else {
|
||||||
|
return DisguiseUtilities.getProfileFromMojang(getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return playerName;
|
return playerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public String getSkin() {
|
||||||
|
return skinToUse;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isPlayerDisguise() {
|
public boolean isPlayerDisguise() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public void setGameProfile(Object gameProfile) {
|
||||||
|
this.gameProfile = ReflectionManager.getGameProfileWithThisSkin(null, getName(), gameProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public void setSkin(String skinToUse) {
|
||||||
|
this.skinToUse = skinToUse;
|
||||||
|
if (skinToUse == null) {
|
||||||
|
this.currentLookup = null;
|
||||||
|
this.gameProfile = null;
|
||||||
|
} else {
|
||||||
|
if (skinToUse.length() > 16) {
|
||||||
|
this.skinToUse = skinToUse.substring(0, 16);
|
||||||
|
}
|
||||||
|
if (LibVersion.is1_7()) {
|
||||||
|
currentLookup = new LibsProfileLookup() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLookup(Object gameProfile) {
|
||||||
|
if (currentLookup == this && gameProfile != null) {
|
||||||
|
setGameProfile(gameProfile);
|
||||||
|
if (DisguiseUtilities.isDisguiseInUse(PlayerDisguise.this)) {
|
||||||
|
DisguiseUtilities.refreshTrackers(PlayerDisguise.this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Object obj = DisguiseUtilities.getProfileFromMojang(this.skinToUse, currentLookup);
|
||||||
|
if (obj != null) {
|
||||||
|
setGameProfile(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -10,6 +10,7 @@ import com.comphenix.protocol.reflect.StructureModifier;
|
|||||||
|
|
||||||
import me.libraryaddict.disguise.DisguiseConfig;
|
import me.libraryaddict.disguise.DisguiseConfig;
|
||||||
import me.libraryaddict.disguise.disguisetypes.Disguise;
|
import me.libraryaddict.disguise.disguisetypes.Disguise;
|
||||||
|
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
|
||||||
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
|
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
|
||||||
import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion;
|
import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion;
|
||||||
|
|
||||||
@ -39,6 +40,10 @@ public class PlayerWatcher extends LivingWatcher {
|
|||||||
sendData(9);
|
sendData(9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSkin(String playerName) {
|
||||||
|
((PlayerDisguise) getDisguise()).setSkin(playerName);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The facing direction for the bed is the block metadata. 0 - 90 degrees. 1 - 0 degrees. 2 - 270 degrees. 3 - 180 degrees.
|
* The facing direction for the bed is the block metadata. 0 - 90 degrees. 1 - 0 degrees. 2 - 270 degrees. 3 - 180 degrees.
|
||||||
*/
|
*/
|
||||||
|
@ -19,7 +19,6 @@ import me.libraryaddict.disguise.disguisetypes.TargetedDisguise;
|
|||||||
import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher;
|
import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher;
|
||||||
import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher;
|
import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher;
|
||||||
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType;
|
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -57,6 +56,7 @@ public class DisguiseUtilities {
|
|||||||
*/
|
*/
|
||||||
private static HashMap<String, Object> gameProfiles = new HashMap<String, Object>();
|
private static HashMap<String, Object> gameProfiles = new HashMap<String, Object>();
|
||||||
private static LibsDisguises libsDisguises;
|
private static LibsDisguises libsDisguises;
|
||||||
|
private static HashMap<String, ArrayList<Object>> runnables = new HashMap<String, ArrayList<Object>>();
|
||||||
/**
|
/**
|
||||||
* A internal storage of fake entity ID's each entity has. Realistically I could probably use a ID like "4" for everyone,
|
* A internal storage of fake entity ID's each entity has. Realistically I could probably use a ID like "4" for everyone,
|
||||||
* seeing as no one sees each others entity ID
|
* seeing as no one sees each others entity ID
|
||||||
@ -81,6 +81,11 @@ public class DisguiseUtilities {
|
|||||||
futureDisguises.get(entityId).add(disguise);
|
futureDisguises.get(entityId).add(disguise);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void addGameProfile(String string, Object gameProfile) {
|
||||||
|
getGameProfiles().put(string, gameProfile);
|
||||||
|
addedByPlugins.add(string);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If name isn't null. Make sure that the name doesn't see any other disguise. Else if name is null. Make sure that the
|
* If name isn't null. Make sure that the name doesn't see any other disguise. Else if name is null. Make sure that the
|
||||||
* observers in the disguise don't see any other disguise.
|
* observers in the disguise don't see any other disguise.
|
||||||
@ -245,6 +250,10 @@ public class DisguiseUtilities {
|
|||||||
return gameProfiles.get(playerName);
|
return gameProfiles.get(playerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static HashMap<String, Object> getGameProfiles() {
|
||||||
|
return gameProfiles;
|
||||||
|
}
|
||||||
|
|
||||||
public static TargetedDisguise getMainDisguise(UUID entityId) {
|
public static TargetedDisguise getMainDisguise(UUID entityId) {
|
||||||
TargetedDisguise toReturn = null;
|
TargetedDisguise toReturn = null;
|
||||||
if (getDisguises().containsKey(entityId)) {
|
if (getDisguises().containsKey(entityId)) {
|
||||||
@ -286,8 +295,11 @@ public class DisguiseUtilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Object getProfileFromMojang(final String playerName) {
|
public static Object getProfileFromMojang(final String playerName) {
|
||||||
return getProfileFromMojang(playerName, new Runnable() {
|
return getProfileFromMojang(playerName, new LibsProfileLookup() {
|
||||||
public void run() {
|
|
||||||
|
@Override
|
||||||
|
public void onLookup(Object gameProfile) {
|
||||||
|
getAddedByPlugins().remove(playerName);
|
||||||
for (HashSet<TargetedDisguise> disguises : DisguiseUtilities.getDisguises().values()) {
|
for (HashSet<TargetedDisguise> disguises : DisguiseUtilities.getDisguises().values()) {
|
||||||
for (TargetedDisguise disguise : disguises) {
|
for (TargetedDisguise disguise : disguises) {
|
||||||
if (disguise.getType() == DisguiseType.PLAYER && ((PlayerDisguise) disguise).getName().equals(playerName)) {
|
if (disguise.getType() == DisguiseType.PLAYER && ((PlayerDisguise) disguise).getName().equals(playerName)) {
|
||||||
@ -306,7 +318,11 @@ public class DisguiseUtilities {
|
|||||||
* Thread safe to use. This returns a GameProfile. And if its GameProfile doesn't have a skin blob. Then it does a lookup
|
* Thread safe to use. This returns a GameProfile. And if its GameProfile doesn't have a skin blob. Then it does a lookup
|
||||||
* using schedulers. The runnable is run once the GameProfile has been successfully dealt with
|
* using schedulers. The runnable is run once the GameProfile has been successfully dealt with
|
||||||
*/
|
*/
|
||||||
public static Object getProfileFromMojang(final String playerName, final Runnable runnable) {
|
public static Object getProfileFromMojang(String playerName, LibsProfileLookup runnableIfCantReturn) {
|
||||||
|
return getProfileFromMojang(playerName, (Object) runnableIfCantReturn);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Object getProfileFromMojang(final String playerName, final Object runnable) {
|
||||||
if (gameProfiles.containsKey(playerName)) {
|
if (gameProfiles.containsKey(playerName)) {
|
||||||
if (gameProfiles.get(playerName) != null) {
|
if (gameProfiles.get(playerName) != null) {
|
||||||
return gameProfiles.get(playerName);
|
return gameProfiles.get(playerName);
|
||||||
@ -331,8 +347,14 @@ public class DisguiseUtilities {
|
|||||||
public void run() {
|
public void run() {
|
||||||
if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) {
|
if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) {
|
||||||
gameProfiles.put(playerName, gameProfile);
|
gameProfiles.put(playerName, gameProfile);
|
||||||
if (runnable != null) {
|
}
|
||||||
runnable.run();
|
if (runnables.containsKey(playerName)) {
|
||||||
|
for (Object obj : runnables.remove(playerName)) {
|
||||||
|
if (obj instanceof Runnable) {
|
||||||
|
((Runnable) obj).run();
|
||||||
|
} else if (obj instanceof LibsProfileLookup) {
|
||||||
|
((LibsProfileLookup) obj).onLookup(gameProfile);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -348,9 +370,23 @@ public class DisguiseUtilities {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (runnable != null) {
|
||||||
|
if (!runnables.containsKey(playerName)) {
|
||||||
|
runnables.put(playerName, new ArrayList<Object>());
|
||||||
|
}
|
||||||
|
runnables.get(playerName).add(runnable);
|
||||||
|
}
|
||||||
return ReflectionManager.getGameProfile(null, playerName);
|
return ReflectionManager.getGameProfile(null, playerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thread safe to use. This returns a GameProfile. And if its GameProfile doesn't have a skin blob. Then it does a lookup
|
||||||
|
* using schedulers. The runnable is run once the GameProfile has been successfully dealt with
|
||||||
|
*/
|
||||||
|
public static Object getProfileFromMojang(String playerName, Runnable runnableIfCantReturn) {
|
||||||
|
return getProfileFromMojang(playerName, (Object) runnableIfCantReturn);
|
||||||
|
}
|
||||||
|
|
||||||
public static List<TargetedDisguise> getSeenDisguises(String viewer) {
|
public static List<TargetedDisguise> getSeenDisguises(String viewer) {
|
||||||
List<TargetedDisguise> dis = new ArrayList<TargetedDisguise>();
|
List<TargetedDisguise> dis = new ArrayList<TargetedDisguise>();
|
||||||
for (HashSet<TargetedDisguise> disguises : getDisguises().values()) {
|
for (HashSet<TargetedDisguise> disguises : getDisguises().values()) {
|
||||||
@ -521,10 +557,15 @@ public class DisguiseUtilities {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public static void removeGameprofile(String string) {
|
public static void removeGameprofile(String string) {
|
||||||
gameProfiles.remove(string);
|
gameProfiles.remove(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void removeGameProfile(String string) {
|
||||||
|
gameProfiles.remove(string);
|
||||||
|
}
|
||||||
|
|
||||||
public static void removeSelfDisguise(Player player) {
|
public static void removeSelfDisguise(Player player) {
|
||||||
if (selfDisguisesIds.containsKey(player.getUniqueId())) {
|
if (selfDisguisesIds.containsKey(player.getUniqueId())) {
|
||||||
// Send a packet to destroy the fake entity
|
// Send a packet to destroy the fake entity
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
package me.libraryaddict.disguise.utilities;
|
||||||
|
|
||||||
|
public interface LibsProfileLookup {
|
||||||
|
public void onLookup(Object gameProfile);
|
||||||
|
|
||||||
|
}
|
@ -186,7 +186,7 @@ public class PacketsManager {
|
|||||||
if (!DisguiseUtilities.hasGameProfile(name)) {
|
if (!DisguiseUtilities.hasGameProfile(name)) {
|
||||||
removeName = !DisguiseUtilities.getAddedByPlugins().contains(name);
|
removeName = !DisguiseUtilities.getAddedByPlugins().contains(name);
|
||||||
}
|
}
|
||||||
gameProfile = DisguiseUtilities.getProfileFromMojang(name);
|
gameProfile = ((PlayerDisguise) disguise).getGameProfile();
|
||||||
if (removeName) {
|
if (removeName) {
|
||||||
DisguiseUtilities.getAddedByPlugins().remove(name);
|
DisguiseUtilities.getAddedByPlugins().remove(name);
|
||||||
}
|
}
|
||||||
|
@ -233,6 +233,27 @@ public class ReflectionManager {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Object getGameProfileWithThisSkin(UUID uuid, String playerName, Object profileWithSkin) {
|
||||||
|
try {
|
||||||
|
Object gameProfile;
|
||||||
|
try {
|
||||||
|
gameProfile = Class.forName("net.minecraft.util.com.mojang.authlib.GameProfile")
|
||||||
|
.getConstructor(UUID.class, String.class)
|
||||||
|
.newInstance(uuid != null ? uuid : UUID.randomUUID(), playerName);
|
||||||
|
} catch (NoSuchMethodException ex) {
|
||||||
|
gameProfile = Class.forName("net.minecraft.util.com.mojang.authlib.GameProfile")
|
||||||
|
.getConstructor(String.class, String.class).newInstance(uuid != null ? uuid.toString() : "", playerName);
|
||||||
|
}
|
||||||
|
Field properties = gameProfile.getClass().getDeclaredField("properties");
|
||||||
|
properties.setAccessible(true);
|
||||||
|
properties.set(gameProfile, properties.get(profileWithSkin));
|
||||||
|
return gameProfile;
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static Class getNmsClass(String className) {
|
public static Class getNmsClass(String className) {
|
||||||
try {
|
try {
|
||||||
return Class.forName("net.minecraft.server." + getBukkitVersion() + "." + className);
|
return Class.forName("net.minecraft.server." + getBukkitVersion() + "." + className);
|
||||||
|
Loading…
Reference in New Issue
Block a user