diff --git a/common/data/xmlres/file.go b/common/data/xmlres/file.go index dd5d0d95..b212d0da 100644 --- a/common/data/xmlres/file.go +++ b/common/data/xmlres/file.go @@ -40,7 +40,7 @@ var ( // EffectArgsConfig EffectArg //arg参数 //TalkConfig TalkRoot //任务配置 // //Monster MonsterRoot //野怪配置 - MonsterMap map[int]TMapConfig + //MonsterMap map[int]TMapConfig //Skill MovesTbl //技能配置 SkillMap map[int]Move PetMAP map[int]PetInfo //宠物配置 @@ -78,10 +78,10 @@ func Initfile() { }) //TalkConfig = getXml[TalkRoot](path + "talk.xml") - MonsterMap = utils.ToMap(getXml[MonsterRoot](path+"地图配置野怪.xml").Maps, func(m TMapConfig) int { - return m.ID + // MonsterMap = utils.ToMap(getXml[MonsterRoot](path+"地图配置野怪.xml").Maps, func(m TMapConfig) int { + // return m.ID - }) + // }) ShopMap = utils.ToMap(getXml[ShopRoot](path+"地图配置野怪.xml").Items, func(m ShopItem) int { return gconv.Int(m.ProductID) diff --git a/logic/controller/fight_boss野怪和地图怪.go b/logic/controller/fight_boss野怪和地图怪.go index f88fdab3..fd8bee75 100644 --- a/logic/controller/fight_boss野怪和地图怪.go +++ b/logic/controller/fight_boss野怪和地图怪.go @@ -10,7 +10,6 @@ import ( "blazing/logic/service/fight/info" "blazing/logic/service/player" - "blazing/modules/config/service" "blazing/modules/player/model" "github.com/gogf/gf/v2/util/gconv" @@ -51,112 +50,114 @@ func processMonID(bm string) string { // data: 包含挑战Boss信息的输入数据 // player: 当前玩家对象 // 返回: 战斗结果和错误码 -func (Controller) PlayerFightBoss(data *fight.ChallengeBossInboundInfo, p *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - if !p.CanFight() { - return nil, errorcode.ErrorCodes.ErrPokemonNoStamina - } - var monster *model.PetInfo - monsterInfo := &model.PlayerInfo{} +// func (Controller) PlayerFightBoss(data *fight.ChallengeBossInboundInfo, p *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { +// r := p.CanFight() +// if p.CanFight() != 0 { +// return nil, r +// } +// var monster *model.PetInfo +// monsterInfo := &model.PlayerInfo{} - var taskID int - var canCapture int - mdata, ok := xmlres.MonsterMap[int(p.Info.MapID)] - if !ok { - return nil, errorcode.ErrorCodes.ErrPokemonNotExists - } - if len(mdata.Bosses) == 0 { - return nil, errorcode.ErrorCodes.ErrPokemonNotExists - } - for _, bc := range mdata.Bosses { +// var taskID int +// var canCapture int +// mdata, ok := xmlres.MonsterMap[int(p.Info.MapID)] +// if !ok { +// return nil, errorcode.ErrorCodes.ErrPokemonNotExists +// } +// if len(mdata.Bosses) == 0 { +// return nil, errorcode.ErrorCodes.ErrPokemonNotExists +// } +// for _, bc := range mdata.Bosses { - if bc.Id == nil { +// if bc.Id == nil { - bc.Id = gconv.PtrInt(0) - } +// bc.Id = gconv.PtrInt(0) +// } - if (bc.Id == nil && data.BossId == 0) || uint32(*bc.Id) == data.BossId { //打默认第一个boss - if bc.TaskID != nil { - taskID = *bc.TaskID - } +// if (bc.Id == nil && data.BossId == 0) || uint32(*bc.Id) == data.BossId { //打默认第一个boss +// if bc.TaskID != nil { +// taskID = *bc.TaskID +// } - for i, bm := range bc.BossMon { +// for i, bm := range bc.BossMon { - dv := 24 - if bc.BossCatchable == 1 { - dv = -1 - } +// dv := 24 +// if bc.BossCatchable == 1 { +// dv = -1 +// } - monster = model.GenPetInfo( - gconv.Int(processMonID(bm.MonID)), dv, //24个体 - -1, - 0, //野怪没特性 +// monster = model.GenPetInfo( +// gconv.Int(processMonID(bm.MonID)), dv, //24个体 +// -1, +// 0, //野怪没特性 - bm.Lv, nil, 0) - monster.CatchTime = uint32(i) - if bm.Hp != 0 { - monster.Hp = uint32(bm.Hp) - monster.MaxHp = uint32(bm.Hp) - } +// bm.Lv, nil, 0) +// monster.CatchTime = uint32(i) +// if bm.Hp != 0 { +// monster.Hp = uint32(bm.Hp) +// monster.MaxHp = uint32(bm.Hp) +// } - for _, v := range strings.Split(bm.NewSeIdxs, " ") { - idx := gconv.Uint16(v) +// for _, v := range strings.Split(bm.NewSeIdxs, " ") { +// idx := gconv.Uint16(v) - if idx == 0 { - continue - } +// if idx == 0 { +// continue +// } - EID, args := service.NewEffectService().Args(uint32(idx)) - monster.EffectInfo = append(monster.EffectInfo, model.PetEffectInfo{ - Idx: idx, - EID: gconv.Uint16(EID), - Args: gconv.Ints(args), - }) - } - monsterInfo.PetList = append(monsterInfo.PetList, *monster) - } - if bc.BossCatchable == 1 { - canCapture = xmlres.PetMAP[int(monster.ID)].CatchRate - if grand.Meet(1, 500) { - monsterInfo.PetList[0].RandomByWeightShiny() - } +// EID, args := service.NewEffectService().Args(uint32(idx)) +// monster.EffectInfo = append(monster.EffectInfo, model.PetEffectInfo{ +// Idx: idx, +// EID: gconv.Uint16(EID), +// Args: gconv.Ints(args), +// }) +// } +// monsterInfo.PetList = append(monsterInfo.PetList, *monster) +// } +// if bc.BossCatchable == 1 { +// canCapture = xmlres.PetMAP[int(monster.ID)].CatchRate +// if grand.Meet(1, 500) { +// monsterInfo.PetList[0].RandomByWeightShiny() +// } - } - monsterInfo.Nick = bc.Name //xmlres.PetMAP[int(monster.ID)].DefName - break - } +// } +// monsterInfo.Nick = bc.Name //xmlres.PetMAP[int(monster.ID)].DefName +// break +// } - } - if len(monsterInfo.PetList) == 0 { - return nil, errorcode.ErrorCodes.ErrPokemonNotExists - } - p.Fightinfo.Status = info.BattleMode.FIGHT_WITH_NPC - p.Fightinfo.Mode = info.BattleMode.MULTI_MODE +// } +// if len(monsterInfo.PetList) == 0 { +// return nil, errorcode.ErrorCodes.ErrPokemonNotExists +// } +// p.Fightinfo.Status = info.BattleMode.FIGHT_WITH_NPC +// p.Fightinfo.Mode = info.BattleMode.MULTI_MODE - ai := player.NewAI_player(monsterInfo) - ai.CanCapture = canCapture - ai.Prop[0] = 2 - fight.NewFight(p, ai, func(foi info.FightOverInfo) { - if taskID != 0 { - if foi.Reason == 0 && foi.WinnerId == p.Info.UserID { - p.SptCompletedTask(taskID, 1) +// ai := player.NewAI_player(monsterInfo) +// ai.CanCapture = canCapture +// ai.Prop[0] = 2 +// fight.NewFight(p, ai, func(foi info.FightOverInfo) { +// if taskID != 0 { +// if foi.Reason == 0 && foi.WinnerId == p.Info.UserID { +// p.SptCompletedTask(taskID, 1) - } - } +// } +// } - //p.Done.Exec(model.MilestoneMode.BOSS, []uint32{p.Info.MapID, data.BossId, uint32(foi.Reason)}, nil) +// //p.Done.Exec(model.MilestoneMode.BOSS, []uint32{p.Info.MapID, data.BossId, uint32(foi.Reason)}, nil) - }) +// }) - return nil, -1 -} +// return nil, -1 +// } // OnPlayerFightNpcMonster 战斗野怪 // data: 包含战斗野怪信息的输入数据 // player: 当前玩家对象 // 返回: 战斗结果和错误码 func (Controller) OnPlayerFightNpcMonster(data1 *fight.FightNpcMonsterInboundInfo, p *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - if !p.CanFight() { - return nil, errorcode.ErrorCodes.ErrSystemError + r := p.CanFight() + if p.CanFight() != 0 { + return nil, r } if data1.Number > 9 { return nil, errorcode.ErrorCodes.ErrSystemError @@ -188,7 +189,8 @@ func (Controller) OnPlayerFightNpcMonster(data1 *fight.FightNpcMonsterInboundInf monsterInfo.Nick = xmlres.PetMAP[int(monster.ID)].DefName monsterInfo.PetList = append(monsterInfo.PetList, *monster) ai := player.NewAI_player(monsterInfo) - ai.CanCapture = handleNPCFightSpecial(monster.ID) + + ai.CanCapture = refPet.IsCapture //handleNPCFightSpecial(monster.ID) p.Fightinfo.Status = info.BattleMode.FIGHT_WITH_NPC //打野怪 p.Fightinfo.Mode = info.BattleMode.MULTI_MODE //多人模式 @@ -240,17 +242,3 @@ func (Controller) OnPlayerFightNpcMonster(data1 *fight.FightNpcMonsterInboundInf return nil, -1 } - -// handleNPCFightSpecial 处理NPC战斗特殊情况 -func handleNPCFightSpecial(petID uint32) int { - - npcPetID := int(petID) - petCfg, ok := xmlres.PetMAP[npcPetID] - if !ok { - // log.Error(context.Background(), "NPC宠物配置不存在", "petID", npcPetID) - return 0 - } - - catchRate := gconv.Int(petCfg.CatchRate) - return catchRate -} diff --git a/logic/controller/fight_pvp_withplayer.go b/logic/controller/fight_pvp_withplayer.go index cfd0e798..06d52581 100644 --- a/logic/controller/fight_pvp_withplayer.go +++ b/logic/controller/fight_pvp_withplayer.go @@ -23,8 +23,9 @@ func (h Controller) OnPlayerHandleFightInvite(data *fight.HandleFightInviteInbou } - if !c.CanFight() { - return nil, errorcode.ErrorCodes.ErrSystemError + r := c.CanFight() + if c.CanFight() != 0 { + return nil, r } //c.Fightinfo.Status = info.BattleMode.FIGHT_WITH_NPC diff --git a/logic/controller/fight_塔.go b/logic/controller/fight_塔.go index 8caed2b0..aeb8baf3 100644 --- a/logic/controller/fight_塔.go +++ b/logic/controller/fight_塔.go @@ -25,11 +25,13 @@ func (h Controller) FreshOpen(data *fight.C2S_OPEN_DARKPORTAL, c *player.Player) 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) + r := service.NewBossService().Get(boss.BossIds[0]) + result.CurBossID = uint32(r[0].MonID) + // for _, v := range r { + // r := service.NewBossService().Get(boss.BossIds[0]) + // result.CurBossID = uint32(r.MonID) - } + // } c.CurDark = uint32(data.Level) defer c.GetSpace().LeaveMap(c) @@ -80,13 +82,9 @@ func (h Controller) FreshChoiceFightLevel(data *fight.C2S_FRESH_CHOICE_FIGHT_LEV } if boss != nil { - - for _, v := range boss.BossIds { - r := service.NewBossService().Get(v) - if r != nil { - result.BossId = append(result.BossId, uint32(r.MonID)) - } - + r := service.NewBossService().Get(boss.BossIds[0]) + for _, v := range r { + result.BossId = append(result.BossId, uint32(v.MonID)) } } @@ -108,8 +106,9 @@ func (h Controller) FreshLeaveFightLevel(data *fight.FRESH_LEAVE_FIGHT_LEVEL, c } 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 + r := c.CanFight() + if c.CanFight() != 0 { + return nil, r } c.Fightinfo.Mode = fightinfo.BattleMode.MULTI_MODE c.Fightinfo.Status = fightinfo.BattleMode.FIGHT_WITH_NPC @@ -132,57 +131,57 @@ func (h Controller) PetTawor(data *fight.StartTwarInboundInfo, c *player.Player) 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)) - + r := service.NewBossService().Get(boss.BossIds[0]) + for _, v := range r { + result.BossID = append(result.BossID, uint32(v.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, 0) - if r.Hp != 0 { - monster.Hp = uint32(r.Hp) - monster.MaxHp = uint32(r.Hp) + bosss := service.NewBossService().Get(boss.BossIds[0]) + monsterInfo.Nick = boss.Name + for i, r := range bosss { - } + monster := model.GenPetInfo(int(r.MonID), 24, int(r.Nature), 0, int(r.Lv), nil, 0) + 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] - } - - } - - } - - 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) } + 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] + } + + } + + } + + 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) diff --git a/logic/controller/fight_擂台.go b/logic/controller/fight_擂台.go index 9f90c866..f40a1c94 100644 --- a/logic/controller/fight_擂台.go +++ b/logic/controller/fight_擂台.go @@ -18,9 +18,9 @@ import ( // 后端到前端无数据内容 空包 // ArenaSetOwner 都需要通过2419包广播更新擂台状态 func (h Controller) ArenaSetOwner(data *fight.ARENA_SET_OWENR, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - - if !c.CanFight() { - return nil, errorcode.ErrorCodes.ErrPokemonNotEligible + r := c.CanFight() + if r != 0 { + return nil, r } c.Fightinfo.Mode = 0 //取消队列匹配 if atomic.CompareAndSwapUint32(&c.GetSpace().Owner.Flag, 0, 1) { @@ -41,8 +41,9 @@ func (h Controller) ArenaSetOwner(data *fight.ARENA_SET_OWENR, c *player.Player) // ArenaFightOwner 并不会通知对方是否接受挑战。只要有人挑战就直接进入对战 func (h Controller) ArenaFightOwner(data1 *fight.ARENA_FIGHT_OWENR, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - if !c.CanFight() { - return nil, errorcode.ErrorCodes.ErrNoEligiblePokemon + r := c.CanFight() + if r != 0 { + return nil, r } if c.Info.UserID == c.GetSpace().Owner.UserID { @@ -53,7 +54,7 @@ func (h Controller) ArenaFightOwner(data1 *fight.ARENA_FIGHT_OWENR, c *player.Pl return nil, errorcode.ErrorCodes.ErrSystemError200007 } - if !c.GetSpace().Owner.ARENA_Player.CanFight() { + if c.GetSpace().Owner.ARENA_Player.CanFight() != 0 { c.GetSpace().Owner.Set(c) c.GetSpace().Broadcast(c, 2419, &c.GetSpace().Owner) c.SendPackCmd(2419, &c.GetSpace().Owner) diff --git a/logic/service/common/playeri.go b/logic/service/common/playeri.go index cc91a4e4..b5746ac8 100644 --- a/logic/service/common/playeri.go +++ b/logic/service/common/playeri.go @@ -1,6 +1,7 @@ package common import ( + "blazing/common/socket/errorcode" "blazing/logic/service/fight/info" "blazing/modules/player/model" ) @@ -16,6 +17,6 @@ type PlayerI interface { SetFightC(FightI) QuitFight() MessWin(bool) - CanFight() bool + CanFight() errorcode.ErrorCode SendPackCmd(uint32, any) } diff --git a/logic/service/fight/input.go b/logic/service/fight/input.go index 102dc283..37f03125 100644 --- a/logic/service/fight/input.go +++ b/logic/service/fight/input.go @@ -130,9 +130,9 @@ func (f *FightC) LoadPercent(c common.PlayerI, percent int32) { var meetpet = make(map[int]model.PetInfo) func (f *FightC) initplayer(c common.PlayerI) (*input.Input, errorcode.ErrorCode) { - - if !c.CanFight() { - return nil, errorcode.ErrorCodes.ErrNoEligiblePokemon + r := c.CanFight() + if c.CanFight() != 0 { + return nil, r } in := input.NewInput(f, c) diff --git a/logic/service/player/Monster.go b/logic/service/player/Monster.go index 10489015..b45cf984 100644 --- a/logic/service/player/Monster.go +++ b/logic/service/player/Monster.go @@ -3,8 +3,8 @@ package player import ( "blazing/common/data/xmlres" "blazing/cool" + "blazing/modules/config/model" "blazing/modules/config/service" - "strings" "sync/atomic" "time" @@ -13,11 +13,18 @@ import ( "github.com/samber/lo" ) -// 2. 从 string 类型 slice 随机选一个元素 -func RandomStringFromSlice(s []string) string { +func (p *Player) IsMatch(t model.Event) bool { + _, ok := lo.Find(t.Weather, func(item int32) bool { + return item == int32(p.GetSpace().Weather) + }) + if !ok { + // 不在同一天气下 + return false + + } + + return true - randomIdx := grand.Intn(len(s)) - return s[randomIdx] } // 应该根据怪物信息决定后端生成 @@ -43,33 +50,29 @@ func (p *Player) GenMonster() { } p.MapNPC.Reset(10 * time.Second) p.Data[oldnum] = OgrePetInfo{} //切地图清空 - mapss, ok := xmlres.MonsterMap[gconv.Int(p.Info.MapID)] - if ok && mapss.Monsters != nil { + for _, i := range replce { + ogreconfig := service.NewMapPitService().GetData(p.Info.MapID, uint32(i)) - for i, m := range mapss.Monsters.Monsters { //这里是9个 + for _, v := range ogreconfig { - _, rok := lo.Find(replce, func(it int) bool { - return it == i - }) - - if !rok { + if !p.IsMatch(*v.Event) { continue } - id := strings.Split(m.ID, " ") - lv := strings.Split(m.Lv, " ") - p.Data[i] = OgrePetInfo{} - p.Data[i].ID = gconv.Uint32(RandomStringFromSlice(id)) + p.Data[i].ID = uint32(v.RefreshID[grand.Intn(len(v.RefreshID))]) if p.Data[i].ID != 0 { - p.Data[i].Lv = gconv.Uint32(RandomStringFromSlice(lv)) + p.Data[i].Lv = uint32(grand.N(v.MinLevel, v.MaxLevel)) + p.Data[i].IsCapture = v.IsCapture //实现捕捉限制 + if handleNPCFightSpecial(p.Data[i].ID) == 0 { + p.Data[i].IsCapture = 0 + } + if len(v.RefreshID) == 1 { //说明这里只固定刷一个,概率变尼尔尼奥,不是稀有精灵 - if len(id) == 1 { //说明这里只固定刷一个,概率变尼尔尼奥,不是稀有精灵 - - nieo, _, _ := p.Roll(20, 1000) + nieo, _, _ := p.Roll(1, 25) if nieo { p.Data[i].Ext = 77 if grand.Meet(1, 2) { @@ -77,13 +80,15 @@ func (p *Player) GenMonster() { } p.Data[i].Lv = 16 + p.Data[i].IsCapture = 1 //解除捕捉限制 } } + if cool.Config.ServerInfo.IsVip != 0 { //测试服,百分百异色 p.Data[i].FixSHiny() } else { - if xmlres.PetMAP[int(p.Data[i].ID)].CatchRate != 0 && grand.Meet(1, 500) { + if p.Data[i].IsCapture == 1 && grand.Meet(1, 500) { p.Data[i].RandomByWeightShiny() @@ -96,10 +101,10 @@ func (p *Player) GenMonster() { } } - } } + if p != nil { p.SendPackCmd(2004, &p.OgrePet) } @@ -192,3 +197,17 @@ func GenerateNormalizedColorMatrix() [20]uint8 { return matrix } + +// handleNPCFightSpecial 处理NPC战斗特殊情况 +func handleNPCFightSpecial(petID uint32) int { + + npcPetID := int(petID) + petCfg, ok := xmlres.PetMAP[npcPetID] + if !ok { + // log.Error(context.Background(), "NPC宠物配置不存在", "petID", npcPetID) + return 0 + } + + catchRate := gconv.Int(petCfg.CatchRate) + return catchRate +} diff --git a/logic/service/player/ai.go b/logic/service/player/ai.go index a2f48c3c..efaa7d44 100644 --- a/logic/service/player/ai.go +++ b/logic/service/player/ai.go @@ -1,6 +1,7 @@ package player import ( + "blazing/common/socket/errorcode" "blazing/logic/service/fight/info" "blazing/modules/player/model" ) @@ -39,6 +40,6 @@ func (lw *AI_player) SendLoadPercent(info.LoadPercentOutboundInfo) { } -func (p *AI_player) CanFight() bool { - return true +func (p *AI_player) CanFight() errorcode.ErrorCode { + return 0 } diff --git a/logic/service/player/fight.go b/logic/service/player/fight.go index fa64ec40..07d6f4e5 100644 --- a/logic/service/player/fight.go +++ b/logic/service/player/fight.go @@ -9,9 +9,9 @@ import ( // JoinFight 加入战斗队列 func (p *Player) JoinFight(handler func(p common.PlayerI) bool) errorcode.ErrorCode { - //加入队列前就开始判断一次 - if !p.CanFight() { - return errorcode.ErrorCodes.ErrNoEligiblePokemon + r := p.CanFight() + if p.CanFight() != 0 { + return r } if p.GetSpace().Owner.UserID == p.Info.UserID { return errorcode.ErrorCodes.ErrSystemError @@ -20,7 +20,7 @@ func (p *Player) JoinFight(handler func(p common.PlayerI) bool) errorcode.ErrorC p.GetSpace().User.Range(func(key uint32, opponent common.PlayerI) bool { if opponent.GetInfo().UserID != p.Info.UserID { //确认是乱斗模式 - if opponent.Getfightinfo() == p.Getfightinfo() && p.CanFight() { + if opponent.Getfightinfo() == p.Getfightinfo() && p.CanFight() == 0 { success := handler(opponent) if success { atomic.StoreUint32(&opponent.(*Player).Fightinfo.Mode, 0) diff --git a/logic/service/player/player.go b/logic/service/player/player.go index 8917de8a..f5864521 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -36,6 +36,7 @@ type OgrePetInfo struct { Lv uint32 `struc:"skip"` //等级 Item []int64 `struc:"skip"` //奖励,如果有的话 Ext uint32 `struc:"skip"` //是否变尼尔尼奥 + IsCapture int `struc:"skip"` } func (o *OgrePetInfo) FixSHiny() { @@ -146,26 +147,26 @@ func (p *Player) GetSpace() *space.Space { // CanFight 检查玩家是否可以进行战斗 // 0无战斗,1PVP,2,BOOS,3PVE -func (p *Player) CanFight() bool { +func (p *Player) CanFight() errorcode.ErrorCode { if len(p.Info.PetList) == 0 { atomic.StoreUint32(&p.Fightinfo.Mode, 0) - return false + return errorcode.ErrorCodes.ErrBattleCancelled } if p.FightC != nil { atomic.StoreUint32(&p.Fightinfo.Mode, 0) - return false + return errorcode.ErrorCodes.ErrBattleEnded } for _, pet := range p.Info.PetList { if pet.Hp > 0 { // 只要找到一个血量大于0的宠物,就可以战斗 - return true + return 0 } } // 遍历完所有宠物,都没有血量大于0的,才不能战斗 atomic.StoreUint32(&p.Fightinfo.Mode, 0) - return false + return errorcode.ErrorCodes.ErrPokemonNoStamina } func (p *Player) SendPack(b []byte) error { diff --git a/logic/service/space/boss_wer.go b/logic/service/space/boss_wer.go index 69061ce2..44efbb1e 100644 --- a/logic/service/space/boss_wer.go +++ b/logic/service/space/boss_wer.go @@ -8,7 +8,7 @@ import ( ) func (s *Space) getwerboss() { - + println("天气变化地图", s.Name, "pos", s.MapBossInfo.Pos, "wer", s.Weather) switch s.ID { case 12: @@ -29,7 +29,7 @@ func (s *Space) getwerboss() { } t.INFO = append(t.INFO, s.MapBossInfo) - println("天气变化地图", s.Name, "pos", s.MapBossInfo.Pos, "wer", s.Weather) + s.Broadcast(nil, 2021, &t) } diff --git a/modules/config/controller/admin/boss.go b/modules/config/controller/admin/boss.go index 1b36d797..63f5aef7 100644 --- a/modules/config/controller/admin/boss.go +++ b/modules/config/controller/admin/boss.go @@ -3,9 +3,6 @@ package admin import ( "blazing/cool" "blazing/modules/config/service" - "context" - - "github.com/gogf/gf/v2/frame/g" ) type BossController struct { @@ -24,13 +21,13 @@ func init() { cool.RegisterController(task_info_controller) } -type GetListReq struct { - g.Meta `path:"/getlist" method:"POST"` - Id uint32 `json:"id" v:"required#请选择要查询的数据"` -} +// type GetListReq struct { +// g.Meta `path:"/getlist" method:"POST"` +// Id uint32 `json:"id" v:"required#请选择要查询的数据"` +// } -func (this *BossController) GetList(ctx context.Context, req *GetListReq) (res *cool.BaseRes, err error) { - res = &cool.BaseRes{} - res.Data = service.NewBossService().GetList(req.Id) - return res, nil -} +// func (this *BossController) GetList(ctx context.Context, req *GetListReq) (res *cool.BaseRes, err error) { +// res = &cool.BaseRes{} +// res.Data = service.NewBossService().GetList(req.Id) +// return res, nil +// } diff --git a/modules/config/controller/admin/map_node.go b/modules/config/controller/admin/map_node.go index fa15790c..4dfbfe32 100644 --- a/modules/config/controller/admin/map_node.go +++ b/modules/config/controller/admin/map_node.go @@ -16,7 +16,7 @@ func init() { &cool.Controller{ Prefix: "/admin/config/mapboss", Api: []string{"Add", "Delete", "Update", "Info", "List", "Page"}, - Service: service.NewMapBossService(), + Service: service.NewMapNodeService(), }, }) } diff --git a/modules/config/model/map_node.go b/modules/config/model/map_node.go index 8b81fa00..f4c9930e 100644 --- a/modules/config/model/map_node.go +++ b/modules/config/model/map_node.go @@ -24,8 +24,9 @@ type MapNode struct { *BaseConfig *Event // 嵌入BOSS事件配置 // 基础关联字段 - NodeType int `gorm:"not null;default:0;comment:'节点类型(0是游戏自带分支,其余自增)'" json:"node_type" description:"节点类型"` - NodeID uint32 `gorm:"not null;default:0;comment:'节点ID'" json:"node_id" description:"节点ID"` + MapID int32 `gorm:"not null;index;comment:'所属地图ID'" json:"map_id" description:"地图ID"` + + NodeID uint32 `gorm:"not null;default:0;comment:'节点ID'" json:"node_id" description:"节点ID"` NodeName string `gorm:"type:varchar(100);default:'';comment:'节点名称'" json:"node_name" description:"节点名称"` //节点激活脚本 @@ -42,7 +43,7 @@ type MapNode struct { //回调通boss打完给前端发送固定事件 //PlotFinishScript string `gorm:"type:text;comment:'剧情完成后脚本回调'" json:"plot_finish_script" description:"剧情完成后脚本回调"` - BindBossID uint32 `gorm:"default:0;comment:'绑定的BOSS ID(0表示无BOSS)'" json:"bind_boss_id" description:"绑定BOSS ID"` + BossIds []uint32 `gorm:"type:jsonb; ;comment:'塔层BOSS ID列表'" json:"boss_ids"` } // -------------------------- MapNode 配套方法(遵循项目规范)-------------------------- @@ -64,20 +65,6 @@ func NewMapNode() *MapNode { } // GetNodeTypeName 获取节点类型的中文名称(方便展示) -func (m *MapNode) GetNodeTypeName() string { - switch m.NodeType { - case MapNodeTypeBoss: - return "BOSS节点" - case MapNodeTypeNPC: - return "NPC节点" - case MapNodeTypeScene: - return "场景触发节点" - case MapNodeTypePortal: - return "传送门节点" - default: - return "未知节点" - } -} // -------------------------- 表结构自动同步 -------------------------- func init() { diff --git a/modules/config/model/tower_110.go b/modules/config/model/tower_110.go index c4b653fb..74a639f1 100644 --- a/modules/config/model/tower_110.go +++ b/modules/config/model/tower_110.go @@ -13,9 +13,9 @@ const ( type BaseTowerConfig struct { *BaseConfig - Name string `gorm:"type:varchar(100);default:'';comment:'塔名称'" json:"name" description:"塔名称"` - TowerLevel uint32 `gorm:"not null;default:0;uniqueIndex;comment:'塔层数'" json:"tower_level" ` - BossIds uint32 `gorm:"type:jsonb; ;comment:'塔层BOSS ID列表'" json:"boss_ids"` + Name string `gorm:"type:varchar(100);default:'';comment:'塔名称'" json:"name" description:"塔名称"` + TowerLevel uint32 `gorm:"not null;default:0;uniqueIndex;comment:'塔层数'" json:"tower_level" ` + BossIds []uint32 `gorm:"type:jsonb; ;comment:'塔层BOSS ID列表'" json:"boss_ids"` } // NewBaseTowerConfig 创建基础塔配置实例(所有塔类型共用) diff --git a/modules/config/service/boss.go b/modules/config/service/boss.go index 2796d221..4a6b392e 100644 --- a/modules/config/service/boss.go +++ b/modules/config/service/boss.go @@ -25,23 +25,24 @@ func NewBossService() *BossService { } } -func (s *BossService) Get(id uint32) *model.BossConfig { +func (s *BossService) Get(id uint32) []model.BossConfig { if id == 0 { return nil } - var item *model.BossConfig - dbm_notenable(s.Model).Where("id", id).Scan(&item) + var item []model.BossConfig + dbm_notenable(s.Model).Where("id", id).WhereOr("parentId", id).OrderAsc("ordernum").Scan(&item) return item } -func (s *BossService) GetList(id uint32) []model.BossConfig { - var ret []model.BossConfig +// func (s *BossService) GetList(id uint32) []model.BossConfig { - // 执行 Raw SQL 并扫描返回值 - dbm_nocache_noenable(s.Model). - Wheref(`map_id @> ARRAY[?]::integer[]`, id).WhereOrf(`map_id @> ARRAY[?]::integer[]`, 0).Scan(&ret) +// var ret []model.BossConfig - return ret -} +// // 执行 Raw SQL 并扫描返回值 +// dbm_nocache_noenable(s.Model). +// Wheref(`map_id @> ARRAY[?]::integer[]`, id).WhereOrf(`map_id @> ARRAY[?]::integer[]`, 0).Scan(&ret) + +// return ret +// } diff --git a/modules/config/service/map_boos.go b/modules/config/service/map_boos.go deleted file mode 100644 index c908917e..00000000 --- a/modules/config/service/map_boos.go +++ /dev/null @@ -1,22 +0,0 @@ -package service - -import ( - "blazing/cool" - "blazing/modules/config/model" -) - -type MapBossService struct { - *cool.Service -} - -func NewMapBossService() *MapBossService { - return &MapBossService{ - &cool.Service{ - Model: model.NewMapNode(), - PageQueryOp: &cool.QueryOp{ - KeyWordField: []string{"remake"}, - FieldEQ: []string{"map_id"}, - }, - }, - } -} diff --git a/modules/config/service/map_node.go b/modules/config/service/map_node.go new file mode 100644 index 00000000..2a77b331 --- /dev/null +++ b/modules/config/service/map_node.go @@ -0,0 +1,30 @@ +package service + +import ( + "blazing/cool" + "blazing/modules/config/model" +) + +type MapNodeService struct { + *cool.Service +} + +func NewMapNodeService() *MapNodeService { + return &MapNodeService{ + &cool.Service{ + Model: model.NewMapNode(), + PageQueryOp: &cool.QueryOp{ + KeyWordField: []string{"remake"}, + FieldEQ: []string{"map_id"}, + }, + }, + } +} +func (s *MapNodeService) GetData(mapid, pos uint32) []model.MapNode { + + var pet []model.MapNode //一个特性应该是唯一的,但是我们要获取默认随机特性 + dbm_enable(s.Model).Where("map_id", mapid).Wheref(`pos @> ARRAY[?]::integer[]`, pos).Scan(&pet) + + return pet + +} diff --git a/modules/config/service/map_pit.go b/modules/config/service/map_pit.go index bc2b4a2d..0a68fb23 100644 --- a/modules/config/service/map_pit.go +++ b/modules/config/service/map_pit.go @@ -20,3 +20,11 @@ func NewMapPitService() *MapPitService { }, } } +func (s *MapPitService) GetData(mapid, pos uint32) []model.MapPit { + + var pet []model.MapPit //一个特性应该是唯一的,但是我们要获取默认随机特性 + dbm_enable(s.Model).Where("map_id", mapid).Wheref(`pos @> ARRAY[?]::integer[]`, pos).Scan(&pet) + + return pet + +}