```
feat(fight_boss): 优化BOSS战斗奖励逻辑并修复宠物等级突破100级限制 重构了handleMapBossFightRewards函数,将奖励逻辑分离到独立的处理函数中, 增加了shouldGrantBossWinBonus条件判断,确保只有满足条件时才发放胜利奖励。 同时修复了宠物等级系统,允许宠物等级突破100级限制但面板属性仍保持100级上限, 改进了经验获取和面板更新逻辑。 fix(item
This commit is contained in:
@@ -41,7 +41,6 @@ func (Controller) PlayerFightBoss(req *ChallengeBossInboundInfo, p *player.Playe
|
||||
if err != 0 {
|
||||
return nil, err
|
||||
}
|
||||
leadMonster := &monsterInfo.PetList[0]
|
||||
|
||||
p.Fightinfo.Status = fightinfo.BattleMode.FIGHT_WITH_NPC
|
||||
p.Fightinfo.Mode = resolveMapNodeFightMode(mapNode)
|
||||
@@ -53,7 +52,12 @@ func (Controller) PlayerFightBoss(req *ChallengeBossInboundInfo, p *player.Playe
|
||||
|
||||
var fightC *fight.FightC
|
||||
fightC, err = startMapBossFight(mapNode, p, ai, func(foi model.FightOverInfo) {
|
||||
handleMapBossFightRewards(p, fightC, foi, mapNode, bossConfigs[0], leadMonster)
|
||||
if mapNode.WinBonusID == 0 {
|
||||
return
|
||||
}
|
||||
if shouldGrantBossWinBonus(fightC, p.Info.UserID, bossConfigs[0], foi) {
|
||||
p.SptCompletedTask(mapNode.WinBonusID, 1)
|
||||
}
|
||||
})
|
||||
if err != 0 {
|
||||
return nil, err
|
||||
@@ -230,95 +234,6 @@ func shouldGrantBossWinBonus(fightC *fight.FightC, playerID uint32, bossConfig c
|
||||
return true
|
||||
}
|
||||
|
||||
func handleMapBossFightRewards(
|
||||
p *player.Player,
|
||||
fightC *fight.FightC,
|
||||
foi model.FightOverInfo,
|
||||
mapNode *configmodel.MapNode,
|
||||
bossConfig configmodel.BossConfig,
|
||||
leadMonster *model.PetInfo,
|
||||
) {
|
||||
rewards := grantMonsterFightRewards(p, foi, leadMonster)
|
||||
if mapNode != nil && mapNode.WinBonusID != 0 && shouldGrantBossWinBonus(fightC, p.Info.UserID, bossConfig, foi) {
|
||||
appendBossTaskReward(p, mapNode.WinBonusID, 1, rewards)
|
||||
}
|
||||
if rewards != nil && rewards.HasReward() {
|
||||
p.SendPackCmd(8004, rewards)
|
||||
}
|
||||
}
|
||||
|
||||
func grantMonsterFightRewards(p *player.Player, foi model.FightOverInfo, monster *model.PetInfo) *fightinfo.S2C_GET_BOSS_MONSTER {
|
||||
rewards := &fightinfo.S2C_GET_BOSS_MONSTER{}
|
||||
if p == nil || monster == nil || foi.Reason != 0 || foi.WinnerId != p.Info.UserID || !p.CanGet() {
|
||||
return rewards
|
||||
}
|
||||
|
||||
petCfg, ok := xmlres.PetMAP[int(monster.ID)]
|
||||
if !ok {
|
||||
return rewards
|
||||
}
|
||||
|
||||
exp := uint32(petCfg.YieldingExp) * monster.Level / 7
|
||||
addlevel, poolevel := p.CanGetExp()
|
||||
addexp := gconv.Float32(addlevel * gconv.Float32(exp))
|
||||
poolexp := gconv.Float32(poolevel) * gconv.Float32(exp)
|
||||
|
||||
p.ItemAdd(3, int64(poolexp+addexp))
|
||||
rewards.AddItem(rewardItemExpPool, uint32(poolexp))
|
||||
p.AddPetExp(foi.Winpet, int64(addexp))
|
||||
|
||||
if p.CanGetItem() {
|
||||
itemID := p.GetSpace().GetDrop()
|
||||
if itemID != 0 {
|
||||
count := uint32(grand.N(1, 2))
|
||||
if p.ItemAdd(itemID, int64(count)) {
|
||||
rewards.AddItem(uint32(itemID), count)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
petType := int64(petCfg.Type)
|
||||
if monster.IsShiny() && p.CanGetXUAN() && petType < 16 {
|
||||
xuanID := uint32(400686 + petType)
|
||||
count := uint32(grand.N(1, 2))
|
||||
if p.ItemAdd(int64(xuanID), int64(count)) {
|
||||
rewards.AddItem(xuanID, count)
|
||||
}
|
||||
}
|
||||
|
||||
if foi.Winpet != nil {
|
||||
foi.Winpet.AddEV(petCfg.YieldingEVValues)
|
||||
}
|
||||
return rewards
|
||||
}
|
||||
|
||||
func appendBossTaskReward(p *player.Player, taskID int, outState int, rewards *fightinfo.S2C_GET_BOSS_MONSTER) {
|
||||
if p == nil || rewards == nil || !p.IsLogin || taskID <= 0 {
|
||||
return
|
||||
}
|
||||
if p.Info.GetTask(taskID) == model.Completed {
|
||||
return
|
||||
}
|
||||
|
||||
granted, err := p.ApplyTaskCompletion(uint32(taskID), outState, nil)
|
||||
if err != 0 {
|
||||
return
|
||||
}
|
||||
|
||||
p.Info.SetTask(taskID, model.Completed)
|
||||
rewards.BonusID = uint32(taskID)
|
||||
if granted == nil {
|
||||
return
|
||||
}
|
||||
if granted.Pet != nil {
|
||||
rewards.PetID = granted.Pet.ID
|
||||
rewards.CaptureTm = granted.Pet.CatchTime
|
||||
}
|
||||
for _, item := range granted.Items {
|
||||
rewards.AddItemInfo(item)
|
||||
}
|
||||
}
|
||||
|
||||
func buildNpcMonsterInfo(refPet player.OgrePetInfo, mapID uint32) (*model.PetInfo, *model.PlayerInfo, errorcode.ErrorCode) {
|
||||
if refPet.ID == 0 {
|
||||
return nil, nil, errorcode.ErrorCodes.ErrPokemonNotExists
|
||||
@@ -354,8 +269,46 @@ func buildNpcMonsterInfo(refPet player.OgrePetInfo, mapID uint32) (*model.PetInf
|
||||
}
|
||||
|
||||
func handleNpcFightRewards(p *player.Player, foi model.FightOverInfo, monster *model.PetInfo) {
|
||||
rewards := grantMonsterFightRewards(p, foi, monster)
|
||||
if foi.Reason != 0 || foi.WinnerId != p.Info.UserID || !p.CanGet() {
|
||||
return
|
||||
}
|
||||
|
||||
petCfg, ok := xmlres.PetMAP[int(monster.ID)]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
exp := uint32(petCfg.YieldingExp) * monster.Level / 7
|
||||
addlevel, poolevel := p.CanGetExp()
|
||||
addexp := gconv.Float32(addlevel * gconv.Float32(exp))
|
||||
poolexp := gconv.Float32(poolevel) * gconv.Float32(exp)
|
||||
rewards := &fightinfo.S2C_GET_BOSS_MONSTER{}
|
||||
|
||||
p.ItemAdd(3, int64(poolexp+addexp))
|
||||
rewards.AddItem(rewardItemExpPool, uint32(poolexp))
|
||||
p.AddPetExp(foi.Winpet, int64(addexp))
|
||||
|
||||
if p.CanGetItem() {
|
||||
itemID := p.GetSpace().GetDrop()
|
||||
if itemID != 0 {
|
||||
count := uint32(grand.N(1, 2))
|
||||
if p.ItemAdd(itemID, int64(count)) {
|
||||
rewards.AddItem(uint32(itemID), count)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
petType := int64(petCfg.Type)
|
||||
if monster.IsShiny() && p.CanGetXUAN() && petType < 16 {
|
||||
xuanID := uint32(400686 + petType)
|
||||
count := uint32(grand.N(1, 2))
|
||||
if p.ItemAdd(int64(xuanID), int64(count)) {
|
||||
rewards.AddItem(xuanID, count)
|
||||
}
|
||||
}
|
||||
|
||||
if rewards.HasReward() {
|
||||
p.SendPackCmd(8004, rewards)
|
||||
}
|
||||
foi.Winpet.AddEV(petCfg.YieldingEVValues)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user