add configuration support for /server packet

This commit is contained in:
Tnze
2023-11-19 11:25:17 +08:00
parent a5e6acea73
commit 54ffcb2bad
12 changed files with 72 additions and 2668 deletions

39
server/configuration.go Normal file
View File

@ -0,0 +1,39 @@
package server
import (
"github.com/Tnze/go-mc/chat"
"github.com/Tnze/go-mc/data/packetid"
"github.com/Tnze/go-mc/net"
pk "github.com/Tnze/go-mc/net/packet"
"github.com/Tnze/go-mc/registry"
)
type ConfigHandler interface {
AcceptConfig(conn *net.Conn) error
}
type Configurations struct {
Registries registry.NetworkCodec
}
func (c *Configurations) AcceptConfig(conn *net.Conn) error {
err := conn.WritePacket(pk.Marshal(
packetid.ClientboundConfigRegistryData,
pk.NBT(c.Registries),
))
if err != nil {
return err
}
err = conn.WritePacket(pk.Marshal(
packetid.ClientboundConfigFinishConfiguration,
))
return err
}
type ConfigFailErr struct {
reason chat.Message
}
func (c ConfigFailErr) Error() string {
return "config error: " + c.reason.ClearString()
}

View File

@ -157,6 +157,15 @@ func (d *MojangLoginHandler) AcceptLogin(conn *net.Conn, protocol int32) (name s
pk.String(name),
pk.Array(properties),
))
if err != nil {
return
}
// receive login ack
err = conn.ReadPacket(&p)
if err == nil && packetid.ServerboundPacketID(p.ID) != packetid.ServerboundLoginAcknowledged {
err = wrongPacketErr{expect: int32(packetid.ServerboundLoginAcknowledged), get: p.ID}
}
return
}

View File

@ -38,14 +38,15 @@ import (
)
const (
ProtocolName = "1.19.4"
ProtocolVersion = 762
ProtocolName = "1.20.2"
ProtocolVersion = 764
)
type Server struct {
*log.Logger
ListPingHandler
LoginHandler
ConfigHandler
GamePlay
}
@ -89,6 +90,20 @@ func (s *Server) AcceptConn(conn *net.Conn) {
}
return
}
s.AcceptConfig(conn)
if err != nil {
var configErr ConfigFailErr
if errors.As(err, &configErr) {
_ = conn.WritePacket(pk.Marshal(
packetid.ClientboundConfigDisconnect,
configErr.reason,
))
}
if s.Logger != nil {
s.Logger.Printf("client %v config error: %v", conn.Socket.RemoteAddr(), err)
}
return
}
s.AcceptPlayer(name, id, profilePubKey, properties, protocol, conn)
}
}