ecs/servers/game/logic/player_lineup.go

184 lines
4.5 KiB
Go
Raw Normal View History

package logic
import (
"ecs/proto/pb"
"ecs/servers/game/data"
"github.com/oylshe1314/framework/util"
"sort"
)
type PlayerLineup struct {
Uid uint64 `json:"uid" key:"1"`
Name string `bson:"name"`
Active bool `bson:"active"`
Heroes [8]*PlayerLineupHero `bson:"heroes"`
Helper [8]uint64 `bson:"helper"`
}
2025-06-14 18:49:31 +08:00
func (this *PlayerLineup) BuildMsgLineup(deleted ...bool) *pb.Lineup {
if len(deleted) > 0 && deleted[0] {
return &pb.Lineup{Uid: this.Uid}
}
var msg = &pb.Lineup{Uid: this.Uid, Name: this.Name, Active: this.Active}
if this.Active {
msg.HeroList = make([]*pb.LineupHero, 8)
for i, hero := range this.Heroes {
if hero != nil {
msg.HeroList[i] = hero.BuildMsgLineupHero(uint32(i))
}
}
for _, helper := range this.Helper {
msg.HelpList = append(msg.HelpList, helper)
}
}
return msg
}
2025-06-14 18:49:31 +08:00
func (this *Player) SendLineupHeroChange(lineups ...*PlayerLineup) {
var heroChangeList []*pb.HeroChange
for _, lineup := range lineups {
if lineup == nil {
continue
}
for _, lineupHero := range lineup.Heroes {
if lineupHero == nil {
continue
}
if hero, ok := this.Hero[lineupHero.HeroUid]; ok {
if lineup.Active {
if this.updateHeroAttrs(hero, lineup, lineupHero) {
heroChangeList = append(heroChangeList, &pb.HeroChange{ChangeType: pb.ChangeType_Changed, Hero: hero.BuildMsgHero()})
}
} else {
if this.updateHeroAttrs(hero, nil, nil) {
heroChangeList = append(heroChangeList, &pb.HeroChange{ChangeType: pb.ChangeType_Changed, Hero: hero.BuildMsgHero()})
}
}
}
}
}
_ = this.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroChange), pb.HeroChangeListAck{
ChangeList: heroChangeList,
})
}
func (this *Player) SendUpgradeMaster(masterType pb.UpgradeMasterType, preLevel, curLevel uint32, heroUid uint64) {
if heroUid == 0 {
return
}
2025-06-14 18:49:31 +08:00
var hero = this.Hero[heroUid]
if hero == nil {
return
}
var masterTables = this.manager.tables.UpgradeMaster.Find1(int(masterType))
if len(masterTables) == 0 {
return
}
var preMasterTable, curMasterTable *data.UpgradeMaster
for _, v := range masterTables {
if uint32(v.NeedLevel) <= preLevel {
preMasterTable = v
continue
}
if uint32(v.NeedLevel) > curLevel {
return
}
curMasterTable = v
break
}
if curMasterTable == nil {
return
}
var lineup = util.MapFindValue(this.Lineup, func(v *PlayerLineup) bool {
return v.Active
})
if lineup == nil {
return
}
var lineupHero = util.SliceFindValue(lineup.Heroes[:], func(i int) bool {
2025-06-14 18:49:31 +08:00
return lineup.Heroes[i] != nil && lineup.Heroes[i].HeroUid == hero.Uid
})
if lineupHero == nil {
return
}
var ack *pb.UpgradeMasterAck
switch masterType {
case pb.UpgradeMasterType_MasterEquipUpgrade, pb.UpgradeMasterType_MasterEquipRefine:
for _, equipUid := range lineupHero.Equip {
var equip = this.Equip[equipUid]
if equip == nil {
return
}
if masterType == pb.UpgradeMasterType_MasterEquipUpgrade {
if equip.Level < uint32(curMasterTable.NeedLevel) {
return
}
} else {
if equip.RefineLevel < uint32(curMasterTable.NeedLevel) {
return
}
}
}
ack = &pb.UpgradeMasterAck{
CurLevel: uint32(curMasterTable.Level),
}
case pb.UpgradeMasterType_MasterTreasureUpgrade, pb.UpgradeMasterType_MasterTreasureRefine:
for _, treasureUid := range lineupHero.Treasure {
var treasure = this.Treasure[treasureUid]
if treasure == nil {
return
}
if masterType == pb.UpgradeMasterType_MasterTreasureUpgrade {
if treasure.Level < uint32(curMasterTable.NeedLevel) {
return
}
} else {
if treasure.RefineLevel < uint32(curMasterTable.NeedLevel) {
return
}
}
}
ack = &pb.UpgradeMasterAck{
CurLevel: uint32(curMasterTable.Level),
}
default:
return
}
if preMasterTable != nil {
ack.PreLevel = uint32(preMasterTable.Level)
}
_ = this.Send(uint16(pb.ModId_ModuleRole), uint16(pb.MsgId_ModRoleUpgradeMaster), ack)
2025-06-14 18:49:31 +08:00
if this.updateHeroAttrs(hero, lineup, lineupHero) {
_ = this.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroChange), pb.HeroChangeListAck{
ChangeList: []*pb.HeroChange{{ChangeType: pb.ChangeType_Changed, Hero: hero.BuildMsgHero()}},
})
}
}
func (this *Player) BuildMsgLineupListAck() *pb.LineupListAck {
var list []*pb.Lineup
for _, lineup := range this.Lineup {
list = append(list, lineup.BuildMsgLineup())
}
sort.Slice(list, func(i, j int) bool {
return list[i].Uid < list[j].Uid
})
return &pb.LineupListAck{LineupList: list}
}