From 71fc6de652f6865b6c93d086fac16000ccdbc5e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Thu, 1 Jan 2026 05:32:56 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(fight):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=AF=95=E7=82=BC=E4=B9=8B=E5=A1=94=E5=92=8C=E5=8B=87=E8=80=85?= =?UTF-8?q?=E4=B9=8B=E5=A1=94=E6=88=98=E6=96=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现FreshChoiceFightLevel方法,支持试炼之塔(2428)和勇者之塔(2414)的关卡选择 - 添加PetTawor方法,支持宠物对战功能,处理CMD 2429和2415命令 - 集成Boss配置服务,动态获取Boss信息并设置战斗属性 - 重构Boss性别检查字段访问路径,修正战斗逻辑错误 - 移除未使用的xmlres依赖 --- logic/controller/fight_tawor.go | 111 +++++++++++++++++++++++- logic/service/fight/boss/NewSeIdx_69.go | 2 +- logic/service/fight/cmd.go | 10 ++- logic/service/fight/input.go | 21 ----- modules/config/service/boss.go | 21 +++++ modules/config/service/tower600.go | 7 ++ 6 files changed, 145 insertions(+), 27 deletions(-) diff --git a/logic/controller/fight_tawor.go b/logic/controller/fight_tawor.go index c5534e1c3..bab317697 100644 --- a/logic/controller/fight_tawor.go +++ b/logic/controller/fight_tawor.go @@ -4,8 +4,13 @@ import ( "blazing/common/socket/errorcode" "blazing/common/utils" "blazing/logic/service/fight" + fightinfo "blazing/logic/service/fight/info" "blazing/logic/service/player" "blazing/logic/service/space/info" + "blazing/modules/blazing/model" + configmodel "blazing/modules/config/model" + "blazing/modules/config/service" + configservice "blazing/modules/config/service" "sync/atomic" "github.com/jinzhu/copier" @@ -25,17 +30,37 @@ import ( func (h Controller) FreshChoiceFightLevel(data *fight.C2S_FRESH_CHOICE_FIGHT_LEVEL, c *player.Player) (result *fight.S2C_FreshChoiceLevelRequestInfo, err errorcode.ErrorCode) { result = &fight.S2C_FreshChoiceLevelRequestInfo{} + c.Info.CurrentFreshStage = utils.Max(c.Info.CurrentFreshStage, 1) + c.Info.CurrentStage = utils.Max(c.Info.CurrentStage, 1) + if data.Level > 0 { + switch data.Head.CMD { + case 2428: //试炼之塔 + + c.Info.CurrentFreshStage = uint32((data.Level - 1) * 10) + case 2414: //勇者之塔 + c.Info.CurrentStage = uint32((data.Level - 1) * 10) + } + } switch data.Head.CMD { case 2428: //试炼之塔 - c.Info.CurrentFreshStage = utils.Max(c.Info.CurrentFreshStage, 1) + result.CurFightLevel = uint(c.Info.CurrentFreshStage) + boss := service.NewTower600Service().Boss(c.Info.CurrentFreshStage) + //next := service.NewTower600Service().Boss(c.Info.CurrentFreshStage + 1) + if boss != nil { + + for _, v := range boss.BossIds { + r := configservice.NewBossService().Get(v) + result.BossId = append(result.BossId, uint32(r.MonID)) + + } + + } case 2414: //勇者之塔 - c.Info.CurrentStage = utils.Max(c.Info.CurrentStage, 1) + result.CurFightLevel = uint(c.Info.CurrentStage) } - // 设置Boss ID为固定值10 - result.BossId = []uint32{10} // 重置玩家的Canmon标志位为0,表示可以刷怪 atomic.StoreUint32(&c.Canmon, 0) // 在函数结束时将玩家传送到对应地图 @@ -52,3 +77,81 @@ func (h Controller) FreshLeaveFightLevel(data *fight.FRESH_LEAVE_FIGHT_LEVEL, c c.SendPackCmd(2001, out) return result, 0 } + +func (h Controller) PetTawor(data *fight.StartTwarInboundInfo, c *player.Player) (result *fight.S2C_ChoiceLevelRequestInfo, err errorcode.ErrorCode) { + if !c.CanFight() { + return nil, errorcode.ErrorCodes.ErrSystemError + } + c.Fightinfo.Mode = fightinfo.BattleMode.MULTI_MODE + c.Fightinfo.Status = fightinfo.BattleMode.FIGHT_WITH_NPC + monsterInfo := &model.PlayerInfo{} + var boss *configmodel.BaseTowerConfig + result = &fight.S2C_ChoiceLevelRequestInfo{} + switch data.Head.CMD { + case 2429: //试炼之塔 + boss = service.NewTower600Service().Boss(c.Info.CurrentFreshStage) + next := service.NewTower600Service().Boss(c.Info.CurrentFreshStage + 1) + if next != nil { + for _, v := range next.BossIds { + r := configservice.NewBossService().Get(v) + result.BossID = append(result.BossID, uint32(r.MonID)) + + } + } + + result.CurFightLevel = uint32(c.Info.CurrentFreshStage) + case 2415: //勇者之塔 + result.CurFightLevel = uint32(c.Info.CurrentStage) + + } + + for i, v := range boss.BossIds { + r := configservice.NewBossService().Get(v) + if r != nil { + + monster := model.GenPetInfo(int(r.MonID), int(r.Lv), int(r.Nature), 0, int(r.Lv), nil) + if r.Hp != 0 { + monster.Hp = uint32(r.Hp) + monster.MaxHp = uint32(r.Hp) + + } + if len(r.Prop) != 0 { + + copy(monster.Prop[:], r.Prop) + + } + + if len(r.SKill) != 0 { + for i := 0; i < len(monster.SkillList); i++ { + if r.SKill[i] != 0 { + monster.SkillList[i].ID = r.SKill[i] + } + + } + + } + //todo 特性填装 + monster.CatchTime = uint32(i) + monsterInfo.PetList = append(monsterInfo.PetList, *monster) + } + + } + + ai := player.NewAI_player(monsterInfo) + _, err = fight.NewFight(c, ai, func(foi *fightinfo.FightOverInfo) { + if foi.Reason == 0 && foi.WinnerId == c.Info.UserID { //我放获胜 + switch data.Head.CMD { + case 2429: //试炼之塔 + + c.Info.CurrentFreshStage++ + + case 2415: //勇者之塔 + + } + + } + + }) ///开始对战,房主方以及被邀请方 + + return +} diff --git a/logic/service/fight/boss/NewSeIdx_69.go b/logic/service/fight/boss/NewSeIdx_69.go index f9ccddf5f..df4d7178d 100644 --- a/logic/service/fight/boss/NewSeIdx_69.go +++ b/logic/service/fight/boss/NewSeIdx_69.go @@ -21,7 +21,7 @@ func (e *NewSel69) Damage_ADD(t *info.DamageZone) bool { } // 检查对手性别 - if e.Ctx().Opp.CurrentPet.Info.Gender != int(e.Args()[0].IntPart()) { + if e.Ctx().Opp.CurrentPet.Gender != int(e.Args()[0].IntPart()) { return true } diff --git a/logic/service/fight/cmd.go b/logic/service/fight/cmd.go index 7aa6a3f92..d6a09ef26 100644 --- a/logic/service/fight/cmd.go +++ b/logic/service/fight/cmd.go @@ -20,6 +20,12 @@ type ChallengeBossInboundInfo struct { type NullOutboundInfo struct { } +type S2C_ChoiceLevelRequestInfo struct { + CurFightLevel uint32 `json:"curFightLevel"` // 当前战斗层数 + BossLen uint32 `struc:"sizeof=BossID"` + BossID []uint32 `json:"bossId"` // 下一层的精灵id数组 +} + // 准备战斗包 type ReadyToFightInboundInfo struct { Head common.TomeeHeader `cmd:"2404" struc:"skip"` @@ -34,7 +40,9 @@ type EscapeFightInboundInfo struct { type StartPetWarInboundInfo struct { Head common.TomeeHeader `cmd:"2431" struc:"skip"` } - +type StartTwarInboundInfo struct { + Head common.TomeeHeader `cmd:"2429|2415" struc:"skip"` +} type ARENA_SET_OWENR struct { Head common.TomeeHeader `cmd:"2417" struc:"skip"` } diff --git a/logic/service/fight/input.go b/logic/service/fight/input.go index 24731defb..f09bc4613 100644 --- a/logic/service/fight/input.go +++ b/logic/service/fight/input.go @@ -2,7 +2,6 @@ package fight import ( "blazing/common/data" - "blazing/common/data/xmlres" "blazing/common/socket/errorcode" "blazing/common/utils" "blazing/cool" @@ -132,26 +131,6 @@ func (f *FightC) LoadPercent(c common.PlayerI, percent int32) { var meetpet = make(map[int]model.PetInfo) -func initmeetpet() { - meetpet = make(map[int]model.PetInfo) - for i, v := range xmlres.PetMAP { - - if v.EvolvesTo != 0 { - continue - } - if v.EvolvFlag != 0 { - continue - } - if v.ID > 2000 { - continue - } - - r := model.GenPetInfo(int(v.ID), 24, -1, -1, 100, nil) - - meetpet[i] = *r - - } -} func (f *FightC) initplayer(c common.PlayerI) (*input.Input, errorcode.ErrorCode) { if !c.CanFight() { diff --git a/modules/config/service/boss.go b/modules/config/service/boss.go index 0643dbeba..a8b906c0e 100644 --- a/modules/config/service/boss.go +++ b/modules/config/service/boss.go @@ -3,6 +3,8 @@ package service import ( "blazing/cool" "blazing/modules/config/model" + + "github.com/gogf/gf/v2/database/gdb" ) type BossService struct { @@ -13,6 +15,25 @@ func NewBossService() *BossService { return &BossService{ &cool.Service{ Model: model.NewBossConfig(), + PageQueryOp: &cool.QueryOp{ + KeyWordField: []string{"desc"}, + }, }, } } + +func (s *BossService) Get(id uint32) *model.BossConfig { + if id == 0 { + return nil + } + var item *model.BossConfig + cool.DBM(s.Model).Where("id", id). + Cache(gdb.CacheOption{ + // Duration: time.Hour, + + Force: false, + }).Scan(&item) + + return item + +} diff --git a/modules/config/service/tower600.go b/modules/config/service/tower600.go index 47d8461ce..eb00e728d 100644 --- a/modules/config/service/tower600.go +++ b/modules/config/service/tower600.go @@ -16,3 +16,10 @@ func NewTower600Service() *Tower600Service { }, } } + +func (s *Tower600Service) Boss(tower_level uint32) *model.BaseTowerConfig { + var config model.Tower600Config + cool.DBM(s.Model).Where("tower_level = ?", tower_level).Scan(&config) + + return &config.BaseTowerConfig +}