ecs/servers/game/logic/player_treasure.go
2025-06-14 18:49:31 +08:00

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(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 {
list = append(list, treasure.BuildMsgTreasure())
}
return &pb.TreasureListAck{TreasureList: list}
}