basic inventory support

This commit is contained in:
Tnze
2021-07-02 23:49:56 +08:00
parent 4f9779df88
commit 085b2efd6f
2 changed files with 98 additions and 0 deletions

90
bot/screen/screen.go Normal file
View File

@ -0,0 +1,90 @@
package screen
import (
"io"
"github.com/Tnze/go-mc/bot"
"github.com/Tnze/go-mc/chat"
"github.com/Tnze/go-mc/data/packetid"
pk "github.com/Tnze/go-mc/net/packet"
)
type Manager struct {
Screens map[byte]Container
}
func NewManager(c *bot.Client) *Manager {
m := &Manager{Screens: make(map[byte]Container)}
m.Screens[0] = &Inventory{}
c.Events.AddListener(
bot.PacketHandler{Priority: 64, ID: packetid.OpenWindow, F: m.onOpenScreen},
)
return m
}
func (m *Manager) onOpenScreen(p pk.Packet) error {
var (
ContainerID pk.VarInt
Type pk.VarInt
Title chat.Message
)
if err := p.Scan(&ContainerID, &Type, &Title); err != nil {
return Error{err}
}
// TODO: Create the specified container
return nil
}
func (m *Manager) onSetContentPacket(p pk.Packet) error {
var (
ContainerID pk.UnsignedByte
Count pk.Short
SlotData []slot
)
if err := p.Scan(
&ContainerID,
&Count, pk.Ary{
Len: &Count,
Ary: &SlotData,
}); err != nil {
return Error{err}
}
container := m.Screens[byte(ContainerID)]
for i, v := range SlotData {
container.SetSlot(i, int32(v.id), byte(v.count), v.nbt)
}
return nil
}
type slot struct {
present pk.Boolean
id pk.VarInt
count pk.Byte
nbt interface{}
}
func (s *slot) ReadFrom(r io.Reader) (n int64, err error) {
return pk.Tuple{
&s.present, pk.Opt{Has: &s.present,
Field: pk.Tuple{
&s.id, &s.count, pk.NBT(&s.nbt),
},
},
}.ReadFrom(r)
}
type Container interface {
SetSlot(i int, id int32, count byte, NBT interface{})
}
type Error struct {
Err error
}
func (e Error) Error() string {
return "bot/screen: " + e.Err.Error()
}
func (e Error) Unwrap() error {
return e.Err
}