Read desc
Cleaned up the main packet listener. Fixed a problem with facing direction. Stupid me only accounted for living entitys. Forgot this problem extended to disguised non-living Added some commenting
This commit is contained in:
parent
957cf83e67
commit
b3f2fcaed2
@ -80,7 +80,7 @@ public class LibsDisguises extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void addPacketListeners() {
|
private void addPacketListeners() {
|
||||||
final ProtocolManager manager = ProtocolLibrary.getProtocolManager();
|
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
|
||||||
manager.addPacketListener(new PacketAdapter(this, ConnectionSide.SERVER_SIDE, ListenerPriority.HIGHEST,
|
manager.addPacketListener(new PacketAdapter(this, ConnectionSide.SERVER_SIDE, ListenerPriority.HIGHEST,
|
||||||
Packets.Server.NAMED_ENTITY_SPAWN, Packets.Server.ENTITY_METADATA, Packets.Server.ARM_ANIMATION,
|
Packets.Server.NAMED_ENTITY_SPAWN, Packets.Server.ENTITY_METADATA, Packets.Server.ARM_ANIMATION,
|
||||||
Packets.Server.REL_ENTITY_MOVE_LOOK, Packets.Server.ENTITY_LOOK, Packets.Server.ENTITY_TELEPORT,
|
Packets.Server.REL_ENTITY_MOVE_LOOK, Packets.Server.ENTITY_LOOK, Packets.Server.ENTITY_TELEPORT,
|
||||||
@ -89,110 +89,75 @@ public class LibsDisguises extends JavaPlugin {
|
|||||||
@Override
|
@Override
|
||||||
public void onPacketSending(PacketEvent event) {
|
public void onPacketSending(PacketEvent event) {
|
||||||
try {
|
try {
|
||||||
final Player observer = event.getPlayer();
|
Player observer = event.getPlayer();
|
||||||
|
// First get the entity, the one sending this packet
|
||||||
StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld());
|
StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld());
|
||||||
org.bukkit.entity.Entity entity = entityModifer.read((Packets.Server.COLLECT == event.getPacketID() ? 1 : 0));
|
org.bukkit.entity.Entity entity = entityModifer.read((Packets.Server.COLLECT == event.getPacketID() ? 1 : 0));
|
||||||
|
// If the entity is the same as the sender. Don't disguise!
|
||||||
|
// Prevents problems and there is no advantage to be gained.
|
||||||
if (entity == observer)
|
if (entity == observer)
|
||||||
return;
|
return;
|
||||||
if (DisguiseAPI.isDisguised(entity)) {
|
|
||||||
Disguise disguise = DisguiseAPI.getDisguise(entity);
|
Disguise disguise = DisguiseAPI.getDisguise(entity);
|
||||||
|
// If disguised.
|
||||||
|
if (disguise != null) {
|
||||||
|
// If packet is Packets.Server.UPDATE_ATTRIBUTES - For some reason maven doesn't let me..
|
||||||
|
// This packet sends attributes
|
||||||
if (event.getPacketID() == 44) {
|
if (event.getPacketID() == 44) {
|
||||||
if (disguise.getType().isMisc() && entity.getType().isAlive()) {
|
// Grab the values which are 'approved' to be sent for this entity
|
||||||
event.setCancelled(true);
|
|
||||||
} else {
|
|
||||||
HashMap<String, Double> values = Values.getAttributesValues(disguise.getType());
|
HashMap<String, Double> values = Values.getAttributesValues(disguise.getType());
|
||||||
Iterator<AttributeSnapshot> itel = ((List<AttributeSnapshot>) event.getPacket().getModifier()
|
|
||||||
.read(1)).iterator();
|
|
||||||
event.setPacket(new PacketContainer(event.getPacketID()));
|
|
||||||
Collection collection = new ArrayList<AttributeSnapshot>();
|
Collection collection = new ArrayList<AttributeSnapshot>();
|
||||||
while (itel.hasNext()) {
|
for (AttributeSnapshot att : (List<AttributeSnapshot>) event.getPacket().getModifier().read(1)) {
|
||||||
AttributeSnapshot att = itel.next();
|
|
||||||
if (values.containsKey(att.a())) {
|
if (values.containsKey(att.a())) {
|
||||||
collection.add(new AttributeSnapshot(null, att.a(), values.get(att.a()), att.c()));
|
collection.add(new AttributeSnapshot(null, att.a(), values.get(att.a()), att.c()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (collection.size() > 0) {
|
||||||
|
event.setPacket(new PacketContainer(event.getPacketID()));
|
||||||
StructureModifier<Object> mods = event.getPacket().getModifier();
|
StructureModifier<Object> mods = event.getPacket().getModifier();
|
||||||
mods.write(0, entity.getEntityId());
|
mods.write(0, entity.getEntityId());
|
||||||
mods.write(1, collection);
|
mods.write(1, collection);
|
||||||
|
} else {
|
||||||
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
} else if (event.getPacketID() == Packets.Server.ENTITY_METADATA) {
|
}
|
||||||
StructureModifier<Object> mods = event.getPacket().getModifier();
|
// Else if the packet is sending entity metadata
|
||||||
|
else if (event.getPacketID() == Packets.Server.ENTITY_METADATA) {
|
||||||
|
List<WatchableObject> watchableObjects = disguise.getWatcher().convert(
|
||||||
|
(List<WatchableObject>) event.getPacket().getModifier().read(1));
|
||||||
event.setPacket(new PacketContainer(event.getPacketID()));
|
event.setPacket(new PacketContainer(event.getPacketID()));
|
||||||
StructureModifier<Object> newMods = event.getPacket().getModifier();
|
StructureModifier<Object> newMods = event.getPacket().getModifier();
|
||||||
newMods.write(0, mods.read(0));
|
newMods.write(0, entity.getEntityId());
|
||||||
newMods.write(1, disguise.getWatcher().convert((List<WatchableObject>) mods.read(1)));
|
newMods.write(1, watchableObjects);
|
||||||
} else if (event.getPacketID() == Packets.Server.NAMED_ENTITY_SPAWN) {
|
|
||||||
if (disguise.getType().isPlayer()) {
|
|
||||||
StructureModifier<Object> mods = event.getPacket().getModifier();
|
|
||||||
String name = (String) mods.read(1);
|
|
||||||
if (!name.equals(((PlayerDisguise) disguise).getName())) {
|
|
||||||
final PacketContainer[] packets = constructPacket(disguise, entity);
|
|
||||||
event.setPacket(packets[0]);
|
|
||||||
if (packets.length > 1) {
|
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
manager.sendServerPacket(observer, packets[1]);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
// Else if the packet is spawning..
|
||||||
});
|
else if (event.getPacketID() == Packets.Server.NAMED_ENTITY_SPAWN
|
||||||
}
|
|| event.getPacketID() == Packets.Server.MOB_SPAWN
|
||||||
}
|
|
||||||
} else {
|
|
||||||
final PacketContainer[] packets = constructPacket(disguise, entity);
|
|
||||||
event.setPacket(packets[0]);
|
|
||||||
if (packets.length > 1) {
|
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
manager.sendServerPacket(observer, packets[1]);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (event.getPacketID() == Packets.Server.MOB_SPAWN
|
|
||||||
|| event.getPacketID() == Packets.Server.ADD_EXP_ORB
|
|| event.getPacketID() == Packets.Server.ADD_EXP_ORB
|
||||||
|| event.getPacketID() == Packets.Server.VEHICLE_SPAWN
|
|| event.getPacketID() == Packets.Server.VEHICLE_SPAWN
|
||||||
|| event.getPacketID() == Packets.Server.ENTITY_PAINTING) {
|
|| event.getPacketID() == Packets.Server.ENTITY_PAINTING) {
|
||||||
final PacketContainer[] packets = constructPacket(disguise, entity);
|
PacketContainer[] packets = constructPacket(disguise, entity);
|
||||||
event.setPacket(packets[0]);
|
event.setPacket(packets[0]);
|
||||||
if (packets.length > 1) {
|
if (packets.length > 1) {
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
|
sendDelayedPacket(packets[1], observer);
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
manager.sendServerPacket(observer, packets[1]);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
// Else if the disguise is attempting to send players a forbidden packet
|
||||||
}
|
else if (event.getPacketID() == Packets.Server.ARM_ANIMATION
|
||||||
} else if (event.getPacketID() == Packets.Server.ARM_ANIMATION
|
|
||||||
|| event.getPacketID() == Packets.Server.COLLECT) {
|
|| event.getPacketID() == Packets.Server.COLLECT) {
|
||||||
if (disguise.getType().isMisc()) {
|
if (disguise.getType().isMisc()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
} else if (Packets.Server.REL_ENTITY_MOVE_LOOK == event.getPacketID()
|
}
|
||||||
|
// Else if the disguise is moving.
|
||||||
|
else if (Packets.Server.REL_ENTITY_MOVE_LOOK == event.getPacketID()
|
||||||
|| Packets.Server.ENTITY_LOOK == event.getPacketID()
|
|| Packets.Server.ENTITY_LOOK == event.getPacketID()
|
||||||
|| Packets.Server.ENTITY_TELEPORT == event.getPacketID()) {
|
|| Packets.Server.ENTITY_TELEPORT == event.getPacketID()) {
|
||||||
event.setPacket(event.getPacket().deepClone());
|
// If the disguise needs its yaw value modified
|
||||||
|
if (disguise.getType() == DisguiseType.ENDER_DRAGON || disguise.getType().isMisc()) {
|
||||||
|
event.setPacket(event.getPacket().shallowClone());
|
||||||
StructureModifier<Object> mods = event.getPacket().getModifier();
|
StructureModifier<Object> mods = event.getPacket().getModifier();
|
||||||
if (disguise.getType() == DisguiseType.ENDER_DRAGON) {
|
|
||||||
byte value = (Byte) mods.read(4);
|
byte value = (Byte) mods.read(4);
|
||||||
mods.write(4, (byte) (value - 128));
|
mods.write(4, getYaw(DisguiseType.getType(entity.getType()), disguise.getType(), value));
|
||||||
} else if (disguise.getType().isMisc()) {
|
|
||||||
byte value = (Byte) mods.read(4);
|
|
||||||
if (disguise.getType() == DisguiseType.ITEM_FRAME || disguise.getType() == DisguiseType.ARROW) {
|
|
||||||
mods.write(4, (byte) -value);
|
|
||||||
} else if (disguise.getType() == DisguiseType.PAINTING) {
|
|
||||||
mods.write(4, (byte) -(value + 128));
|
|
||||||
} else if (disguise.getType().isMisc())
|
|
||||||
mods.write(4, (byte) (value - 64));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -201,6 +166,8 @@ public class LibsDisguises extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// Now add a client listener to cancel them interacting with uninteractable disguised entitys.
|
||||||
|
// You ain't supposed to be allowed to 'interact' with a item that cannot be clicked.
|
||||||
manager.addPacketListener(new PacketAdapter(this, ConnectionSide.CLIENT_SIDE, ListenerPriority.NORMAL,
|
manager.addPacketListener(new PacketAdapter(this, ConnectionSide.CLIENT_SIDE, ListenerPriority.NORMAL,
|
||||||
Packets.Client.USE_ENTITY) {
|
Packets.Client.USE_ENTITY) {
|
||||||
@Override
|
@Override
|
||||||
@ -220,6 +187,56 @@ public class LibsDisguises extends JavaPlugin {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private byte getYaw(DisguiseType entityType, DisguiseType disguiseType, int value) {
|
||||||
|
switch (disguiseType) {
|
||||||
|
case ENDER_DRAGON:
|
||||||
|
value -= 128;
|
||||||
|
break;
|
||||||
|
case ITEM_FRAME:
|
||||||
|
case ARROW:
|
||||||
|
value = -value;
|
||||||
|
break;
|
||||||
|
case PAINTING:
|
||||||
|
value = -(value + 128);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (disguiseType.isMisc()) {
|
||||||
|
value -= 64;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (entityType) {
|
||||||
|
case ENDER_DRAGON:
|
||||||
|
value += 128;
|
||||||
|
break;
|
||||||
|
case ITEM_FRAME:
|
||||||
|
case ARROW:
|
||||||
|
value = -value;
|
||||||
|
break;
|
||||||
|
case PAINTING:
|
||||||
|
value = -(value - 128);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (disguiseType.isMisc()) {
|
||||||
|
value += 64;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (byte) value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendDelayedPacket(final PacketContainer packet, final Player player) {
|
||||||
|
Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
protected PacketContainer[] constructPacket(Disguise disguise, Entity disguisedEntity) {
|
protected PacketContainer[] constructPacket(Disguise disguise, Entity disguisedEntity) {
|
||||||
PacketContainer[] spawnPackets = new PacketContainer[2];
|
PacketContainer[] spawnPackets = new PacketContainer[2];
|
||||||
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
|
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
|
||||||
|
Loading…
Reference in New Issue
Block a user