86 lines
2.4 KiB
Go
86 lines
2.4 KiB
Go
package logic
|
|
|
|
import (
|
|
"ecs/proto/pb"
|
|
"sort"
|
|
)
|
|
|
|
type PlayerAchievement struct {
|
|
Type uint32 `bson:"type" key:"1"`
|
|
Process uint32 `bson:"process"`
|
|
RewardStatus map[uint32]uint32 `bson:"statuses"`
|
|
}
|
|
|
|
func (this *PlayerAchievement) BuildMsgAchievement() *pb.Achievement {
|
|
var statusList []*pb.RewardStatus
|
|
for id, status := range this.RewardStatus {
|
|
statusList = append(statusList, &pb.RewardStatus{Id: id, Status: pb.AbleStatus(status)})
|
|
}
|
|
sort.Slice(statusList, func(i, j int) bool {
|
|
return statusList[i].Id < statusList[j].Id
|
|
})
|
|
return &pb.Achievement{Type: pb.AchievementType(this.Type), Process: this.Process, StatusList: statusList}
|
|
}
|
|
|
|
func (this *Player) CheckAchievement(tipe pb.AchievementType, value uint32) (changed bool) {
|
|
if value == 0 {
|
|
return
|
|
}
|
|
|
|
var achievementTables = this.manager.tables.Achievement.Find2(int(tipe))
|
|
if len(achievementTables) == 0 {
|
|
return
|
|
}
|
|
|
|
var achievement = this.Achievement[uint32(tipe)]
|
|
if achievement == nil {
|
|
achievement = &PlayerAchievement{
|
|
Type: uint32(tipe),
|
|
Process: value,
|
|
RewardStatus: map[uint32]uint32{},
|
|
}
|
|
this.Achievement[achievement.Type] = achievement
|
|
changed = true
|
|
} else {
|
|
switch pb.AchievementModule(achievement.Type) {
|
|
case pb.AchievementModule_ModuleIncrement:
|
|
achievement.Process += value
|
|
case pb.AchievementModule_ModuleHistory:
|
|
if value <= achievement.Process {
|
|
return false
|
|
}
|
|
achievement.Process = value
|
|
default:
|
|
this.manager.Logger().Errorf("Invalid achievement module %d", achievementTables[0].Module)
|
|
return false
|
|
}
|
|
}
|
|
|
|
for _, achievementTable := range achievementTables {
|
|
if achievement.Process < uint32(achievementTable.Value) {
|
|
break
|
|
}
|
|
|
|
if status := achievement.RewardStatus[uint32(achievementTable.Id)]; pb.AbleStatus(status) == pb.AbleStatus_Unable {
|
|
achievement.RewardStatus[uint32(achievementTable.Id)] = uint32(pb.AbleStatus_Able)
|
|
changed = true
|
|
}
|
|
}
|
|
|
|
if changed {
|
|
this.SaveModel(achievement)
|
|
_ = this.Send(pb.ModId_ModuleAchievement, pb.MsgId_ModAchievementChange, &pb.AchievementChangeAck{
|
|
Achievement: achievement.BuildMsgAchievement(),
|
|
})
|
|
}
|
|
return changed
|
|
}
|
|
|
|
func (this *Player) BuildMsgAchievementListAck() *pb.AchievementListAck {
|
|
var achievementList []*pb.Achievement
|
|
for _, achievement := range this.Achievement {
|
|
achievementList = append(achievementList, achievement.BuildMsgAchievement())
|
|
}
|
|
return &pb.AchievementListAck{AchievementList: achievementList}
|
|
}
|