12
0
Fork 0
SteamWarBungeeTeamserver/src/de/steamwar/listener/TestListener.java

87 Zeilen
3.7 KiB
Java

package de.steamwar.listener;
import io.netty.buffer.ByteBuf;
import net.md_5.bungee.api.connection.PendingConnection;
import net.md_5.bungee.api.event.PreLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.connection.InitialHandler;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.protocol.Protocol;
import net.md_5.bungee.protocol.ProtocolConstants;
import net.md_5.bungee.protocol.packet.Handshake;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.function.Supplier;
public class TestListener implements Listener {
private Field handShakeField;
private static class SteamwarHandshake extends Handshake {
public void read(ByteBuf buf) {
System.out.println("read");
setProtocolVersion(readVarInt(buf));
setHost(readString(buf));
setPort(buf.readUnsignedShort());
setRequestedProtocol(readVarInt(buf));
}
}
{
try {
Method mapMethod = Protocol.class.getDeclaredMethod("map", int.class, int.class);
mapMethod.setAccessible(true);
Object protocolMapping = mapMethod.invoke(null, ProtocolConstants.MINECRAFT_1_8, 0x00);
Class<?> directionDataClazz = Class.forName("net.md_5.bungee.protocol.Protocol$DirectionData");
Class<?> protocolMappingClazz = Class.forName("net.md_5.bungee.protocol.Protocol$ProtocolMapping");
Field field = Protocol.class.getDeclaredField("TO_SERVER");
field.setAccessible(true);
Object o = field.get(Protocol.HANDSHAKE);
Method method = Arrays.stream(directionDataClazz.getDeclaredMethods())
.filter(m -> m.getName().equals("registerPacket"))
.filter(m -> m.getParameterCount() == 3)
.filter(m -> m.getParameterTypes()[0] == Class.class)
.filter(m -> m.getParameterTypes()[1] == Supplier.class)
.filter(m -> m.getParameterTypes()[2].isArray())
.findFirst()
.orElseThrow(() -> new RuntimeException("Could not find registerPacket method"));
method.setAccessible(true);
Object protocolMappingArray = Array.newInstance(protocolMappingClazz, 1);
Array.set(protocolMappingArray, 0, protocolMapping);
method.invoke(o, Handshake.class, new Supplier<Handshake>() {
@Override
public Handshake get() {
return new SteamwarHandshake();
}
}, protocolMappingArray);
handShakeField = InitialHandler.class.getDeclaredField("handshake");
handShakeField.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
@EventHandler
public void preLoginEvent(PreLoginEvent preLoginEvent) {
PendingConnection pendingConnection = preLoginEvent.getConnection();
System.out.println("PreLoginEvent " + preLoginEvent);
String address = preLoginEvent.getConnection().getSocketAddress().toString();
if (address.startsWith("/78.31.71.136:")) {
SteamwarHandshake handshake;
try {
handshake = (SteamwarHandshake) handShakeField.get(pendingConnection);
} catch (IllegalAccessException e) {
e.printStackTrace();
return;
}
System.out.println(Arrays.toString(handshake.getHost().split("\0")));
// 0: host, 1: address, 2: uuid, (3): mojangProfile (properties, so skin data)
preLoginEvent.getConnection().setOnlineMode(false);
}
}
}