From 0ea945d84ef519b0676793d60eb4d8b47c788e7c Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Tue, 24 Jan 2023 11:50:01 -0500 Subject: 1.7.0 rc2 (1.19.3 datawater fix) --- .../tylermurphy/hideAndSeek/game/Disguiser.java | 1 + .../tylermurphy/hideAndSeek/game/EntityHider.java | 6 +- .../tylermurphy/hideAndSeek/game/events/Glow.java | 24 +++----- .../hideAndSeek/util/packet/AbstractPacket.java | 4 +- .../util/packet/EntityMetadataPacket.java | 70 ++++++++++++++++++++++ 5 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java (limited to 'src/main/java') diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java index 5fce7d3..351ba10 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java @@ -17,6 +17,7 @@ public class Disguiser { public Disguiser(){ this.disguises = new HashMap<>(); + } public Disguise getDisguise(Player player){ diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java index 8274655..3892f6f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java @@ -235,11 +235,7 @@ public class EntityHider implements Listener { destroyEntity.getIntegerArrays().write(0, new int[]{entity.getEntityId()}); } catch (Exception e){ return false; } // Make the entity disappear - try { - manager.sendServerPacket(observer, destroyEntity); - } catch (InvocationTargetException e) { - throw new RuntimeException("Cannot send server packet.", e); - } + manager.sendServerPacket(observer, destroyEntity); } return visibleBefore; } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java index 8631ef5..dec23d7 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java @@ -6,6 +6,7 @@ import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.WrappedDataWatcher; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.util.packet.EntityMetadataPacket; import org.bukkit.entity.Player; import java.lang.reflect.InvocationTargetException; @@ -64,22 +65,13 @@ public class Glow { } public void setGlow(Player player, Player target, boolean glowing) { - PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_METADATA); - packet.getIntegers().write(0, target.getEntityId()); - WrappedDataWatcher watcher = new WrappedDataWatcher(); - WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Byte.class); - watcher.setEntity(target); - if (glowing) { - watcher.setObject(0, serializer, (byte) (0x40)); - } else { - watcher.setObject(0, serializer, (byte) (0x0)); - } - packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects()); - try { - protocolManager.sendServerPacket(player, packet); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } + + EntityMetadataPacket packet = new EntityMetadataPacket(); + packet.setEntity(target); + packet.setGlow(glowing); + packet.writeMetadata(); + packet.send(player); + } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java index 9293beb..4e3fc3b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java @@ -23,9 +23,7 @@ public class AbstractPacket { } public void send(Player player){ - try { - protocolManager.sendServerPacket(player, packet); - } catch (InvocationTargetException ignored) {} + protocolManager.sendServerPacket(player, packet); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java new file mode 100644 index 0000000..d77a227 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java @@ -0,0 +1,70 @@ +package net.tylermurphy.hideAndSeek.util.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.wrappers.WrappedDataValue; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.comphenix.protocol.wrappers.WrappedWatchableObject; +import org.bukkit.entity.Entity; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class EntityMetadataPacket extends AbstractPacket { + + private final WrappedDataWatcher watcher; + private final WrappedDataWatcher.Serializer serializer; + + public EntityMetadataPacket(){ + super(PacketType.Play.Server.ENTITY_METADATA); + watcher = new WrappedDataWatcher(); + serializer = WrappedDataWatcher.Registry.get(Byte.class); + } + + public void setEntity(@NotNull Entity target){ + super.packet.getIntegers().write(0, target.getEntityId()); + watcher.setEntity(target); + } + + public void setGlow(boolean glowing){ + if (glowing) { + watcher.setObject(0, serializer, (byte) (0x40)); + } else { + watcher.setObject(0, serializer, (byte) (0x0)); + } + } + + public void writeMetadata() { + + // thank you to + // https://www.spigotmc.org/threads/unable-to-modify-entity-metadata-packet-using-protocollib-1-19-3.582442/ + + try { + // 1.19.3 And Up + Class.forName("com.comphenix.protocol.wrappers.WrappedDataValue"); + + final List wrappedDataValueList = new ArrayList<>(); + + for(final WrappedWatchableObject entry : watcher.getWatchableObjects()) { + if(entry == null) continue; + + final WrappedDataWatcher.WrappedDataWatcherObject watcherObject = entry.getWatcherObject(); + wrappedDataValueList.add( + new WrappedDataValue( + watcherObject.getIndex(), + watcherObject.getSerializer(), + entry.getRawValue() + ) + ); + } + + packet.getDataValueCollectionModifier().write(0, wrappedDataValueList); + + } catch (ClassCastException | ClassNotFoundException ignored) { + // 1.9 to 1.19.2 And Up + packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects()); + } + + } + +} \ No newline at end of file -- cgit v1.2.3-freya