minecraft-server icon indicating copy to clipboard operation
minecraft-server copied to clipboard

Crashes when connecting with MCProtocolLib

Open JakkuSakura opened this issue 5 years ago • 2 comments

https://github.com/Steveice10/MCProtocolLib/blob/1.15.2-1/example/com/github/steveice10/mc/protocol/test/MinecraftProtocolTest.java

panic: runtime error: index out of range [64] with length 64

goroutine 19 [running]:
github.com/golangmc/minecraft-server/impl/conn/crypto.(*cfb8).XORKeyStream(0xc0001428c0, 0xc001ba0000, 0x1d19f, 0x1d19f, 0xc001b82000, 0x1d19f, 0x1e000)
        /home/jack/Dev/minecraft-server/impl/conn/crypto/cfb8.go:66 +0x249
github.com/golangmc/minecraft-server/impl/conn.(*connection).Encrypt(...)
        /home/jack/Dev/minecraft-server/impl/conn/connect.go:64
github.com/golangmc/minecraft-server/impl/conn.(*connection).SendPacket(0xc000296150, 0x7bf040, 0xc000396010)
        /home/jack/Dev/minecraft-server/impl/conn/connect.go:172 +0x248
github.com/golangmc/minecraft-server/impl/game/mode.HandleState3.func5(0xc00010e1e0, 0xc000162400)
        /home/jack/Dev/minecraft-server/impl/game/mode/mode_state3.go:154 +0xeb
created by github.com/golangmc/minecraft-server/impl/game/mode.HandleState3
        /home/jack/Dev/minecraft-server/impl/game/mode/mode_state3.go:80 +0x20e

import com.github.steveice10.mc.auth.exception.request.RequestException;
import com.github.steveice10.mc.protocol.MinecraftConstants;
import com.github.steveice10.mc.protocol.MinecraftProtocol;
import com.github.steveice10.mc.protocol.data.SubProtocol;
import com.github.steveice10.mc.protocol.data.message.Message;
import com.github.steveice10.mc.protocol.data.message.TranslationMessage;
import com.github.steveice10.mc.protocol.data.status.ServerStatusInfo;
import com.github.steveice10.mc.protocol.data.status.handler.ServerInfoHandler;
import com.github.steveice10.mc.protocol.data.status.handler.ServerPingTimeHandler;
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientChatPacket;
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket;
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket;
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerChunkDataPacket;
import com.github.steveice10.packetlib.Client;
import com.github.steveice10.packetlib.ProxyInfo;
import com.github.steveice10.packetlib.Session;
import com.github.steveice10.packetlib.event.session.DisconnectedEvent;
import com.github.steveice10.packetlib.event.session.PacketReceivedEvent;
import com.github.steveice10.packetlib.event.session.SessionAdapter;
import com.github.steveice10.packetlib.tcp.TcpSessionFactory;

import java.net.Proxy;
import java.util.Arrays;

public class TestClient {
    private static final boolean SPAWN_SERVER = false;
    private static final boolean VERIFY_USERS = true;
    private static final String HOST = "127.0.0.1";
    private static final int PORT = 25565;
    private static final ProxyInfo PROXY = null;
    private static final Proxy AUTH_PROXY = Proxy.NO_PROXY;
    private static final String USERNAME = "********";
    private static final String PASSWORD = "********";

    public static void main(String[] args) {
        status();
        login();
    }

    private static void status() {
        MinecraftProtocol protocol = new MinecraftProtocol(SubProtocol.STATUS);
        Client client = new Client(HOST, PORT, protocol, new TcpSessionFactory(PROXY));
        client.getSession().setFlag(MinecraftConstants.AUTH_PROXY_KEY, AUTH_PROXY);
        client.getSession().setFlag(MinecraftConstants.SERVER_INFO_HANDLER_KEY, new ServerInfoHandler() {
            @Override
            public void handle(Session session, ServerStatusInfo info) {
                System.out.println("Version: " + info.getVersionInfo().getVersionName() + ", " + info.getVersionInfo().getProtocolVersion());
                System.out.println("Player Count: " + info.getPlayerInfo().getOnlinePlayers() + " / " + info.getPlayerInfo().getMaxPlayers());
                System.out.println("Players: " + Arrays.toString(info.getPlayerInfo().getPlayers()));
                System.out.println("Description: " + info.getDescription().getFullText());
                System.out.println("Icon: " + info.getIconPng());
            }
        });

        client.getSession().setFlag(MinecraftConstants.SERVER_PING_TIME_HANDLER_KEY, new ServerPingTimeHandler() {
            @Override
            public void handle(Session session, long pingTime) {
                System.out.println("Server ping took " + pingTime + "ms");
            }
        });

        client.getSession().connect();
        while(client.getSession().isConnected()) {
            try {
                Thread.sleep(5);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private static void login() {
        MinecraftProtocol protocol = null;
        if(VERIFY_USERS) {
            try {
                protocol = new MinecraftProtocol(USERNAME, PASSWORD);
                System.out.println("Successfully authenticated user.");
            } catch(RequestException e) {
                e.printStackTrace();
                return;
            }
        } else {
            protocol = new MinecraftProtocol(USERNAME);
        }

        Client client = new Client(HOST, PORT, protocol, new TcpSessionFactory(PROXY));
        client.getSession().setFlag(MinecraftConstants.AUTH_PROXY_KEY, AUTH_PROXY);
        client.getSession().addListener(new SessionAdapter() {
            @Override
            public void packetReceived(PacketReceivedEvent event) {
                if(event.getPacket() instanceof ServerJoinGamePacket) {
                    event.getSession().send(new ClientChatPacket("Hello, this is a test of MCProtocolLib."));
                } else if(event.getPacket() instanceof ServerChatPacket) {
                    Message message = event.<ServerChatPacket>getPacket().getMessage();
                    System.out.println("Received Message: " + message.getFullText());
                    if(message instanceof TranslationMessage) {
                        System.out.println("Received Translation Components: " + Arrays.toString(((TranslationMessage) message).getTranslationParams()));
                    }
//                    event.getSession().disconnect("Finished");
                } 
                else if (event.getPacket() instanceof ServerChunkDataPacket) {
// This increases probability of crashing
                    ServerChunkDataPacket data = event.getPacket();
                    System.out.println("Received message: " + data);
                }
            }

            @Override
            public void disconnected(DisconnectedEvent event) {
                System.out.println("Disconnected: " + Message.fromString(event.getReason()).getFullText());
                if(event.getCause() != null) {
                    event.getCause().printStackTrace();
                }
            }
        });

        client.getSession().connect();
    }
}

JakkuSakura avatar Oct 09 '20 02:10 JakkuSakura

Hey, can you tell me what is happening on your client to trigger this.

The line numbers don't correspond to what I have here, so I can't really pinpoint what's happening.

I do believe however that this is an issue of the chat packet.

Sxtanna avatar Oct 09 '20 03:10 Sxtanna

I'm trying to print out packets between the server and client to fix a bug(players cannot move after spawn) of my server. (Would you like to help me with this?) Indeed, after removing the chat packet, it works. Hasn't it been supported?

PS: I have fixed my bug

JakkuSakura avatar Oct 09 '20 03:10 JakkuSakura