ecs/servers/game/logic/player_reward_login.go
2025-06-21 16:17:24 +08:00

123 lines
3.6 KiB
Go

package logic
import (
"ecs/proto/pb"
"github.com/oylshe1314/framework/util"
)
type PlayerRewardLogin struct {
SeriesId uint32 `bson:"series_id" key:"1"`
RewardStatus [][2]uint32 `bson:"reward_status"`
}
func (this *PlayerRewardLogin) BuildMsgRewardLogin() *pb.RewardLogin {
var msg = &pb.RewardLogin{SeriesId: this.SeriesId}
for _, status := range this.RewardStatus {
msg.StatusList = append(msg.StatusList, &pb.RewardStatus{Id: status[0], Status: pb.AbleStatus(status[1])})
}
return msg
}
func (this *Player) CheckRewardLogin() bool {
var changed = false
for _, seriesId := range this.manager.tables.RewardLogin.SeriesIds() {
changed = this.checkRewardLogin(uint32(seriesId)) || changed
}
return changed
}
func (this *Player) checkRewardLogin(seriesId uint32) bool {
var changed = false
var rewardLogin = this.RewardLogin[seriesId]
if rewardLogin == nil {
rewardLogin = this.newRewardLogin(seriesId)
if rewardLogin == nil {
return false
}
this.RewardLogin[rewardLogin.SeriesId] = rewardLogin
changed = true
} else {
var rewardTables = this.manager.tables.RewardLogin.Find2(int(seriesId))
if len(rewardTables) == 0 {
return false
}
_, _, days := util.YMD()
if pb.DaysModule(rewardTables[0].DaysModule) == pb.DaysModule_PeriodDays {
maxDays, ok := this.manager.tables.RewardLogin.MaxDays(int(seriesId))
if !ok {
maxDays = len(rewardTables)
}
days = int(this.LoginDays-1)%maxDays + 1
}
if len(rewardLogin.RewardStatus) != len(rewardTables) {
var newRewardStatus = make([][2]uint32, len(rewardTables))
for i := range rewardLogin.RewardStatus {
if i >= len(newRewardStatus) {
break
}
if rewardLogin.RewardStatus[i][0] == newRewardStatus[i][0] &&
pb.AbleStatus(rewardLogin.RewardStatus[i][1]) == pb.AbleStatus_Able {
newRewardStatus[i][1] = uint32(pb.AbleStatus_Able)
}
}
rewardLogin.RewardStatus = newRewardStatus
changed = true
}
for i := range rewardLogin.RewardStatus {
if pb.AbleStatus(rewardLogin.RewardStatus[i][1]) == pb.AbleStatus_Unable {
var activeTable = this.manager.tables.RewardLogin.Find1(int(rewardLogin.RewardStatus[i][0]))
if activeTable != nil {
if days >= activeTable.Days {
rewardLogin.RewardStatus[i][1] = uint32(pb.AbleStatus_Able)
changed = true
}
}
}
}
}
if changed {
this.SaveModel(rewardLogin)
_ = this.Send(pb.ModId_ModuleReward, pb.MsgId_ModRewardLoginChange, &pb.RewardLoginChangeAck{RewardLogin: rewardLogin.BuildMsgRewardLogin()})
}
return changed
}
func (this *Player) newRewardLogin(seriesId uint32) *PlayerRewardLogin {
var rewardTables = this.manager.tables.RewardLogin.Find2(int(seriesId))
if len(rewardTables) == 0 {
return nil
}
_, _, days := util.YMD()
if pb.DaysModule(rewardTables[0].DaysModule) == pb.DaysModule_PeriodDays {
maxDays, ok := this.manager.tables.RewardLogin.MaxDays(int(seriesId))
if !ok {
maxDays = len(rewardTables)
}
days = int(this.LoginDays-1)%maxDays + 1
}
var rewardLogin = &PlayerRewardLogin{SeriesId: seriesId, RewardStatus: make([][2]uint32, len(rewardTables))}
for i, rewardTable := range rewardTables {
rewardLogin.RewardStatus[i] = [2]uint32{
uint32(rewardTable.Id),
util.If(days < rewardTable.Days, uint32(pb.AbleStatus_Unable), uint32(pb.AbleStatus_Able)),
}
}
return rewardLogin
}
func (this *Player) BuildMsgRewardLoginListAck() *pb.RewardLoginListAck {
var activeList []*pb.RewardLogin
for _, rewardStatus := range this.RewardLogin {
activeList = append(activeList, rewardStatus.BuildMsgRewardLogin())
}
return &pb.RewardLoginListAck{LoginList: activeList}
}