From 3761fdbefecc1f5ff1798d50605b8ddb5a91e6f7 Mon Sep 17 00:00:00 2001 From: Tnze Date: Sun, 19 Nov 2023 02:55:30 +0800 Subject: [PATCH] add more configuration supports --- bot/client.go | 1 + bot/configuration.go | 58 +++++++++++++++++++++++++++++++++++++++++--- bot/msg/chat.go | 4 +-- bot/world/chunks.go | 2 +- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/bot/client.go b/bot/client.go index 481d3d4..373532b 100644 --- a/bot/client.go +++ b/bot/client.go @@ -22,6 +22,7 @@ type Client struct { Events Events LoginPlugin map[string]func(data []byte) ([]byte, error) + ConfigData } func (c *Client) Close() error { diff --git a/bot/configuration.go b/bot/configuration.go index 06de2a4..3d1abde 100644 --- a/bot/configuration.go +++ b/bot/configuration.go @@ -1,13 +1,26 @@ package bot import ( + "unsafe" + "github.com/Tnze/go-mc/chat" "github.com/Tnze/go-mc/data/packetid" - "github.com/Tnze/go-mc/nbt" "github.com/Tnze/go-mc/net" pk "github.com/Tnze/go-mc/net/packet" + "github.com/Tnze/go-mc/registry" ) +type ConfigData struct { + Registries registry.NetworkCodec + ResourcePack struct { + URL string + Hash string + Forced bool + PromptMessage *chat.Message // Optional + } + FeatureFlags []string +} + type ConfigErr struct { Stage string Err error @@ -72,17 +85,54 @@ func (c *Client) joinConfiguration(conn *net.Conn) error { } case packetid.ClientboundConfigPing: + var pingID pk.Int + err := p.Scan(&pingID) + if err != nil { + return ConfigErr{"ping", err} + } + // send it back + err = conn.WritePacket(pk.Marshal( + packetid.ServerboundConfigPong, + pingID, + )) + if err != nil { + return ConfigErr{"pong", err} + } + case packetid.ClientboundConfigRegistryData: - var registryCodec nbt.RawMessage - err := p.Scan(pk.NBT(®istryCodec)) + err := p.Scan(pk.NBT(&c.ConfigData.Registries)) if err != nil { return ConfigErr{"registry data", err} } - // TODO: Handle registries case packetid.ClientboundConfigResourcePack: + var Url, Hash pk.String + var Forced pk.Boolean + var PromptMessage pk.Option[chat.Message, *chat.Message] + err := p.Scan( + &Url, + &Hash, + &Forced, + &PromptMessage, + ) + if err != nil { + return ConfigErr{"resource pack", err} + } + c.ConfigData.ResourcePack.URL = string(Url) + c.ConfigData.ResourcePack.Hash = string(Hash) + c.ConfigData.ResourcePack.Forced = bool(Forced) + if PromptMessage.Has { + c.ConfigData.ResourcePack.PromptMessage = &PromptMessage.Val + } + case packetid.ClientboundConfigUpdateEnabledFeatures: + err := p.Scan(pk.Array((*[]pk.Identifier)(unsafe.Pointer(&c.ConfigData.FeatureFlags)))) + if err != nil { + return ConfigErr{"update enabled features", err} + } + case packetid.ClientboundConfigUpdateTags: + // TODO: Handle Tags } } } diff --git a/bot/msg/chat.go b/bot/msg/chat.go index 26970c5..c6c6c8f 100644 --- a/bot/msg/chat.go +++ b/bot/msg/chat.go @@ -88,7 +88,7 @@ func (m *Manager) handlePlayerChat(packet pk.Packet) error { if !ok { return InvalidChatPacket } - ct := m.p.WorldInfo.RegistryCodec.ChatType.FindByID(chatType.ID) + ct := m.c.Registries.ChatType.FindByID(chatType.ID) if ct == nil { return InvalidChatPacket } @@ -141,7 +141,7 @@ func (m *Manager) handleDisguisedChat(packet pk.Packet) error { return err } - ct := m.p.WorldInfo.RegistryCodec.ChatType.FindByID(chatType.ID) + ct := m.c.Registries.ChatType.FindByID(chatType.ID) if ct == nil { return InvalidChatPacket } diff --git a/bot/world/chunks.go b/bot/world/chunks.go index 8e4ff1a..6b44a07 100644 --- a/bot/world/chunks.go +++ b/bot/world/chunks.go @@ -41,7 +41,7 @@ func (w *World) onPlayerSpawn(pk.Packet) error { func (w *World) handleLevelChunkWithLightPacket(packet pk.Packet) error { var pos level.ChunkPos - _, currentDimType := w.p.WorldInfo.RegistryCodec.DimensionType.Find(w.p.DimensionType) + _, currentDimType := w.c.ConfigData.Registries.DimensionType.Find(w.p.DimensionType) if currentDimType == nil { return errors.New("dimension type " + w.p.DimensionType + " not found") }