2025-09-21 17:01:31 +00:00
|
|
|
|
package player
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"blazing/common/data/xmlres"
|
2025-10-18 23:58:19 +08:00
|
|
|
|
"blazing/common/utils"
|
2025-09-26 13:33:55 +08:00
|
|
|
|
"blazing/logic/service/fight/info"
|
|
|
|
|
|
|
2025-09-21 17:01:31 +00:00
|
|
|
|
"blazing/modules/blazing/model"
|
2025-09-26 13:33:55 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/jinzhu/copier"
|
2025-09-21 17:01:31 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 主函数实现
|
|
|
|
|
|
// 添加经验
|
2025-10-14 01:26:59 +08:00
|
|
|
|
// 禁止发包
|
2025-11-01 00:40:19 +08:00
|
|
|
|
func (p *Player) AddPetExp(petinfo *model.PetInfo, addExp uint32) {
|
2025-10-18 23:58:19 +08:00
|
|
|
|
addExp = utils.Min(addExp, p.Info.ExpPool)
|
2025-09-26 13:33:55 +08:00
|
|
|
|
originalLevel := petinfo.Level
|
2025-10-18 23:58:19 +08:00
|
|
|
|
Exp := petinfo.Exp + addExp
|
|
|
|
|
|
petinfo.Update()
|
2025-10-17 23:09:26 +00:00
|
|
|
|
p.Info.ExpPool -= addExp //减去已使用的经验
|
2025-10-18 23:58:19 +08:00
|
|
|
|
for Exp >= petinfo.NextLvExp {
|
2025-10-17 23:09:26 +00:00
|
|
|
|
petinfo.Level++
|
2025-10-18 23:58:19 +08:00
|
|
|
|
petinfo.Update()
|
|
|
|
|
|
Exp -= petinfo.LvExp
|
2025-10-17 23:09:26 +00:00
|
|
|
|
if originalLevel < 100 && petinfo.Level == 100 { //升到100了
|
2025-10-18 23:58:19 +08:00
|
|
|
|
p.Info.ExpPool += Exp //减去已使用的经验
|
|
|
|
|
|
Exp = 0
|
2025-10-17 23:09:26 +00:00
|
|
|
|
break //停止升级
|
|
|
|
|
|
}
|
2025-09-22 15:47:07 +00:00
|
|
|
|
|
2025-09-21 17:01:31 +00:00
|
|
|
|
}
|
2025-10-17 21:40:51 +00:00
|
|
|
|
|
2025-10-18 23:58:19 +08:00
|
|
|
|
petinfo.Exp = Exp
|
2025-09-21 17:01:31 +00:00
|
|
|
|
// 重新计算面板
|
2025-09-26 13:33:55 +08:00
|
|
|
|
if originalLevel != petinfo.Level {
|
2025-10-18 23:58:19 +08:00
|
|
|
|
|
2025-09-26 13:33:55 +08:00
|
|
|
|
petinfo.CalculatePetPane()
|
2025-10-18 23:58:19 +08:00
|
|
|
|
petinfo.Cure()
|
2025-09-22 13:30:16 +00:00
|
|
|
|
}
|
2025-09-21 17:01:31 +00:00
|
|
|
|
|
|
|
|
|
|
// 处理技能学习
|
2025-10-13 18:51:41 +08:00
|
|
|
|
canLearnSkillList := LastFourElements(petinfo.GetLevelRangeCanLearningSkills(originalLevel, petinfo.Level)) //获取最后四个技能,如果不足,那就取全部技能
|
2025-09-21 17:01:31 +00:00
|
|
|
|
|
2025-10-27 01:11:31 +08:00
|
|
|
|
for i := 0; i < 4; i++ {
|
2025-09-21 17:01:31 +00:00
|
|
|
|
|
2025-10-27 01:11:31 +08:00
|
|
|
|
if len(canLearnSkillList) != 0 {
|
|
|
|
|
|
skid := canLearnSkillList[len(canLearnSkillList)-1]
|
|
|
|
|
|
petinfo.SkillList = append(petinfo.SkillList, model.SkillInfo{
|
2025-10-26 20:56:03 +08:00
|
|
|
|
|
2025-10-27 01:11:31 +08:00
|
|
|
|
ID: skid,
|
|
|
|
|
|
PP: uint32(xmlres.SkillMap[int(skid)].MaxPP),
|
|
|
|
|
|
})
|
2025-09-21 17:01:31 +00:00
|
|
|
|
|
2025-10-27 01:11:31 +08:00
|
|
|
|
canLearnSkillList = canLearnSkillList[:len(canLearnSkillList)-1]
|
2025-09-21 17:01:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-10-27 01:11:31 +08:00
|
|
|
|
petinfo.SkillList = petinfo.SkillList[:4] //归正到4
|
2025-11-01 00:40:19 +08:00
|
|
|
|
|
|
|
|
|
|
t1 := NewTomeeHeader(2508, p.Info.UserID)
|
|
|
|
|
|
rrr := &info.PetUpdateOutboundInfo{}
|
|
|
|
|
|
|
|
|
|
|
|
var petinfwo info.UpdatePropInfo
|
|
|
|
|
|
|
|
|
|
|
|
copier.Copy(&petinfwo, petinfo)
|
|
|
|
|
|
rrr.Data = append(rrr.Data, petinfwo)
|
|
|
|
|
|
p.SendPack(t1.Pack(rrr)) //准备包由各自发,因为协议不一样
|
|
|
|
|
|
// 发送经验更新消息
|
|
|
|
|
|
//player.SendMessage(generatePetUpdateInfo(petEntity, originalExp+addExp-exp, addition))
|
|
|
|
|
|
|
2025-09-21 17:01:31 +00:00
|
|
|
|
// // 发送技能更新消息
|
|
|
|
|
|
// updateSkillInfo := UpdateSkillInfo{
|
|
|
|
|
|
// PetCatchTime: petEntity.captureTime,
|
|
|
|
|
|
// ActiveSkillNum: activeSkillNum,
|
|
|
|
|
|
// UnActiveSkillNum: unActiveSkillNum,
|
|
|
|
|
|
// SkillArray: canLearnSkillList,
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// player.SendMessage(UpdateSkillOutboundInfo{
|
|
|
|
|
|
// InfoArray: []UpdateSkillInfo{updateSkillInfo},
|
|
|
|
|
|
// })
|
|
|
|
|
|
|
|
|
|
|
|
// return exp
|
2025-10-13 19:46:19 +08:00
|
|
|
|
|
2025-09-21 17:01:31 +00:00
|
|
|
|
}
|
2025-10-13 18:51:41 +08:00
|
|
|
|
|
|
|
|
|
|
func LastFourElements[T any](s []T) []T {
|
|
|
|
|
|
n := len(s)
|
|
|
|
|
|
if n <= 4 {
|
|
|
|
|
|
// 切片长度小于等于4时,返回整个切片
|
|
|
|
|
|
return s
|
|
|
|
|
|
}
|
|
|
|
|
|
// 切片长度大于4时,返回最后4个元素(从n-4索引到末尾)
|
|
|
|
|
|
return s[n-4:]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-24 00:31:38 +08:00
|
|
|
|
// GenPetInfo 生成一个新的精灵实例
|
|
|
|
|
|
// - 参数为 -1 时表示随机生成对应属性
|
2025-10-13 18:51:41 +08:00
|
|
|
|
// * @param petTypeId 精灵类型ID
|
2025-10-24 00:31:38 +08:00
|
|
|
|
// * @param individualValue 个体值(0-31)
|
|
|
|
|
|
// * @param natureId 性格ID(0-24)
|
|
|
|
|
|
// * @param abilityTypeEnum 特性类型ID(0=无, >0=指定, -1=随机)
|
|
|
|
|
|
// * @param shinyid 闪光ID(-1=随机)
|
|
|
|
|
|
// * @param level 等级(1-100)
|
2025-10-13 18:51:41 +08:00
|
|
|
|
// * @return 生成的精灵实体
|
2025-10-24 00:31:38 +08:00
|
|
|
|
func (player *Player) GenPetInfo(
|
|
|
|
|
|
id int,
|
|
|
|
|
|
dv, natureId, abilityTypeEnum, shinyid, level int,
|
|
|
|
|
|
) *model.PetInfo {
|
2025-10-13 18:51:41 +08:00
|
|
|
|
|
2025-10-24 00:31:38 +08:00
|
|
|
|
return model.GenPetInfo(id, dv, natureId, abilityTypeEnum, shinyid, level)
|
2025-10-13 18:51:41 +08:00
|
|
|
|
}
|