384 lines
9.8 KiB
Go
384 lines
9.8 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.ErrMessageError)
|
|
return
|
|
}
|
|
|
|
if req.HeroUid == 0 {
|
|
_ = player.TipNotice(proto.ErrParameterError)
|
|
return
|
|
}
|
|
|
|
if req.Levels != 1 && req.Levels != 5 {
|
|
_ = player.TipNotice(proto.ErrParameterError)
|
|
return
|
|
}
|
|
|
|
var hero = player.Hero[req.HeroUid]
|
|
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
|
|
}
|
|
|
|
if req.HeroUid == 0 || req.OptItemId == 0 {
|
|
_ = player.TipNotice(proto.ErrParameterError)
|
|
return
|
|
}
|
|
|
|
var hero = player.Hero[req.HeroUid]
|
|
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
|
|
}
|
|
|
|
var hero = player.Hero[req.HeroUid]
|
|
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]]
|
|
if setup != nil && setup.HeroUid != 0 {
|
|
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(),
|
|
})
|
|
|
|
if equip.HeroUid != 0 {
|
|
var setup = player.Hero[equip.HeroUid]
|
|
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(),
|
|
})
|
|
}
|
|
}
|
|
|
|
equip.HeroUid = hero.Uid
|
|
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) {
|
|
|
|
}
|
|
|
|
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(),
|
|
})
|
|
}
|