From 6da7f0b3f04ba325876b5b65fc96168197af6f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Mon, 10 Nov 2025 03:23:32 +0800 Subject: [PATCH] =?UTF-8?q?```=20refactor(fight):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8A=80=E8=83=BD=E6=8B=B7=E8=B4=9D=E9=80=BB=E8=BE=91=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=88=98=E6=96=97=E5=BE=AA=E7=8E=AF=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 `copyskill` 方法的参数类型从 `*info.SkillEntity` 改为 `*action.SelectSkillAction` - 在 `copyskill` 中增加对 nil 的判断,避免空指针 panic - 调整 `battleLoop` 中 defer 逻辑,确保资源正确释放和战斗结束信息发送 - 移动 `SendFightEndInfo` 到 defer 中执行,简化主循环逻辑 - 将 `Fightpool` 类型由 `*ants.Pool` 改为 `* --- logic/main.go | 2 +- logic/service/fight/fightc.go | 14 +++++++++----- logic/service/fight/loop.go | 18 ++++++++++-------- logic/service/fight/playeraction.go | 5 ++--- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/logic/main.go b/logic/main.go index 50f2fb0e2..b7bacf34f 100644 --- a/logic/main.go +++ b/logic/main.go @@ -33,7 +33,7 @@ func PprofWeb() { } } func signalHandlerForMain(sig os.Signal) { - fight.Fightpool.Release() + fight.Fightpool.Free() player.Mainplayer.Range(func(key uint32, value *player.Player) bool { value.Save() diff --git a/logic/service/fight/fightc.go b/logic/service/fight/fightc.go index 5ed7044ac..4a6e9ffd8 100644 --- a/logic/service/fight/fightc.go +++ b/logic/service/fight/fightc.go @@ -342,10 +342,14 @@ func IsNil(x interface{}) bool { rv := reflect.ValueOf(x) return rv.Kind() == reflect.Ptr && rv.IsNil() } -func (f *FightC) copyskill(t *info.SkillEntity) *info.SkillEntity { +func (f *FightC) copyskill(t *action.SelectSkillAction) *info.SkillEntity { + if t.SkillEntity == nil { + return nil - oldskill, _ := deepcopy.Anything(t) //备份技能 - oldskill.(*info.SkillEntity).Rand = f.rand //拷贝后随机数丢失 + } + + oldskill, _ := deepcopy.Anything(t.SkillEntity) //备份技能 + oldskill.(*info.SkillEntity).Rand = f.rand //拷贝后随机数丢失 return oldskill.(*info.SkillEntity) } @@ -429,11 +433,11 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) { var currentskill *info.SkillEntity //当前技能 if i == 0 { // attacker, defender = f.First, f.Second - oldskill = f.copyskill(fattack.SkillEntity) + oldskill = f.copyskill(fattack) } else { attacker, defender = f.Second, f.First - oldskill = f.copyskill(sattack.SkillEntity) + oldskill = f.copyskill(sattack) } diff --git a/logic/service/fight/loop.go b/logic/service/fight/loop.go index ff1ebf156..dc2b77b82 100644 --- a/logic/service/fight/loop.go +++ b/logic/service/fight/loop.go @@ -15,6 +15,16 @@ import ( ) func (f *FightC) battleLoop() { + defer func() { + f.Broadcast(func(ff *input.Input) { + //todo 将血量和技能pp传回enterturn + //<-time.After(10000) + ff.Player.SendFightEndInfo(f.FightOverInfo) + + }) + close(f.actionChan) + close(f.overchan) + }() f.actionChan = make(chan action.BattleActionI, 2) fmt.Println("战斗开始精灵", f.Our.Player.GetInfo().PetList[0].CatchTime) @@ -24,14 +34,6 @@ func (f *FightC) battleLoop() { for { if f.closefight { - f.Broadcast(func(ff *input.Input) { - //todo 将血量和技能pp传回enterturn - //<-time.After(10000) - ff.Player.SendFightEndInfo(f.FightOverInfo) - - }) - close(f.actionChan) - close(f.overchan) break } diff --git a/logic/service/fight/playeraction.go b/logic/service/fight/playeraction.go index f49a90c83..df0175713 100644 --- a/logic/service/fight/playeraction.go +++ b/logic/service/fight/playeraction.go @@ -9,7 +9,6 @@ import ( "blazing/logic/service/fight/input" "blazing/logic/service/player" "context" - "math" "github.com/gogf/gf/v2/util/gconv" "github.com/jinzhu/copier" @@ -156,9 +155,9 @@ func (f *FightC) ReadyFight(c common.PlayerI) { } } -var Fightpool *ants.Pool +var Fightpool *ants.MultiPool func init() { - Fightpool, _ = ants.NewPool(math.MaxInt32) + Fightpool, _ = ants.NewMultiPool(100, 10, ants.LeastTasks) //defer p.Release() }