diff --git a/common/socket/kick.go b/common/socket/kick.go index 99cc86bc1..b3160dc95 100644 --- a/common/socket/kick.go +++ b/common/socket/kick.go @@ -15,6 +15,12 @@ func (h *Server) KickPerson(a int) error { func (h *Server) QuitSelf(a int) error { //TODO 这里待退出 fmt.Println("检测到退出请求") + h.quit = true + + player.Mainplayer.Range(func(key uint32, value *player.Player) bool { + value.Kick() + return true + }) return nil } diff --git a/logic/service/player/player.go b/logic/service/player/player.go index ccec99bdb..95654ea56 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -272,6 +272,24 @@ func (p *Player) ItemAdd(t ...model.SingleItemInfo) (result []model.SingleItemIn return } +func (player1 *Player) Kick() { + if player1.IsLogin { + //取成功,否则创建 + //player1.Save() //先保存数据再返回 + head := NewTomeeHeader(1001, player1.Info.UserID) + head.Result = uint32(errorcode.ErrorCodes.ErrAccountLoggedInElsewhere) + //实际上这里有个问题,会造成重复保存问题 + + player1.SendPack(head.Pack(nil)) + player1.MainConn.Context().(*ClientData).CloseChan = make(chan struct{}) + player1.MainConn.Context().(*ClientData).Mu.Lock() + player1.MainConn.Close() + player1.MainConn.Context().(*ClientData).Mu.Unlock() + // clientdata.Player = player + + <-player1.MainConn.Context().(*ClientData).CloseChan + } +} func (p *Player) SendPack(b []byte) error { if _, ok := p.MainConn.Context().(*ClientData); !ok { return fmt.Errorf("链接错误,取消发包") diff --git a/logic/service/player/server.go b/logic/service/player/server.go index ca98d4d6c..0f02a4fbe 100644 --- a/logic/service/player/server.go +++ b/logic/service/player/server.go @@ -1,8 +1,6 @@ package player import ( - "blazing/common/socket/errorcode" - "github.com/panjf2000/gnet/v2" ) @@ -33,22 +31,7 @@ func KickPlayer(userid uint32) error { //踢出玩家 //TODO 返回错误码 //var player *entity.Player if player1, ok := Mainplayer.Load(userid); ok { - if player1.IsLogin { - //取成功,否则创建 - //player1.Save() //先保存数据再返回 - head := NewTomeeHeader(1001, userid) - head.Result = uint32(errorcode.ErrorCodes.ErrAccountLoggedInElsewhere) - //实际上这里有个问题,会造成重复保存问题 - - player1.SendPack(head.Pack(nil)) - player1.MainConn.Context().(*ClientData).CloseChan = make(chan struct{}) - player1.MainConn.Context().(*ClientData).Mu.Lock() - player1.MainConn.Close() - player1.MainConn.Context().(*ClientData).Mu.Unlock() - // clientdata.Player = player - - <-player1.MainConn.Context().(*ClientData).CloseChan - } + player1.Kick() }