From 7e8118e21fba8c1dec8949bda93998fcd983dcd6 Mon Sep 17 00:00:00 2001 From: JunDao Date: Sun, 19 May 2019 11:32:31 +0800 Subject: [PATCH] PluginMessage event --- bot/event.go | 13 ++++---- bot/ingame.go | 11 ++++++- bot/login.go | 2 +- bot/world/entity/entity.go | 32 ++++++++++++++++++- bot/world/entity/player/player.go | 2 +- chat/chatMsg.go | 2 +- cmd/daze/daze.go | 6 ++++ net/packet/types.go | 53 +++++++++++++++++++++---------- 8 files changed, 94 insertions(+), 27 deletions(-) diff --git a/bot/event.go b/bot/event.go index 8dfa445..db61670 100644 --- a/bot/event.go +++ b/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 } diff --git a/bot/ingame.go b/bot/ingame.go index 584e88d..f0c8e31 100644 --- a/bot/ingame.go +++ b/bot/ingame.go @@ -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 } diff --git a/bot/login.go b/bot/login.go index 283f673..731fb28 100644 --- a/bot/login.go +++ b/bot/login.go @@ -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 diff --git a/bot/world/entity/entity.go b/bot/world/entity/entity.go index 9c693d4..93d7817 100644 --- a/bot/world/entity/entity.go +++ b/bot/world/entity/entity.go @@ -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 } diff --git a/bot/world/entity/player/player.go b/bot/world/entity/player/player.go index a533299..9c09e04 100644 --- a/bot/world/entity/player/player.go +++ b/bot/world/entity/player/player.go @@ -12,7 +12,7 @@ type Player struct { OnGround bool HeldItem int //拿着的物品栏位 - Inventory []entity.Solt + Inventory []entity.Slot Health float32 //血量 Food int32 //饱食度 diff --git a/chat/chatMsg.go b/chat/chatMsg.go index 0d0e4fa..10b8789 100644 --- a/chat/chatMsg.go +++ b/chat/chatMsg.go @@ -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 diff --git a/cmd/daze/daze.go b/cmd/daze/daze.go index f7aa949..057b9ec 100644 --- a/cmd/daze/daze.go +++ b/cmd/daze/daze.go @@ -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 +} diff --git a/net/packet/types.go b/net/packet/types.go index d6860da..7d2f2d1 100644 --- a/net/packet/types.go +++ b/net/packet/types.go @@ -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 +}