package controller 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" configmodel "blazing/modules/config/model" "blazing/modules/config/service" "blazing/modules/player/model" "sync/atomic" "github.com/gogf/gf/v2/util/gconv" "github.com/jinzhu/copier" ) func (h Controller) FreshOPEN(data *fight.C2S_OPEN_DARKPORTAL, c *player.Player) (result *fight.S2C_OPEN_DARKPORTAL, err errorcode.ErrorCode) { result = &fight.S2C_OPEN_DARKPORTAL{} c.Info.CurrentFreshStage = utils.Max(c.Info.CurrentFreshStage, 1) c.Info.CurrentStage = utils.Max(c.Info.CurrentStage, 1) boss := service.NewTower110Service().Boss(uint32(data.Level)) result = &fight.S2C_OPEN_DARKPORTAL{} for _, v := range boss.BossIds { r := service.NewBossService().Get(v) result.CurBossID = uint32(r.MonID) } c.CurDark = uint32(data.Level) defer c.GetSpace().LeaveMap(c) return result, 0 } // FreshChoiceFightLevel 处理玩家选择挑战模式(试炼之塔或勇者之塔) // 根据不同的CMD值设置玩家的挑战状态和地图信息,并返回当前挑战层级信息 // 参数: // // data: 客户端发送的挑战层级选择请求数据,包含CMD和挑战层级 // c: 玩家对象,包含玩家的详细信息 // // 返回值: // // result: 服务器返回给客户端的挑战层级信息,包含当前战斗层级和Boss ID // err: 错误码,表示处理过程中是否出现错误 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) + 1 case 2414: //勇者之塔 c.Info.CurrentStage = uint32((data.Level-1)*10) + 1 } } var boss *configmodel.BaseTowerConfig switch data.Head.CMD { case 2428: //试炼之塔 result.CurFightLevel = uint32(c.Info.CurrentFreshStage) boss = service.NewTower600Service().Boss(c.Info.CurrentFreshStage) case 2414: //勇者之塔 result.CurFightLevel = uint32(c.Info.CurrentStage) boss = service.NewTower500Service().Boss(c.Info.CurrentStage) //next := service.NewTower600Service().Boss(c.Info.CurrentFreshStage + 1) } if boss != nil { for _, v := range boss.BossIds { r := service.NewBossService().Get(v) result.BossId = append(result.BossId, uint32(r.MonID)) } } // 重置玩家的Canmon标志位为0,表示可以刷怪 atomic.StoreUint32(&c.Canmon, 0) // 在函数结束时将玩家传送到对应地图 defer c.GetSpace().LeaveMap(c) return result, 0 } func (h Controller) FreshLeaveFightLevel(data *fight.FRESH_LEAVE_FIGHT_LEVEL, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { defer c.GetSpace().EnterMap(c) out := info.NewOutInfo() copier.CopyWithOption(out, c.GetInfo(), copier.Option{DeepCopy: true}) 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 var next *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) result.CurFightLevel = uint32(c.Info.CurrentFreshStage) case 2415: //勇者之塔 boss = service.NewTower500Service().Boss(c.Info.CurrentStage) next = service.NewTower500Service().Boss(c.Info.CurrentStage + 1) result.CurFightLevel = uint32(c.Info.CurrentStage) case 2425: boss = service.NewTower110Service().Boss(c.CurDark) } if next != nil { for _, v := range next.BossIds { r := service.NewBossService().Get(v) result.BossID = append(result.BossID, uint32(r.MonID)) } } for i, v := range boss.BossIds { r := service.NewBossService().Get(v) if r != nil { monster := model.GenPetInfo(int(r.MonID), 24, int(r.Nature), 0, int(r.Lv), nil) if r.Hp != 0 { monster.Hp = uint32(r.Hp) monster.MaxHp = uint32(r.Hp) } for i, v := range r.Prop { if v != 0 { monster.Prop[i] = v } } 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 特性填装 if len(r.Effect) != 0 { for _, v := range r.Effect { EID, args := service.NewEffectService().Args(v) monster.EffectInfo = append(monster.EffectInfo, model.PetEffectInfo{ Idx: uint16(v), EID: gconv.Uint16(EID), Args: gconv.Ints(args), }) } } 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.BossCompletedTask(600, int(c.Info.CurrentStage)) c.Info.CurrentFreshStage++ if c.Info.CurrentFreshStage >= c.Info.MaxFreshStage { c.Info.MaxFreshStage = c.Info.CurrentFreshStage } case 2415: //勇者之塔 c.BossCompletedTask(500, int(c.Info.CurrentStage)) c.Info.CurrentStage++ if c.Info.CurrentStage >= c.Info.MaxStage { c.Info.MaxStage = c.Info.CurrentStage } case 2425: c.BossCompletedTask(110, int(c.Info.CurrentStage)) } } }) ///开始对战,房主方以及被邀请方 return }