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