Add ugly delayed packets fix and fixed player disguises
This commit is contained in:
parent
d64648cfbf
commit
19689a2ed6
@ -970,8 +970,10 @@ public class DisguiseUtilities {
|
||||
/**
|
||||
* Method to send a packet to the self disguise, translate his entity ID to the fake id.
|
||||
*/
|
||||
private static void sendSelfPacket(Player player, PacketContainer packet) {
|
||||
PacketContainer[] packets = PacketsManager.transformPacket(packet, player, player);
|
||||
private static void sendSelfPacket(final Player player, PacketContainer packet) {
|
||||
PacketContainer[][] transformed = PacketsManager.transformPacket(packet, player, player);
|
||||
PacketContainer[] packets = transformed == null ? null : transformed[0];
|
||||
final PacketContainer[] delayed = transformed == null ? null : transformed[1];
|
||||
try {
|
||||
if (packets == null) {
|
||||
packets = new PacketContainer[] { packet };
|
||||
@ -981,6 +983,19 @@ public class DisguiseUtilities {
|
||||
p.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId());
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false);
|
||||
}
|
||||
if (delayed != null && delayed.length > 0) {
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
for (PacketContainer packet : delayed) {
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false);
|
||||
}
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
@ -2,7 +2,6 @@ package me.libraryaddict.disguise.utilities;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
@ -116,7 +115,7 @@ public class PacketsManager {
|
||||
/**
|
||||
* Construct the packets I need to spawn in the disguise
|
||||
*/
|
||||
public static PacketContainer[] constructSpawnPackets(Player player, Disguise disguise, Entity disguisedEntity) {
|
||||
public static PacketContainer[][] constructSpawnPackets(final Player player, Disguise disguise, Entity disguisedEntity) {
|
||||
if (disguise.getEntity() == null)
|
||||
disguise.setEntity(disguisedEntity);
|
||||
Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity);
|
||||
@ -169,6 +168,7 @@ public class PacketsManager {
|
||||
}
|
||||
}
|
||||
PacketContainer[] spawnPackets = new PacketContainer[2 + packets.size()];
|
||||
PacketContainer[] delayedPackets = new PacketContainer[0];
|
||||
for (int i = 0; i < packets.size(); i++) {
|
||||
spawnPackets[i + 2] = packets.get(i);
|
||||
}
|
||||
@ -215,12 +215,12 @@ public class PacketsManager {
|
||||
|
||||
spawnPackets[0] = new PacketContainer(PacketType.Play.Server.NAMED_ENTITY_SPAWN);
|
||||
StructureModifier<String> stringMods = spawnPackets[0].getStrings();
|
||||
WrappedGameProfile gameProfile = null; // TODO Will this throw a error for older MC's? Namely pre-1.7
|
||||
if (stringMods.size() > 0) {
|
||||
for (int i = 0; i < stringMods.size(); i++) {
|
||||
stringMods.write(i, ((PlayerDisguise) disguise).getName());
|
||||
}
|
||||
} else {
|
||||
WrappedGameProfile gameProfile;
|
||||
PlayerDisguise playerDisguise = (PlayerDisguise) disguise;
|
||||
String name = playerDisguise.getSkin() != null ? playerDisguise.getSkin() : playerDisguise.getName();
|
||||
boolean removeName = false;
|
||||
@ -251,8 +251,7 @@ public class PacketsManager {
|
||||
spawnPackets[0].getDataWatcherModifier().write(0,
|
||||
createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher()));
|
||||
|
||||
if (((PlayerWatcher) disguise.getWatcher()).isSleeping() && DisguiseConfig.isBedPacketsEnabled()) {
|
||||
spawnPackets = Arrays.copyOf(spawnPackets, spawnPackets.length);
|
||||
if (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) {
|
||||
PacketContainer[] bedPackets = DisguiseUtilities.getBedPackets(player,
|
||||
loc.clone().subtract(0, PacketsManager.getYModifier(disguisedEntity, disguise), 0), player.getLocation(),
|
||||
((PlayerDisguise) disguise));
|
||||
@ -261,6 +260,23 @@ public class PacketsManager {
|
||||
}
|
||||
}
|
||||
|
||||
if (ReflectionManager.is1_8(player)) {
|
||||
ArrayList<PacketContainer> newPackets = new ArrayList<PacketContainer>();
|
||||
newPackets.add(null);
|
||||
for (int i = 0; i < spawnPackets.length; i++) {
|
||||
if (spawnPackets[i] != null) {
|
||||
newPackets.add(spawnPackets[i]);
|
||||
}
|
||||
}
|
||||
spawnPackets = newPackets.toArray(new PacketContainer[newPackets.size()]);
|
||||
spawnPackets[0] = new PacketContainer(PacketType.Play.Server.PLAYER_INFO);
|
||||
spawnPackets[0].getGameProfiles().write(0, gameProfile);
|
||||
spawnPackets[0].getModifier().write(4, gameProfile.getName());
|
||||
PacketContainer delayedPacket = spawnPackets[0].shallowClone();
|
||||
delayedPacket.getModifier().write(0, 4);
|
||||
delayedPackets = new PacketContainer[] { delayedPacket };
|
||||
}
|
||||
|
||||
} else if (disguise.getType().isMob()) {
|
||||
|
||||
DisguiseValues values = DisguiseValues.getDisguiseValues(disguise.getType());
|
||||
@ -329,7 +345,7 @@ public class PacketsManager {
|
||||
mods.write(0, disguisedEntity.getEntityId());
|
||||
mods.write(1, yaw);
|
||||
}
|
||||
return spawnPackets;
|
||||
return new PacketContainer[][] { spawnPackets, delayedPackets };
|
||||
}
|
||||
|
||||
/**
|
||||
@ -749,7 +765,9 @@ public class PacketsManager {
|
||||
if (event.getPacket().getIntegers().read(0) == observer.getEntityId()) {
|
||||
if (DisguiseAPI.isSelfDisguised(observer)) {
|
||||
// Here I grab the packets to convert them to, So I can display them as if the disguise sent them.
|
||||
PacketContainer[] packets = transformPacket(event.getPacket(), observer, observer);
|
||||
PacketContainer[][] transformed = transformPacket(event.getPacket(), observer, observer);
|
||||
PacketContainer[] packets = transformed == null ? null : transformed[0];
|
||||
final PacketContainer[] delayedPackets = transformed == null ? null : transformed[1];
|
||||
if (packets == null) {
|
||||
packets = new PacketContainer[] { event.getPacket() };
|
||||
}
|
||||
@ -764,6 +782,19 @@ public class PacketsManager {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (delayedPackets != null && delayedPackets.length > 0) {
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
for (PacketContainer packet : delayedPackets) {
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
|
||||
}
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
if (event.getPacketType() == PacketType.Play.Server.ENTITY_METADATA) {
|
||||
event.setPacket(event.getPacket().deepClone());
|
||||
for (WrappedWatchableObject watch : event.getPacket().getWatchableCollectionModifier().read(0)) {
|
||||
@ -1163,13 +1194,27 @@ public class PacketsManager {
|
||||
// Prevents problems and there is no advantage to be gained.
|
||||
if (entity == observer)
|
||||
return;
|
||||
PacketContainer[] packets = transformPacket(event.getPacket(), event.getPlayer(), entity);
|
||||
PacketContainer[][] packets = transformPacket(event.getPacket(), event.getPlayer(), entity);
|
||||
if (packets != null) {
|
||||
event.setCancelled(true);
|
||||
try {
|
||||
for (PacketContainer packet : packets) {
|
||||
for (PacketContainer packet : packets[0]) {
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
|
||||
}
|
||||
final PacketContainer[] delayed = packets[1];
|
||||
if (delayed.length > 0) {
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
for (PacketContainer packet : delayed) {
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
|
||||
}
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}, 2);
|
||||
}
|
||||
} catch (InvocationTargetException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
@ -1210,8 +1255,9 @@ public class PacketsManager {
|
||||
* Transform the packet magically into the one I have always dreamed off. My true luv!!! This will return null if its not
|
||||
* transformed
|
||||
*/
|
||||
public static PacketContainer[] transformPacket(PacketContainer sentPacket, Player observer, Entity entity) {
|
||||
public static PacketContainer[][] transformPacket(PacketContainer sentPacket, Player observer, Entity entity) {
|
||||
PacketContainer[] packets = null;
|
||||
PacketContainer[] delayedPackets = new PacketContainer[0];
|
||||
try {
|
||||
Disguise disguise = DisguiseAPI.getDisguise(observer, entity);
|
||||
// If disguised.
|
||||
@ -1274,7 +1320,9 @@ public class PacketsManager {
|
||||
|| sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB
|
||||
|| sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY
|
||||
|| sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_PAINTING) {
|
||||
packets = constructSpawnPackets(observer, disguise, entity);
|
||||
PacketContainer[][] spawnPackets = constructSpawnPackets(observer, disguise, entity);
|
||||
packets = spawnPackets[0];
|
||||
delayedPackets = spawnPackets[1];
|
||||
}
|
||||
|
||||
// Else if the disguise is attempting to send players a forbidden packet
|
||||
@ -1418,6 +1466,6 @@ public class PacketsManager {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return packets;
|
||||
return packets == null ? null : new PacketContainer[][] { packets, delayedPackets };
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user