From 03aea8ae6c4564f1f76bbb4c449e0ba13601934a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Sun, 26 Oct 2025 14:56:29 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(player):=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=8E=A9=E5=AE=B6=E4=B8=BB=E5=8A=A8=E9=80=80=E5=87=BA=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B8=A2=E5=87=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原有的踢出玩家逻辑提取到 Player 结构体的 Kick 方法中,统一处理登录状态判断、 发送错误码、关闭连接等操作。同时在 QuitSelf 方法中调用该逻辑,确保所有玩家被正确踢出。 移除了 server.go 中重复的踢出实现,并调整了相关包导入路径。 ``` --- common/socket/kick.go | 6 ++++++ logic/service/player/player.go | 18 ++++++++++++++++++ logic/service/player/server.go | 19 +------------------ 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/common/socket/kick.go b/common/socket/kick.go index 99cc86bc..b3160dc9 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 ccec99bd..95654ea5 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 ca98d4d6..0f02a4fb 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() }