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
|
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 (
|
var (
|
||||||
InvalidChatPacket = errors.New("invalid chat packet")
|
InvalidChatPacket = errors.New("invalid chat packet")
|
||||||
ValidationFailed error = bot.DisconnectErr(chat.TranslateMsg("multiplayer.disconnect.chat_validation_failed"))
|
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
|
package screen
|
||||||
|
|
||||||
|
import "github.com/Tnze/go-mc/chat"
|
||||||
|
|
||||||
type EventsListener struct {
|
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
|
SetSlot func(id, index int) error
|
||||||
Close func(id 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 {
|
if err := p.Scan(&ContainerID, &Type, &Title); err != nil {
|
||||||
return Error{err}
|
return Error{err}
|
||||||
}
|
}
|
||||||
//if c, ok := m.Screens[byte(ContainerID)]; ok {
|
if _, ok := m.Screens[int(ContainerID)]; !ok {
|
||||||
// TODO: Create the specified container
|
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 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}
|
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