From 958102e43c4854249920e2707ca4d4a3af0354c5 Mon Sep 17 00:00:00 2001 From: Admin Else <74665496+admin-else@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:51:07 +0200 Subject: [PATCH] fixes for config in 1.21.11 --- client/client.go | 6 +--- data/registry/1.21.11.nbt | Bin 17889 -> 17939 bytes proto/connection.go | 18 ++++++++++-- proto/packet_lookup.go | 9 ++++++ proto/smart_convert.go | 8 ++++-- proto/smart_convert_test.go | 17 ++++++++++++ server/config_server.go | 43 ++++++++++++++++++++--------- server/server.go | 7 +---- tools/registry_data_hunter/main.go | 11 ++++++++ 9 files changed, 91 insertions(+), 28 deletions(-) diff --git a/client/client.go b/client/client.go index 16de82b..918d83e 100644 --- a/client/client.go +++ b/client/client.go @@ -3,7 +3,6 @@ package client import ( "net" - "github.com/admin-else/strom/event" "github.com/admin-else/strom/proto" "github.com/admin-else/strom/proto_base" ) @@ -27,11 +26,8 @@ func Connect(addr string) (ret *proto.Conn, err error) { // when using this function. // You must close the connection when you're done with it func ConnectVersionLess(addr string) (ret *proto.Conn, err error) { - ret = &proto.Conn{} - ret.SetState(proto_base.Handshaking) - ret.SetCompressionThreshold(-1) + ret = proto.NewConn() ret.Actor = proto_base.Client - ret.Loop = event.NewLoop() ret.Conn, err = net.Dial("tcp", addr) if err != nil { return diff --git a/data/registry/1.21.11.nbt b/data/registry/1.21.11.nbt index 5d257b026c6a3bd9a70c52ebed49d586f7ccf186..8ae435db6245c4174a7f0653523e401216910cc6 100644 GIT binary patch literal 17939 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 O0RR8_HS^Q@B>?~x<-7p^ literal 17889 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

ZZ#wX1wyt54H#^$YsEt=zN%epi2%;u;mq2-jr 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 Q2LJ&7|LPdiJhCML0G|6t=Kufz diff --git a/proto/connection.go b/proto/connection.go index b9f0d23..b3573e3 100644 --- a/proto/connection.go +++ b/proto/connection.go @@ -37,6 +37,7 @@ var ( type LoginTick struct{} var LatestVersion = proto_generated.SupportedVersions[len(proto_generated.SupportedVersions)-1] +var EarliestVersion = proto_generated.SupportedVersions[len(proto_generated.SupportedVersions)-1] // UnCodablePacket represents a packet that could not be decoded. type UnCodablePacket struct { @@ -230,7 +231,8 @@ func (c *Conn) Receive() (packet proto_base.EncodeDecodeAble, err error) { packet = reflect.New(reflect.TypeOf(i.Type).Elem()).Interface().(proto_base.EncodeDecodeAble) debugPrint := slog.Default().Enabled(context.Background(), slog.LevelDebug) && slices.ContainsFunc(c.DebugPrintPackets, func(s string) bool { return strings.Contains(i.Name, s) }) - if !c.IsTypeRegistered(reflect.TypeOf(packet)) && !debugPrint { + isListenerRegistered := c.IsTypeRegistered(reflect.TypeOf(packet)) + if !isListenerRegistered && !debugPrint { packet = &UnCodablePacket{Err: NoHandlerRegisteredErr, Data: packetBytes, Direction: c.Actor.ReceiveDirection()} return } @@ -246,7 +248,19 @@ func (c *Conn) Receive() (packet proto_base.EncodeDecodeAble, err error) { return } if debugPrint { - slog.Debug("recv", "packet", fmt.Sprintf("%#v", packet)) + slog.Debug("recv", "packet", fmt.Sprintf("%#v", packet), "isListenerRegistered", isListenerRegistered) } return } + +func NewConn() (ret *Conn) { + ret = &Conn{} + ret.SetState(proto_base.Handshaking) + ret.SetCompressionThreshold(-1) + err := ret.SetVersion(EarliestVersion) + if err != nil { + panic(err) + } + ret.Loop = event.NewLoop() + return +} diff --git a/proto/packet_lookup.go b/proto/packet_lookup.go index f0a1c11..b4c8ade 100644 --- a/proto/packet_lookup.go +++ b/proto/packet_lookup.go @@ -73,3 +73,12 @@ func LookupPacketInfoByNameProtocolVersionAndState(name string, version int32, s } return } + +func LookupPacketInfoByNameProtocolVersionStateAndDirection(name string, version int32, state proto_base.State, direction proto_base.Direction) (p proto_base.PacketInfo, ok bool) { + for _, p := range proto_generated.Packets { + if state == p.State && p.Name == name && p.ProtocolVersion == version && p.Direction == direction { + return p, true + } + } + return +} diff --git a/proto/smart_convert.go b/proto/smart_convert.go index f6859f3..d41e575 100644 --- a/proto/smart_convert.go +++ b/proto/smart_convert.go @@ -88,7 +88,11 @@ func (c *Conn) RegisterCriticalUntil(h any, until string) { func (c *Conn) registerUntil(h any, until string, critical bool) { eventType, hv := event.ValidateHandler(h) - c.RegisterDirect(eventType, hv) + if critical { + c.RegisterDirect(eventType, hv) + } else { + c.RegisterCustomType(eventType, hv) + } if !eventType.Implements(reflect.TypeFor[proto_base.EncodeDecodeAble]()) { panic("expected method with argument that implements proto_base.EncodeDecodeAble") } @@ -109,7 +113,7 @@ func (c *Conn) registerUntil(h any, until string, critical bool) { panic("protocol version not found") } var newPacketInfo proto_base.PacketInfo - newPacketInfo, found = LookupPacketInfoByNameProtocolVersionAndState(packetInfo.Name, versionInfo.Version, packetInfo.State) + newPacketInfo, found = LookupPacketInfoByNameProtocolVersionStateAndDirection(packetInfo.Name, versionInfo.Version, packetInfo.State, packetInfo.Direction) if !found { panic("packet not found") } diff --git a/proto/smart_convert_test.go b/proto/smart_convert_test.go index a4bfd4f..b7f375b 100644 --- a/proto/smart_convert_test.go +++ b/proto/smart_convert_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/admin-else/strom/proto" + "github.com/admin-else/strom/proto_generated/v1_21_11" "github.com/admin-else/strom/proto_generated/v1_21_8" "github.com/admin-else/strom/proto_generated/v1_21_9" ) @@ -29,3 +30,19 @@ func TestCanSmartConvertTags(t *testing.T) { ret := proto.SmartConvert(reflect.ValueOf(packet), targetType) t.Logf("%#v", ret) } + +func TestRegisterUntilLatest(t *testing.T) { + conn := proto.NewConn() + ok := false + conn.RegisterCriticalUntilLatest(func(p *v1_21_8.ConfigurationToServerPacketFinishConfiguration) error { + ok = true + return nil + }) + err := conn.Fire(&v1_21_11.ConfigurationToServerPacketFinishConfiguration{}) + if err != nil { + t.Errorf("fire failed err: %v", err) + } + if !ok { + t.Errorf("handler not called") + } +} diff --git a/server/config_server.go b/server/config_server.go index 6d928f5..ab39766 100644 --- a/server/config_server.go +++ b/server/config_server.go @@ -1,9 +1,6 @@ package server import ( - "fmt" - "log/slog" - "github.com/admin-else/strom/data" "github.com/admin-else/strom/event" "github.com/admin-else/strom/nbt" @@ -14,24 +11,45 @@ import ( type ConfigServer struct { *proto.Conn -} - -func (c *ConfigServer) Default(event event.Anything) (err error) { - slog.Debug("Config server", "packet", fmt.Sprintf("%#v", event.Val)) - return + registryData map[string]any } func ServeConfig(c *proto.Conn) (err error) { + cs := &ConfigServer{Conn: c} n, err := data.LoadRegistry(c.Version) if err != nil { return } - for _, p := range n.Value.(map[string]any)["Registries"].([]any) { + err = c.Send(&v1_21_8.ConfigurationToClientPacketFeatureFlags{Features: []string{"minecraft:vanilla"}}) + if err != nil { + return + } + cs.registryData = n.Value.(map[string]any) + packet := &v1_21_8.ConfigurationToClientPacketCommonSelectKnownPacks{} + for _, pAny := range cs.registryData["KnownPacks"].([]any) { + p := pAny.(map[string]any) + packet.Packs = append(packet.Packs, struct { + Namespace string + Id string + Version string + }{p["Namespace"].(string), p["Id"].(string), p["Version"].(string)}) + } + err = c.Send(packet) + if err != nil { + return + } + cs.RegisterCriticalUntilLatest(cs.OnSelectKnownPacksResponse) + cs.RegisterCriticalUntilLatest(cs.OnFinishConfiguration) + return cs.StartConn() +} + +func (c *ConfigServer) OnSelectKnownPacksResponse(_ *v1_21_8.ConfigurationToServerPacketCommonSelectKnownPacks) (err error) { + for _, p := range c.registryData["Registries"].([]any) { packet := &v1_21_8.ConfigurationToClientPacketRegistryData{Id: p.(map[string]any)["Id"].(string)} for _, entry := range p.(map[string]any)["Entries"].([]any) { entryTyped := entry.(map[string]any) valAny, ok := entryTyped["Value"] - var val *nbt.Anon + var val *nbt.Anon = nil if ok { val = &nbt.Anon{Value: valAny} } @@ -46,7 +64,7 @@ func ServeConfig(c *proto.Conn) (err error) { } } tagsPacket := &v1_21_8.ConfigurationToClientPacketTags{} - for _, p := range n.Value.(map[string]any)["Tags"].([]any) { + for _, p := range c.registryData["Tags"].([]any) { p := p.(map[string]any) tags := v1_21_8.Tags{} for _, entry := range p["Entries"].([]any) { @@ -69,8 +87,7 @@ func ServeConfig(c *proto.Conn) (err error) { return } err = c.Send(&v1_21_8.ConfigurationToClientPacketFinishConfiguration{}) - cs := &ConfigServer{c} - return cs.StartLoop() + return } func (c *ConfigServer) OnFinishConfiguration(_ *v1_21_8.ConfigurationToServerPacketFinishConfiguration) (err error) { diff --git a/server/server.go b/server/server.go index af5b3df..b053cbb 100644 --- a/server/server.go +++ b/server/server.go @@ -5,22 +5,17 @@ import ( "log/slog" "net" - "github.com/admin-else/strom/event" "github.com/admin-else/strom/proto" "github.com/admin-else/strom/proto_base" "github.com/admin-else/strom/text" ) func Servee(c net.Conn) (ret *proto.Conn) { - ret = &proto.Conn{} - _ = ret.SetVersion("1.21.8") // cant fail - ret.SetState(proto_base.Handshaking) - ret.SetCompressionThreshold(-1) + ret = proto.NewConn() ret.Actor = proto_base.Servee ret.Conn = c ret.R = c ret.W = c - ret.Loop = event.NewLoop() return } diff --git a/tools/registry_data_hunter/main.go b/tools/registry_data_hunter/main.go index f6e897a..94c5500 100644 --- a/tools/registry_data_hunter/main.go +++ b/tools/registry_data_hunter/main.go @@ -70,6 +70,16 @@ func (p *Proxy) OnFinishConfiguration(_ *v1_21_8.ConfigurationToClientPacketFini return } +func (p *Proxy) OnSelectKnownPacks(data *v1_21_8.ConfigurationToClientPacketCommonSelectKnownPacks) (err error) { + var entries []any + for _, entry := range data.Packs { + e := map[string]any{"Namespace": entry.Namespace, "Id": entry.Id, "Version": entry.Version} + entries = append(entries, e) + } + p.Data.Value.(map[string]any)["KnownPacks"] = entries + return +} + func (p *Proxy) OnData(data *v1_21_8.ConfigurationToClientPacketRegistryData) (err error) { d := p.Data.Value.(map[string]any)["Registries"].([]any) var entries []any @@ -118,6 +128,7 @@ func handleClient(c *proto.Conn) (err error) { p.Servee.RegisterCritical(p.OnAnything) p.Client.RegisterCriticalUntilLatest(p.OnData) p.Client.RegisterCriticalUntilLatest(p.OnTags) + p.Client.RegisterCriticalUntilLatest(p.OnSelectKnownPacks) p.Client.RegisterCriticalUntilLatest(p.OnFinishConfiguration) go func() {