NullValkyrie

Minecraft 1.19 multipurpose plugin for spigot servers with a lot of features where most modern servers have.
git clone https://codeberg.org/night0721/NullValkyrie
Log | Files | Refs | README | LICENSE

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 }