feat(player): 实现玩家主动退出并优化踢出逻辑

将原有的踢出玩家逻辑提取到 Player 结构体的 Kick 方法中,统一处理登录状态判断、
发送错误码、关闭连接等操作。同时在 QuitSelf 方法中调用该逻辑,确保所有玩家被正确踢出。
移除了 server.go 中重复的踢出实现,并调整了相关包导入路径。
```
This commit is contained in:
2025-10-26 14:56:29 +08:00
parent 4306e2db53
commit 03aea8ae6c
3 changed files with 25 additions and 18 deletions

View File

@@ -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
}

View File

@@ -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("链接错误,取消发包")

View File

@@ -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()
}