390 lines
10 KiB
Go
390 lines
10 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.HeroId == 0 {
|
||
|
_ = player.TipNotice(proto.ErrParameterError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if req.Levels != 1 && req.Levels != 5 {
|
||
|
_ = player.TipNotice(proto.ErrParameterError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var hero = player.Hero[req.HeroId]
|
||
|
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.HeroId == 0 || req.OptItemId == 0 {
|
||
|
_ = player.TipNotice(proto.ErrParameterError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var hero = player.Hero[req.HeroId]
|
||
|
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) HeroGeneralActivate(player *logic.Player, msg *net.Message) {
|
||
|
var req = new(pb.HeroGeneralActivateReq)
|
||
|
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 hero = player.Hero[req.HeroId]
|
||
|
if hero == nil {
|
||
|
_ = player.TipNotice(proto.ErrHeroNotFound)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var heroGeneralTables = this.tables.HeroGeneral.Find2(int(hero.Id))
|
||
|
if len(heroGeneralTables) == 0 {
|
||
|
_ = player.TipNotice(proto.ErrDataTablesError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if req.Index >= uint32(len(heroGeneralTables)) {
|
||
|
_ = player.TipNotice(proto.ErrParameterError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if req.Index >= uint32(len(hero.General)) {
|
||
|
_ = player.TipNotice(proto.ErrParameterError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if len(hero.General) != len(heroGeneralTables) {
|
||
|
var general = make([]uint32, len(heroGeneralTables))
|
||
|
copy(general, hero.General)
|
||
|
hero.General = general
|
||
|
}
|
||
|
|
||
|
if hero.General[req.Index] != 0 {
|
||
|
_ = player.TipNotice(proto.ErrHeroGeneralActivated)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for _, needId := range heroGeneralTables[req.Index].NeedHeroes {
|
||
|
if _, ok := player.Hero[uint32(needId)]; !ok {
|
||
|
_ = player.TipNotice(proto.ErrHeroGeneralCanNotActivate)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
hero.General[req.Index] = uint32(heroGeneralTables[req.Index].HeroId)
|
||
|
|
||
|
player.SaveModel(hero)
|
||
|
player.UpdateHeroAttrs(hero)
|
||
|
|
||
|
_ = player.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroChange), &pb.HeroChangeListAck{
|
||
|
ChangeList: []*pb.HeroChange{{ChangeType: pb.ChangeType_Changed, Hero: hero.BuildMsgHero()}},
|
||
|
})
|
||
|
}
|
||
|
|
||
|
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.HeroId]
|
||
|
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.HeroId != 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.HeroId != 0 {
|
||
|
var setup = player.Hero[equip.HeroId]
|
||
|
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.HeroId = hero.Id
|
||
|
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) {
|
||
|
|
||
|
}
|