All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jnngl.packet.PacketSender Maven / Gradle / Ivy

There is a newer version: 0.10.2b
Show newest version
package com.jnngl.packet;

import org.bukkit.entity.Player;

import java.awt.image.BufferedImage;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class PacketSender {

    private Method sendPackage;
    private Field connection;

    public String pkg;

    protected Class resolveClass(String name, String p) {
        try {
            return Class.forName(pkg+"."+p+"."+name);
        } catch (ClassNotFoundException e) {
            try {
                return Class.forName(p+"."+name);
            } catch (ClassNotFoundException ex) {
                try {
                    return Class.forName(pkg+"."+name);
                } catch (ClassNotFoundException exc) {
                    try {
                        return Class.forName("net.minecraft."+p+"."+name);
                    } catch (ClassNotFoundException classNotFoundException) {
                        try {
                            return Class.forName("net.minecraft.server."+p+"."+name);
                        } catch (ClassNotFoundException i) {
                            return null;
                        }
                    }
                }
            }
        }
    }

    private String getPackages(String prefix) throws ReflectiveOperationException {
        for(Package p : Package.getPackages()) {
            if(p.getName().startsWith(prefix)) return p.getName();
        }
        throw new ReflectiveOperationException("Failed to enumerate package");
    }

    public PacketSender() throws ReflectiveOperationException {
        pkg = getPackages("net.minecraft.server");
        Class entityPlayer = resolveClass("EntityPlayer", "server.level");
        Class playerConnection = resolveClass("PlayerConnection", "server.network");
        Class packet = resolveClass("Packet", "network.protocol");
        try {
            sendPackage = playerConnection.getMethod("sendPacket", packet);
        } catch (Throwable e) {
            sendPackage = playerConnection.getMethod("a", packet);
        }
        for(Field field : entityPlayer.getDeclaredFields()) {
            if(field.getType().equals(playerConnection)) {
                connection = field;
                break;
            }
        }
    }

    public void sendPacket(Player player, Object packet) throws ReflectiveOperationException {
        Method getHandle = player.getClass().getDeclaredMethod("getHandle");
        getHandle.setAccessible(true);
        Object handle = getHandle.invoke(player);
        final Object connection = this.connection.get(handle);
        sendPackage.invoke(connection, packet);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy