diff --git a/configs/confroomrank/config.go b/configs/confroomrank/config.go index 6c7c17f..4ac4ee0 100644 --- a/configs/confroomrank/config.go +++ b/configs/confroomrank/config.go @@ -15,6 +15,7 @@ type ActivityConfig struct { Id int64 // ID Typ int // 排行榜类型 OpenLevel int // 开启等级 + OpenScore int64 // 开启积分 PreviewTime int64 // 预告时间 StartTime int64 // 开始时间 EndTime int64 // 结束时间 @@ -56,6 +57,7 @@ type ActivityConfigRaw struct { Id int64 `gorm:"column:id;primaryKey"` // ID Typ int // 排行榜类型 OpenLevel int // 开启等级 + OpenScore int64 // 开启积分 PreviewTime int64 // 预告时间 StartTime int64 // 开始时间 EndTime int64 // 结束时间 @@ -75,6 +77,7 @@ func (c *ActivityConfigRaw) GenerateConfigClient() *ActivityConfigClient { Id: c.Id, Typ: c.Typ, OpenLevel: c.OpenLevel, + OpenScore: c.OpenScore, PreviewTime: c.PreviewTime, StartTime: c.StartTime, EndTime: c.EndTime, @@ -90,6 +93,7 @@ type ActivityConfigClient struct { Id int64 `form:"id" json:"id"` // ID Typ int `form:"typ" json:"typ"` // 排行榜类型 OpenLevel int `form:"open_level" json:"open_level"` // 开启等级 + OpenScore int64 `form:"open_score" json:"open_score"` // 开启积分 PreviewTime int64 `form:"preview_time" json:"preview_time"` // 预告时间 StartTime int64 `form:"start_time" json:"start_time"` // 开始时间 EndTime int64 `form:"end_time" json:"end_time"` // 结束时间 diff --git a/configs/confroomrank/decode.go b/configs/confroomrank/decode.go index ccb6df6..e7e4aa4 100644 --- a/configs/confroomrank/decode.go +++ b/configs/confroomrank/decode.go @@ -14,6 +14,7 @@ func (c *ActivityConfig) Decode(gameId string, rawData any) { c.Id = raw.Id c.Typ = raw.Typ c.OpenLevel = raw.OpenLevel + c.OpenScore = raw.OpenScore c.PreviewTime = raw.PreviewTime c.StartTime = raw.StartTime c.EndTime = raw.EndTime diff --git a/service/roomrank/dto-player.go b/service/roomrank/dto-player.go index e5cc591..b240fd4 100644 --- a/service/roomrank/dto-player.go +++ b/service/roomrank/dto-player.go @@ -19,6 +19,8 @@ type Player struct { UserScore int `gorm:"comment:用户评级分"` UserClass int `gorm:"comment:用户评级"` + Score int64 `gorm:"comment:本轮分数"` + RoomUid int64 `gorm:"comment:所在房间唯一ID"` SettleActivityId int64 `gorm:"comment:上次结算的活动ID"` diff --git a/service/roomrank/handle.go b/service/roomrank/handle.go index 3526ae2..662b232 100644 --- a/service/roomrank/handle.go +++ b/service/roomrank/handle.go @@ -69,6 +69,20 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan return } + // 尝试找到旧房间 并获取原来的积分 这里主要是为了兼容之前版本没有积分要求的设置 + { + _, hasOldRoom, scoreOld := TryGetOldRoomScore(gameId, req.TopType, player, config) + if hasOldRoom { + player.Score = scoreOld + } + } + + // 判断玩家积分 + if player.Score < config.OpenScore { + rsp.RoomRankInfo = GetInfoFromPlayer(gameId, player, config) + return + } + // 尝试加入房间 room, hasRoom, firstJoin := TryGetRoom(gameId, req.TopType, player, config, playerLevel) @@ -131,6 +145,7 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r player.SettleAward = "" player.ActivityId = config.Id player.RoomUid = 0 + player.Score = 0 SavePlayer(gameId, player) // 记录日志 @@ -189,11 +204,32 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs return } + // 尝试找到旧房间 并获取原来的积分 这里主要是为了兼容之前版本没有积分要求的设置 + { + _, hasOldRoom, scoreOld := TryGetOldRoomScore(gameId, req.TopType, player, config) + if hasOldRoom { + player.Score = scoreOld + } + } + + oldScore := player.Score + player.Score += req.AddScore + newScore := player.Score + // 记录日志 + recordBase := NewRecordBase(player.Uid, req.TopType, config.Id) + SaveRecordAddScore(gameId, NewRecordAddScore(recordBase, req.AddScore, oldScore, newScore)) + + // 判断玩家积分 + if player.Score < config.OpenScore { + rsp.RoomRankInfo = GetInfoFromPlayer(gameId, player, config) + return + } + // 尝试加入房间 room, hasRoom, firstJoin := TryGetRoom(gameId, req.TopType, player, config, playerLevel) // 房间排行增加积分 - oldScore, newScore := ChangePlayerScore(room, player, req.AddScore) + UpdatePlayerScore(room, player) if !hasRoom { code = code_msg.RECODE_MERGE_CONFIG_ERROR @@ -206,9 +242,5 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs rsp.RoomRankInfo = GetInfoFromRoom(gameId, player, room, config) rsp.RoomRankInfo.FirstJoin = firstJoin - // 记录日志 - recordBase := NewRecordBase(player.Uid, req.TopType, config.Id) - SaveRecordAddScore(gameId, NewRecordAddScore(recordBase, req.AddScore, oldScore, newScore)) - return } diff --git a/service/roomrank/logic.go b/service/roomrank/logic.go index ab91bfd..745edda 100644 --- a/service/roomrank/logic.go +++ b/service/roomrank/logic.go @@ -64,16 +64,15 @@ func TrySettle(gameId string, topType int, player *Player, config *confroomrank. return } -// ChangePlayerScore 房间排行增加积分 -func ChangePlayerScore(room *Room, player *Player, addScore int64) (oldScore, newScore int64) { +// UpdatePlayerScore 房间排行更新积分 +func UpdatePlayerScore(room *Room, player *Player) { for i := 0; i < len(room.Details.Players); i++ { p := room.Details.Players[i] if player.Uid == p.Uid { - oldScore = p.Score - p.Score += addScore - newScore = p.Score + p.Name = player.Name + p.Icon = player.Icon + p.Score = player.Score return } } - return } diff --git a/service/roomrank/player.go b/service/roomrank/player.go index be88fd7..d4be549 100644 --- a/service/roomrank/player.go +++ b/service/roomrank/player.go @@ -72,7 +72,7 @@ func NewRoomPlayer(player *Player) *RoomPlayer { Uid: player.Uid, Name: player.Name, Icon: player.Icon, - Score: 0, + Score: player.Score, JoinTime: lxtime.NowUninx(), UserType: player.UserType, RobotConfigId: 0, @@ -93,6 +93,15 @@ func GetInfoFromSettle(player *Player, config *confroomrank.ActivityConfig) mode return info } +// GetInfoFromPlayer 活动信息 从玩家 未报名时 +func GetInfoFromPlayer(gameId string, player *Player, config *confroomrank.ActivityConfig) models.RoomRankInfo { + info := models.RoomRankInfo{} + info.UserClass = player.UserClass + info.SelfScore = player.Score + info.RobotAvatarPath = svcommon.GetAvatarPath(gameId) + return info +} + // GetInfoFromRoom 活动信息 从房间 func GetInfoFromRoom(gameId string, player *Player, room *Room, config *confroomrank.ActivityConfig) models.RoomRankInfo { info := models.RoomRankInfo{} @@ -115,10 +124,10 @@ func GetInfoFromRoom(gameId string, player *Player, room *Room, config *confroom } if player.Uid == p.Uid { info.SelfRank = rank - info.SelfScore = p.Score } info.Tops = append(info.Tops, node) } + info.SelfScore = player.Score info.RobotAvatarPath = svcommon.GetAvatarPath(gameId) return info } diff --git a/service/roomrank/room.go b/service/roomrank/room.go index 0e9be0c..4b4e83b 100644 --- a/service/roomrank/room.go +++ b/service/roomrank/room.go @@ -86,6 +86,26 @@ func FindRoom(gameId string, topType int, activityId int64, roomConfigId int) (r return } +// TryGetOldRoomScore 尝试获取旧房间里的积分 +func TryGetOldRoomScore(gameId string, topType int, player *Player, config *confroomrank.ActivityConfig) (room *Room, hasOldRoom bool, scoreOld int64) { + hasOldRoom = false + if player.ActivityId != config.Id { + player.ActivityId = config.Id + player.RoomUid = 0 + return + } + // 查找玩家所在的房间 + room, hasOldRoom = LoadRoom(gameId, topType, config.Id, player.RoomUid) + for i := 0; i < len(room.Details.Players); i++ { + p := room.Details.Players[i] + if player.Uid == p.Uid { + scoreOld = p.Score + break + } + } + return +} + // TryGetRoom 尝试获取房间 func TryGetRoom(gameId string, topType int, player *Player, config *confroomrank.ActivityConfig, playerLevel int) (room *Room, hasRoom bool, firstJoin bool) { hasRoom = false -- libgit2 0.21.0