PluginMessage event

This commit is contained in:
JunDao
2019-05-19 11:32:31 +08:00
parent 4653cab5e1
commit 7e8118e21f
8 changed files with 94 additions and 27 deletions

View File

@ -5,10 +5,11 @@ import (
) )
type eventBroker struct { type eventBroker struct {
GameStart func() error GameStart func() error
ChatMsg func(msg chat.Message, pos byte) error ChatMsg func(msg chat.Message, pos byte) error
Disconnect func(reason chat.Message) error Disconnect func(reason chat.Message) error
HealthChange func() error HealthChange func() error
Die func() error Die func() error
SoundPlay func(name string, category int, x, y, z float64, volume, pitch float32) error SoundPlay func(name string, category int, x, y, z float64, volume, pitch float32) error
PluginMessage func(channel string, data []byte) error
} }

View File

@ -339,7 +339,16 @@ func handleJoinGamePacket(c *Client, p pk.Packet) error {
} }
func handlePluginPacket(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 return nil
} }

View File

@ -62,7 +62,7 @@ type encryptionRequest struct {
VerifyToken []byte VerifyToken []byte
} }
func (e *encryptionRequest) Decode(r pk.ComByteReader) error { func (e *encryptionRequest) Decode(r pk.DecodeReader) error {
var serverID pk.String var serverID pk.String
if err := serverID.Decode(r); err != nil { if err := serverID.Decode(r); err != nil {
return err return err

View File

@ -1,9 +1,39 @@
package entity package entity
import (
"github.com/Tnze/go-mc/nbt"
pk "github.com/Tnze/go-mc/net/packet"
)
//Entity is the entity of minecraft //Entity is the entity of minecraft
type Entity struct { type Entity struct {
EntityID int //实体ID 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
} }

View File

@ -12,7 +12,7 @@ type Player struct {
OnGround bool OnGround bool
HeldItem int //拿着的物品栏位 HeldItem int //拿着的物品栏位
Inventory []entity.Solt Inventory []entity.Slot
Health float32 //血量 Health float32 //血量
Food int32 //饱食度 Food int32 //饱食度

View File

@ -39,7 +39,7 @@ func (m *Message) UnmarshalJSON(jsonMsg []byte) (err error) {
} }
//Decode a ChatMsg packet //Decode a ChatMsg packet
func (m *Message) Decode(r pk.ComByteReader) error { func (m *Message) Decode(r pk.DecodeReader) error {
var Len pk.VarInt var Len pk.VarInt
if err := Len.Decode(r); err != nil { if err := Len.Decode(r); err != nil {
return err return err

View File

@ -29,6 +29,7 @@ func main() {
c.Events.GameStart = onGameStart c.Events.GameStart = onGameStart
c.Events.ChatMsg = onChatMsg c.Events.ChatMsg = onChatMsg
c.Events.Disconnect = onDisconnect c.Events.Disconnect = onDisconnect
c.Events.PluginMessage = onPluginMessage
//JoinGame //JoinGame
err = c.HandleGame() err = c.HandleGame()
@ -51,3 +52,8 @@ func onDisconnect(c chat.Message) error {
log.Println("Disconnect:", c) log.Println("Disconnect:", c)
return nil return nil
} }
func onPluginMessage(channel string, data []byte) error {
log.Println("PluginMessage", channel, data)
return nil
}

View File

@ -2,6 +2,7 @@ package packet
import ( import (
"io" "io"
"io/ioutil"
"math" "math"
) )
@ -15,11 +16,11 @@ type FieldEncoder interface {
} }
type FieldDecoder interface { type FieldDecoder interface {
Decode(r ComByteReader) error Decode(r DecodeReader) error
} }
//ComByteReader is both io.Reader and io.ByteReader //DecodeReader is both io.Reader and io.ByteReader
type ComByteReader interface { type DecodeReader interface {
io.ByteReader io.ByteReader
io.Reader io.Reader
} }
@ -69,7 +70,7 @@ type (
) )
//ReadNBytes read N bytes from bytes.Reader //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) bs = make([]byte, n)
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
bs[i], err = r.ReadByte() bs[i], err = r.ReadByte()
@ -89,7 +90,7 @@ func (b Boolean) Encode() []byte {
} }
//Decode a Boolean //Decode a Boolean
func (b *Boolean) Decode(r ComByteReader) error { func (b *Boolean) Decode(r DecodeReader) error {
v, err := r.ReadByte() v, err := r.ReadByte()
if err != nil { if err != nil {
return err return err
@ -108,7 +109,7 @@ func (s String) Encode() (p []byte) {
} }
//Decode a String //Decode a String
func (s *String) Decode(r ComByteReader) error { func (s *String) Decode(r DecodeReader) error {
var l VarInt //String length var l VarInt //String length
if err := l.Decode(r); err != nil { if err := l.Decode(r); err != nil {
return err return err
@ -129,7 +130,7 @@ func (b Byte) Encode() []byte {
} }
//Decode a Byte //Decode a Byte
func (b *Byte) Decode(r ComByteReader) error { func (b *Byte) Decode(r DecodeReader) error {
v, err := r.ReadByte() v, err := r.ReadByte()
if err != nil { if err != nil {
return err return err
@ -144,7 +145,7 @@ func (ub UnsignedByte) Encode() []byte {
} }
//Decode a UnsignedByte //Decode a UnsignedByte
func (ub *UnsignedByte) Decode(r ComByteReader) error { func (ub *UnsignedByte) Decode(r DecodeReader) error {
v, err := r.ReadByte() v, err := r.ReadByte()
if err != nil { if err != nil {
return err return err
@ -163,7 +164,7 @@ func (s Short) Encode() []byte {
} }
//Decode a Short //Decode a Short
func (s *Short) Decode(r ComByteReader) error { func (s *Short) Decode(r DecodeReader) error {
bs, err := ReadNBytes(r, 2) bs, err := ReadNBytes(r, 2)
if err != nil { if err != nil {
return err return err
@ -183,7 +184,7 @@ func (us UnsignedShort) Encode() []byte {
} }
//Decode a UnsignedShort //Decode a UnsignedShort
func (us *UnsignedShort) Decode(r ComByteReader) error { func (us *UnsignedShort) Decode(r DecodeReader) error {
bs, err := ReadNBytes(r, 2) bs, err := ReadNBytes(r, 2)
if err != nil { if err != nil {
return err return err
@ -203,7 +204,7 @@ func (i Int) Encode() []byte {
} }
//Decode a Int //Decode a Int
func (i *Int) Decode(r ComByteReader) error { func (i *Int) Decode(r DecodeReader) error {
bs, err := ReadNBytes(r, 4) bs, err := ReadNBytes(r, 4)
if err != nil { if err != nil {
return err return err
@ -223,7 +224,7 @@ func (l Long) Encode() []byte {
} }
//Decode a Long //Decode a Long
func (l *Long) Decode(r ComByteReader) error { func (l *Long) Decode(r DecodeReader) error {
bs, err := ReadNBytes(r, 8) bs, err := ReadNBytes(r, 8)
if err != nil { if err != nil {
return err return err
@ -252,7 +253,7 @@ func (v VarInt) Encode() (vi []byte) {
} }
//Decode a VarInt //Decode a VarInt
func (v *VarInt) Decode(r ComByteReader) error { func (v *VarInt) Decode(r DecodeReader) error {
var n uint32 var n uint32
for i := 0; i < 5; i++ { //读数据前的长度标记 for i := 0; i < 5; i++ { //读数据前的长度标记
sec, err := r.ReadByte() sec, err := r.ReadByte()
@ -283,7 +284,7 @@ func (p Position) Encode() []byte {
} }
// Decode a Position // Decode a Position
func (p *Position) Decode(r ComByteReader) error { func (p *Position) Decode(r DecodeReader) error {
var v Long var v Long
if err := v.Decode(r); err != nil { if err := v.Decode(r); err != nil {
return err return err
@ -314,7 +315,7 @@ func (f Float) Encode() []byte {
} }
// Decode a Float // Decode a Float
func (f *Float) Decode(r ComByteReader) error { func (f *Float) Decode(r DecodeReader) error {
var v Int var v Int
if err := v.Decode(r); err != nil { if err := v.Decode(r); err != nil {
return err return err
@ -330,7 +331,7 @@ func (d Double) Encode() []byte {
} }
// Decode a Double // Decode a Double
func (d *Double) Decode(r ComByteReader) error { func (d *Double) Decode(r DecodeReader) error {
var v Long var v Long
if err := v.Decode(r); err != nil { if err := v.Decode(r); err != nil {
return err return err
@ -339,3 +340,23 @@ func (d *Double) Decode(r ComByteReader) error {
*d = Double(math.Float64frombits(uint64(v))) *d = Double(math.Float64frombits(uint64(v)))
return nil 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
}