implementing storing chest data into Manager.Screens in bot/screen (#279)
This commit is contained in:
@ -175,6 +175,30 @@ func (m *Manager) SendMessage(msg string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// SendMessage send chat message to server.
|
||||
// Doesn't support sending message with signature currently.
|
||||
func (m *Manager) SendCommand(command string) error {
|
||||
if len(command) > 256 {
|
||||
return errors.New("message length greater than 256")
|
||||
}
|
||||
var salt int64
|
||||
if err := binary.Read(rand.Reader, binary.BigEndian, &salt); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err := m.c.Conn.WritePacket(pk.Marshal(
|
||||
packetid.ServerboundChatCommand,
|
||||
pk.String(command),
|
||||
pk.Long(time.Now().UnixMilli()),
|
||||
pk.Long(salt),
|
||||
pk.Ary[pk.VarInt]{Ary: []pk.Tuple{}},
|
||||
sign.HistoryUpdate{
|
||||
Acknowledged: pk.NewFixedBitSet(20),
|
||||
},
|
||||
))
|
||||
return err
|
||||
}
|
||||
|
||||
var (
|
||||
InvalidChatPacket = errors.New("invalid chat packet")
|
||||
ValidationFailed error = bot.DisconnectErr(chat.TranslateMsg("multiplayer.disconnect.chat_validation_failed"))
|
||||
|
39
bot/screen/chest.go
Normal file
39
bot/screen/chest.go
Normal file
@ -0,0 +1,39 @@
|
||||
package screen
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/Tnze/go-mc/chat"
|
||||
"github.com/Tnze/go-mc/data/inventory"
|
||||
)
|
||||
|
||||
type Chest struct {
|
||||
Type inventory.InventoryID
|
||||
Title chat.Message
|
||||
Slots []Slot
|
||||
Rows int
|
||||
}
|
||||
|
||||
func (c *Chest) onSetSlot(i int, slot Slot) error {
|
||||
if i < 0 || i >= len(c.Slots) {
|
||||
return errors.New("slot index out of bounds")
|
||||
}
|
||||
c.Slots[i] = slot
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Chest) onClose() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Chest) Container() []Slot {
|
||||
return c.Slots[0 : c.Rows*9]
|
||||
}
|
||||
|
||||
func (c *Chest) Main() []Slot {
|
||||
return c.Slots[c.Rows*9 : c.Rows*9+27]
|
||||
}
|
||||
|
||||
func (c *Chest) Hotbar() []Slot {
|
||||
return c.Slots[c.Rows*9+27 : (c.Rows+4)*9]
|
||||
}
|
@ -1,7 +1,9 @@
|
||||
package screen
|
||||
|
||||
import "github.com/Tnze/go-mc/chat"
|
||||
|
||||
type EventsListener struct {
|
||||
Open func(id int) error
|
||||
Open func(id int, container_type int32, title chat.Message) error
|
||||
SetSlot func(id, index int) error
|
||||
Close func(id int) error
|
||||
}
|
||||
|
@ -81,11 +81,23 @@ func (m *Manager) onOpenScreen(p pk.Packet) error {
|
||||
if err := p.Scan(&ContainerID, &Type, &Title); err != nil {
|
||||
return Error{err}
|
||||
}
|
||||
//if c, ok := m.Screens[byte(ContainerID)]; ok {
|
||||
// TODO: Create the specified container
|
||||
//}
|
||||
if _, ok := m.Screens[int(ContainerID)]; !ok {
|
||||
TypeInt32 := int32(Type)
|
||||
if TypeInt32 < 6 {
|
||||
Rows := TypeInt32 + 1
|
||||
chest := Chest{
|
||||
Type: TypeInt32,
|
||||
Slots: make([]Slot, 9*Rows),
|
||||
Rows: int(Rows),
|
||||
Title: Title,
|
||||
}
|
||||
m.Screens[int(ContainerID)] = &chest
|
||||
}
|
||||
} else {
|
||||
return errors.New("container id already exists in screens")
|
||||
}
|
||||
if m.events.Open != nil {
|
||||
if err := m.events.Open(int(ContainerID)); err != nil {
|
||||
if err := m.events.Open(int(ContainerID), int32(Type), Title); err != nil {
|
||||
return Error{err}
|
||||
}
|
||||
}
|
||||
|
143
data/inventory/inventory.go
Normal file
143
data/inventory/inventory.go
Normal file
@ -0,0 +1,143 @@
|
||||
package inventory
|
||||
|
||||
type InventoryID = int32
|
||||
|
||||
const (
|
||||
Generic9x1 InventoryID = iota
|
||||
Generic9x2
|
||||
Generic9x3
|
||||
Generic9x4
|
||||
Generic9x5
|
||||
Generic9x6
|
||||
Generic3x3
|
||||
Crafter3x3
|
||||
Anvil
|
||||
Beacon
|
||||
BlastFurnace
|
||||
BrewingStand
|
||||
Crafting
|
||||
Enchantment
|
||||
Furnace
|
||||
Grindstone
|
||||
Hopper
|
||||
Lectern
|
||||
Loom
|
||||
Merchant
|
||||
ShulkerBox
|
||||
Smithing
|
||||
Smoker
|
||||
Cartography
|
||||
Stonecutter
|
||||
)
|
||||
|
||||
func IDToName(t InventoryID) string {
|
||||
switch t {
|
||||
case Generic9x1:
|
||||
return "generic_9x1"
|
||||
case Generic9x2:
|
||||
return "generic_9x2"
|
||||
case Generic9x3:
|
||||
return "generic_9x3"
|
||||
case Generic9x4:
|
||||
return "generic_9x4"
|
||||
case Generic9x5:
|
||||
return "generic_9x5"
|
||||
case Generic9x6:
|
||||
return "generic_9x6"
|
||||
case Generic3x3:
|
||||
return "generic_3x3"
|
||||
case Crafter3x3:
|
||||
return "crafter_3x3"
|
||||
case Anvil:
|
||||
return "anvil"
|
||||
case Beacon:
|
||||
return "beacon"
|
||||
case BlastFurnace:
|
||||
return "blast_furnace"
|
||||
case BrewingStand:
|
||||
return "brewing_stand"
|
||||
case Crafting:
|
||||
return "crafting"
|
||||
case Enchantment:
|
||||
return "enchantment"
|
||||
case Furnace:
|
||||
return "furnace"
|
||||
case Grindstone:
|
||||
return "grindstone"
|
||||
case Hopper:
|
||||
return "hopper"
|
||||
case Lectern:
|
||||
return "lectern"
|
||||
case Loom:
|
||||
return "loom"
|
||||
case Merchant:
|
||||
return "merchant"
|
||||
case ShulkerBox:
|
||||
return "shulker_box"
|
||||
case Smithing:
|
||||
return "smithing"
|
||||
case Smoker:
|
||||
return "smoker"
|
||||
case Cartography:
|
||||
return "cartography"
|
||||
case Stonecutter:
|
||||
return "stonecutter"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func NameToID(name string) InventoryID {
|
||||
switch name {
|
||||
case "generic_9x1":
|
||||
return Generic9x1
|
||||
case "generic_9x2":
|
||||
return Generic9x2
|
||||
case "generic_9x3":
|
||||
return Generic9x3
|
||||
case "generic_9x4":
|
||||
return Generic9x4
|
||||
case "generic_9x5":
|
||||
return Generic9x5
|
||||
case "generic_9x6":
|
||||
return Generic9x6
|
||||
case "generic_3x3":
|
||||
return Generic3x3
|
||||
case "crafter_3x3":
|
||||
return Crafter3x3
|
||||
case "anvil":
|
||||
return Anvil
|
||||
case "beacon":
|
||||
return Beacon
|
||||
case "blast_furnace":
|
||||
return BlastFurnace
|
||||
case "brewing_stand":
|
||||
return BrewingStand
|
||||
case "crafting":
|
||||
return Crafting
|
||||
case "enchantment":
|
||||
return Enchantment
|
||||
case "furnace":
|
||||
return Furnace
|
||||
case "grindstone":
|
||||
return Grindstone
|
||||
case "hopper":
|
||||
return Hopper
|
||||
case "lectern":
|
||||
return Lectern
|
||||
case "loom":
|
||||
return Loom
|
||||
case "merchant":
|
||||
return Merchant
|
||||
case "shulker_box":
|
||||
return ShulkerBox
|
||||
case "smithing":
|
||||
return Smithing
|
||||
case "smoker":
|
||||
return Smoker
|
||||
case "cartography":
|
||||
return Cartography
|
||||
case "stonecutter":
|
||||
return Stonecutter
|
||||
}
|
||||
return -1
|
||||
}
|
Reference in New Issue
Block a user