event system

This commit is contained in:
JunDao
2019-05-02 00:39:43 +08:00
parent 45820c10f5
commit 1f0bdf19a3
4 changed files with 84 additions and 22 deletions

View File

@ -16,6 +16,7 @@ type Client struct {
settings Settings settings Settings
// wd world //the map data // wd world //the map data
Events eventBroker
} }
//NewClient init and return a new Client //NewClient init and return a new Client

11
bot/event.go Normal file
View File

@ -0,0 +1,11 @@
package bot
import (
"github.com/Tnze/go-mc/chat"
)
type eventBroker struct {
GameStart func() error
ChatMsg func(msg chat.Message) error
Disconnect func(reason chat.Message) error
}

View File

@ -6,6 +6,7 @@ import (
// "time" // "time"
"fmt" "fmt"
"github.com/Tnze/go-mc/chat"
"github.com/Tnze/go-mc/data" "github.com/Tnze/go-mc/data"
pk "github.com/Tnze/go-mc/net/packet" pk "github.com/Tnze/go-mc/net/packet"
// "github.com/Tnze/gomcbot/world/entity" // "github.com/Tnze/gomcbot/world/entity"
@ -31,17 +32,24 @@ func (c *Client) HandleGame() error {
return fmt.Errorf("bot: read packet fail: %v", err) return fmt.Errorf("bot: read packet fail: %v", err)
} }
//handle packets //handle packets
err = c.handlePacket(p) disconnect, err := c.handlePacket(p)
if err != nil { if err != nil {
return fmt.Errorf("handle packet 0x%X error: %v", p.ID, err) return fmt.Errorf("handle packet 0x%X error: %v", p.ID, err)
} }
if disconnect {
return nil
}
} }
} }
func (c *Client) handlePacket(p pk.Packet) (err error) { func (c *Client) handlePacket(p pk.Packet) (disconnect bool, err error) {
switch p.ID { switch p.ID {
case data.JoinGame: case data.JoinGame:
err = handleJoinGamePacket(c, p) err = handleJoinGamePacket(c, p)
if err == nil && c.Events.GameStart != nil {
err = c.Events.GameStart()
}
case data.PluginMessageClientbound: case data.PluginMessageClientbound:
err = handlePluginPacket(c, p) err = handlePluginPacket(c, p)
case data.ServerDifficulty: case data.ServerDifficulty:
@ -88,15 +96,14 @@ func (c *Client) handlePacket(p pk.Packet) (err error) {
case data.UpdateHealth: case data.UpdateHealth:
//// err = handleUpdateHealthPacket(c, p) //// err = handleUpdateHealthPacket(c, p)
case data.ChatMessageClientbound: case data.ChatMessageClientbound:
////err = handleChatMessagePacket(c, p) err = handleChatMessagePacket(c, p)
case data.BlockChange: case data.BlockChange:
////err = handleBlockChangePacket(c, p) ////err = handleBlockChangePacket(c, p)
case data.MultiBlockChange: case data.MultiBlockChange:
////err = handleMultiBlockChangePacket(c, p) ////err = handleMultiBlockChangePacket(c, p)
case 0x1A: case 0x1A:
// should assumes that the server has already closed the connection by the time the packet arrives. err = handleDisconnectPacket(c, p)
disconnect = true
err = fmt.Errorf("disconnect")
case 0x16: case 0x16:
// err = handleSetSlotPacket(g, reader) // err = handleSetSlotPacket(g, reader)
case 0x51: case 0x51:
@ -142,6 +149,25 @@ func (c *Client) handlePacket(p pk.Packet) (err error) {
// return nil // return nil
// } // }
func handleDisconnectPacket(c *Client, p pk.Packet) error {
var rowReason pk.String
err := p.Scan(&rowReason)
if err != nil {
return err
}
if c.Events.Disconnect != nil {
var reason chat.Message
err := reason.UnmarshalJSON([]byte(rowReason))
if err != nil {
return err
}
return c.Events.Disconnect(reason)
}
return nil
}
// func handleSetSlotPacket(g *Client, r *bytes.Reader) error { // func handleSetSlotPacket(g *Client, r *bytes.Reader) error {
// windowID, err := r.ReadByte() // windowID, err := r.ReadByte()
// if err != nil { // if err != nil {
@ -233,23 +259,25 @@ func (c *Client) handlePacket(p pk.Packet) (err error) {
// return nil // return nil
// } // }
// func handleChatMessagePacket(c *Client, p pk.Packet) error { func handleChatMessagePacket(c *Client, p pk.Packet) error {
// var ( var (
// s pk.String s pk.String
// pos pk.Byte pos pk.Byte
// ) )
// if err := p.Scan(&s, &pos); err != nil { if err := p.Scan(&s, &pos); err != nil {
// return err return err
// } }
// cm, err := newChatMsg([]byte(s)) var cm chat.Message
// if err != nil { err := cm.UnmarshalJSON([]byte(s))
// return err
// }
// return nil if err == nil && c.Events.ChatMsg != nil {
// } err = c.Events.ChatMsg(cm)
}
return err
}
// func handleUpdateHealthPacket(c *Client, p pk.Packet) (err error) { // func handleUpdateHealthPacket(c *Client, p pk.Packet) (err error) {
// var ( // var (

View File

@ -1,21 +1,43 @@
package main package main
import ( import (
bot "github.com/Tnze/gomcbot" "github.com/Tnze/go-mc/bot"
"github.com/Tnze/go-mc/chat"
"log" "log"
) )
func main() { func main() {
c := bot.NewClient() c := bot.NewClient()
//Login
err := c.JoinServer("localhost", 25565) err := c.JoinServer("localhost", 25565)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
log.Println("Login success") log.Println("Login success")
//Regist event handlers
c.Events.GameStart = onGameStart
c.Events.ChatMsg = onChatMsg
c.Events.Disconnect = onDisconnect
//JoinGame
err = c.HandleGame() err = c.HandleGame()
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
} }
func onGameStart() error {
log.Println("Game start")
return nil //if err isn't nil, HandleGame() will return it.
}
func onChatMsg(c chat.Message) error {
log.Println("Chat:", c)
return nil
}
func onDisconnect(c chat.Message) error {
log.Println("Disconnect:", c)
return nil
}