Instead of using Object's for gameprofiles. Use WrappedGameProfile

This commit is contained in:
libraryaddict 2014-06-05 08:40:15 +12:00
parent 5ff1370ea0
commit d23e518c1b
6 changed files with 52 additions and 74 deletions

View File

@ -2,6 +2,8 @@ package me.libraryaddict.disguise.disguisetypes;
import org.bukkit.entity.Player;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.LibsProfileLookup;
import me.libraryaddict.disguise.utilities.ReflectionManager;
@ -9,7 +11,7 @@ import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion;
public class PlayerDisguise extends TargetedDisguise {
private LibsProfileLookup currentLookup;
private Object gameProfile;
private WrappedGameProfile gameProfile;
private String playerName;
private String skinToUse;
@ -53,7 +55,7 @@ public class PlayerDisguise extends TargetedDisguise {
}
@Deprecated
public Object getGameProfile() {
public WrappedGameProfile getGameProfile() {
if (getSkin() != null) {
if (gameProfile != null) {
return gameProfile;
@ -79,7 +81,7 @@ public class PlayerDisguise extends TargetedDisguise {
}
@Deprecated
public void setGameProfile(Object gameProfile) {
public void setGameProfile(WrappedGameProfile gameProfile) {
this.gameProfile = ReflectionManager.getGameProfileWithThisSkin(null, getName(), gameProfile);
}
@ -97,7 +99,7 @@ public class PlayerDisguise extends TargetedDisguise {
currentLookup = new LibsProfileLookup() {
@Override
public void onLookup(Object gameProfile) {
public void onLookup(WrappedGameProfile gameProfile) {
if (currentLookup == this && gameProfile != null) {
setGameProfile(gameProfile);
if (DisguiseUtilities.isDisguiseInUse(PlayerDisguise.this)) {
@ -109,7 +111,7 @@ public class PlayerDisguise extends TargetedDisguise {
}
}
};
Object obj = DisguiseUtilities.getProfileFromMojang(this.skinToUse, currentLookup);
WrappedGameProfile obj = DisguiseUtilities.getProfileFromMojang(this.skinToUse, currentLookup);
if (obj != null) {
setGameProfile(obj);
}

View File

@ -38,6 +38,7 @@ import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
public class DisguiseUtilities {
/**
@ -58,7 +59,7 @@ public class DisguiseUtilities {
/**
* A hashmap storing the uuid and skin of a playername
*/
private static HashMap<String, Object> gameProfiles = new HashMap<String, Object>();
private static HashMap<String, WrappedGameProfile> gameProfiles = new HashMap<String, WrappedGameProfile>();
private static LibsDisguises libsDisguises;
private static HashMap<String, ArrayList<Object>> runnables = new HashMap<String, ArrayList<Object>>();
/**
@ -122,7 +123,7 @@ public class DisguiseUtilities {
runnable.runTaskLater(libsDisguises, 20);
}
public static void addGameProfile(String string, Object gameProfile) {
public static void addGameProfile(String string, WrappedGameProfile gameProfile) {
getGameProfiles().put(string, gameProfile);
addedByPlugins.add(string);
}
@ -263,7 +264,7 @@ public class DisguiseUtilities {
}
return null;
}
public static TargetedDisguise getDisguise(Player observer, Entity entity) {
UUID entityId = entity.getUniqueId();
if (futureDisguises.containsKey(entity.getEntityId())) {
@ -297,11 +298,11 @@ public class DisguiseUtilities {
return futureDisguises;
}
public static Object getGameProfile(String playerName) {
public static WrappedGameProfile getGameProfile(String playerName) {
return gameProfiles.get(playerName);
}
public static HashMap<String, Object> getGameProfiles() {
public static HashMap<String, WrappedGameProfile> getGameProfiles() {
return gameProfiles;
}
@ -345,11 +346,11 @@ public class DisguiseUtilities {
return players;
}
public static Object getProfileFromMojang(final PlayerDisguise disguise) {
public static WrappedGameProfile getProfileFromMojang(final PlayerDisguise disguise) {
return getProfileFromMojang(disguise.getName(), new LibsProfileLookup() {
@Override
public void onLookup(Object gameProfile) {
public void onLookup(WrappedGameProfile gameProfile) {
getAddedByPlugins().remove(disguise.getName());
if (DisguiseAPI.isDisguiseInUse(disguise)) {
DisguiseUtilities.refreshTrackers(disguise);
@ -365,11 +366,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
* using schedulers. The runnable is run once the GameProfile has been successfully dealt with
*/
public static Object getProfileFromMojang(String playerName, LibsProfileLookup runnableIfCantReturn) {
public static WrappedGameProfile getProfileFromMojang(String playerName, LibsProfileLookup runnableIfCantReturn) {
return getProfileFromMojang(playerName, (Object) runnableIfCantReturn);
}
private static Object getProfileFromMojang(final String playerName, final Object runnable) {
private static WrappedGameProfile getProfileFromMojang(final String playerName, final Object runnable) {
if (gameProfiles.containsKey(playerName)) {
if (gameProfiles.get(playerName) != null) {
return gameProfiles.get(playerName);
@ -378,7 +379,7 @@ public class DisguiseUtilities {
getAddedByPlugins().add(playerName);
Player player = Bukkit.getPlayerExact(playerName);
if (player != null) {
Object gameProfile = ReflectionManager.getGameProfile(player);
WrappedGameProfile gameProfile = ReflectionManager.getGameProfile(player);
if (ReflectionManager.hasSkinBlob(gameProfile)) {
gameProfiles.put(playerName, gameProfile);
return gameProfile;
@ -389,7 +390,7 @@ public class DisguiseUtilities {
Bukkit.getScheduler().scheduleAsyncDelayedTask(libsDisguises, new Runnable() {
public void run() {
try {
final Object gameProfile = lookupGameProfile(playerName);
final WrappedGameProfile gameProfile = lookupGameProfile(playerName);
Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() {
public void run() {
if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) {
@ -430,7 +431,7 @@ 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
* using schedulers. The runnable is run once the GameProfile has been successfully dealt with
*/
public static Object getProfileFromMojang(String playerName, Runnable runnableIfCantReturn) {
public static WrappedGameProfile getProfileFromMojang(String playerName, Runnable runnableIfCantReturn) {
return getProfileFromMojang(playerName, (Object) runnableIfCantReturn);
}
@ -454,8 +455,8 @@ public class DisguiseUtilities {
/**
* This is called on a thread as it is thread blocking
*/
public static Object lookupGameProfile(String playerName) {
Object gameprofile = ReflectionManager.grabProfileAddUUID(playerName);
public static WrappedGameProfile lookupGameProfile(String playerName) {
WrappedGameProfile gameprofile = ReflectionManager.grabProfileAddUUID(playerName);
return ReflectionManager.getSkullBlob(gameprofile);
}

View File

@ -1,6 +1,8 @@
package me.libraryaddict.disguise.utilities;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
public interface LibsProfileLookup {
public void onLookup(Object gameProfile);
public void onLookup(WrappedGameProfile gameProfile);
}

View File

@ -3,13 +3,15 @@ package me.libraryaddict.disguise.utilities;
import java.lang.reflect.Field;
import java.util.UUID;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import net.minecraft.util.com.mojang.authlib.GameProfile;
import net.minecraft.util.com.mojang.authlib.ProfileLookupCallback;
public class LibsProfileLookupCaller implements ProfileLookupCallback {
private GameProfile gameProfile;
private WrappedGameProfile gameProfile;
public GameProfile getGameProfile() {
public WrappedGameProfile getGameProfile() {
return gameProfile;
}
@ -27,7 +29,7 @@ public class LibsProfileLookupCaller implements ProfileLookupCallback {
@Override
public void onProfileLookupSucceeded(GameProfile profile) {
gameProfile = profile;
gameProfile = WrappedGameProfile.fromHandle(profile);
}
}

View File

@ -49,6 +49,7 @@ import com.comphenix.protocol.reflect.StructureModifier;
import com.comphenix.protocol.wrappers.WrappedAttribute;
import com.comphenix.protocol.wrappers.WrappedAttribute.Builder;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.comphenix.protocol.wrappers.WrappedWatchableObject;
public class PacketsManager {
@ -196,7 +197,7 @@ public class PacketsManager {
stringMods.write(i, ((PlayerDisguise) disguise).getName());
}
} else {
Object gameProfile;
WrappedGameProfile gameProfile;
String name = ((PlayerDisguise) disguise).getName();
boolean removeName = false;
if (!DisguiseUtilities.hasGameProfile(name)) {
@ -206,7 +207,7 @@ public class PacketsManager {
if (removeName) {
DisguiseUtilities.getAddedByPlugins().remove(name);
}
spawnPackets[0].getModifier().write(1, gameProfile);
spawnPackets[0].getGameProfiles().write(0, gameProfile);
}
StructureModifier<Integer> intMods = spawnPackets[0].getIntegers();
intMods.write(0, disguisedEntity.getEntityId());

View File

@ -14,6 +14,8 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
public class ReflectionManager {
public enum LibVersion {
V1_6, V1_7;
@ -90,10 +92,10 @@ public class ReflectionManager {
Object playerinteractmanager = getNmsClass("PlayerInteractManager").getConstructor(getNmsClass("World"))
.newInstance(world);
if (LibVersion.is1_7()) {
Object gameProfile = getGameProfile(null, "LibsDisguises");
WrappedGameProfile gameProfile = getGameProfile(null, "LibsDisguises");
entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"),
gameProfile.getClass(), playerinteractmanager.getClass()).newInstance(minecraftServer, world,
gameProfile, playerinteractmanager);
gameProfile.getHandleType(), playerinteractmanager.getClass()).newInstance(minecraftServer, world,
gameProfile.getHandle(), playerinteractmanager);
} else {
entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("World"), String.class,
playerinteractmanager.getClass()).newInstance(minecraftServer, world, "LibsDisguises",
@ -205,47 +207,26 @@ public class ReflectionManager {
return null;
}
public static Object getGameProfile(Player player) {
public static WrappedGameProfile getGameProfile(Player player) {
if (LibVersion.is1_7()) {
try {
return getNmsClass("EntityHuman").getMethod("getProfile").invoke(getNmsEntity(player));
} catch (Exception ex) {
ex.printStackTrace();
}
return WrappedGameProfile.fromPlayer(player);
}
return null;
}
public static Object getGameProfile(UUID uuid, String playerName) {
public static WrappedGameProfile getGameProfile(UUID uuid, String playerName) {
try {
try {
return Class.forName("net.minecraft.util.com.mojang.authlib.GameProfile")
.getConstructor(UUID.class, String.class)
.newInstance(uuid != null ? uuid : UUID.randomUUID(), playerName);
} catch (NoSuchMethodException ex) {
return Class.forName("net.minecraft.util.com.mojang.authlib.GameProfile")
.getConstructor(String.class, String.class).newInstance(uuid != null ? uuid.toString() : "", playerName);
}
return new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), playerName);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static Object getGameProfileWithThisSkin(UUID uuid, String playerName, Object profileWithSkin) {
public static WrappedGameProfile getGameProfileWithThisSkin(UUID uuid, String playerName, WrappedGameProfile 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));
WrappedGameProfile gameProfile = new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), playerName);
gameProfile.getProperties().putAll(profileWithSkin.getProperties());
return gameProfile;
} catch (Exception ex) {
ex.printStackTrace();
@ -301,14 +282,15 @@ public class ReflectionManager {
return null;
}
public static Object getSkullBlob(Object gameProfile) {
public static WrappedGameProfile getSkullBlob(WrappedGameProfile gameProfile) {
try {
Object minecraftServer = getNmsClass("MinecraftServer").getMethod("getServer").invoke(null);
for (Method method : getNmsClass("MinecraftServer").getMethods()) {
if (method.getReturnType().getSimpleName().equals("MinecraftSessionService")) {
Object session = method.invoke(minecraftServer);
return session.getClass().getMethod("fillProfileProperties", gameProfile.getClass(), boolean.class)
.invoke(session, gameProfile, true);
return WrappedGameProfile.fromHandle(session.getClass()
.getMethod("fillProfileProperties", gameProfile.getHandleType(), boolean.class)
.invoke(session, gameProfile.getHandle(), true));
}
}
} catch (Exception ex) {
@ -335,7 +317,7 @@ public class ReflectionManager {
return null;
}
public static Object grabProfileAddUUID(String playername) {
public static WrappedGameProfile grabProfileAddUUID(String playername) {
try {
Object minecraftServer = getNmsClass("MinecraftServer").getMethod("getServer").invoke(null);
for (Method method : getNmsClass("MinecraftServer").getMethods()) {
@ -357,20 +339,8 @@ public class ReflectionManager {
return null;
}
public static boolean hasSkinBlob(Object gameprofile) {
try {
Field propField = gameprofile.getClass().getDeclaredField("properties");
propField.setAccessible(true);
Object propMap = propField.get(gameprofile);
propField = propMap.getClass().getDeclaredField("properties");
propField.setAccessible(true);
propMap = propField.get(propMap);
return !(Boolean) propMap.getClass().getMethod("isEmpty").invoke(propMap);
} catch (NoSuchFieldException ex) {
} catch (Exception ex) {
ex.printStackTrace();
}
return true;
public static boolean hasSkinBlob(WrappedGameProfile gameProfile) {
return !gameProfile.getProperties().isEmpty();
}
public static void setAllowSleep(Player player) {