Catch errors and cancel, fix some disguises
This commit is contained in:
parent
d98333f0f1
commit
37395a1a6d
@ -15,6 +15,7 @@ import org.bukkit.Location;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.entity.Ambient;
|
import org.bukkit.entity.Ambient;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
@ -24,7 +25,9 @@ import org.bukkit.inventory.EntityEquipment;
|
|||||||
import org.bukkit.inventory.EquipmentSlot;
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.potion.PotionEffect;
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
import org.bukkit.util.EulerAngle;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.wrappers.BlockPosition;
|
||||||
import com.comphenix.protocol.wrappers.MinecraftKey;
|
import com.comphenix.protocol.wrappers.MinecraftKey;
|
||||||
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry;
|
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry;
|
||||||
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer;
|
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer;
|
||||||
@ -908,6 +911,58 @@ public class ReflectionManager
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Object convertInvalidItem(Object value)
|
||||||
|
{
|
||||||
|
if (value instanceof Optional)
|
||||||
|
{
|
||||||
|
Optional opt = (Optional) value;
|
||||||
|
|
||||||
|
if (!opt.isPresent())
|
||||||
|
return value;
|
||||||
|
|
||||||
|
Object val = opt.get();
|
||||||
|
|
||||||
|
if (val instanceof ItemStack)
|
||||||
|
{
|
||||||
|
return Optional.of(getNmsItem((ItemStack) val));
|
||||||
|
}
|
||||||
|
else if (val instanceof BlockPosition)
|
||||||
|
{
|
||||||
|
BlockPosition pos = (BlockPosition) val;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Optional.of(getNmsConstructor("BlockPosition", int.class, int.class, int.class).newInstance(pos.getX(),
|
||||||
|
pos.getY(), pos.getZ()));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (value instanceof EulerAngle)
|
||||||
|
{
|
||||||
|
EulerAngle angle = (EulerAngle) value;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return getNmsConstructor("Vector3f", float.class, float.class, float.class).newInstance((float) angle.getX(),
|
||||||
|
(float) angle.getY(), (float) angle.getZ());
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (value instanceof BlockFace)
|
||||||
|
{
|
||||||
|
return getEnumDirection(((BlockFace) value).ordinal());
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This creates a DataWatcherItem usable with WrappedWatchableObject
|
* This creates a DataWatcherItem usable with WrappedWatchableObject
|
||||||
*
|
*
|
||||||
@ -920,6 +975,8 @@ public class ReflectionManager
|
|||||||
if (value == null)
|
if (value == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
value = convertInvalidItem(value);
|
||||||
|
|
||||||
Serializer serializer;
|
Serializer serializer;
|
||||||
|
|
||||||
if (value instanceof Optional)
|
if (value instanceof Optional)
|
||||||
@ -933,6 +990,12 @@ public class ReflectionManager
|
|||||||
serializer = Registry.get(value.getClass());
|
serializer = Registry.get(value.getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (serializer == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Unable to find Serializer for " + value + "! Are you running the latest version of ProtocolLib?");
|
||||||
|
}
|
||||||
|
|
||||||
WrappedDataWatcherObject watcherObject = new WrappedDataWatcherObject(id, serializer);
|
WrappedDataWatcherObject watcherObject = new WrappedDataWatcherObject(id, serializer);
|
||||||
|
|
||||||
Constructor construct = getNmsConstructor("DataWatcher$Item", getNmsClass("DataWatcherObject"), Object.class);
|
Constructor construct = getNmsConstructor("DataWatcher$Item", getNmsClass("DataWatcherObject"), Object.class);
|
||||||
|
@ -51,7 +51,18 @@ public class PacketListenerMain extends PacketAdapter
|
|||||||
if (entity == observer)
|
if (entity == observer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PacketContainer[][] packets = PacketsManager.transformPacket(event.getPacket(), event.getPlayer(), entity);
|
PacketContainer[][] packets;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
packets = PacketsManager.transformPacket(event.getPacket(), event.getPlayer(), entity);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ex.printStackTrace();
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (packets == null)
|
if (packets == null)
|
||||||
{
|
{
|
||||||
|
@ -42,151 +42,159 @@ public class PacketListenerViewDisguises extends PacketAdapter
|
|||||||
if (event.isCancelled())
|
if (event.isCancelled())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
final Player observer = event.getPlayer();
|
try
|
||||||
|
|
||||||
if (observer.getName().contains("UNKNOWN[")) // If the player is temporary
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (event.getPacket().getIntegers().read(0) != observer.getEntityId())
|
|
||||||
{
|
{
|
||||||
return;
|
final Player observer = event.getPlayer();
|
||||||
}
|
|
||||||
|
|
||||||
if (!DisguiseAPI.isSelfDisguised(observer))
|
if (observer.getName().contains("UNKNOWN[")) // If the player is temporary
|
||||||
{
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Here I grab the packets to convert them to, So I can display them as if the disguise sent them.
|
if (event.getPacket().getIntegers().read(0) != observer.getEntityId())
|
||||||
PacketContainer[][] transformed = PacketsManager.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()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
for (PacketContainer packet : packets)
|
|
||||||
{
|
|
||||||
if (packet.getType() != Server.PLAYER_INFO)
|
|
||||||
{
|
{
|
||||||
if (packet.equals(event.getPacket()))
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!DisguiseAPI.isSelfDisguised(observer))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Here I grab the packets to convert them to, So I can display them as if the disguise sent them.
|
||||||
|
PacketContainer[][] transformed = PacketsManager.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()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
for (PacketContainer packet : packets)
|
||||||
|
{
|
||||||
|
if (packet.getType() != Server.PLAYER_INFO)
|
||||||
{
|
{
|
||||||
packet = packet.shallowClone();
|
if (packet.equals(event.getPacket()))
|
||||||
|
{
|
||||||
|
packet = packet.shallowClone();
|
||||||
|
}
|
||||||
|
|
||||||
|
packet.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId());
|
||||||
}
|
}
|
||||||
|
|
||||||
packet.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId());
|
try
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
|
|
||||||
}
|
|
||||||
catch (InvocationTargetException e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (delayedPackets != null && delayedPackets.length > 0)
|
|
||||||
{
|
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable()
|
|
||||||
{
|
|
||||||
public void run()
|
|
||||||
{
|
{
|
||||||
try
|
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
|
||||||
|
}
|
||||||
|
catch (InvocationTargetException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delayedPackets != null && delayedPackets.length > 0)
|
||||||
|
{
|
||||||
|
Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
{
|
{
|
||||||
for (PacketContainer packet : delayedPackets)
|
try
|
||||||
{
|
{
|
||||||
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
|
for (PacketContainer packet : delayedPackets)
|
||||||
|
{
|
||||||
|
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (InvocationTargetException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InvocationTargetException e)
|
}, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getPacketType() == Server.ENTITY_METADATA)
|
||||||
|
{
|
||||||
|
event.setPacket(event.getPacket().deepClone());
|
||||||
|
|
||||||
|
for (WrappedWatchableObject watch : event.getPacket().getWatchableCollectionModifier().read(0))
|
||||||
|
{
|
||||||
|
if (watch.getIndex() == 0)
|
||||||
{
|
{
|
||||||
e.printStackTrace();
|
byte b = (byte) watch.getValue();
|
||||||
|
|
||||||
|
byte a = (byte) (b | 1 << 5);
|
||||||
|
|
||||||
|
if ((b & 1 << 3) != 0)
|
||||||
|
a = (byte) (a | 1 << 3);
|
||||||
|
|
||||||
|
watch.setValue(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, 2);
|
}
|
||||||
}
|
else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN)
|
||||||
|
|
||||||
if (event.getPacketType() == Server.ENTITY_METADATA)
|
|
||||||
{
|
|
||||||
event.setPacket(event.getPacket().deepClone());
|
|
||||||
|
|
||||||
for (WrappedWatchableObject watch : event.getPacket().getWatchableCollectionModifier().read(0))
|
|
||||||
{
|
{
|
||||||
if (watch.getIndex() == 0)
|
event.setCancelled(true);
|
||||||
|
|
||||||
|
PacketContainer packet = new PacketContainer(Server.ENTITY_METADATA);
|
||||||
|
|
||||||
|
StructureModifier<Object> mods = packet.getModifier();
|
||||||
|
|
||||||
|
mods.write(0, observer.getEntityId());
|
||||||
|
|
||||||
|
List<WrappedWatchableObject> watchableList = new ArrayList<>();
|
||||||
|
Byte b = 1 << 5;
|
||||||
|
|
||||||
|
if (observer.isSprinting())
|
||||||
|
b = (byte) (b | 1 << 3);
|
||||||
|
|
||||||
|
WrappedWatchableObject watch = ReflectionManager.createWatchable(0, b);
|
||||||
|
|
||||||
|
watchableList.add(watch);
|
||||||
|
packet.getWatchableCollectionModifier().write(0, watchableList);
|
||||||
|
|
||||||
|
try
|
||||||
{
|
{
|
||||||
byte b = (byte) watch.getValue();
|
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet);
|
||||||
|
}
|
||||||
|
catch (InvocationTargetException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (event.getPacketType() == Server.ANIMATION)
|
||||||
|
{
|
||||||
|
if (event.getPacket().getIntegers().read(1) != 2)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (event.getPacketType() == Server.ATTACH_ENTITY || event.getPacketType() == Server.REL_ENTITY_MOVE
|
||||||
|
|| event.getPacketType() == Server.REL_ENTITY_MOVE_LOOK || event.getPacketType() == Server.ENTITY_LOOK
|
||||||
|
|| event.getPacketType() == Server.ENTITY_TELEPORT || event.getPacketType() == Server.ENTITY_HEAD_ROTATION
|
||||||
|
|| event.getPacketType() == Server.ENTITY_EFFECT || event.getPacketType() == Server.ENTITY_EQUIPMENT)
|
||||||
|
{
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
else if (event.getPacketType() == Server.ENTITY_STATUS)
|
||||||
|
{
|
||||||
|
Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer());
|
||||||
|
|
||||||
byte a = (byte) (b | 1 << 5);
|
if (disguise.isSelfDisguiseSoundsReplaced() && !disguise.getType().isPlayer()
|
||||||
|
&& event.getPacket().getBytes().read(0) == 2)
|
||||||
if ((b & 1 << 3) != 0)
|
{
|
||||||
a = (byte) (a | 1 << 3);
|
event.setCancelled(true);
|
||||||
|
|
||||||
watch.setValue(a);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
ex.printStackTrace();
|
||||||
PacketContainer packet = new PacketContainer(Server.ENTITY_METADATA);
|
|
||||||
|
|
||||||
StructureModifier<Object> mods = packet.getModifier();
|
|
||||||
|
|
||||||
mods.write(0, observer.getEntityId());
|
|
||||||
|
|
||||||
List<WrappedWatchableObject> watchableList = new ArrayList<>();
|
|
||||||
Byte b = 1 << 5;
|
|
||||||
|
|
||||||
if (observer.isSprinting())
|
|
||||||
b = (byte) (b | 1 << 3);
|
|
||||||
|
|
||||||
WrappedWatchableObject watch = ReflectionManager.createWatchable(0, b);
|
|
||||||
|
|
||||||
watchableList.add(watch);
|
|
||||||
packet.getWatchableCollectionModifier().write(0, watchableList);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet);
|
|
||||||
}
|
|
||||||
catch (InvocationTargetException e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (event.getPacketType() == Server.ANIMATION)
|
|
||||||
{
|
|
||||||
if (event.getPacket().getIntegers().read(1) != 2)
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (event.getPacketType() == Server.ATTACH_ENTITY || event.getPacketType() == Server.REL_ENTITY_MOVE
|
|
||||||
|| event.getPacketType() == Server.REL_ENTITY_MOVE_LOOK || event.getPacketType() == Server.ENTITY_LOOK
|
|
||||||
|| event.getPacketType() == Server.ENTITY_TELEPORT || event.getPacketType() == Server.ENTITY_HEAD_ROTATION
|
|
||||||
|| event.getPacketType() == Server.ENTITY_EFFECT || event.getPacketType() == Server.ENTITY_EQUIPMENT)
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
else if (event.getPacketType() == Server.ENTITY_STATUS)
|
|
||||||
{
|
|
||||||
Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer());
|
|
||||||
|
|
||||||
if (disguise.isSelfDisguiseSoundsReplaced() && !disguise.getType().isPlayer()
|
|
||||||
&& event.getPacket().getBytes().read(0) == 2)
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user