From d9b6a90afc8aeac8b5c97cf96ead05a56da473ea Mon Sep 17 00:00:00 2001 From: Tnze Date: Sun, 4 Jul 2021 00:44:42 +0800 Subject: [PATCH] Handle screen open/send content --- bot/basic/info.go | 5 +++-- bot/screen/inventory.go | 12 ++++++++++-- bot/screen/screen.go | 6 ++++-- data/inv/inv.go => bot/screen/type.go | 3 +-- examples/daze/daze.go | 4 ++-- net/packet/types.go | 9 ++++++--- 6 files changed, 26 insertions(+), 13 deletions(-) rename data/inv/inv.go => bot/screen/type.go (91%) diff --git a/bot/basic/info.go b/bot/basic/info.go index 70a00fd..9679592 100644 --- a/bot/basic/info.go +++ b/bot/basic/info.go @@ -4,6 +4,7 @@ import ( "unsafe" "github.com/Tnze/go-mc/data/packetid" + "github.com/Tnze/go-mc/nbt" pk "github.com/Tnze/go-mc/net/packet" ) @@ -47,8 +48,8 @@ func (p *Player) handleJoinGamePacket(packet pk.Packet) error { (*pk.Byte)(&p.PrevGamemode), &WorldCount, pk.Ary{Len: &WorldCount, Ary: &WorldNames}, - pk.NBT(new(interface{})), - pk.NBT(new(interface{})), + pk.NBT(new(nbt.RawMessage)), + pk.NBT(new(nbt.RawMessage)), (*pk.Identifier)(&p.WorldName), (*pk.Long)(&p.HashedSeed), (*pk.VarInt)(&p.MaxPlayers), diff --git a/bot/screen/inventory.go b/bot/screen/inventory.go index 8da3e2b..67f11f1 100644 --- a/bot/screen/inventory.go +++ b/bot/screen/inventory.go @@ -1,8 +1,16 @@ package screen +import ( + "fmt" + + "github.com/Tnze/go-mc/data/item" + "github.com/Tnze/go-mc/nbt" +) + type Inventory struct { } -func (inv Inventory) SetSlot(i int, id int32, count byte, NBT interface{}) { - panic("implement me") +func (inv Inventory) SetSlot(i int, id int32, count byte, NBT nbt.RawMessage) { + // TODO: accept inv data + fmt.Printf("Inventory[%d] = minecraft:%v * %d\n", i, item.ByID[item.ID(id)].Name, count) } diff --git a/bot/screen/screen.go b/bot/screen/screen.go index d03689b..375c89a 100644 --- a/bot/screen/screen.go +++ b/bot/screen/screen.go @@ -6,6 +6,7 @@ import ( "github.com/Tnze/go-mc/bot" "github.com/Tnze/go-mc/chat" "github.com/Tnze/go-mc/data/packetid" + "github.com/Tnze/go-mc/nbt" pk "github.com/Tnze/go-mc/net/packet" ) @@ -18,6 +19,7 @@ func NewManager(c *bot.Client) *Manager { m.Screens[0] = &Inventory{} c.Events.AddListener( bot.PacketHandler{Priority: 64, ID: packetid.OpenWindow, F: m.onOpenScreen}, + bot.PacketHandler{Priority: 64, ID: packetid.WindowItems, F: m.onSetContentPacket}, ) return m } @@ -60,7 +62,7 @@ type slot struct { present pk.Boolean id pk.VarInt count pk.Byte - nbt interface{} + nbt nbt.RawMessage } func (s *slot) ReadFrom(r io.Reader) (n int64, err error) { @@ -74,7 +76,7 @@ func (s *slot) ReadFrom(r io.Reader) (n int64, err error) { } type Container interface { - SetSlot(i int, id int32, count byte, NBT interface{}) + SetSlot(i int, id int32, count byte, NBT nbt.RawMessage) } type Error struct { diff --git a/data/inv/inv.go b/bot/screen/type.go similarity index 91% rename from data/inv/inv.go rename to bot/screen/type.go index cfa2ba1..de435d7 100644 --- a/data/inv/inv.go +++ b/bot/screen/type.go @@ -1,5 +1,4 @@ -// Package inv maps window types to inventory slot information. -package inv +package screen type Info struct { Name string diff --git a/examples/daze/daze.go b/examples/daze/daze.go index d7f8a32..f3facd4 100644 --- a/examples/daze/daze.go +++ b/examples/daze/daze.go @@ -1,7 +1,5 @@ // Daze could join an offline-mode server as client. // Just standing there and do nothing. Automatically reborn after five seconds of death. -// -// BUG(Tnze): Kick by Disconnect: Time Out package main import ( @@ -14,6 +12,7 @@ import ( "github.com/Tnze/go-mc/bot" "github.com/Tnze/go-mc/bot/basic" + "github.com/Tnze/go-mc/bot/screen" "github.com/Tnze/go-mc/chat" _ "github.com/Tnze/go-mc/data/lang/zh-cn" ) @@ -33,6 +32,7 @@ func main() { Disconnect: onDisconnect, Death: onDeath, }.Attach(client) + _ = screen.NewManager(client) //Login err := client.JoinServer(*address) diff --git a/net/packet/types.go b/net/packet/types.go index 6ae25d4..bc78c7f 100644 --- a/net/packet/types.go +++ b/net/packet/types.go @@ -441,20 +441,23 @@ type nbtField struct { FieldName string } -// Encode a nbtField func (n nbtField) WriteTo(w io.Writer) (int64, error) { var buf bytes.Buffer - if err := nbt.NewEncoder(&buf).Encode(n.V, n.FieldName); err != nil { + if n.V == nil { + buf.WriteByte(nbt.TagEnd) + } else if err := nbt.NewEncoder(&buf).Encode(n.V, n.FieldName); err != nil { return 0, err } return buf.WriteTo(w) } -// Decode a nbtField func (n nbtField) ReadFrom(r io.Reader) (int64, error) { // LimitReader is used to count reader length lr := &io.LimitedReader{R: r, N: math.MaxInt64} err := nbt.NewDecoder(lr).Decode(n.V) + if err != nil && errors.Is(err, nbt.ErrEND) { + err = nil + } return math.MaxInt64 - lr.N, err }