Big changes

This commit is contained in:
Yapollon 2025-02-20 23:59:19 +01:00
parent 9ae2457416
commit e1de1c182e

113
main.go
View File

@ -56,6 +56,11 @@ type Reader struct {
cursor int cursor int
} }
type ClientState struct {
conn net.Conn
nextState int
}
func main() { func main() {
listener, err := net.Listen("tcp", "localhost:25565") listener, err := net.Listen("tcp", "localhost:25565")
if err != nil { if err != nil {
@ -73,62 +78,84 @@ func main() {
continue continue
} }
go handleConnection(conn) client := &ClientState{conn: conn, nextState: 0}
go handleConnection(client)
} }
} }
func handleConnection(conn net.Conn) { func handleConnection(client *ClientState) {
r := &Reader{data: make([]byte, 1024)} defer client.conn.Close()
fmt.Println("New connection from:", client.conn.RemoteAddr())
r := &Reader{data: make([]byte, 0)}
// Print the whole packet
buf := make([]byte, 1024) buf := make([]byte, 1024)
n, _ := conn.Read(buf)
r.data = buf[:n]
fmt.Println("Packet: ", r.data) for {
n, err := client.conn.Read(buf)
_, err := r.readVarInt()
if err != nil { if err != nil {
fmt.Println("Error reading first number:", err) fmt.Println("Error reading from connection or connection closed:", err)
return break
}
// Append new data to the reader buffer
r.data = append(r.data, buf[:n]...)
// Process packets as long as there is data
for len(r.data) > 0 {
startCursor := r.cursor
packetLength, err := r.readVarInt()
if err != nil {
r.cursor = startCursor // Reset if incomplete packet
break
}
if len(r.data[r.cursor:]) < packetLength {
r.cursor = startCursor // Reset if incomplete packet
break
} }
packetID, err := r.readVarInt() packetID, err := r.readVarInt()
if err != nil { if err != nil {
fmt.Println("Error reading packet ID:", err) fmt.Println("Error reading packet ID:", err)
return break
} }
fmt.Println("Packet ID: ", packetID) fmt.Println("Packet ID:", packetID)
switch packetID { if packetID == StatusRequestID && client.nextState == 1 {
case HandshakePacketID: handleStatusRequest(client.conn)
handleHandshake(r) } else {
default: if packetID == HandshakePacketID {
fmt.Println("Unknown packet ID:", packetID) handshake, err := handleHandshake(r)
if err != nil {
fmt.Println("Error processing handshake:", err)
return
}
client.nextState = handshake.NextState
}
}
// Remove processed data
r.data = r.data[r.cursor:]
r.cursor = 0
}
} }
} }
func handleHandshake(r *Reader) { func handleHandshake(r *Reader) (HandshakePacket, error) {
var handshake HandshakePacket var handshake HandshakePacket
if err := readHandshakePacket(r, &handshake); err != nil { if err := readHandshakePacket(r, &handshake); err != nil {
fmt.Println("Error reading handshake packet:", err) fmt.Println("Error reading handshake packet:", err)
return return handshake, err
} }
if handshake.NextState == 1 { return handshake, nil
handleStatusRequest(r)
}
} }
func handleStatusRequest(r *Reader) { func handleStatusRequest(conn net.Conn) {
packetID, err := r.readVarInt()
if err != nil {
fmt.Println("Error reading packet ID:", err)
return
}
if packetID == StatusRequestID {
status := StatusResponse{ status := StatusResponse{
Version: VersionInfo{ Version: VersionInfo{
Name: "1.17.1", Name: "1.17.1",
@ -166,6 +193,11 @@ func handleStatusRequest(r *Reader) {
fmt.Println("Error writing response:", err) fmt.Println("Error writing response:", err)
return return
} }
// Send response to client
_, err = conn.Write(w.data[:w.cursor])
if err != nil {
fmt.Println("Error sending response:", err)
} }
} }
@ -218,6 +250,20 @@ func (r *Reader) readString() (string, error) {
return str, nil return str, nil
} }
func (r *Reader) readUnsignedShort() (uint16, error) {
b1, err := r.readByte()
if err != nil {
return 0, err
}
b2, err := r.readByte()
if err != nil {
return 0, err
}
return uint16(b1)<<8 | uint16(b2), nil
}
type Writer struct { type Writer struct {
data []byte data []byte
cursor int cursor int
@ -304,11 +350,12 @@ func readHandshakePacket(r *Reader, packet *HandshakePacket) error {
return err return err
} }
port, err := r.readByte() port, err := r.readUnsignedShort()
if err != nil { if err != nil {
return err return err
} }
packet.ServerPort = uint16(port) packet.ServerPort = port
fmt.Println("Port: ", packet.ServerPort)
packet.NextState, err = r.readVarInt() packet.NextState, err = r.readVarInt()
fmt.Println("Next state: ", packet.NextState) fmt.Println("Next state: ", packet.NextState)