Add a new method for converting the datawatchers to 1.8 new indexes
This commit is contained in:
parent
47366fec94
commit
e5eb16faac
@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user