diff --git a/zinx_app_demo/mmo_game/core/player.go b/zinx_app_demo/mmo_game/core/player.go index 5c84a76..4e12bf7 100644 --- a/zinx_app_demo/mmo_game/core/player.go +++ b/zinx_app_demo/mmo_game/core/player.go @@ -194,6 +194,26 @@ func (p *Player) GetSurroundingPlayers() []*Player { return players } +//玩家下线 +func (p *Player) LostConnection() { + //1 获取周围AOI九宫格内的玩家 + players := p.GetSurroundingPlayers() + + //2 封装MsgID:201消息 + msg := &pb.SyncPid{ + Pid:p.Pid, + } + + //3 向周围玩家发送消息 + for _, player := range players { + player.SendMsg(201, msg) + } + + //4 世界管理器将当前玩家从AOI中摘除 + WorldMgrObj.AoiMgr.RemoveFromGridByPos(int(p.Pid), p.X, p.Z) + WorldMgrObj.RemovePlayerByPid(p.Pid) +} + /* 发送消息给客户端, diff --git a/zinx_app_demo/mmo_game/server.go b/zinx_app_demo/mmo_game/server.go index ff24ba6..2fd62b1 100644 --- a/zinx_app_demo/mmo_game/server.go +++ b/zinx_app_demo/mmo_game/server.go @@ -12,26 +12,49 @@ import ( func OnConnecionAdd(conn ziface.IConnection) { //创建一个玩家 player := core.NewPlayer(conn) + //同步当前的PlayerID给客户端, 走MsgID:1 消息 player.SyncPid() + //同步当前玩家的初始化坐标信息给客户端,走MsgID:200消息 player.BroadCastStartPosition() + //将当前新上线玩家添加到worldManager中 core.WorldMgrObj.AddPlayer(player) + //将该连接绑定属性Pid conn.SetProperty("pid", player.Pid) + //同步周边玩家上线信息,与现实周边玩家信息 player.SyncSurrounding() fmt.Println("=====> Player pidId = ", player.Pid, " arrived ====") } +//当客户端断开连接的时候的hook函数 +func OnConnectionLost(conn ziface.IConnection) { + //获取当前连接的Pid属性 + pid, _ := conn.GetProperty("pid") + + //根据pid获取对应的玩家对象 + player := core.WorldMgrObj.GetPlayerByPid(pid.(int32)) + + //触发玩家下线业务 + if pid != nil { + player.LostConnection() + } + + fmt.Println("====> Player ", pid , " left =====") + +} + func main() { //创建服务器句柄 s := znet.NewServer() //注册客户端连接建立和丢失函数 s.SetOnConnStart(OnConnecionAdd) + s.SetOnConnStop(OnConnectionLost) //注册路由 s.AddRouter(2, &api.WorldChatApi{})