event system
This commit is contained in:
@ -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
11
bot/event.go
Normal 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
|
||||||
|
}
|
@ -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 (
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user