strom: add 1.12.2 protocol support and legacy login/status handlers

- Add minecraft-data for 1.12.2 (protocol 340)
- Generate proto_generated/v1_12_2
- Add v1_12_2 legacy handlers to client.Login (OnDisconnect,
  OnCompress, OnSuccess) and client.Status (OnStatus, OnPong)
- Same pattern as v1_8: RegisterUntilLatest only registers
  upward, so legacy versions need explicit RegisterCritical handlers
This commit is contained in:
Admin Else
2026-08-04 22:01:06 +02:00
parent acb5fe8d90
commit 1e6ce06fb0
9 changed files with 17933 additions and 3 deletions
+29
View File
@@ -16,6 +16,7 @@ import (
"github.com/admin-else/strom/mc/proto_base"
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
"github.com/admin-else/strom/mc/proto_generated/v1_8"
"github.com/admin-else/strom/mc/proto_generated/v1_12_2"
"github.com/admin-else/strom/mc/proto_generated/v26_2"
"github.com/admin-else/strom/mc/text"
"github.com/google/uuid"
@@ -139,6 +140,31 @@ func (s *LoginClient) OnSuccessV1_8(success *v1_8.LoginToClientPacketSuccess) (e
return
}
func (s *LoginClient) OnDisconnectV1_12_2(packet *v1_12_2.LoginToClientPacketDisconnect) (err error) {
var reason text.Component
err = json.Unmarshal([]byte(packet.Reason), &reason)
if err != nil {
return
}
err = KickedDuringLoginErr{reason}
return
}
func (s *LoginClient) OnCompressV1_12_2(packet *v1_12_2.LoginToClientPacketCompress) (err error) {
s.SetCompressionThreshold(packet.Threshold)
return
}
func (s *LoginClient) OnSuccessV1_12_2(success *v1_12_2.LoginToClientPacketSuccess) (err error) {
s.GivenAccount = &v1_21_8.LoginToClientPacketSuccess{
Uuid: uuid.MustParse(success.Uuid),
Username: success.Username,
}
s.SetState(proto_base.Play)
err = event.HandlerDoneErr{}
return
}
func (s *LoginClient) OnSuccess(success *v1_21_8.LoginToClientPacketSuccess) (err error) {
s.GivenAccount = success
if s.ProtocolVersion >= 764 {
@@ -189,6 +215,9 @@ func LoginRawAddr(c *proto.Conn, account *api.Account, hostAddr string) (err err
lc.RegisterCritical(lc.OnCompressV1_8)
lc.RegisterCritical(lc.OnDisconnectV1_8)
lc.RegisterCritical(lc.OnSuccessV1_8)
lc.RegisterCritical(lc.OnCompressV1_12_2)
lc.RegisterCritical(lc.OnDisconnectV1_12_2)
lc.RegisterCritical(lc.OnSuccessV1_12_2)
var p proto_base.EncodeDecodeAble
if hostAddr != "" {
+20
View File
@@ -10,6 +10,7 @@ import (
"github.com/admin-else/strom/mc/proto_base"
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
"github.com/admin-else/strom/mc/proto_generated/v1_8"
"github.com/admin-else/strom/mc/proto_generated/v1_12_2"
"github.com/admin-else/strom/mc/server"
)
@@ -54,6 +55,23 @@ func (s *StatusClient) OnPongV1_8(p *v1_8.StatusToClientPacketPing) (err error)
return
}
func (s *StatusClient) OnStatusV1_12_2(p *v1_12_2.StatusToClientPacketServerInfo) (err error) {
s.Status = p.Response
s.PingSendTime = time.Now()
if s.DoPingRoundTripTime {
err = s.Send(&v1_21_8.StatusToServerPacketPing{Time: s.PingSendTime.UnixMilli()})
} else {
err = event.HandlerDoneErr{}
}
return
}
func (s *StatusClient) OnPongV1_12_2(p *v1_12_2.StatusToClientPacketPing) (err error) {
s.PingReceiveTime = time.Now()
err = event.HandlerDoneErr{}
return
}
// StatusRaw returns a StatusClient that is not connected to a server.
// So ignore the resource leak warning. And maybe attach a warn ignore comment.
// It does not resolve SRV records.
@@ -79,6 +97,8 @@ func StatusRawWithVersion(ctx context.Context, addr, version string) (s *StatusC
s.RegisterCriticalUntilLatest(s.OnPong)
s.RegisterCritical(s.OnStatusV1_8)
s.RegisterCritical(s.OnPongV1_8)
s.RegisterCritical(s.OnStatusV1_12_2)
s.RegisterCritical(s.OnPongV1_12_2)
p, err := MakeHandshakePacketAddr(s.Conn, proto_base.Status, addr)
if err != nil {
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,5 @@
{
"minecraftVersion": "1.12.2",
"version":340,
"majorVersion": "1.12"
}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -429,7 +429,7 @@ func GenerateVersions(versions []string) (err error) {
}
func main() {
err := GenerateVersions([]string{"1.8", "1.21.8", "1.21.9", "1.21.11", "26.1", "26.2"})
err := GenerateVersions([]string{"1.8", "1.12.2", "1.21.8", "1.21.9", "1.21.11", "26.1", "26.2"})
if err != nil {
panic(err)
}