ecs/servers/game/handler/player_hero.go

384 lines
9.8 KiB
Go
Raw Normal View History

2025-06-04 18:17:39 +08:00
package handler
import (
"ecs/proto"
"ecs/proto/pb"
"ecs/servers/game/logic"
"github.com/oylshe1314/framework/net"
)
func (this *PlayerHandler) HeroUpgrade(player *logic.Player, msg *net.Message) {
var req = new(pb.HeroUpgradeReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.ErrMessageError)
return
}
2025-06-05 17:48:23 +08:00
if req.HeroUid == 0 {
2025-06-04 18:17:39 +08:00
_ = player.TipNotice(proto.ErrParameterError)
return
}
if req.Levels != 1 && req.Levels != 5 {
_ = player.TipNotice(proto.ErrParameterError)
return
}
2025-06-05 17:48:23 +08:00
var hero = player.Hero[req.HeroUid]
2025-06-04 18:17:39 +08:00
if hero == nil {
_ = player.TipNotice(proto.ErrHeroNotFound)
return
}
var heroTable = this.tables.Hero.Get(int(hero.Id))
if heroTable == nil {
_ = player.TipNotice(proto.ErrDataTablesError)
return
}
if hero.Level >= uint32(heroTable.Level) {
_ = player.TipNotice(proto.ErrLevelAlreadyMax)
return
}
var itemTables = this.tables.Item.Find2(int(pb.ItemType_ItemProp), int(pb.PropType_HeroExp))
if len(itemTables) == 0 {
_ = player.TipNotice(proto.ErrDataTablesError)
return
}
var exp = hero.Exp
var level = hero.Level
var consumeItems = map[uint32]uint32{}
for range req.Levels {
var heroLevelTable = this.tables.HeroLevel.Find3(int(hero.Id), int(level))
if heroLevelTable == nil {
_ = player.TipNotice(proto.ErrDataTablesError)
return
}
var hasItem = false
for _, itemTable := range itemTables {
var item = player.Item[uint32(itemTable.Id)]
if item == nil || item.Num == 0 {
continue
}
var consumedNum = consumeItems[item.Id]
if item.Num <= consumedNum {
continue
}
var needExp = uint64(heroLevelTable.NeedExp) - exp
var needNums = uint32(needExp / uint64(itemTable.Value))
if needExp%uint64(itemTable.Value) > 0 {
needNums += 1
}
if item.Num-consumedNum < needNums {
consumedNum = item.Num
exp += uint64(itemTable.Value) * uint64(item.Num-consumedNum)
} else {
hasItem = true
consumedNum += needNums
exp += uint64(itemTable.Value) * uint64(needNums)
}
if exp >= uint64(heroLevelTable.NeedExp) {
level += 1
exp -= uint64(heroLevelTable.NeedExp)
}
}
if !hasItem {
break
}
}
if exp == hero.Exp && level == hero.Level {
return
}
hero.Exp = exp
hero.Level = level
player.SaveModel(hero)
player.UpdateHeroAttrs(hero)
for itemId, itemNum := range consumeItems {
player.ReduceItem(itemId, itemNum, logic.LogTypeItemConsumeByHeroUpgrade)
}
_ = player.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroChange), &pb.HeroChangeListAck{
ChangeList: []*pb.HeroChange{{ChangeType: pb.ChangeType_Changed, Hero: hero.BuildMsgHero()}},
})
// switch proto.EquipType(component.Type) {
// case proto.EquipTypeHead:
// player.CheckTask(proto.TaskSection1UpgradeHeadComponents, 0, 1)
// player.CheckTask(proto.TaskSection1HeadComponentMaxLevel, 0, nextComponentTable.Level)
// case proto.EquipTypeBody:
// player.CheckTask(proto.TaskSection1UpgradeBodyComponents, 0, 1)
// player.CheckTask(proto.TaskSection1BodyComponentMaxLevel, 0, nextComponentTable.Level)
// case proto.EquipTypeTail:
// player.CheckTask(proto.TaskSection1UpgradeTailComponents, 0, 1)
// player.CheckTask(proto.TaskSection1TailComponentMaxLevel, 0, nextComponentTable.Level)
// }
//
// player.UpdateRigAttrs()
//
// player.CheckRigTrammelsStatus(uint32(nextComponentTable.ItemId), uint32(nextComponentTable.Level), 0)
//
// player.CheckTask(proto.TaskSection1UpgradeComponents, 0, 1)
// player.CheckTask(proto.TaskSection1ComponentsAllLevels, 0, int(player.GetAllRigComponentLevels()))
return
}
func (this *PlayerHandler) HeroBreak(player *logic.Player, msg *net.Message) {
var req = new(pb.HeroBreakReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.ErrMessageError)
return
}
2025-06-05 17:48:23 +08:00
if req.HeroUid == 0 || req.OptItemId == 0 {
2025-06-04 18:17:39 +08:00
_ = player.TipNotice(proto.ErrParameterError)
return
}
2025-06-05 17:48:23 +08:00
var hero = player.Hero[req.HeroUid]
2025-06-04 18:17:39 +08:00
if hero == nil {
_ = player.TipNotice(proto.ErrHeroNotFound)
return
}
var heroTable = this.tables.Hero.Get(int(hero.Id))
if heroTable == nil {
_ = player.TipNotice(proto.ErrDataTablesError)
return
}
if hero.BreakLevel >= uint32(heroTable.BreaksLevels) {
_ = player.TipNotice(proto.ErrHeroBreakLevelAlreadyMax)
return
}
var nextBreakLevelTable = this.tables.HeroBreak.Find3(int(hero.Id), int(hero.BreakLevel+1))
if nextBreakLevelTable == nil {
_ = player.TipNotice(proto.ErrDataTablesError)
return
}
for i := range nextBreakLevelTable.ConsumeItems {
err = player.CheckItem(uint32(nextBreakLevelTable.ConsumeItems[i]), uint32(nextBreakLevelTable.ConsumeNums[i]))
if err != nil {
_ = player.TipNotice(err)
return
}
}
var optItemId, optItemNum uint32
for i := range nextBreakLevelTable.OptionalConsumeItems {
if uint32(nextBreakLevelTable.OptionalConsumeItems[i]) == req.OptItemId {
optItemId, optItemNum = uint32(nextBreakLevelTable.OptionalConsumeItems[i]), uint32(nextBreakLevelTable.OptionalConsumeNums[i])
err = player.CheckItem(optItemId, optItemNum)
if err != nil {
_ = player.TipNotice(err)
return
}
}
}
if optItemId == 0 {
_ = player.TipNotice(proto.ErrParameterError)
return
}
hero.BreakLevel = uint32(nextBreakLevelTable.BreakLevel)
player.SaveModel(hero)
player.UpdateHeroAttrs(hero)
for i := range nextBreakLevelTable.ConsumeItems {
player.ReduceItem(uint32(nextBreakLevelTable.ConsumeItems[i]), uint32(nextBreakLevelTable.ConsumeNums[i]), logic.LogTypeItemConsumeByHeroBreak)
}
player.ReduceItem(optItemId, optItemNum, logic.LogTypeItemConsumeByHeroBreak)
}
func (this *PlayerHandler) HeroAwaken(player *logic.Player, msg *net.Message) {
}
func (this *PlayerHandler) HeroSoul(player *logic.Player, msg *net.Message) {
}
func (this *PlayerHandler) HeroFate(player *logic.Player, msg *net.Message) {
}
func (this *PlayerHandler) HeroQuality(player *logic.Player, msg *net.Message) {
}
func (this *PlayerHandler) HeroEquip(player *logic.Player, msg *net.Message) {
var req = new(pb.HeroEquipReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.ErrMessageError)
return
}
2025-06-05 17:48:23 +08:00
var hero = player.Hero[req.HeroUid]
2025-06-04 18:17:39 +08:00
if hero == nil {
_ = player.TipNotice(proto.ErrHeroNotFound)
return
}
var equip = player.Equip[req.EquipUid]
if equip == nil {
_ = player.TipNotice(proto.ErrEquipNotFound)
return
}
var equipTable = this.tables.Equip.Find(int(equip.Id))
if equipTable == nil {
_ = player.TipNotice(proto.ErrDataTablesError)
return
}
var equipIndex = 0
switch pb.EquipType(equipTable.Type) {
case pb.EquipType_Weapon:
equipIndex = 0
case pb.EquipType_Hat:
equipIndex = 1
case pb.EquipType_Cloth:
equipIndex = 2
case pb.EquipType_Shoe:
equipIndex = 3
default:
_ = player.TipNotice(proto.ErrDataTablesError)
return
}
var heroChangeList []*pb.HeroChange
var equipChangeList []*pb.EquipChange
if hero.Equips[equipIndex] != 0 {
var setup = player.Equip[hero.Equips[equipIndex]]
2025-06-05 17:48:23 +08:00
if setup != nil && setup.HeroUid != 0 {
2025-06-04 18:17:39 +08:00
setup.Id = 0
player.SaveModel(setup)
equipChangeList = append(equipChangeList, &pb.EquipChange{
ChangeType: pb.ChangeType_Changed,
Equip: setup.BuildMsgEquip(),
})
}
}
hero.Equips[equipIndex] = equip.Uid
player.SaveModel(hero)
heroChangeList = append(heroChangeList, &pb.HeroChange{
ChangeType: pb.ChangeType_Changed,
Hero: hero.BuildMsgHero(),
})
2025-06-05 17:48:23 +08:00
if equip.HeroUid != 0 {
var setup = player.Hero[equip.HeroUid]
2025-06-04 18:17:39 +08:00
if setup != nil && setup.Equips[equipIndex] != 0 {
setup.Equips[equipIndex] = 0
player.SaveModel(setup)
heroChangeList = append(heroChangeList, &pb.HeroChange{
ChangeType: pb.ChangeType_Changed,
Hero: setup.BuildMsgHero(),
})
}
}
2025-06-05 17:48:23 +08:00
equip.HeroUid = hero.Uid
2025-06-04 18:17:39 +08:00
player.SaveModel(equip)
equipChangeList = append(equipChangeList, &pb.EquipChange{
ChangeType: pb.ChangeType_Changed,
Equip: equip.BuildMsgEquip(),
})
_ = player.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroChange), &pb.HeroChangeListAck{ChangeList: heroChangeList})
_ = player.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemEquipChange), &pb.EquipChangeListAck{ChangeList: equipChangeList})
return
}
func (this *PlayerHandler) HeroTreasure(player *logic.Player, msg *net.Message) {
}
func (this *PlayerHandler) HeroArtifacts(player *logic.Player, msg *net.Message) {
}
func (this *PlayerHandler) HeroTips(player *logic.Player, msg *net.Message) {
}
2025-06-05 17:48:23 +08:00
func (this *PlayerHandler) HeroBookActivate(player *logic.Player, msg *net.Message) {
var req = new(pb.HeroBookActivateReq)
var err = msg.Read(req)
if err != nil {
this.logger.Error("Read message failed, ", err)
_ = player.TipNotice(proto.ErrMessageError)
return
}
if req.HeroId == 0 {
_ = player.TipNotice(proto.ErrParameterError)
return
}
var heroBook = player.HeroBook[req.HeroId]
if heroBook == nil {
_ = player.TipNotice(proto.ErrHeroNotFound)
return
}
if req.Index >= uint32(len(heroBook.Items)) {
_ = player.TipNotice(proto.ErrParameterError)
return
}
var heroBookTables = this.tables.HeroBook.Find2(int(heroBook.HeroId))
if len(heroBookTables) != len(heroBook.Items) {
_ = player.TipNotice(proto.ErrDataTablesError)
return
}
if heroBook.Items[req.Index].Value {
_ = player.TipNotice(proto.ErrHeroBookActivated)
return
}
for _, needId := range heroBookTables[req.Index].NeedHeroes {
if _, ok := player.HeroBook[uint32(needId)]; !ok {
_ = player.TipNotice(proto.ErrHeroBookCanNotActivate)
return
}
}
heroBook.Items[req.Index].Value = true
player.SaveModel(heroBook)
for _, hero := range player.Hero {
if hero.Id == heroBook.HeroId {
player.UpdateHeroAttrs(hero)
}
}
_ = player.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroBookChange), &pb.HeroBookChangeAck{
ChangeType: pb.ChangeType_Changed,
HeroBook: heroBook.BuildMsgHeroBook(),
})
}