PacketHandler.java (4823B)
1 package me.night.nullvalkyrie.packets.handle; 2 3 import io.netty.channel.ChannelDuplexHandler; 4 import io.netty.channel.ChannelHandlerContext; 5 import io.netty.channel.ChannelPromise; 6 import me.night.nullvalkyrie.NullValkyrie; 7 import me.night.nullvalkyrie.entities.holograms.PerPlayerHologram; 8 import me.night.nullvalkyrie.entities.npcs.NPCManager; 9 import me.night.nullvalkyrie.events.custom.InteractHologramEvent; 10 import me.night.nullvalkyrie.events.custom.RightClickNPCEvent; 11 import me.night.nullvalkyrie.util.Util; 12 import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; 13 import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; 14 import net.minecraft.network.protocol.game.ServerboundInteractPacket; 15 import net.minecraft.network.syncher.EntityDataAccessor; 16 import net.minecraft.network.syncher.EntityDataSerializers; 17 import net.minecraft.network.syncher.SynchedEntityData; 18 import net.minecraft.server.level.ServerPlayer; 19 import org.bukkit.Bukkit; 20 import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; 21 import org.bukkit.entity.ArmorStand; 22 import org.bukkit.entity.Entity; 23 import org.bukkit.entity.EntityType; 24 import org.bukkit.entity.Player; 25 import org.bukkit.scheduler.BukkitRunnable; 26 27 import java.util.List; 28 import java.util.concurrent.ThreadLocalRandom; 29 30 public class PacketHandler extends ChannelDuplexHandler { 31 private final Player player; 32 33 public PacketHandler(Player player) { 34 this.player = player; 35 } 36 37 @Override 38 public void write(ChannelHandlerContext ctx, Object packet, ChannelPromise promise) throws Exception { 39 if (packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayOutEntityMetadat")) { 40 ClientboundSetEntityDataPacket pk = (ClientboundSetEntityDataPacket) packet; 41 int entityID = pk.getId(); 42 final Entity[] entity = {null}; 43 // get entity from id 44 new BukkitRunnable() { 45 @Override 46 public void run() { 47 for (Entity e : Bukkit.getWorld("world").getEntities()) { 48 if (e.getEntityId() == entityID && e.getType() == EntityType.PLAYER) { 49 entity[0] = e; 50 } 51 } 52 } 53 }.runTaskLater(NullValkyrie.getPlugin(NullValkyrie.class), 0); 54 if (entity[0] == null) return; 55 List<SynchedEntityData.DataItem<?>> list = pk.getUnpackedData(); 56 SynchedEntityData.DataItem<Float> value = (SynchedEntityData.DataItem<Float>) list.get(9); 57 System.out.println(value.getAccessor()); 58 float health = ThreadLocalRandom.current().nextInt(5, 20); 59 list.set(9, new SynchedEntityData.DataItem<>(new EntityDataAccessor<>(value.getAccessor().getId(), EntityDataSerializers.FLOAT), health)); 60 } 61 super.write(ctx, packet, promise); 62 } 63 64 @Override 65 public void channelRead(ChannelHandlerContext c, Object packet) throws Exception { 66 if (packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayInUseEntity")) { 67 ServerboundInteractPacket pk = (ServerboundInteractPacket) packet; 68 int entityID = (int) Util.getFieldValue(packet, "a"); 69 boolean sneak = (boolean) Util.getFieldValue(packet, "c"); 70 Bukkit.getScheduler().scheduleSyncDelayedTask(NullValkyrie.getPlugin(NullValkyrie.class), () -> { 71 net.minecraft.world.entity.decoration.ArmorStand[] stands = PerPlayerHologram.getHolograms().get(entityID); 72 if (stands == null) return; 73 Bukkit.getPluginManager().callEvent(new InteractHologramEvent(player, (ArmorStand) stands[stands.length - 1].getBukkitEntity())); 74 for (net.minecraft.world.entity.decoration.ArmorStand i : stands) { 75 ((CraftPlayer) player).getHandle().connection.send(new ClientboundRemoveEntitiesPacket(i.getId())); 76 } 77 }, 0); 78 Object data = Util.getFieldValue(pk, "b"); 79 if (data.toString().split("\\$")[1].charAt(0) == 'e') return; 80 try { 81 Object hand = Util.getFieldValue(data, "a"); 82 if (!hand.toString().equals("MAIN_HAND")) return; 83 ServerPlayer npc = NPCManager.getNPC(entityID); 84 if (npc == null) return; 85 //Right Click 86 if (npc.getBukkitEntity().getEntityId() == entityID && sneak) 87 Bukkit.getScheduler().scheduleSyncDelayedTask(NullValkyrie.getPlugin(NullValkyrie.class), () -> Bukkit.getPluginManager().callEvent(new RightClickNPCEvent(player, npc)), 0); 88 } catch (NoSuchFieldException x) { 89 //Left Click 90 } 91 } else { 92 super.channelRead(c, packet); 93 } 94 } 95 }