diff --git a/bot/client.go b/bot/client.go index 9f0f479..6f7e69d 100644 --- a/bot/client.go +++ b/bot/client.go @@ -9,7 +9,9 @@ import ( "github.com/Tnze/go-mc/bot/world" "github.com/Tnze/go-mc/bot/world/entity" "github.com/Tnze/go-mc/bot/world/entity/player" + "github.com/Tnze/go-mc/data" "github.com/Tnze/go-mc/net" + "github.com/Tnze/go-mc/net/packet" pk "github.com/Tnze/go-mc/net/packet" ) @@ -47,6 +49,10 @@ func (c *Client) Close() error { return err } +func (c *Client) SendCloseWindow(windowID byte) error { + return c.conn.WritePacket(packet.Marshal(data.CloseWindowServerbound, pk.UnsignedByte(windowID))) +} + // NewClient init and return a new Client. // // A new Client has default name "Steve" and zero UUID. diff --git a/bot/event.go b/bot/event.go index 42a3b82..81fe221 100644 --- a/bot/event.go +++ b/bot/event.go @@ -7,6 +7,7 @@ import ( "github.com/google/uuid" pk "github.com/Tnze/go-mc/net/packet" + "github.com/Tnze/go-mc/net/ptypes" ) type seenPacketFlags uint8 @@ -41,6 +42,7 @@ type eventBroker struct { SoundPlay func(name string, category int, x, y, z float64, volume, pitch float32) error PluginMessage func(channel string, data []byte) error HeldItemChange func(slot int) error + OpenWindow func(pkt ptypes.OpenWindow) error // ExperienceChange will be called every time player's experience level updates. // Parameters: diff --git a/bot/ingame.go b/bot/ingame.go index 089c5a2..d39ddb8 100644 --- a/bot/ingame.go +++ b/bot/ingame.go @@ -149,6 +149,8 @@ func (c *Client) handlePacket(p pk.Packet) (disconnect bool, err error) { err = handleHeldItemPacket(c, p) case data.WindowItems: err = handleWindowItemsPacket(c, p) + case data.OpenWindow: + err = handleOpenWindowPacket(c, p) case data.DeclareRecipes: // handleDeclareRecipesPacket(g, reader) @@ -276,7 +278,7 @@ func handleEntityAnimationPacket(c *Client, p pk.Packet) error { if err := se.Decode(p); err != nil { return err } - fmt.Printf("EntityAnimationClientbound: %+v\n", se) + // fmt.Printf("EntityAnimationClientbound: %+v\n", se) return nil } @@ -288,7 +290,7 @@ func handleEntityStatusPacket(c *Client, p pk.Packet) error { if err := p.Scan(&id, &status); err != nil { return err } - fmt.Printf("EntityStatus: %v, %v\n", id, status) + // fmt.Printf("EntityStatus: %v, %v\n", id, status) return nil } @@ -722,6 +724,18 @@ func handleWindowItemsPacket(c *Client, p pk.Packet) error { return nil } +func handleOpenWindowPacket(c *Client, p pk.Packet) error { + var pkt ptypes.OpenWindow + if err := pkt.Decode(p); err != nil { + return err + } + + if c.Events.OpenWindow != nil { + return c.Events.OpenWindow(pkt) + } + return nil +} + func handleSetExperience(c *Client, p pk.Packet) (err error) { var ( bar pk.Float diff --git a/net/ptypes/inventory.go b/net/ptypes/inventory.go index 48bdaae..0e2824e 100644 --- a/net/ptypes/inventory.go +++ b/net/ptypes/inventory.go @@ -6,6 +6,7 @@ import ( "errors" "github.com/Tnze/go-mc/bot/world/entity" + "github.com/Tnze/go-mc/chat" "github.com/Tnze/go-mc/nbt" pk "github.com/Tnze/go-mc/net/packet" ) @@ -52,3 +53,17 @@ func (p *WindowItems) Decode(pkt pk.Packet) error { } return nil } + +// OpenWindow is a clientbound packet which opens an inventory. +type OpenWindow struct { + WindowID pk.VarInt + WindowType pk.VarInt + Title chat.Message +} + +func (p *OpenWindow) Decode(pkt pk.Packet) error { + if err := pkt.Scan(&p.WindowID, &p.WindowType, &p.Title); err != nil && !errors.Is(err, nbt.ErrEND) { + return err + } + return nil +}