137 lines
4.2 KiB
Go
137 lines
4.2 KiB
Go
package logic
|
|
|
|
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"`
|
|
Holes1 []uint64 `bson:"holes"`
|
|
Holes2 []uint64 `bson:"holes"`
|
|
HeroUid uint64 `bson:"hero_id"`
|
|
}
|
|
|
|
func (this *PlayerTreasure) BuildMsgTreasure(deleted ...bool) *pb.Treasure {
|
|
if len(deleted) > 0 && deleted[0] {
|
|
return &pb.Treasure{Uid: this.Uid}
|
|
}
|
|
return &pb.Treasure{
|
|
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(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(pb.ModId_ModuleItem, 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(pb.ModId_ModuleItem, 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 {
|
|
list = append(list, treasure.BuildMsgTreasure())
|
|
}
|
|
return &pb.TreasureListAck{TreasureList: list}
|
|
}
|