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:
Source Code:
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");
}
}
}
