diff --git a/proto/idl/mod_item.proto b/proto/idl/mod_item.proto index 18ac66d..720f353 100644 --- a/proto/idl/mod_item.proto +++ b/proto/idl/mod_item.proto @@ -67,13 +67,13 @@ message ItemSaleReq { message Equip { uint64 Uid = 1; //玩家装备在列表中的唯一ID,列表中会有多个相同装备, 故不能用Id做为键 - uint32 Id = 2; - uint32 Level = 3; - uint32 RefineExp = 4; - uint32 RefineLevel = 5; - repeated uint32 Holes1 = 6; - repeated uint32 Holes2 = 7; - uint64 HeroUid = 8; + uint32 Id = 2; //配置表ID + uint32 Level = 3; //等级经验 + uint32 RefineExp = 4; //强化等级 + uint32 RefineLevel = 5; //精炼等级 + repeated uint64 Holes1 = 6; //普通孔镶嵌 + repeated uint64 Holes2 = 7; //特殊孔镶嵌 + uint64 HeroUid = 8; //装备的英雄 } // MsgId.ModEquipList: 6011 @@ -109,8 +109,13 @@ message EquipRefineReq { message Treasure { uint64 Uid = 1; //玩家宝物在列表中的唯一ID,列表中会有多个相同宝物, 故不能用Id做为键 - uint32 Id = 2; - uint64 HeroUid = 7; + uint32 Id = 2; //配置表ID + uint32 Exp = 3; //等级经验 + uint32 Level = 4; //强化等级 + uint32 RefineLevel = 5; //精炼等级 + repeated uint64 Holes1 = 6; //普通孔镶嵌 + repeated uint64 Holes2 = 7; //特殊孔镶嵌 + uint64 HeroUid = 8; //装备的英雄 } // MsgId.ModItemTreasureList = 6021; diff --git a/servers/game/handler/player_item.go b/servers/game/handler/player_item.go index 9256912..9fe8a3f 100644 --- a/servers/game/handler/player_item.go +++ b/servers/game/handler/player_item.go @@ -156,7 +156,7 @@ func (this *PlayerHandler) EquipUpgrade(player *logic.Player, msg *net.Message) ChangeList: []*pb.EquipChange{{Equip: equip.BuildMsgEquip(), ChangeType: pb.ChangeType_Add}}, }) - player.CheckUpgradeMaster(pb.UpgradeMasterType_MasterEquipUpgrade, preLevel, equip.Level, equip.HeroUid) + player.SendUpgradeMaster(pb.UpgradeMasterType_MasterEquipUpgrade, preLevel, equip.Level, equip.HeroUid) return } @@ -294,7 +294,7 @@ func (this *PlayerHandler) EquipRefine(player *logic.Player, msg *net.Message) { }) if equip.RefineLevel != preLevel { - player.CheckUpgradeMaster(pb.UpgradeMasterType_MasterEquipRefine, preLevel, equip.RefineLevel, equip.HeroUid) + player.SendUpgradeMaster(pb.UpgradeMasterType_MasterEquipRefine, preLevel, equip.RefineLevel, equip.HeroUid) } } @@ -432,7 +432,7 @@ func (this *PlayerHandler) TreasureUpgrade(player *logic.Player, msg *net.Messag }) if treasure.Level != preLevel { - player.CheckUpgradeMaster(pb.UpgradeMasterType_MasterTreasureUpgrade, preLevel, treasure.Level, treasure.HeroUid) + player.SendUpgradeMaster(pb.UpgradeMasterType_MasterTreasureUpgrade, preLevel, treasure.Level, treasure.HeroUid) } } @@ -506,6 +506,6 @@ func (this *PlayerHandler) TreasureRefine(player *logic.Player, msg *net.Message ChangeList: []*pb.TreasureChange{{Treasure: equip.BuildMsgTreasure(), ChangeType: pb.ChangeType_Add}}, }) - player.CheckUpgradeMaster(pb.UpgradeMasterType_MasterTreasureRefine, preLevel, equip.Level, equip.HeroUid) + player.SendUpgradeMaster(pb.UpgradeMasterType_MasterTreasureRefine, preLevel, equip.Level, equip.HeroUid) return } diff --git a/servers/game/handler/player_role.go b/servers/game/handler/player_role.go index 730e0bd..4cbd53e 100644 --- a/servers/game/handler/player_role.go +++ b/servers/game/handler/player_role.go @@ -143,11 +143,16 @@ func (this *PlayerHandler) LineupHeroChange(player *logic.Player, msg *net.Messa var setups [7]bool for i := 0; i < 8; i++ { - if lineup.Heroes[i] != nil && hero.Uid == lineup.Heroes[i].HeroUid { + if lineup.Heroes[i] == nil { + continue + } + + if hero.Uid == lineup.Heroes[i].HeroUid { this.logger.Errorf("The hero has set into the lineup, hero.Uid: %d, index: %d", hero.Uid, i) _ = player.TipNotice(proto.TipLineupHeroHasSet) return } + if i < 6 { if lineup.Heroes[i].Position > 0 { setups[lineup.Heroes[i].Position] = true @@ -236,16 +241,10 @@ func (this *PlayerHandler) LineupHeroPosition(player *logic.Player, msg *net.Mes setups[req.PositionList[i]] = true } - for i, lineupHero := range lineup.Heroes { - if i > 5 { - break + for i := range 6 { + if lineup.Heroes[i] != nil { + lineup.Heroes[i].Position = req.PositionList[i] } - - if lineupHero == nil { - continue - } - - lineupHero.Position = req.PositionList[i] } player.SaveField("lineup.heroes", lineup.Heroes) @@ -341,7 +340,11 @@ func (this *PlayerHandler) LineupHeroEquip(player *logic.Player, msg *net.Messag if equip != nil { if equip.HeroUid != 0 { - for i := range lineup.Heroes { + util.SliceFindValue(lineup.Heroes[:], func(i int) bool { + if lineup.Heroes[i] == nil { + return false + } + if lineup.Heroes[i].HeroUid == equip.HeroUid { var preLineupHero = lineup.Heroes[i] if preLineupHero.Equip[req.EquipType] != 0 { @@ -349,8 +352,10 @@ func (this *PlayerHandler) LineupHeroEquip(player *logic.Player, msg *net.Messag player.SaveArray("lineup.heroes", i, preLineupHero) lineupHeroList = append(lineupHeroList, preLineupHero.BuildMsgLineupHero(uint32(i))) } + return true } - } + return false + }) } equip.HeroUid = lineupHero.HeroUid @@ -454,7 +459,11 @@ func (this *PlayerHandler) LineupHeroTreasure(player *logic.Player, msg *net.Mes if treasure != nil { if treasure.HeroUid != 0 { - for i := range lineup.Heroes { + util.SliceFindValue(lineup.Heroes[:], func(i int) bool { + if lineup.Heroes[i] == nil { + return false + } + if lineup.Heroes[i].HeroUid == treasure.HeroUid { var preLineupHero = lineup.Heroes[i] if preLineupHero.Treasure[req.TreasureType] != 0 { @@ -462,8 +471,10 @@ func (this *PlayerHandler) LineupHeroTreasure(player *logic.Player, msg *net.Mes player.SaveArray("lineup.heroes", i, preLineupHero) lineupHeroList = append(lineupHeroList, preLineupHero.BuildMsgLineupHero(uint32(i))) } + return true } - } + return false + }) } treasure.HeroUid = lineupHero.HeroUid @@ -551,14 +562,9 @@ func (this *PlayerHandler) LineupCreate(player *logic.Player, msg *net.Message) return } - var previous *logic.PlayerLineup - for _, v := range player.Lineup { - if v.Active { - previous = v - break - } - } - + var previous = util.MapFindValue(player.Lineup, func(v *logic.PlayerLineup) bool { + return v.Active + }) if previous == nil { _ = player.TipNotice(proto.TipServerError) return diff --git a/servers/game/logic/player_check_correct.go b/servers/game/logic/player_check_correct.go index d8f4cd6..67e7be0 100644 --- a/servers/game/logic/player_check_correct.go +++ b/servers/game/logic/player_check_correct.go @@ -213,6 +213,10 @@ func (this *Player) initLineup(cur *GameTime) { var i = uint32(1) for _, hero := range this.Hero { + if i > 5 { + break + } + var lineupHero = &PlayerLineupHero{ HeroUid: hero.Uid, Position: i + 1, diff --git a/servers/game/logic/player_equip.go b/servers/game/logic/player_equip.go index a155477..1cb016e 100644 --- a/servers/game/logic/player_equip.go +++ b/servers/game/logic/player_equip.go @@ -12,8 +12,8 @@ type PlayerEquip struct { Level uint32 `bson:"level"` RefineExp uint32 `bson:"refine_exp"` RefineLevel uint32 `bson:"refine_level"` - Holes1 []uint32 `bson:"holes"` - Holes2 []uint32 `bson:"holes"` + Holes1 []uint64 `bson:"holes"` + Holes2 []uint64 `bson:"holes"` HeroUid uint64 `bson:"hero_id"` } @@ -49,8 +49,8 @@ func (this *Player) addEquip(equipTable *data.Equip, logType LogType) bool { Level: uint32(levelTable.Level), RefineExp: 0, RefineLevel: uint32(refineTable.RefineLevel), - Holes1: make([]uint32, equipTable.Holes1), - Holes2: make([]uint32, equipTable.Holes2), + Holes1: make([]uint64, equipTable.Holes1), + Holes2: make([]uint64, equipTable.Holes2), HeroUid: 0, } @@ -105,15 +105,15 @@ func (this *Player) AddEquips(equipId, nums uint32, logType LogType) bool { Level: uint32(levelTable.Level), RefineExp: 0, RefineLevel: uint32(refineTable.RefineLevel), - Holes1: make([]uint32, equipTable.Holes1), - Holes2: make([]uint32, equipTable.Holes2), + Holes1: make([]uint64, equipTable.Holes1), + Holes2: make([]uint64, equipTable.Holes2), HeroUid: 0, } this.Equip[equip.Uid] = equip this.SaveModel(equip) - changeList = append(changeList, &pb.EquipChange{Equip: equip.BuildMsgEquip(), ChangeType: pb.ChangeType_Add}) + changeList = append(changeList, &pb.EquipChange{ChangeType: pb.ChangeType_Add, Equip: equip.BuildMsgEquip()}) //this.CheckAchievement(proto.AchievementTypeEquipLevel, uint32(equipTable.Level), 1) } diff --git a/servers/game/logic/player_hero.go b/servers/game/logic/player_hero.go index 965cf48..134e339 100644 --- a/servers/game/logic/player_hero.go +++ b/servers/game/logic/player_hero.go @@ -320,7 +320,7 @@ func (this *Player) UpdateHeroAttrs(hero *PlayerHero) bool { for _, lineup := range this.Lineup { if lineup.Active { for _, lineupHero := range lineup.Heroes { - if lineupHero.HeroUid == hero.Uid { + if lineupHero != nil && lineupHero.HeroUid == hero.Uid { return this.updateHeroAttrs(hero, lineup, lineupHero) } } @@ -336,16 +336,12 @@ func (this *Player) reduceHero(hero *PlayerHero, logType LogType) *pb.HeroChange this.WipeModel(hero) //if logType > LogTypeNone { - // this.manager.eventManager.PlayerHeroConsume(this, logType, itemId, itemNum) + // this.manager.eventManager.PlayerHeroConsume(this, logType, hero.Id, itemNum) //} return &pb.HeroChange{ChangeType: pb.ChangeType_Delete, Hero: hero.BuildMsgHero()} } -func (this *Player) ReduceHero(hero *PlayerHero, logType LogType) { - _ = this.Send(uint16(pb.ModId_ModuleHero), uint16(pb.MsgId_ModHeroChange), &pb.HeroChangeListAck{ChangeList: []*pb.HeroChange{this.reduceHero(hero, logType)}}) -} - func (this *Player) ReduceHeroes(heroes map[uint64]*PlayerHero, logType LogType) { var changeList = make([]*pb.HeroChange, 0, len(heroes)) for _, hero := range heroes { diff --git a/servers/game/logic/player_item.go b/servers/game/logic/player_item.go index 58669e0..cda9344 100644 --- a/servers/game/logic/player_item.go +++ b/servers/game/logic/player_item.go @@ -157,8 +157,13 @@ func (this *Player) CheckItem(itemId, itemNum uint32) (bool, proto.TipError) { return true, nil } return false, proto.TipItemNotEnough + case pb.ItemType_ItemHero: case pb.ItemType_ItemEquip: case pb.ItemType_ItemTreasure: + if this.CheckTreasure(uint32(itemTable.Value), itemNum) { + return true, nil + } + return false, proto.TipItemNotEnough case pb.ItemType_ItemArtifact: case pb.ItemType_ItemSack: case pb.ItemType_ItemOrnament: @@ -221,8 +226,10 @@ func (this *Player) ReduceItem(itemId, itemNum uint32, logType LogType) { this.ReduceMoney(pb.MoneyType(itemTable.SubType), itemNum, logType) case pb.ItemType_ItemProp: this.reduceItem(itemId, itemNum, logType) + case pb.ItemType_ItemHero: case pb.ItemType_ItemEquip: case pb.ItemType_ItemTreasure: + this.ReduceTreasure(uint32(itemTable.Value), itemNum, logType) case pb.ItemType_ItemArtifact: case pb.ItemType_ItemSack: case pb.ItemType_ItemOrnament: diff --git a/servers/game/logic/player_lineup.go b/servers/game/logic/player_lineup.go index 2699c7e..431a3ca 100644 --- a/servers/game/logic/player_lineup.go +++ b/servers/game/logic/player_lineup.go @@ -3,6 +3,7 @@ package logic import ( "ecs/proto/pb" "ecs/servers/game/data" + "github.com/oylshe1314/framework/util" "sort" ) @@ -30,7 +31,7 @@ func (this *PlayerLineup) BuildMsgLineup() *pb.Lineup { return msg } -func (this *Player) CheckUpgradeMaster(masterType pb.UpgradeMasterType, preLevel, curLevel uint32, heroUid uint64) { +func (this *Player) SendUpgradeMaster(masterType pb.UpgradeMasterType, preLevel, curLevel uint32, heroUid uint64) { if heroUid == 0 { return } @@ -59,24 +60,16 @@ func (this *Player) CheckUpgradeMaster(masterType pb.UpgradeMasterType, preLevel return } - var lineup *PlayerLineup - for _, v := range this.Lineup { - if v.Active { - lineup = v - } - } - + var lineup = util.MapFindValue(this.Lineup, func(v *PlayerLineup) bool { + return v.Active + }) if lineup == nil { return } - var lineupHero *PlayerLineupHero - for _, v := range lineup.Heroes { - if v.HeroUid == heroUid { - lineupHero = v - } - } - + var lineupHero = util.SliceFindValue(lineup.Heroes[:], func(i int) bool { + return lineup.Heroes[i] != nil && lineup.Heroes[i].HeroUid == heroUid + }) if lineupHero == nil { return } diff --git a/servers/game/logic/player_treasure.go b/servers/game/logic/player_treasure.go index acb4899..534741a 100644 --- a/servers/game/logic/player_treasure.go +++ b/servers/game/logic/player_treasure.go @@ -1,28 +1,129 @@ package logic -import "ecs/proto/pb" +import ( + "ecs/proto/pb" + "github.com/oylshe1314/framework/util" +) type PlayerTreasure struct { - Uid uint64 `bson:"uid" key:"1"` - Id uint32 `bson:"id"` - Exp uint32 `bson:"exp"` - Level uint32 `bson:"level"` - RefineLevel uint32 `bson:"refine_level"` - HeroUid uint64 `bson:"hero_id"` + Uid uint64 `bson:"uid" key:"1"` + Id uint32 `bson:"id"` + Exp uint32 `bson:"exp"` + Level uint32 `bson:"level"` + RefineLevel uint32 `bson:"refine_level"` + Holes1 []uint64 `bson:"holes"` + Holes2 []uint64 `bson:"holes"` + HeroUid uint64 `bson:"hero_id"` } func (this *PlayerTreasure) BuildMsgTreasure() *pb.Treasure { return &pb.Treasure{ - Uid: this.Uid, - Id: this.Id, - HeroUid: this.HeroUid, + Uid: this.Uid, + Id: this.Id, + Exp: this.Exp, + Level: this.Level, + RefineLevel: this.RefineLevel, + Holes1: this.Holes1, + Holes2: this.Holes2, + HeroUid: this.HeroUid, } } -func (this *Player) AddTreasures(equipId, nums uint32, logType LogType) bool { +func (this *Player) AddTreasures(treasureId, nums uint32, logType LogType) bool { + var treasureTable = this.manager.tables.Treasure.Find1(int(treasureId)) + if treasureTable == nil { + this.manager.logger.Errorf("Table 'Treasure' was not found, treasureId: %d, level: %d", treasureId, 1) + return false + } + + var levelTable = this.manager.tables.TreasureLevel.Find3(treasureTable.Id, 1) + if levelTable == nil { + this.manager.logger.Errorf("Table 'TreasureLevel' was not found, treasureId %d, level: %d", treasureTable.Id, 1) + return false + } + + var refineTable = this.manager.tables.TreasureRefine.Find3(treasureTable.Id, 0) + if refineTable == nil { + this.manager.logger.Errorf("Table 'EquipRefine' was not fount, treasureId %d, level: %d", treasureTable.Id, 1) + return false + } + + if nums < 1 { + nums = 1 + } + + var changeList []*pb.TreasureChange + for range nums { + var treasure = &PlayerTreasure{ + Uid: util.RandomUid(), + Id: uint32(treasureTable.Id), + Exp: 0, + Level: uint32(levelTable.Level), + RefineLevel: uint32(refineTable.RefineLevel), + Holes1: make([]uint64, treasureTable.Holes1), + Holes2: make([]uint64, treasureTable.Holes2), + HeroUid: 0, + } + + this.Treasure[treasure.Uid] = treasure + this.SaveModel(treasure) + + changeList = append(changeList, &pb.TreasureChange{ChangeType: pb.ChangeType_Add, Treasure: treasure.BuildMsgTreasure()}) + + //this.CheckAchievement(proto.AchievementTypeEquipLevel, uint32(treasureTable.Level), 1) + } + + _ = this.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemTreasureChange), &pb.TreasureChangeListAck{ + ChangeList: changeList, + }) + return true +} + +func (this *Player) CheckTreasure(treasureId uint32, nums uint32) bool { + for _, treasure := range this.Treasure { + if treasure.Id == treasureId && treasure.Level <= 1 && treasure.RefineLevel == 0 && treasure.HeroUid == 0 { + nums -= 1 + if nums == 0 { + return true + } + } + } return false } +func (this *Player) reduceTreasure(treasure *PlayerTreasure, logType LogType) *pb.TreasureChange { + delete(this.Treasure, treasure.Uid) + this.WipeModel(treasure) + + //if logType > LogTypeNone { + // this.manager.eventManager.PlayerTreasureConsume(this, logType, treasure.Id, itemNum) + //} + + return &pb.TreasureChange{ChangeType: pb.ChangeType_Delete, Treasure: treasure.BuildMsgTreasure()} +} + +func (this *Player) ReduceTreasures(treasures map[uint64]*PlayerTreasure, logType LogType) { + var changeList = make([]*pb.TreasureChange, 0, len(treasures)) + for _, treasure := range treasures { + changeList = append(changeList, this.reduceTreasure(treasure, logType)) + } + _ = this.Send(uint16(pb.ModId_ModuleItem), uint16(pb.MsgId_ModItemTreasureChange), &pb.TreasureChangeListAck{ChangeList: changeList}) +} + +func (this *Player) ReduceTreasure(treasureId uint32, nums uint32, logType LogType) { + var treasures = map[uint64]*PlayerTreasure{} + for _, treasure := range this.Treasure { + if treasure.Id == treasureId && treasure.Level <= 1 && treasure.RefineLevel == 0 && treasure.HeroUid == 0 { + treasures[treasure.Uid] = treasure + if uint32(len(treasures)) == nums { + this.ReduceTreasures(treasures, logType) + return + } + } + } + this.manager.logger.Error("Reduce treasure out of range, did not check before deducting?") +} + func (this *Player) BuildMsgTreasureListAck() *pb.TreasureListAck { var list []*pb.Treasure for _, treasure := range this.Treasure {