feat: 增强踢人逻辑与BOSS脚本支持
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful

优化踢人超时处理和僵尸连接清理,支持BOSS动作脚本并增加测试,修复事件匹配与战斗循环中的并发问题。
This commit is contained in:
xinian
2026-04-05 21:59:22 +08:00
committed by cnb
parent 36dd93b076
commit c021b40fbe
16 changed files with 457 additions and 151 deletions

View File

@@ -179,19 +179,51 @@ func (s *InfoService) Gensession() string {
func (s *InfoService) Kick(id uint32) error {
useid1, err := share.ShareManager.GetUserOnline(id)
if err != nil {
return err
if err != nil || useid1 == 0 {
// 请求进入时已经离线,视为成功
return nil
}
cl, ok := cool.GetClientOnly(useid1)
if ok {
err := cl.KickPerson(id) //实现指定服务器踢人
if err != nil {
return err
}
if !ok || cl == nil {
// 目标服务器不在线,清理僵尸在线标记并视为成功
_ = share.ShareManager.DeleteUserOnline(id)
return nil
}
resultCh := make(chan error, 1)
go func() {
resultCh <- cl.KickPerson(id) // 实现指定服务器踢人
}()
select {
case callErr := <-resultCh:
if callErr == nil {
return nil
}
// 调用失败后兜底:若已离线/切服/目标服不在线则视为成功
useid2, err2 := share.ShareManager.GetUserOnline(id)
if err2 != nil || useid2 == 0 || useid2 != useid1 {
return nil
}
if cl2, ok2 := cool.GetClientOnly(useid2); !ok2 || cl2 == nil {
_ = share.ShareManager.DeleteUserOnline(id)
return nil
}
return callErr
case <-time.After(3 * time.Second):
// 防止异常场景下无限等待;超时不按成功处理
useid2, err2 := share.ShareManager.GetUserOnline(id)
if err2 != nil || useid2 == 0 || useid2 != useid1 {
return nil
}
if cl2, ok2 := cool.GetClientOnly(useid2); !ok2 || cl2 == nil {
_ = share.ShareManager.DeleteUserOnline(id)
return nil
}
return fmt.Errorf("kick timeout, user still online: uid=%d server=%d", id, useid2)
}
return nil
}
// saveToLocalFile 兜底保存将数据写入本地lose文件夹