300 lines
7.9 KiB
Go
300 lines
7.9 KiB
Go
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.TipMessageError)
|
|
return
|
|
}
|
|
|
|
if req.HeroUid == 0 {
|
|
this.logger.Error("Parameter error, req.HeroUid == 0")
|
|
_ = player.TipNotice(proto.TipParameterError)
|
|
return
|
|
}
|
|
|
|
if req.HeroUid == player.RoleHero.Uid {
|
|
this.logger.Error("Parameter error, Role hero can not upgrade here, req.HeroUid: ", req.HeroUid)
|
|
_ = player.TipNotice(proto.TipRoleHeroCanNotUpgrade)
|
|
return
|
|
}
|
|
|
|
if req.Levels != 1 && req.Levels != 5 {
|
|
_ = player.TipNotice(proto.TipParameterError)
|
|
return
|
|
}
|
|
|
|
var hero = player.Hero[req.HeroUid]
|
|
if hero == nil {
|
|
_ = player.TipNotice(proto.TipHeroNotFound)
|
|
return
|
|
}
|
|
|
|
var heroTable = this.tables.Hero.Get(int(hero.Id))
|
|
if heroTable == nil {
|
|
_ = player.TipNotice(proto.TipDataTablesError)
|
|
return
|
|
}
|
|
|
|
if hero.Level >= uint32(heroTable.Level) {
|
|
_ = player.TipNotice(proto.TipLevelAlreadyMax)
|
|
return
|
|
}
|
|
|
|
var itemTables = this.tables.Item.Find2(int(pb.ItemType_ItemProp), int(pb.PropType_HeroExp))
|
|
if len(itemTables) == 0 {
|
|
_ = player.TipNotice(proto.TipDataTablesError)
|
|
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.TipDataTablesError)
|
|
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.TipMessageError)
|
|
return
|
|
}
|
|
|
|
if req.HeroUid == 0 || req.OptItemId == 0 {
|
|
_ = player.TipNotice(proto.TipParameterError)
|
|
return
|
|
}
|
|
|
|
var hero = player.Hero[req.HeroUid]
|
|
if hero == nil {
|
|
this.logger.Error("Parameter error, Hero not found, req.HeroUid: ", req.HeroUid)
|
|
_ = player.TipNotice(proto.TipHeroNotFound)
|
|
return
|
|
}
|
|
|
|
var heroTable = this.tables.Hero.Get(int(hero.Id))
|
|
if heroTable == nil {
|
|
_ = player.TipNotice(proto.TipDataTablesError)
|
|
return
|
|
}
|
|
|
|
if hero.BreakLevel >= uint32(heroTable.BreaksLevels) {
|
|
_ = player.TipNotice(proto.TipHeroBreakLevelAlreadyMax)
|
|
return
|
|
}
|
|
|
|
var nextBreakLevelTable = this.tables.HeroBreak.Find3(int(hero.Id), int(hero.BreakLevel+1))
|
|
if nextBreakLevelTable == nil {
|
|
_ = player.TipNotice(proto.TipDataTablesError)
|
|
return
|
|
}
|
|
|
|
for i := range nextBreakLevelTable.ConsumeItems {
|
|
if ok, tip := player.CheckItem(uint32(nextBreakLevelTable.ConsumeItems[i]), uint32(nextBreakLevelTable.ConsumeNums[i])); !ok {
|
|
_ = player.TipNotice(tip)
|
|
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])
|
|
|
|
if ok, tip := player.CheckItem(optItemId, optItemNum); !ok {
|
|
_ = player.TipNotice(tip)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
if optItemId == 0 {
|
|
_ = player.TipNotice(proto.TipParameterError)
|
|
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) HeroFateBreak(player *logic.Player, msg *net.Message) {
|
|
|
|
}
|
|
|
|
func (this *PlayerHandler) HeroQuality(player *logic.Player, msg *net.Message) {
|
|
|
|
}
|
|
|
|
func (this *PlayerHandler) HeroTreasure(player *logic.Player, msg *net.Message) {
|
|
|
|
}
|
|
|
|
func (this *PlayerHandler) HeroArtifacts(player *logic.Player, msg *net.Message) {
|
|
|
|
}
|
|
|
|
func (this *PlayerHandler) HeroSack(player *logic.Player, msg *net.Message) {
|
|
|
|
}
|
|
|
|
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.TipMessageError)
|
|
return
|
|
}
|
|
|
|
if req.HeroId == 0 {
|
|
_ = player.TipNotice(proto.TipParameterError)
|
|
return
|
|
}
|
|
|
|
var heroBook = player.HeroBook[req.HeroId]
|
|
if heroBook == nil {
|
|
_ = player.TipNotice(proto.TipHeroNotFound)
|
|
return
|
|
}
|
|
|
|
if req.Index >= uint32(len(heroBook.Items)) {
|
|
_ = player.TipNotice(proto.TipParameterError)
|
|
return
|
|
}
|
|
|
|
var heroBookTables = this.tables.HeroBook.Find2(int(heroBook.HeroId))
|
|
if len(heroBookTables) != len(heroBook.Items) {
|
|
_ = player.TipNotice(proto.TipDataTablesError)
|
|
return
|
|
}
|
|
|
|
if pb.AbleStatus(heroBook.Items[req.Index][1]) == pb.AbleStatus_Already {
|
|
_ = player.TipNotice(proto.TipHeroBookActivated)
|
|
return
|
|
}
|
|
|
|
if pb.AbleStatus(heroBook.Items[req.Index][1]) == pb.AbleStatus_Unable {
|
|
_ = player.TipNotice(proto.TipHeroBookCanNotActivate)
|
|
return
|
|
}
|
|
|
|
heroBook.Items[req.Index][1] = uint32(pb.AbleStatus_Already)
|
|
|
|
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.HeroBookListAck{
|
|
BookList: []*pb.HeroBook{heroBook.BuildMsgHeroBook()},
|
|
})
|
|
}
|