feat(xmlres): 更新 BOSS 配置结构并优化字段注释
新增多个 BOSS 相关配置字段,包括任务关联、奖励机制与挑战限制等, 增强 BOSS 精灵的可配置性与业务表达能力。同时完善字段注释以对齐 XML 实际使用情况,并保留原有部分字段用于兼容历史配置。 fix(fight): 调整战斗胜利回调执行顺序以确保数据一致性 将战斗结束回调移至广播之前执行,保证在发送战斗结果前已完成所有状态 更新,尤其是针对胜利宠物的信息同步
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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回包
|
||||
|
||||
Reference in New Issue
Block a user