ecs/servers/game/logic/player_achievement.go
2025-07-16 10:05:22 +08:00

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}
}