```
feat(player): 实现玩家主动退出并优化踢出逻辑 将原有的踢出玩家逻辑提取到 Player 结构体的 Kick 方法中,统一处理登录状态判断、 发送错误码、关闭连接等操作。同时在 QuitSelf 方法中调用该逻辑,确保所有玩家被正确踢出。 移除了 server.go 中重复的踢出实现,并调整了相关包导入路径。 ```
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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("链接错误,取消发包")
|
||||
|
||||
@@ -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()
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user