feat(xmlres): 更新 BOSS 配置结构并优化字段注释

新增多个 BOSS 相关配置字段,包括任务关联、奖励机制与挑战限制等,
增强 BOSS 精灵的可配置性与业务表达能力。同时完善字段注释以对齐 XML
实际使用情况,并保留原有部分字段用于兼容历史配置。

fix(fight): 调整战斗胜利回调执行顺序以确保数据一致性

将战斗结束回调移至广播之前执行,保证在发送战斗结果前已完成所有状态
更新,尤其是针对胜利宠物的信息同步
This commit is contained in:
2025-11-22 22:57:32 +08:00
parent 7f443736bc
commit 1dbd4169e9
35 changed files with 518 additions and 360 deletions

View File

@@ -3,7 +3,6 @@ package controller
import (
"blazing/common/data/xmlres"
"blazing/common/socket/errorcode"
"fmt"
"math/rand"
"strings"
@@ -14,6 +13,7 @@ import (
"blazing/modules/blazing/model"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/grand"
)
func processMonID(bm string) string {
@@ -50,19 +50,9 @@ func (h Controller) PlayerFightBoss(data *fight.ChallengeBossInboundInfo, c *pla
var mo *model.PetInfo
moinfo := &model.PlayerInfo{}
// 新手任务2选择不同精灵
// <Map ID="8" Name="机械舱" InitX="456" InitY="143">
// <Bosses>
// <Boss TaskID="4" AppearTime="0 23" BossVisible="0" >
// <BossMon MonID="1 4 7" Hp="10" Lv="2" />
// </Boss>
// <Boss AppearTime="0 23" BossVisible="0" >
// <!--boss for task 526 -->
// <BossMon MonID="506" Hp="55" Lv="18" NewSeIdxs="80 157 158" />
// </Boss>
// </Bosses>
// </Map>
var taskid int
var cancpet int
mdata, ok := xmlres.MonsterMap[int(c.Info.MapID)]
if !ok {
return nil, errorcode.ErrorCodes.ErrPokemonNotExists
@@ -76,8 +66,14 @@ func (h Controller) PlayerFightBoss(data *fight.ChallengeBossInboundInfo, c *pla
bc.Id = gconv.PtrInt(0)
}
if (bc.Id == nil && data.BossId == 0) || uint32(*bc.Id) == data.BossId { //打默认第一个boss
if (bc.Id == nil && data.BossId == 0) || uint32(*bc.Id) == data.BossId { //打默认第一个boss
if bc.TaskID != nil {
taskid = *bc.TaskID
}
if bc.BossCatchable == 1 {
cancpet = xmlres.PetMAP[int(mo.ID)].CatchRate
}
for _, bm := range bc.BossMon {
mo = c.GenPetInfo(
@@ -102,19 +98,32 @@ func (h Controller) PlayerFightBoss(data *fight.ChallengeBossInboundInfo, c *pla
c.Fightinfo.Mode = info.BattleMode.MULTI_MODE
ai := player.NewAI_player(moinfo)
//给予打过一次的奖励
event := c.Done.SPT(c.Info.MapID, data.BossId, 1, func() bool {
fmt.Println("触发事件", "第一次奖励")
return true
})
event1 := c.Done.SPT(c.Info.MapID, data.BossId, 2, func() bool {
fmt.Println("触发事件", "第二次奖励")
return true
})
ai.CanCapture = cancpet
fight.NewFight(c, ai, func(foi *info.FightOverInfo) {
c.Done.Exec(model.MilestoneMode.BOSS, []uint32{c.Info.MapID, data.BossId})
event.Cancel() //取消事件
event1.Cancel()
c.Done.Exec(model.MilestoneMode.BOSS, []uint32{c.Info.MapID, data.BossId, uint32(foi.Reason)}, func(results *model.MilestoneEX) uint32 {
if foi.Reason == 0 && foi.WinnerId == c.Info.UserID {
if results.CheakNoNumber(1) && taskid != 0 { //触发3次奖励
c.Info.TaskList[taskid-1] = 3
moinfo.PetList[0].Downgrade(1)
PetID := moinfo.PetList[0].ID
newm1 := model.GenPetInfo(int(PetID), -1, -1, 0, 0, 1)
c.Service.Pet.PetAdd(*newm1)
c.SendPackCmd(8004, &info.S2C_GET_BOSS_MONSTER{
BonusID: uint32(taskid),
PetID: PetID,
CaptureTm: newm1.CatchTime,
})
return 1
}
}
return 0
})
})
@@ -146,7 +155,32 @@ func (h Controller) OnPlayerFightNpcMonster(data *fight.FightNpcMonsterInboundIn
c.Fightinfo.Mode = info.BattleMode.MULTI_MODE //多人模式
fight.NewFight(c, ai, func(foi *info.FightOverInfo) {
c.Done.Exec(model.MilestoneMode.Moster, []uint32{c.Info.MapID, moinfo.PetList[0].ID, uint32(foi.Reason)}, func(results *model.MilestoneEX) uint32 {
if foi.Reason == 0 && foi.WinnerId == c.Info.UserID {
if refpet.Item != 0 {
c.SendPackCmd(8004, &info.S2C_GET_BOSS_MONSTER{
ItemList: c.ItemAdd(model.ItemInfo{
ItemId: refpet.Item,
ItemCnt: uint32(grand.Intn(2) + 1),
}),
})
}
foi.Winpet.ADD_EV(gconv.Uint32s(strings.Split(xmlres.PetMAP[int(mo.ID)].YieldingEV, " ")))
exp := uint32(xmlres.PetMAP[int(mo.ID)].YieldingExp) * mo.Level / 7
c.Info.ExpPool += exp * 4
c.AddPetExp(foi.Winpet, uint32(exp)*2)
c.SendPackCmd(2509, &info.PET_WAR_EXP_NOTICE{
EXP: exp * 2,
})
}
return 0
})
})
return nil, -1

View File

@@ -46,7 +46,7 @@ func (h Controller) BuyItem(data *item.BuyInboundInfo, c *player.Player) (result
tt, ok := xmlres.ItemsMAP[int(data.ItemId)]
if ok && tt.Price != 0 && c.UseCoins(data.Count*uint32(tt.Price)) {
r := c.ItemAdd(model.SingleItemInfo{ItemId: data.ItemId, ItemCnt: data.Count})
r := c.ItemAdd(model.ItemInfo{ItemId: data.ItemId, ItemCnt: data.Count})
if len(r) != 0 {
return &item.BuyOutboundInfo{
ItemId: data.ItemId,
@@ -55,7 +55,8 @@ func (h Controller) BuyItem(data *item.BuyInboundInfo, c *player.Player) (result
Coins: c.Info.Coins,
}, 0
}
//购买失败,返还豆子
c.Info.Coins += data.Count * uint32(tt.Price)
}
return &item.BuyOutboundInfo{
@@ -129,7 +130,7 @@ func (h Controller) TalkCate(data *item.TalkCateInboundInfo, c *player.Player) (
t[data.ID] += 1
if t[data.ID] < uint32(te.CollectCnt) {
result.OutList = append(result.OutList, item.CateInfo{ID: uint32(talkcacche[te.Name]), Count: uint32(randomNum)})
c.ItemAdd(model.SingleItemInfo{ItemId: uint32(talkcacche[te.Name]), ItemCnt: uint32(randomNum)})
c.ItemAdd(model.ItemInfo{ItemId: uint32(talkcacche[te.Name]), ItemCnt: uint32(randomNum)})
}
return true
@@ -143,12 +144,12 @@ func (h Controller) TalkCate(data *item.TalkCateInboundInfo, c *player.Player) (
return result, 0
}
func (h Controller) BuyMItem(data *item.BuyMultiInboundInfo, c *player.Player) (result *item.BuyMultiOutboundInfo, err errorcode.ErrorCode) {
var rrr []model.SingleItemInfo
var rrr []model.ItemInfo
for _, v := range data.ItemIds {
_, ok := xmlres.ItemsMAP[int(v)]
if ok {
rrr = append(rrr, model.SingleItemInfo{ItemId: uint32(v), ItemCnt: 1})
rrr = append(rrr, model.ItemInfo{ItemId: uint32(v), ItemCnt: 1})
}
}

View File

@@ -23,6 +23,25 @@ func (h *Controller) MapEnter(data *maps.InInfo, c *player.Player) (result *info
copier.Copy(result, c.Info)
defer c.GetSpace().EnterMap(c)
// go func() {
// for {
// <-time.After(time.Second * 5)
// var t info.MapBossSInfo
// t.INFO = make([]info.MapBossInfo, 0)
// t.INFO = append(t.INFO, info.MapBossInfo{
// Id: 47,
// Hp: 1,
// Pos: 1,
// })
// c.SendPackCmd(2021, &t)
// }
// }()
return result, 0
}
func (h Controller) MapHot(data *maphot.InInfo, c *player.Player) (result *maphot.OutInfo, err errorcode.ErrorCode) {

View File

@@ -63,7 +63,7 @@ func (h Controller) Complete_Task(data *task.CompleteTaskInboundInfo, c *player.
c.Info.TaskList[data.TaskId-1] = 3
result = &task.CompleteTaskOutboundInfo{
TaskId: data.TaskId,
ItemList: make([]task.ItemInfo, 0),
ItemList: make([]model.ItemInfo, 0),
}
//提交任务
@@ -82,11 +82,8 @@ func (h Controller) Complete_Task(data *task.CompleteTaskInboundInfo, c *player.
c.Service.Pet.PetAdd(*r)
}
var ttt []model.SingleItemInfo
ret := c.ItemAdd(result.ItemList...) //获取成功的条目
copier.CopyWithOption(&ttt, &result.ItemList, copier.Option{IgnoreEmpty: true, DeepCopy: true})
ret := c.ItemAdd(ttt...) //获取成功的条目
result.ItemList = make([]task.ItemInfo, 0) //清空
copier.CopyWithOption(&result.ItemList, &ret, copier.Option{IgnoreEmpty: true, DeepCopy: true})
return result, 0 //通过PUB/SUB回包