[Library] Packet Listening Library

Status
This thread has been locked.

kampai

Feedback score
8
Posts
361
Reactions
187
Resources
0
I was going to use this for another server but I'm just going to integrate packet listening through the spigot so I'm releasing this

Usage:

Code:
    PacketLibrary.addListener(new PacketListener<PacketPlayOutEntityLook>() {

            @Override
            public boolean readPacket(PacketPlayOutEntityLook packet) {
                System.out.println("Yeah he looked.");
                return true;
            }
        
        }, PacketPlayOutEntityLook.class);

Source Code:

Code:
package com.patrone.dev.practice.backend;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Player;

import com.google.common.collect.Sets;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import net.minecraft.server.NetworkManager;
import net.minecraft.server.Packet;


/*
 * AUTHOR: kammy
 * This class should only be used for xxx<<
 */

public class PacketLibrary {
    private static Map<Class, Set<PacketListener>> listeners = new HashMap<>();

    public static abstract class PacketListener<T extends Packet> {
        public abstract boolean readPacket(T packet);
    }
   
    public static PacketListener addListener(PacketListener r, Class packet) {
        if(listeners.containsKey(packet)) {
            Set<PacketListener> events = listeners.get(packet);
            events.add(r);
            listeners.put(packet, events);
            return r;
        }
       
        listeners.put(packet, Sets.newHashSet(r));
        return r;
    }
   
    private Player player;
   
    public PacketLibrary(Player player) {
        this.player = player;
        this.inject();
    }
   
    public void inject() {
        CraftPlayer cp = (CraftPlayer) player;
        NetworkManager network = cp.getHandle().playerConnection.networkManager;
        Channel channel = network.channel;
       
        channel.pipeline().addAfter("decoder", "patrone", new MessageToMessageDecoder() {

            private boolean readPacket(Object object) {

                Packet packet = (Packet) object;
               
                for(Entry<Class, Set<PacketListener>> listener : listeners.entrySet()) {
                    if (packet.getClass().equals(listener.getKey())) {
                       
                        for(PacketListener event : listener.getValue()) {
                            if(!event.readPacket(packet)) {
                                return false;
                            }
                        }
                       
                    }
                }
               
                return true;
            }

            protected void decode(ChannelHandlerContext c, Object packet, List list) throws Exception {
                list.add(packet);

                if (!readPacket(packet)) {
                    list.remove(packet);
                    c.flush();
                }

            }

        });
       
    }  
   
    public void deinject() {
        CraftPlayer cp = (CraftPlayer) player;
        NetworkManager network = cp.getHandle().playerConnection.networkManager;
        Channel channel = network.channel;
        if(channel.pipeline().get("patrone") != null) {
            channel.pipeline().remove("patrone");
        }
    }
}
 
PebbleHost
High performance, consistent uptime and fast support. Minecraft hosting that just works.
Status
This thread has been locked.
Top