diff --git a/common/rpc/client.go b/common/rpc/client.go index 4b2cea990..77b215abe 100644 --- a/common/rpc/client.go +++ b/common/rpc/client.go @@ -37,19 +37,6 @@ func GetServerInfoList(isdebug int32) []ServerInfo { ret1 = append(ret1, *tt) } - //t, ok := cool.GetClient(v.Port) - - // if ok { - // cool.Logger.Info(context.TODO(), "服务器假踢人") - // err := t.KickPerson(0) //实现指定服务器踢人 - - // if err == nil { - // // tt.Friends = v.Friends - // ret1 = append(ret1, *tt) - // } - - // } - } array.Sort(&ret1, func(a ServerInfo, b ServerInfo) bool { diff --git a/common/socket/kick.go b/common/socket/kick.go index 2cb1e6125..403c29808 100644 --- a/common/socket/kick.go +++ b/common/socket/kick.go @@ -5,6 +5,7 @@ import ( "blazing/cool" "blazing/logic/service/common" "blazing/logic/service/player" + "blazing/modules/base/service" "context" "fmt" "time" @@ -16,24 +17,45 @@ type Broadcast struct { func (s *Server) Broadcast(t string) int { cool.Logger.Info(context.TODO(), "全服广播", t) - var count int + player.Mainplayer.Range(func(key uint32, value *player.Player) bool { - count++ + value.SendPackCmd(50003, &Broadcast{ Name: t, }) - return false + return true }) - return count + return player.Mainplayer.Count() } + +const kickTimeout = 5 * time.Second + func (s *Server) KickPerson(a int) error { cool.Logger.Info(context.TODO(), "检测到踢人请求", a) if a == 0 { return nil } - return player.KickPlayer(uint32(a)) + // 1. 创建结果通道 + resultChan := make(chan error, 1) + + // 2. 启动 goroutine 执行踢人操作 + go func() { + err := player.KickPlayer(uint32(a)) + resultChan <- err + }() + + // 3. 用 select 监听结果和超时信号 + select { + case err := <-resultChan: + // 正常完成 + return err + case <-time.After(kickTimeout): + service.NewBaseSysLogService().RecordKick(uint32(a), fmt.Errorf("踢人操作超时(超时时间:%v)", kickTimeout).Error()) + // 超时触发,返回自定义或内置超时错误 + return fmt.Errorf("踢人操作超时(超时时间:%v)", kickTimeout) + } } // 参数不为0是强制踢出 diff --git a/logic/service/fight/effect/effect_status.go b/logic/service/fight/effect/effect_status.go index 7dddd2ebb..bdb7a368e 100644 --- a/logic/service/fight/effect/effect_status.go +++ b/logic/service/fight/effect/effect_status.go @@ -100,7 +100,7 @@ type ParasiticSeed struct { func (e *ParasiticSeed) SwitchOut(in *input.Input) bool { //如果我放切换 - if in == e.Ctx().Our && e.Ctx().Our.CurrentPet.GetHP().IntPart() != 0 { + if in == e.Ctx().Our { e.Alive(false) } return true @@ -118,6 +118,9 @@ func (e *ParasiticSeed) ActionStartEx(attacker, defender *action.SelectSkillActi Type: info.DamageType.True, Damage: damage, }) + if e.Ctx().Opp.CurrentPet.GetHP().IntPart() == 0 { + return true + } // 给对方回血(不受回血限制影响) e.Ctx().Opp.Heal(e.Ctx().Our, nil, damage) diff --git a/logic/service/fight/loop.go b/logic/service/fight/loop.go index 34eeb0384..a3d77d622 100644 --- a/logic/service/fight/loop.go +++ b/logic/service/fight/loop.go @@ -18,23 +18,42 @@ import ( "time" "github.com/alpacahq/alpacadecimal" + "github.com/gogf/gf/v2/os/glog" "github.com/gogf/gf/v2/util/gconv" ) +type MyWriter struct { + logger *glog.Logger + user uint32 +} + +func (w *MyWriter) Write(p []byte) (n int, err error) { + var ( + s = string(p) + //ctx = context.Background() + ) + + service.NewBaseSysLogService().RecordFight(w.user, s) + return w.logger.Write(p) +} +func init() { + //var ctx = context.Background() + glog.SetWriter(&MyWriter{ + logger: glog.New(), + }) +} func (f *FightC) battleLoop() { defer func() { if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值 // 1. 打印错误信息 - + var ctx = context.Background() cool.Logger.Error(context.TODO(), "panic 错误:", err) + glog.Errorf(ctx, "%+v", err) f.Broadcast(func(ff *input.Input) { if p, ok := ff.Player.(*player.Player); ok { head := common.NewTomeeHeader(1001, p.Info.UserID) head.Result = uint32(errorcode.ErrorCodes.ErrSystemBusyTryLater) - service.NewBaseSysLogService().RecordFight(p.Info.UserID, gconv.String(err)) - - //实际上这里有个问题,会造成重复保存问题 p.SendPack(head.Pack(nil)) } diff --git a/modules/base/service/base_sys_log.go b/modules/base/service/base_sys_log.go index 80a01d1c4..ce504a305 100644 --- a/modules/base/service/base_sys_log.go +++ b/modules/base/service/base_sys_log.go @@ -128,6 +128,25 @@ func (s *BaseSysLogService) RecordFight(userid uint32, desc string) { "params": baseSysLog.Params, }) } +func (s *BaseSysLogService) RecordKick(userid uint32, desc string) { + + baseSysLog := model.NewBaseSysLog() + baseSysLog.UserID = uint(userid) + baseSysLog.Action = "kick" + + baseSysLog.Params = desc + m := cool.DBM(s.Model) + if baseSysLog.UserID == 10001 { + return + } + m.Insert(g.Map{ + "userId": baseSysLog.UserID, + "action": baseSysLog.Action, + "ip": baseSysLog.IP, + //"ipAddr": baseSysLog.IPAddr, + "params": baseSysLog.Params, + }) +} // Clear 清除日志 func (s *BaseSysLogService) Clear(isAll bool) (err error) { diff --git a/modules/config/service/pet_fusion_material_service.go b/modules/config/service/pet_fusion_material_service.go index 1a65e65bd..1101c8bee 100644 --- a/modules/config/service/pet_fusion_material_service.go +++ b/modules/config/service/pet_fusion_material_service.go @@ -7,7 +7,6 @@ import ( "blazing/modules/dict/service" "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/grand" ) @@ -28,7 +27,7 @@ func NewPetFusionMaterialService() *PetFusionMaterialService { } // 获取融合材料的特性,返回两个值,一个是指定的特性,另一个是如果配方没找到的情况下,默认的配置 -func (s *PetFusionMaterialService) Data(Material1 [4]uint32) uint32 { +func (s *PetFusionMaterialService) Data(Material1 [4]uint32) int32 { fusions := service.NewDictInfoService().GetData("fusion") @@ -58,23 +57,23 @@ func (s *PetFusionMaterialService) Data(Material1 [4]uint32) uint32 { //这时候有可能效果是空的,那么这时候就再次查询默认的特性,保证每次必会生成一个数据库有的特性 //也许这个时候的特性配方就是随机从数据库中查找一个特性 - if effect == nil { - effect2s := service.NewDictInfoService().GetData("effect") - for _, v := range effect2s { - return gconv.Uint32(v.Value) - } + // if effect == nil { + // effect2s := service.NewDictInfoService().GetData("effect") + // for _, v := range effect2s { + // return gconv.Uint32(v.Value) + // } - } + // } r := grand.Intn(4) switch r { case 0: - return effect.Trait1Idx + return int32(effect.Trait1Idx) case 1: - return effect.Trait2Idx + return int32(effect.Trait2Idx) case 2: - return effect.Trait3Idx + return int32(effect.Trait3Idx) case 3: - return effect.Trait4Idx + return int32(effect.Trait4Idx) } - return 0 + return -1 }