Initial commit
This commit is contained in:
3
src/bungee.yml
Normal file
3
src/bungee.yml
Normal file
@ -0,0 +1,3 @@
|
||||
name: SteamWarBungeeTeamserver
|
||||
version: '${version}'
|
||||
main: de.steamwar.SteamWarBungeeTeamserver
|
||||
20
src/de/steamwar/SteamWarBungeeTeamserver.java
Normal file
20
src/de/steamwar/SteamWarBungeeTeamserver.java
Normal file
@ -0,0 +1,20 @@
|
||||
package de.steamwar;
|
||||
|
||||
import de.steamwar.command.TestCommand;
|
||||
import de.steamwar.listener.TestListener;
|
||||
import net.md_5.bungee.api.plugin.Plugin;
|
||||
|
||||
public final class SteamWarBungeeTeamserver extends Plugin {
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
getProxy().getPluginManager().registerListener(this, new TestListener());
|
||||
getProxy().getPluginManager().registerCommand(this, new TestCommand());
|
||||
// Plugin startup logic
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
// Plugin shutdown logic
|
||||
}
|
||||
}
|
||||
23
src/de/steamwar/command/TestCommand.java
Normal file
23
src/de/steamwar/command/TestCommand.java
Normal file
@ -0,0 +1,23 @@
|
||||
package de.steamwar.command;
|
||||
|
||||
import net.md_5.bungee.BungeeServerInfo;
|
||||
import net.md_5.bungee.api.CommandSender;
|
||||
import net.md_5.bungee.api.config.ServerInfo;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
import net.md_5.bungee.api.plugin.Command;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
public class TestCommand extends Command {
|
||||
|
||||
public TestCommand() {
|
||||
super("test");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender commandSender, String[] strings) {
|
||||
ServerInfo serverInfo = new BungeeServerInfo("test", new InetSocketAddress("45.81.234.82", 25565), "test", false);
|
||||
ProxiedPlayer player = (ProxiedPlayer) commandSender;
|
||||
player.connect(serverInfo);
|
||||
}
|
||||
}
|
||||
86
src/de/steamwar/listener/TestListener.java
Normal file
86
src/de/steamwar/listener/TestListener.java
Normal file
@ -0,0 +1,86 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user