Add a new method for converting the datawatchers to 1.8 new indexes

This commit is contained in:
libraryaddict 2014-09-03 13:30:11 +12:00
parent 47366fec94
commit e5eb16faac
4 changed files with 97 additions and 16 deletions

View File

@ -17,12 +17,12 @@ public class VillagerWatcher extends AgeableWatcher {
return Profession.values()[(Integer) getValue(16, 0)]; return Profession.values()[(Integer) getValue(16, 0)];
} }
public void setProfession(Profession newProfession) {
setProfession(newProfession.getId());
}
public void setProfession(int professionId){ public void setProfession(int professionId){
setValue(16, professionId % 6); setValue(16, professionId % 6);
sendData(16); sendData(16);
} }
public void setProfession(Profession newProfession) {
setProfession(newProfession.getId());
}
} }

View File

@ -8,6 +8,7 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -16,9 +17,12 @@ import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; 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.EndermanWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.ItemFrameWatcher;
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 me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion;
@ -41,6 +45,7 @@ import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.comphenix.protocol.wrappers.WrappedWatchableObject;
public class DisguiseUtilities { public class DisguiseUtilities {
/** /**
@ -460,6 +465,65 @@ public class DisguiseUtilities {
return ReflectionManager.getSkullBlob(gameprofile); return ReflectionManager.getSkullBlob(gameprofile);
} }
public static List<WrappedWatchableObject> rebuildForVersion(Player player, FlagWatcher watcher,
List<WrappedWatchableObject> list) {
if (!ReflectionManager.is1_8(player))
return list;
ArrayList<WrappedWatchableObject> rebuiltList = new ArrayList<WrappedWatchableObject>();
ArrayList<WrappedWatchableObject> backups = new ArrayList<WrappedWatchableObject>();
// TODO Player and Minecart
for (WrappedWatchableObject obj : list) {
if (obj.getValue().getClass().getName().startsWith("org.")) {
backups.add(obj);
continue;
}
switch (obj.getIndex()) {
case 2:
case 3:
if (watcher instanceof ItemFrameWatcher) {
rebuiltList.add(new WrappedWatchableObject(obj.getIndex() + 6, obj.getValue()));
} else {
backups.add(obj);
}
break;
case 10:
case 11:
rebuiltList.add(new WrappedWatchableObject(obj.getIndex() - 8, obj.getValue()));
break;
case 12:
if (watcher instanceof AgeableWatcher) {
int i = (Integer) obj.getValue();
rebuiltList.add(new WrappedWatchableObject(obj.getIndex(), (byte) (i < 0 ? -1 : (i >= 6000 ? 1 : 0))));
} else {
backups.add(obj);
}
break;
case 16:
if (watcher instanceof EndermanWatcher) {
rebuiltList.add(new WrappedWatchableObject(obj.getIndex(), ((Short) obj.getValue()).byteValue()));
} else {
backups.add(obj);
}
break;
default:
backups.add(obj);
break;
}
}
Iterator<WrappedWatchableObject> itel = backups.iterator();
while (itel.hasNext()) {
int index = itel.next().getIndex();
for (WrappedWatchableObject obj2 : rebuiltList) {
if (index == obj2.getIndex()) {
itel.remove();
break;
}
}
}
rebuiltList.addAll(backups);
return rebuiltList;
}
/** /**
* Resends the entity to this specific player * Resends the entity to this specific player
*/ */
@ -477,7 +541,7 @@ public class DisguiseUtilities {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
}); }, 2);
DisguiseUtilities.sendSelfDisguise((Player) disguise.getEntity(), disguise); DisguiseUtilities.sendSelfDisguise((Player) disguise.getEntity(), disguise);
} else { } else {
final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity());
@ -500,7 +564,7 @@ public class DisguiseUtilities {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
}); }, 2);
break; break;
} }
} }
@ -539,7 +603,7 @@ public class DisguiseUtilities {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
}); }, 2);
} }
} }
} }
@ -565,7 +629,7 @@ public class DisguiseUtilities {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
}); }, 2);
} }
final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity());
if (entityTrackerEntry != null) { if (entityTrackerEntry != null) {
@ -588,7 +652,7 @@ public class DisguiseUtilities {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
}); }, 2);
} }
} }
} }

View File

@ -113,7 +113,7 @@ public class PacketsManager {
/** /**
* Construct the packets I need to spawn in the disguise * Construct the packets I need to spawn in the disguise
*/ */
public static PacketContainer[] constructSpawnPackets(Disguise disguise, Entity disguisedEntity) { public static PacketContainer[] constructSpawnPackets(Player player, Disguise disguise, Entity disguisedEntity) {
if (disguise.getEntity() == null) if (disguise.getEntity() == null)
disguise.setEntity(disguisedEntity); disguise.setEntity(disguisedEntity);
Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity); Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity);
@ -246,7 +246,7 @@ public class PacketsManager {
byteMods.write(0, yaw); byteMods.write(0, yaw);
byteMods.write(1, pitch); byteMods.write(1, pitch);
spawnPackets[0].getDataWatcherModifier().write(0, spawnPackets[0].getDataWatcherModifier().write(0,
createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher()));
if (((PlayerWatcher) disguise.getWatcher()).isSleeping() && DisguiseConfig.isBedPacketsEnabled()) { if (((PlayerWatcher) disguise.getWatcher()).isSleeping() && DisguiseConfig.isBedPacketsEnabled()) {
spawnPackets[1] = new PacketContainer(PacketType.Play.Server.BED); spawnPackets[1] = new PacketContainer(PacketType.Play.Server.BED);
@ -290,7 +290,7 @@ public class PacketsManager {
mods.write(8, yaw); mods.write(8, yaw);
mods.write(9, pitch); mods.write(9, pitch);
spawnPackets[0].getDataWatcherModifier().write(0, spawnPackets[0].getDataWatcherModifier().write(0,
createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher()));
} else if (disguise.getType().isMisc()) { } else if (disguise.getType().isMisc()) {
@ -331,11 +331,12 @@ public class PacketsManager {
/** /**
* Create a new datawatcher but with the 'correct' values * Create a new datawatcher but with the 'correct' values
*/ */
private static WrappedDataWatcher createDataWatcher(WrappedDataWatcher watcher, FlagWatcher flagWatcher) { private static WrappedDataWatcher createDataWatcher(Player player, WrappedDataWatcher watcher, FlagWatcher flagWatcher) {
WrappedDataWatcher newWatcher = new WrappedDataWatcher(); WrappedDataWatcher newWatcher = new WrappedDataWatcher();
try { try {
List<WrappedWatchableObject> list = DisguiseConfig.isMetadataPacketsEnabled() ? flagWatcher.convert(watcher List<WrappedWatchableObject> list = DisguiseConfig.isMetadataPacketsEnabled() ? flagWatcher.convert(watcher
.getWatchableObjects()) : flagWatcher.getWatchableObjects(); .getWatchableObjects()) : flagWatcher.getWatchableObjects();
list = DisguiseUtilities.rebuildForVersion(player, flagWatcher, list);
for (WrappedWatchableObject watchableObject : list) { for (WrappedWatchableObject watchableObject : list) {
newWatcher.setObject(watchableObject.getIndex(), watchableObject.getValue()); newWatcher.setObject(watchableObject.getIndex(), watchableObject.getValue());
} }
@ -1247,6 +1248,7 @@ public class PacketsManager {
if (DisguiseConfig.isMetadataPacketsEnabled()) { if (DisguiseConfig.isMetadataPacketsEnabled()) {
List<WrappedWatchableObject> watchableObjects = disguise.getWatcher().convert( List<WrappedWatchableObject> watchableObjects = disguise.getWatcher().convert(
packets[0].getWatchableCollectionModifier().read(0)); packets[0].getWatchableCollectionModifier().read(0));
watchableObjects = DisguiseUtilities.rebuildForVersion(observer, disguise.getWatcher(), watchableObjects);
packets[0] = new PacketContainer(sentPacket.getType()); packets[0] = new PacketContainer(sentPacket.getType());
StructureModifier<Object> newMods = packets[0].getModifier(); StructureModifier<Object> newMods = packets[0].getModifier();
newMods.write(0, entity.getEntityId()); newMods.write(0, entity.getEntityId());
@ -1262,7 +1264,7 @@ public class PacketsManager {
|| sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB
|| sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY
|| sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_PAINTING) { || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_PAINTING) {
packets = constructSpawnPackets(disguise, entity); packets = constructSpawnPackets(observer, disguise, entity);
} }
// Else if the disguise is attempting to send players a forbidden packet // Else if the disguise is attempting to send players a forbidden packet
@ -1349,6 +1351,7 @@ public class PacketsManager {
} }
} }
} }
list = DisguiseUtilities.rebuildForVersion(observer, disguise.getWatcher(), list);
// Construct the packets to return // Construct the packets to return
PacketContainer packetBlock = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); PacketContainer packetBlock = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA);
packetBlock.getModifier().write(0, entity.getEntityId()); packetBlock.getModifier().write(0, entity.getEntityId());

View File

@ -29,7 +29,7 @@ import com.comphenix.protocol.wrappers.WrappedGameProfile;
public class ReflectionManager { public class ReflectionManager {
public enum LibVersion { public enum LibVersion {
V1_6, V1_7, V1_7_6; V1_6, V1_7, V1_7_6, V1_8;
private static LibVersion currentVersion = LibVersion.V1_7; private static LibVersion currentVersion = LibVersion.V1_7;
static { static {
String mcVersion = Bukkit.getVersion().split("MC: ")[1].replace(")", ""); String mcVersion = Bukkit.getVersion().split("MC: ")[1].replace(")", "");
@ -37,7 +37,8 @@ public class ReflectionManager {
if (mcVersion.compareTo("1.7") < 0) { if (mcVersion.compareTo("1.7") < 0) {
currentVersion = LibVersion.V1_6; currentVersion = LibVersion.V1_6;
} else { } else {
currentVersion = mcVersion.compareTo("1.7.6") < 0 && !mcVersion.equals("1.7.10") ? LibVersion.V1_7 : LibVersion.V1_7_6; currentVersion = mcVersion.compareTo("1.7.6") < 0 && !mcVersion.equals("1.7.10") ? LibVersion.V1_7
: LibVersion.V1_7_6;
} }
} }
} }
@ -541,6 +542,19 @@ public class ReflectionManager {
return null; return null;
} }
public static boolean is1_8(Player player) {
try {
Object cPlayer = getNmsEntity(player);
Field playerConnection = cPlayer.getClass().getField("playerConnection");
Field networkManager = getNmsClass("PlayerConnection").getField("networkManager");
Method getVersion = getNmsClass("NetworkManager").getMethod("getVersion");
return (Integer) getVersion.invoke(networkManager.get(playerConnection.get(cPlayer))) >= 28;
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
public static boolean isForge() { public static boolean isForge() {
return isForge; return isForge;
} }