PluginMessage event
This commit is contained in:
13
bot/event.go
13
bot/event.go
@ -5,10 +5,11 @@ import (
|
||||
)
|
||||
|
||||
type eventBroker struct {
|
||||
GameStart func() error
|
||||
ChatMsg func(msg chat.Message, pos byte) error
|
||||
Disconnect func(reason chat.Message) error
|
||||
HealthChange func() error
|
||||
Die func() error
|
||||
SoundPlay func(name string, category int, x, y, z float64, volume, pitch float32) error
|
||||
GameStart func() error
|
||||
ChatMsg func(msg chat.Message, pos byte) error
|
||||
Disconnect func(reason chat.Message) error
|
||||
HealthChange func() error
|
||||
Die func() error
|
||||
SoundPlay func(name string, category int, x, y, z float64, volume, pitch float32) error
|
||||
PluginMessage func(channel string, data []byte) error
|
||||
}
|
||||
|
@ -339,7 +339,16 @@ func handleJoinGamePacket(c *Client, p pk.Packet) error {
|
||||
}
|
||||
|
||||
func handlePluginPacket(c *Client, p pk.Packet) error {
|
||||
// fmt.Println("Plugin Packet: ", p)
|
||||
var (
|
||||
Channel pk.Identifier
|
||||
Data pk.PluginMessageData
|
||||
)
|
||||
if err := p.Scan(&Channel, &Data); err != nil {
|
||||
return err
|
||||
}
|
||||
if c.Events.PluginMessage != nil {
|
||||
return c.Events.PluginMessage(string(Channel), []byte(Data))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -62,7 +62,7 @@ type encryptionRequest struct {
|
||||
VerifyToken []byte
|
||||
}
|
||||
|
||||
func (e *encryptionRequest) Decode(r pk.ComByteReader) error {
|
||||
func (e *encryptionRequest) Decode(r pk.DecodeReader) error {
|
||||
var serverID pk.String
|
||||
if err := serverID.Decode(r); err != nil {
|
||||
return err
|
||||
|
@ -1,9 +1,39 @@
|
||||
package entity
|
||||
|
||||
import (
|
||||
"github.com/Tnze/go-mc/nbt"
|
||||
pk "github.com/Tnze/go-mc/net/packet"
|
||||
)
|
||||
|
||||
//Entity is the entity of minecraft
|
||||
type Entity struct {
|
||||
EntityID int //实体ID
|
||||
}
|
||||
|
||||
type Solt struct {
|
||||
// The Slot data structure is how Minecraft represents an item and its associated data in the Minecraft Protocol
|
||||
type Slot struct {
|
||||
Present bool
|
||||
ItemID int32
|
||||
Count int8
|
||||
NBT struct {
|
||||
}
|
||||
}
|
||||
|
||||
//Decode implement packet.FieldDecoder interface
|
||||
func (s *Slot) Decode(r pk.DecodeReader) error {
|
||||
if err := (*pk.Boolean)(&s.Present).Decode(r); err != nil {
|
||||
return err
|
||||
}
|
||||
if s.Present {
|
||||
if err := (*pk.VarInt)(&s.ItemID).Decode(r); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := (*pk.Byte)(&s.Count).Decode(r); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := nbt.NewDecoder(r).Decode(&s.NBT); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ type Player struct {
|
||||
OnGround bool
|
||||
|
||||
HeldItem int //拿着的物品栏位
|
||||
Inventory []entity.Solt
|
||||
Inventory []entity.Slot
|
||||
|
||||
Health float32 //血量
|
||||
Food int32 //饱食度
|
||||
|
@ -39,7 +39,7 @@ func (m *Message) UnmarshalJSON(jsonMsg []byte) (err error) {
|
||||
}
|
||||
|
||||
//Decode a ChatMsg packet
|
||||
func (m *Message) Decode(r pk.ComByteReader) error {
|
||||
func (m *Message) Decode(r pk.DecodeReader) error {
|
||||
var Len pk.VarInt
|
||||
if err := Len.Decode(r); err != nil {
|
||||
return err
|
||||
|
@ -29,6 +29,7 @@ func main() {
|
||||
c.Events.GameStart = onGameStart
|
||||
c.Events.ChatMsg = onChatMsg
|
||||
c.Events.Disconnect = onDisconnect
|
||||
c.Events.PluginMessage = onPluginMessage
|
||||
|
||||
//JoinGame
|
||||
err = c.HandleGame()
|
||||
@ -51,3 +52,8 @@ func onDisconnect(c chat.Message) error {
|
||||
log.Println("Disconnect:", c)
|
||||
return nil
|
||||
}
|
||||
|
||||
func onPluginMessage(channel string, data []byte) error {
|
||||
log.Println("PluginMessage", channel, data)
|
||||
return nil
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package packet
|
||||
|
||||
import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"math"
|
||||
)
|
||||
|
||||
@ -15,11 +16,11 @@ type FieldEncoder interface {
|
||||
}
|
||||
|
||||
type FieldDecoder interface {
|
||||
Decode(r ComByteReader) error
|
||||
Decode(r DecodeReader) error
|
||||
}
|
||||
|
||||
//ComByteReader is both io.Reader and io.ByteReader
|
||||
type ComByteReader interface {
|
||||
//DecodeReader is both io.Reader and io.ByteReader
|
||||
type DecodeReader interface {
|
||||
io.ByteReader
|
||||
io.Reader
|
||||
}
|
||||
@ -69,7 +70,7 @@ type (
|
||||
)
|
||||
|
||||
//ReadNBytes read N bytes from bytes.Reader
|
||||
func ReadNBytes(r ComByteReader, n int) (bs []byte, err error) {
|
||||
func ReadNBytes(r DecodeReader, n int) (bs []byte, err error) {
|
||||
bs = make([]byte, n)
|
||||
for i := 0; i < n; i++ {
|
||||
bs[i], err = r.ReadByte()
|
||||
@ -89,7 +90,7 @@ func (b Boolean) Encode() []byte {
|
||||
}
|
||||
|
||||
//Decode a Boolean
|
||||
func (b *Boolean) Decode(r ComByteReader) error {
|
||||
func (b *Boolean) Decode(r DecodeReader) error {
|
||||
v, err := r.ReadByte()
|
||||
if err != nil {
|
||||
return err
|
||||
@ -108,7 +109,7 @@ func (s String) Encode() (p []byte) {
|
||||
}
|
||||
|
||||
//Decode a String
|
||||
func (s *String) Decode(r ComByteReader) error {
|
||||
func (s *String) Decode(r DecodeReader) error {
|
||||
var l VarInt //String length
|
||||
if err := l.Decode(r); err != nil {
|
||||
return err
|
||||
@ -129,7 +130,7 @@ func (b Byte) Encode() []byte {
|
||||
}
|
||||
|
||||
//Decode a Byte
|
||||
func (b *Byte) Decode(r ComByteReader) error {
|
||||
func (b *Byte) Decode(r DecodeReader) error {
|
||||
v, err := r.ReadByte()
|
||||
if err != nil {
|
||||
return err
|
||||
@ -144,7 +145,7 @@ func (ub UnsignedByte) Encode() []byte {
|
||||
}
|
||||
|
||||
//Decode a UnsignedByte
|
||||
func (ub *UnsignedByte) Decode(r ComByteReader) error {
|
||||
func (ub *UnsignedByte) Decode(r DecodeReader) error {
|
||||
v, err := r.ReadByte()
|
||||
if err != nil {
|
||||
return err
|
||||
@ -163,7 +164,7 @@ func (s Short) Encode() []byte {
|
||||
}
|
||||
|
||||
//Decode a Short
|
||||
func (s *Short) Decode(r ComByteReader) error {
|
||||
func (s *Short) Decode(r DecodeReader) error {
|
||||
bs, err := ReadNBytes(r, 2)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -183,7 +184,7 @@ func (us UnsignedShort) Encode() []byte {
|
||||
}
|
||||
|
||||
//Decode a UnsignedShort
|
||||
func (us *UnsignedShort) Decode(r ComByteReader) error {
|
||||
func (us *UnsignedShort) Decode(r DecodeReader) error {
|
||||
bs, err := ReadNBytes(r, 2)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -203,7 +204,7 @@ func (i Int) Encode() []byte {
|
||||
}
|
||||
|
||||
//Decode a Int
|
||||
func (i *Int) Decode(r ComByteReader) error {
|
||||
func (i *Int) Decode(r DecodeReader) error {
|
||||
bs, err := ReadNBytes(r, 4)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -223,7 +224,7 @@ func (l Long) Encode() []byte {
|
||||
}
|
||||
|
||||
//Decode a Long
|
||||
func (l *Long) Decode(r ComByteReader) error {
|
||||
func (l *Long) Decode(r DecodeReader) error {
|
||||
bs, err := ReadNBytes(r, 8)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -252,7 +253,7 @@ func (v VarInt) Encode() (vi []byte) {
|
||||
}
|
||||
|
||||
//Decode a VarInt
|
||||
func (v *VarInt) Decode(r ComByteReader) error {
|
||||
func (v *VarInt) Decode(r DecodeReader) error {
|
||||
var n uint32
|
||||
for i := 0; i < 5; i++ { //读数据前的长度标记
|
||||
sec, err := r.ReadByte()
|
||||
@ -283,7 +284,7 @@ func (p Position) Encode() []byte {
|
||||
}
|
||||
|
||||
// Decode a Position
|
||||
func (p *Position) Decode(r ComByteReader) error {
|
||||
func (p *Position) Decode(r DecodeReader) error {
|
||||
var v Long
|
||||
if err := v.Decode(r); err != nil {
|
||||
return err
|
||||
@ -314,7 +315,7 @@ func (f Float) Encode() []byte {
|
||||
}
|
||||
|
||||
// Decode a Float
|
||||
func (f *Float) Decode(r ComByteReader) error {
|
||||
func (f *Float) Decode(r DecodeReader) error {
|
||||
var v Int
|
||||
if err := v.Decode(r); err != nil {
|
||||
return err
|
||||
@ -330,7 +331,7 @@ func (d Double) Encode() []byte {
|
||||
}
|
||||
|
||||
// Decode a Double
|
||||
func (d *Double) Decode(r ComByteReader) error {
|
||||
func (d *Double) Decode(r DecodeReader) error {
|
||||
var v Long
|
||||
if err := v.Decode(r); err != nil {
|
||||
return err
|
||||
@ -339,3 +340,23 @@ func (d *Double) Decode(r ComByteReader) error {
|
||||
*d = Double(math.Float64frombits(uint64(v)))
|
||||
return nil
|
||||
}
|
||||
|
||||
// The PluginMessageData only used in recive PluginMessage packet.
|
||||
// When decode it, read to end.
|
||||
type PluginMessageData []byte
|
||||
|
||||
//Encode a PluginMessageData
|
||||
func (p *PluginMessageData) Encode(r io.Writer) error {
|
||||
_, err := r.Write([]byte(*p))
|
||||
return err
|
||||
}
|
||||
|
||||
//Decode a PluginMessageData
|
||||
func (p *PluginMessageData) Decode(r DecodeReader) error {
|
||||
data, err := ioutil.ReadAll(r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*p = PluginMessageData(data)
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user