Skip to content

Commit

Permalink
implementing storing chest data into Manager.Screens in bot/screen (#279
Browse files Browse the repository at this point in the history
)
  • Loading branch information
qwqtoday authored May 1, 2024
1 parent 010ce51 commit d63cc1d
Show file tree
Hide file tree
Showing 5 changed files with 225 additions and 5 deletions.
24 changes: 24 additions & 0 deletions bot/msg/chat.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
Expand Down
39 changes: 39 additions & 0 deletions bot/screen/chest.go
Original file line number Diff line number Diff line change
@@ -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]
}
4 changes: 3 additions & 1 deletion bot/screen/events.go
Original file line number Diff line number Diff line change
@@ -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
}
20 changes: 16 additions & 4 deletions bot/screen/screen.go
Original file line number Diff line number Diff line change
Expand Up @@ -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}
}
}
Expand Down
143 changes: 143 additions & 0 deletions data/inventory/inventory.go
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit d63cc1d

Please sign in to comment.