This commit is contained in:
adman
2026-01-12 17:33:26 +01:00
parent 08ddf8dc41
commit 11bf0624a4
16 changed files with 132 additions and 58 deletions
+5 -2
View File
@@ -9,8 +9,11 @@ import (
func Connect(addr string) (ret *proto.Conn, err error) {
ret = &proto.Conn{}
ret.Version = "1.21.8"
ret.State = proto_base.Handshaking
err = ret.SetVersion("1.21.8")
if err != nil {
return
}
ret.SetState(proto_base.Handshaking)
ret.CompressionThreshold = -1
ret.Actor = proto_base.Client
ret.Conn, err = net.Dial("tcp", addr)
+20
View File
@@ -0,0 +1,20 @@
package client
import (
"net"
"strings"
)
func LookupMinecraftSRV(host string, port uint16) (hostRet string, portRet uint16) {
if port != 25565 {
return
}
_, srvs, err := net.LookupSRV("minecraft", "tcp", host)
if err != nil || len(srvs) == 0 {
return
}
target := strings.TrimSuffix(srvs[0].Target, ".")
hostRet = target
portRet = srvs[0].Port
return
}
+2 -2
View File
@@ -28,7 +28,7 @@ func (c *ConfigIgnorer) OnFinish(_ v1_21_8.ConfigurationToClientPacketFinishConf
if err != nil {
return
}
c.State = proto_base.Play
c.SetState(proto_base.Play)
err = event.ErrHandlerDone
return
}
@@ -44,7 +44,7 @@ func (c *ConfigIgnorer) OnKeepAlive(packet *v1_21_8.ConfigurationToClientPacketK
}
func IgnoreConfig(c *proto.Conn) (err error) {
err = c.StartOne(&ConfigIgnorer{c})
err = c.Start(&ConfigIgnorer{c})
if err != nil {
err = errors.Join(err, errors.New("failed to ignore config"))
}
+23 -21
View File
@@ -16,13 +16,14 @@ import (
"github.com/admin-else/strom/proto"
"github.com/admin-else/strom/proto_base"
"github.com/admin-else/strom/data"
"github.com/admin-else/strom/proto_generated/v1_21_8"
)
type LoginClient struct {
*proto.Conn
Account *api.Account
Account *api.Account
ServerHost string
ServerPort uint16
GivenAccount *v1_21_8.LoginToClientPacketSuccess
}
@@ -37,29 +38,30 @@ func (s *LoginClient) OnCycle(_ event.Tick) (err error) {
}
func (s *LoginClient) OnStart(_ event.OnStart) (err error) {
host, portStr, err := net.SplitHostPort(s.RemoteAddr().String())
if err != nil {
return
}
versionData, err := data.LookUpProtocolVersionByName(s.Version)
if err != nil {
return
}
s.ProtocolVersion = int32(versionData.Version)
port, err := strconv.Atoi(portStr)
if err != nil {
return
if s.ServerHost == "" && s.ServerPort == 0 {
var portStr string
s.ServerHost, portStr, err = net.SplitHostPort(s.RemoteAddr().String())
if err != nil {
return
}
var portUint uint64
portUint, err = strconv.ParseUint(portStr, 10, 16)
if err != nil {
return
}
s.ServerPort = uint16(portUint)
}
err = s.Send(&v1_21_8.HandshakingToServerPacketSetProtocol{
ProtocolVersion: s.ProtocolVersion,
ServerHost: host,
ServerPort: uint16(port),
ServerHost: s.ServerHost,
ServerPort: s.ServerPort,
NextState: int32(proto_base.Login),
})
if err != nil {
return
}
s.State = proto_base.Login
s.SetState(proto_base.Login)
err = s.Send(&v1_21_8.LoginToServerPacketLoginStart{Username: s.Account.Name, PlayerUUID: s.Account.Uuid})
return
}
@@ -118,13 +120,13 @@ func (s *LoginClient) OnSuccess(success *v1_21_8.LoginToClientPacketSuccess) (er
if err != nil {
return
}
s.State = proto_base.Configuration
s.SetState(proto_base.Configuration)
err = event.ErrHandlerDone
return
}
func Login(c *proto.Conn, account *api.Account) (err error) {
err = c.StartOne(&LoginClient{
err = c.Start(&LoginClient{
Conn: c,
Account: account,
})
@@ -139,12 +141,12 @@ func ConnectAndLogin(connectTo string, account *api.Account) (c *proto.Conn, err
if err != nil {
return
}
err = c.StartOne(&LoginClient{
err = c.Start(&LoginClient{
Conn: c,
Account: account,
})
if err != nil {
err = errors.Join(err, errors.New("failed to login"))
err = errors.Join(errors.New("failed to login"), err)
}
return
}
+1 -1
View File
@@ -42,7 +42,7 @@ func (s *StatusClient) OnStart(_ event.OnStart) (err error) {
if err != nil {
return
}
s.State = proto_base.Status
s.SetState(proto_base.Status)
err = s.Send(&v1_21_8.StatusToServerPacketPingStart{})
return
}