Merge pull request #71 from dazoe/fix-handshake

refactor mcbot JoinServer to allow correct handshake packet
This commit is contained in:
Tnze
2020-07-26 07:45:08 +08:00
committed by GitHub

View File

@ -7,6 +7,7 @@ package bot
import ( import (
"fmt" "fmt"
"net" "net"
"strconv"
mcnet "github.com/Tnze/go-mc/net" mcnet "github.com/Tnze/go-mc/net"
pk "github.com/Tnze/go-mc/net/packet" pk "github.com/Tnze/go-mc/net/packet"
@ -17,34 +18,34 @@ const ProtocolVersion = 736
// JoinServer connect a Minecraft server for playing the game. // JoinServer connect a Minecraft server for playing the game.
func (c *Client) JoinServer(addr string, port int) (err error) { func (c *Client) JoinServer(addr string, port int) (err error) {
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", addr, port)) return c.JoinServerWithDialer(&net.Dialer{}, fmt.Sprintf("%s:%d", addr, port))
if err != nil {
err = fmt.Errorf("bot: connect server fail: %v", err)
return
}
return c.join(conn)
} }
// JoinServerWithDialer is similar to JoinServer but using a Dialer. // JoinServerWithDialer is similar to JoinServer but using a Dialer.
func (c *Client) JoinServerWithDialer(d Dialer, addr string) (err error) { func (c *Client) JoinServerWithDialer(d Dialer, addr string) (err error) {
return c.join(d, addr)
}
func (c *Client) join(d Dialer, addr string) (err error) {
conn, err := d.Dial("tcp", addr) conn, err := d.Dial("tcp", addr)
if err != nil { if err != nil {
err = fmt.Errorf("bot: connect server fail: %v", err) err = fmt.Errorf("bot: connect server fail: %v", err)
return return err
} }
return c.join(conn)
}
// JoinConn join a Minecraft server through a connection for playing the game.
func (c *Client) join(conn net.Conn) (err error) {
//Set Conn //Set Conn
c.conn = mcnet.WrapConn(conn) c.conn = mcnet.WrapConn(conn)
//Get Addr //Get Host and Port
strform := c.conn.Socket.RemoteAddr().String() host, portStr, err := net.SplitHostPort(addr)
var addr string if err != nil {
var port int err = fmt.Errorf("bot: connect server fail: %v", err)
fmt.Sscanf(strform, "%s:%d", &addr, &port) return err
}
port, err := strconv.Atoi(portStr)
if err != nil {
err = fmt.Errorf("bot: connect server fail: %v", err)
return err
}
//Handshake //Handshake
err = c.conn.WritePacket( err = c.conn.WritePacket(
@ -52,7 +53,7 @@ func (c *Client) join(conn net.Conn) (err error) {
pk.Marshal( pk.Marshal(
0x00, //Handshake packet ID 0x00, //Handshake packet ID
pk.VarInt(ProtocolVersion), //Protocol version pk.VarInt(ProtocolVersion), //Protocol version
pk.String(addr), //Server's address pk.String(host), //Server's address
pk.UnsignedShort(port), pk.UnsignedShort(port),
pk.Byte(2), pk.Byte(2),
)) ))