rank_helper.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965
  1. package model
  2. import (
  3. "rocommon/service"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. selfmodel "roserver/db/model"
  7. "roserver/serverproto"
  8. "strconv"
  9. )
  10. const ArenaTopRankMaxNum = 100
  11. func getRankScore(val uint64, passTime uint64) uint64 {
  12. //score
  13. var scoreStr = val
  14. if scoreStr >= (1 << 20) {
  15. scoreStr = (1 << 20) - 1
  16. }
  17. scoreStr <<= 44
  18. if 0xfffffffffff > passTime {
  19. scoreStr |= 0xfffffffffff - passTime
  20. } else {
  21. scoreStr |= 0xfffffffffff - passTime/10000
  22. }
  23. return scoreStr
  24. }
  25. func getValByRankScore(score float64) (uint32, uint32, uint32) {
  26. val := uint32(uint64(score) >> 44)
  27. return val / 10000, val % 10000, val
  28. }
  29. func getIdolRankScore(val uint64, passTime uint64) uint64 {
  30. //score
  31. var scoreStr = val
  32. if scoreStr >= (1 << 24) {
  33. scoreStr = (1 << 24) - 1
  34. }
  35. scoreStr <<= 40
  36. if 0xffffffffff > passTime {
  37. scoreStr |= 0xffffffffff - passTime
  38. } else {
  39. scoreStr |= 0xffffffffff - passTime/10000
  40. }
  41. return scoreStr
  42. }
  43. func getIdolValByRankScore(score float64) (uint32, uint32, uint32) {
  44. val := uint32(uint64(score) >> 40)
  45. return val / 10000, val % 10000, val
  46. }
  47. func getArenaScore(val uint64, passTime uint64) uint64 {
  48. //score
  49. var scoreStr = val
  50. if scoreStr >= (1 << 28) {
  51. scoreStr = (1 << 28) - 1
  52. }
  53. scoreStr <<= 36
  54. scoreStr |= 0xfffffffff - passTime/50
  55. return scoreStr
  56. }
  57. func getValByArenaScore(score float64) (uint32, uint32, uint32) {
  58. val := uint32(uint64(score) >> 36)
  59. return val / 10000, val % 10000, val
  60. }
  61. func getTowerScore(val uint64, passTime uint64) uint64 {
  62. //score
  63. var scoreStr = val
  64. if scoreStr >= (1 << 16) {
  65. scoreStr = (1 << 16) - 1
  66. }
  67. scoreStr <<= 48
  68. if 0xfffffffffff > passTime {
  69. scoreStr |= 0xfffffffffff - passTime
  70. } else {
  71. scoreStr |= 0xfffffffffff - passTime/10000
  72. }
  73. return scoreStr
  74. }
  75. func getValByTowerScore(score float64) (uint32, uint32, uint32) {
  76. val := uint32(uint64(score) >> 48)
  77. return val / 10000, val % 10000, val
  78. }
  79. func getScoreTimeByArenaScore(score uint64) (uint32, uint64) {
  80. nowTime := util.GetTimeMilliseconds()
  81. tmpScore := score
  82. tmpScore ^= (tmpScore >> 36) << 36
  83. outTime := 0xfffffffff - tmpScore
  84. if outTime*50 > nowTime {
  85. outScore1 := score >> 48
  86. tmpScore1 := score
  87. tmpScore1 ^= (score >> 48) << 48
  88. outTime1 := 0xfffffffffff - tmpScore1
  89. var scoreStr = outScore1
  90. if scoreStr >= (1 << 28) {
  91. scoreStr = (1 << 28) - 1
  92. }
  93. scoreStr <<= 36
  94. scoreStr |= 0xfffffffff - outTime1/50
  95. return uint32(outScore1), scoreStr
  96. }
  97. return uint32(tmpScore >> 36), score
  98. }
  99. func getScoreTimeByRankScore(score uint64) (uint32, uint64) {
  100. nowTime := util.GetTimeMilliseconds()
  101. tmpScore := score
  102. tmpScore ^= (tmpScore >> 36) << 36
  103. outTime := 0xfffffffff - tmpScore
  104. if outTime*50 > nowTime {
  105. outScore1 := score >> 44
  106. tmpScore1 := score
  107. tmpScore1 ^= (score >> 44) << 44
  108. outTime1 := 0xfffffffffff - tmpScore1
  109. var scoreStr = outScore1
  110. if scoreStr >= (1 << 28) {
  111. scoreStr = (1 << 28) - 1
  112. }
  113. scoreStr <<= 36
  114. scoreStr |= 0xfffffffff - outTime1/50
  115. return uint32(outScore1), scoreStr
  116. }
  117. return uint32(tmpScore >> 36), score
  118. }
  119. //推图冲榜
  120. //40位是:1 099 511 627 776 记录时间到10毫秒精度
  121. //24为记录:16 777 216
  122. func getRushMapScore(val uint64, passTime uint64) uint64 {
  123. //score
  124. var scoreStr = val
  125. if scoreStr >= (1 << 24) {
  126. scoreStr = (1 << 24) - 1
  127. }
  128. scoreStr <<= 40
  129. if 0xffffffffff > passTime {
  130. scoreStr |= 0xffffffffff - passTime
  131. } else {
  132. scoreStr |= 0xffffffffff - passTime/100
  133. }
  134. return scoreStr
  135. }
  136. func getValByRushMapScore(score float64) (uint32, uint32, uint32) {
  137. val := uint32(uint64(score) >> 40)
  138. return val / 10000, val % 10000, val
  139. }
  140. func AddMaxFightPowerRank(uid uint64, maxFightPower uint64) {
  141. if uid <= 0 {
  142. return
  143. }
  144. //uid
  145. keyStr := strconv.FormatUint(uid, 10)
  146. _, err := service.GetRedis().ZAdd(model.MaxFightPowerRankPrefix, service.BaseZ{Score: float64(maxFightPower), Member: keyStr}).Result()
  147. if err != nil {
  148. util.ErrorF("[AddMaxFightPowerRank] err:%v uid:%v", err, uid)
  149. return
  150. }
  151. }
  152. //uid -> rank
  153. func GetMaxFightPowerRank(uid uint64) int32 {
  154. //uid
  155. keyStr := strconv.FormatUint(uid, 10)
  156. selfRank, err := service.GetRedis().ZRevRank(model.MaxFightPowerRankPrefix, keyStr).Result()
  157. if err != nil {
  158. util.DebugF("[GetMaxFightPowerRank] selfRank err:%v", err)
  159. return 0
  160. }
  161. util.DebugF("[GetMaxFightPowerRank] selfRank:%v", selfRank+1)
  162. return int32(selfRank + 1)
  163. }
  164. //rank -> uid
  165. func GetMaxFightPowerByRank(rank int64) uint64 {
  166. uidStrList, err := service.GetRedis().ZRevRange(model.MaxFightPowerRankPrefix, rank-1, rank-1).Result()
  167. if err != nil {
  168. util.DebugF("[GetMaxFightPowerByRank] get uid err:%v", err)
  169. return 0
  170. }
  171. if len(uidStrList) > 0 {
  172. uid, _ := model.Str2NumU64(uidStrList[0])
  173. return uid
  174. }
  175. return 0
  176. }
  177. func SetArenaScoreRank(uid uint64, score int32, passTime uint64, oldScore, minTopScore, topRankNum int32) {
  178. if uid <= 0 {
  179. return
  180. }
  181. //score
  182. scoreStr := getArenaScore(uint64(score), passTime)
  183. //uid
  184. keyStr := strconv.FormatUint(uid, 10)
  185. _, err := service.GetRedis().ZAdd(model.ArenaRankPrefix, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  186. if err != nil {
  187. util.ErrorF("[AddArenaScoreRank] err:%v uid:%v", err, uid)
  188. return
  189. }
  190. _, err1 := service.GetRedis().ZAdd(model.ArenaRankMatchPrefix, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  191. if err1 != nil {
  192. util.ErrorF("[AddArenaScoreRank] matchRank err:%v uid:%v", err, uid)
  193. return
  194. }
  195. ////判断是否需要加入top排行榜
  196. //if oldScore <= minTopScore {
  197. // if score > minTopScore {
  198. // //获得自身排行
  199. // selfRank, err2 := service.GetRedis().ZRevRank(model.ArenaRankPrefix, keyStr).Result()
  200. // if err2 != nil {
  201. // util.DebugF("[AddArenaScoreRank] selfRank err:%v", err2)
  202. // return
  203. // }
  204. // util.DebugF("[AddArenaScoreRank] selfRank:%v", selfRank+1)
  205. //
  206. // if int32(selfRank) <= topRankNum {
  207. // _, err := service.GetRedis().ZAdd(model.ArenaTopRankPrefix, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  208. // if err != nil {
  209. // util.ErrorF("[AddArenaScoreRank] add top rank err:%v uid:%v", err, uid)
  210. // return
  211. // }
  212. // }
  213. // }
  214. //} else {
  215. // if score <= minTopScore && score != 0 {
  216. // //移除top
  217. // _, err := service.GetRedis().ZRem(model.ArenaTopRankPrefix, keyStr).Result()
  218. // if err != nil {
  219. // util.ErrorF("[AddArenaScoreRank] remove top rank err:%v uid:%v", err, uid)
  220. // return
  221. // }
  222. // } else {
  223. // //更新当前玩家的top排行
  224. // _, err := service.GetRedis().ZAdd(model.ArenaTopRankPrefix, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  225. // if err != nil {
  226. // util.ErrorF("[AddArenaScoreRank] update top rank err:%v uid:%v", err, uid)
  227. // return
  228. // }
  229. // }
  230. //}
  231. //更新当前玩家的top排行
  232. _, err = service.GetRedis().ZAdd(model.ArenaTopRankPrefix, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  233. if err != nil {
  234. util.ErrorF("[AddArenaScoreRank] update top rank err:%v uid:%v", err, uid)
  235. return
  236. }
  237. }
  238. func SetCompetitionScoreRank(prefixStr, keyStr string, score, competitionId int32) (int32, int32, int32, int32) {
  239. //特殊处理放到最后一档奖励中
  240. if competitionId != int32(model.CompetitionType_Idol) {
  241. if score <= 0 {
  242. prefixStr += ":sp"
  243. } else {
  244. //移除特殊排行榜中的数据
  245. service.GetRedis().ZRem(prefixStr+":sp", keyStr)
  246. }
  247. }
  248. //Score
  249. passTime := util.GetTimeMilliseconds()
  250. scoreStr := getRankScore(uint64(score), passTime)
  251. if competitionId == int32(model.CompetitionType_Idol) {
  252. scoreStr = getIdolRankScore(uint64(score), passTime)
  253. }
  254. _, err := service.GetRedis().ZAdd(prefixStr, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  255. if err != nil {
  256. util.ErrorF("SetCompetitionScoreRank err=%v uid=%v", err, keyStr)
  257. return 0, 0, 0, 0
  258. }
  259. tempCount, err := service.GetRedis().ZCard(prefixStr).Result()
  260. if err != nil {
  261. util.ErrorF("SetCompetitionScoreRank rankListCount err:%v", err)
  262. return 0, 0, 0, 0
  263. }
  264. //uid
  265. tempSelfRank, err2 := service.GetRedis().ZRevRank(prefixStr, keyStr).Result()
  266. if err2 != nil {
  267. util.ErrorF("SetCompetitionScoreRank selfRank err:%v %v", err2, keyStr)
  268. return 0, 0, 0, 0
  269. }
  270. if score <= 0 {
  271. return 0, 0, int32(tempCount), 0
  272. } else {
  273. convertData, ok := model.ConvertCompTypeList[competitionId]
  274. if !ok {
  275. util.ErrorF("SetCompetitionScoreRank comp data invalid err compId=%v", competitionId)
  276. return 0, 0, 0, 0
  277. }
  278. var nextRankScore int32 = 0
  279. var lastRankScore int32 = 0
  280. sectionId, topRank, _ := convertData.GetRankSection(tempSelfRank+1, tempCount)
  281. if !topRank {
  282. nextRankScore = getCompetitionScoreNextRank(prefixStr, tempCount, sectionId, convertData)
  283. } else {
  284. //获取第一档的第一名
  285. lastRankScore = getCompetitionScoreLastRank(prefixStr, tempCount, sectionId, convertData)
  286. }
  287. return nextRankScore, int32(tempSelfRank + 1), int32(tempCount), lastRankScore
  288. }
  289. }
  290. //获得下一档宝箱玩家积分对应的排名
  291. func getCompetitionScoreNextRank(prefixStr string, totalRank int64, sectionId int32, convertData *model.CompetitionTypeData) int32 {
  292. for _, data := range convertData.ConditionList {
  293. if data.Id == sectionId-1 {
  294. if len(data.ConditionList) > 0 &&
  295. (convertData.CompetitionType == int32(model.CompetitionType_ZhaoMu) ||
  296. convertData.CompetitionType == int32(model.CompetitionType_XuanBa) ||
  297. convertData.CompetitionType == int32(model.CompetitionType_DuoBao) ||
  298. convertData.CompetitionType == int32(model.CompetitionType_ZhanBu)) {
  299. nextRankPercent := data.ConditionList[0].ValList[0]
  300. if totalRank < model.GlobalCompetitionSectionTotal {
  301. totalRank = model.GlobalCompetitionSectionTotal
  302. }
  303. nextRank := (1 - nextRankPercent/100) * float32(totalRank) / model.GlobalCompetitionSectionFactor
  304. rankListWithScore, err := service.GetRedis().ZRevRangeWithScores(prefixStr, int64(nextRank-1), int64(nextRank-1)).Result()
  305. if err != nil || len(rankListWithScore) <= 0 {
  306. return 0
  307. }
  308. //rankUid, _ := strconv.ParseUint(rankListWithScore[0].Member.(string), 10, 64)
  309. _, _, score := getValByRankScore(rankListWithScore[0].Score)
  310. return int32(score)
  311. }
  312. break
  313. }
  314. }
  315. return 0
  316. }
  317. //获得第二名的分数
  318. func getCompetitionScoreLastRank(prefixStr string, totalRank int64, sectionId int32, convertData *model.CompetitionTypeData) int32 {
  319. for _, data := range convertData.ConditionList {
  320. if data.Id == sectionId+1 {
  321. if len(data.ConditionList) > 0 &&
  322. (convertData.CompetitionType == int32(model.CompetitionType_ZhaoMu) ||
  323. convertData.CompetitionType == int32(model.CompetitionType_XuanBa) ||
  324. convertData.CompetitionType == int32(model.CompetitionType_DuoBao) ||
  325. convertData.CompetitionType == int32(model.CompetitionType_ZhanBu)) {
  326. rankListWithScore2, err := service.GetRedis().ZRevRangeWithScores(prefixStr, int64(0), int64(4)).Result()
  327. for i := 0; i < len(rankListWithScore2); i++ {
  328. if err != nil || len(rankListWithScore2) <= 0 {
  329. return 0
  330. }
  331. _, _, score := getValByRankScore(rankListWithScore2[i].Score)
  332. util.InfoF("getCompetitionScoreLastRank level=%v score=%v", i, score)
  333. }
  334. //获取第二名的数据
  335. rankListWithScore, err := service.GetRedis().ZRevRangeWithScores(prefixStr, int64(2), int64(2)).Result()
  336. if err != nil || len(rankListWithScore) <= 0 {
  337. return 0
  338. }
  339. _, _, score := getValByRankScore(rankListWithScore[0].Score)
  340. util.InfoF("getCompetitionScoreLastRank third score=%v", score)
  341. return int32(score)
  342. }
  343. break
  344. }
  345. }
  346. return 0
  347. }
  348. type ArenaRankList struct {
  349. startIdx int32
  350. rankList []*serverproto.ArenaRankInfo
  351. }
  352. var arenaRankTopList = map[int32]*ArenaRankList{}
  353. var arenaRankTopOldList = map[int32]*ArenaRankList{}
  354. var playerBriefInfoCache = map[uint64]*BriefInfoCache{}
  355. type BriefInfoCache struct {
  356. refreshTime uint64
  357. briefInfo *serverproto.CommonPlayerBriefInfo
  358. }
  359. const BriefInfoRefreshTime uint64 = 60 * 1000
  360. func GetArenaRankList(uid uint64, rankType, startIdx, lastSeasonId int32, ssAckMsg *serverproto.SSArenaRankListAck) int32 {
  361. if uid <= 0 {
  362. return 0
  363. }
  364. //uid
  365. keyStr := strconv.FormatUint(uid, 10)
  366. //1上赛季,0本赛季
  367. if rankType == 0 {
  368. //获取当前赛季数据
  369. listData := getArenaRankList(startIdx, model.ArenaTopRankPrefix, true)
  370. if listData != nil {
  371. ssAckMsg.RankList = append(listData.rankList)
  372. }
  373. //获取自身排名
  374. selfRank, err := service.GetRedis().ZRevRank(model.ArenaTopRankPrefix, keyStr).Result()
  375. if err != nil {
  376. util.DebugF("[GetArenaRankList] selfRank err:%v", err)
  377. return 0
  378. }
  379. util.DebugF("[GetArenaRankList] selfRank:%v", selfRank+1)
  380. //只获取自身排名
  381. if startIdx == 0 {
  382. return int32(selfRank + 1)
  383. }
  384. return int32(selfRank + 1)
  385. } else if rankType == 1 {
  386. //获取上赛季数据
  387. //if data, ok := arenaRankTopOldList[startIdx]; ok {
  388. // *rankList = append(data.rankList)
  389. // var arenaTopRewardPrefix = model.ArenaTopRankPrefix + strconv.Itoa(int(lastSeasonId))
  390. // selfRank, err := service.GetRedis().ZRevRank(arenaTopRewardPrefix, keyStr).Result()
  391. // if err != nil {
  392. // util.DebugF("[GetArenaRankList] selfRankPre err:%v", err)
  393. // return 0
  394. // }
  395. // return int32(selfRank + 1)
  396. //} else {
  397. // var arenaTopRewardPrefix = model.ArenaTopRankPrefix + strconv.Itoa(int(lastSeasonId))
  398. // listData := getArenaRankList(startIdx, arenaTopRewardPrefix, false)
  399. // if listData != nil {
  400. // *rankList = append(listData.rankList)
  401. // }
  402. //
  403. // //获取上赛季自身排名
  404. // selfRank, err := service.GetRedis().ZRevRank(arenaTopRewardPrefix, keyStr).Result()
  405. // if err != nil {
  406. // util.DebugF("[GetArenaRankList] selfRankPre err:%v", err)
  407. // return 0
  408. // }
  409. // util.DebugF("[GetArenaRankList] selfRankPre:%v", selfRank+1)
  410. // return int32(selfRank + 1)
  411. //}
  412. var arenaTopRewardPrefix = model.ArenaTopRankPrefix + strconv.Itoa(int(lastSeasonId))
  413. listData := getArenaRankList(startIdx, arenaTopRewardPrefix, false)
  414. if listData != nil {
  415. ssAckMsg.RankList = append(listData.rankList)
  416. }
  417. //获取上赛季自身排名对应的积分
  418. selfRank, err := service.GetRedis().ZRevRank(arenaTopRewardPrefix, keyStr).Result()
  419. if err != nil {
  420. util.DebugF("[GetArenaRankList] selfRankPre err:%v", err)
  421. return 0
  422. }
  423. bFind := false
  424. for idx := 0; idx < len(listData.rankList); idx++ {
  425. if listData.rankList[idx].Rank == int32(selfRank)+1 {
  426. bFind = true
  427. ssAckMsg.SelfRankScore = listData.rankList[idx].Score
  428. break
  429. }
  430. }
  431. if !bFind {
  432. selfRankInfo := getArenaRankInfoByRank(arenaTopRewardPrefix, selfRank)
  433. if selfRankInfo != nil {
  434. ssAckMsg.SelfRankScore = selfRankInfo.Score
  435. }
  436. }
  437. util.DebugF("[GetArenaRankList] selfRankPre:%v", selfRank+1)
  438. return int32(selfRank + 1)
  439. ////获取上赛季自身排名
  440. //selfRank,err := service.GetRedis().ZRevRank(model2.ArenaPreRankPrefix, keyStr).Result()
  441. //if err != nil {
  442. // util.DebugF("[GetArenaRankList] selfRankPre err:%v", err)
  443. // return 0
  444. //}
  445. //util.DebugF("[GetArenaRankList] selfRankPre:%v", selfRank + 1)
  446. //return int32(selfRank+1)
  447. }
  448. return 0
  449. }
  450. //获取对应排名的玩家信息
  451. func getArenaRankInfoByRank(topRankPrefix string, rankIdx int64) *serverproto.ArenaRankInfo {
  452. topListWithScore, err := service.GetRedis().ZRevRangeWithScores(topRankPrefix, rankIdx, rankIdx).Result()
  453. if err == nil {
  454. for idx := range topListWithScore {
  455. rankUid, _ := strconv.ParseUint(topListWithScore[idx].Member.(string), 10, 64)
  456. _, _, score := getValByArenaScore(topListWithScore[idx].Score)
  457. rankInfo := &serverproto.ArenaRankInfo{
  458. Rank: int32(rankIdx + 1),
  459. Score: int32(score),
  460. }
  461. nowTime := util.GetTimeMilliseconds()
  462. bf, ok := playerBriefInfoCache[rankUid]
  463. if !ok {
  464. bf = &BriefInfoCache{
  465. refreshTime: 0,
  466. briefInfo: &serverproto.CommonPlayerBriefInfo{},
  467. }
  468. }
  469. if bf.refreshTime+BriefInfoRefreshTime < nowTime {
  470. bf.refreshTime = nowTime
  471. //获取top rank player nickName
  472. selfmodel.GetSystemDataFromRedis(selfmodel.RolePlayerBriefPrefix, rankUid, bf.briefInfo)
  473. }
  474. rankInfo.BriefInfo = bf.briefInfo
  475. playerBriefInfoCache[rankUid] = bf
  476. return rankInfo
  477. }
  478. }
  479. return nil
  480. }
  481. func getArenaRankList(startIdx int32, topRankPrefix string, isNow bool) *ArenaRankList {
  482. rankListCount, err1 := service.GetRedis().ZCard(topRankPrefix).Result()
  483. if err1 != nil {
  484. util.DebugF("[getArenaRankList] totalRanks err:%v", err1)
  485. }
  486. if rankListCount > 0 {
  487. //获取top排行
  488. begin := int64(startIdx*10 - 10)
  489. end := int64(startIdx*10 - 1)
  490. topListWithScore, err2 := service.GetRedis().ZRevRangeWithScores(topRankPrefix, begin, end).Result()
  491. if err2 == nil {
  492. //var arenaRankList *ArenaRankList = nil
  493. //if isNow {
  494. // //当前赛季
  495. // tempList, ok := arenaRankTopList[startIdx]
  496. // if !ok {
  497. // arenaRankList = &ArenaRankList{}
  498. // arenaRankTopList[startIdx] = arenaRankList
  499. // } else {
  500. // arenaRankList = tempList
  501. // arenaRankList.rankList = arenaRankList.rankList[:0]
  502. // }
  503. //} else {
  504. // //上个赛季
  505. // tempList, ok := arenaRankTopOldList[startIdx]
  506. // if !ok {
  507. // arenaRankList = &ArenaRankList{}
  508. // arenaRankTopOldList[startIdx] = arenaRankList
  509. // } else {
  510. // arenaRankList = tempList
  511. // return arenaRankList
  512. // }
  513. //}
  514. arenaRankList := &ArenaRankList{}
  515. for idx := range topListWithScore {
  516. rankUid, _ := strconv.ParseUint(topListWithScore[idx].Member.(string), 10, 64)
  517. _, _, score := getValByArenaScore(topListWithScore[idx].Score)
  518. rankInfo := &serverproto.ArenaRankInfo{
  519. Rank: int32(idx+1) + int32(begin),
  520. Score: int32(score),
  521. }
  522. nowTime := util.GetTimeMilliseconds()
  523. bf, ok := playerBriefInfoCache[rankUid]
  524. if !ok {
  525. bf = &BriefInfoCache{
  526. refreshTime: 0,
  527. briefInfo: &serverproto.CommonPlayerBriefInfo{},
  528. }
  529. }
  530. if bf.refreshTime+BriefInfoRefreshTime < nowTime {
  531. bf.refreshTime = nowTime
  532. //获取top rank player nickName
  533. selfmodel.GetSystemDataFromRedis(selfmodel.RolePlayerBriefPrefix, rankUid, bf.briefInfo)
  534. }
  535. rankInfo.BriefInfo = bf.briefInfo
  536. playerBriefInfoCache[rankUid] = bf
  537. arenaRankList.rankList = append(arenaRankList.rankList, rankInfo)
  538. }
  539. return arenaRankList
  540. }
  541. }
  542. return nil
  543. }
  544. func GetArenaRankReward(uid uint64, score int32, seasonId int32) (int32, int32) {
  545. var arenaRewardPrefix = model.ArenaTopRankPrefix
  546. rewardSeasonId := seasonId + 1
  547. arenaRewardPrefix += strconv.Itoa(int(rewardSeasonId))
  548. //uid
  549. keyStr := strconv.FormatUint(uid, 10)
  550. //获取自身排名
  551. selfRank, err := service.GetRedis().ZRevRank(arenaRewardPrefix, keyStr).Result()
  552. if err != nil {
  553. util.DebugF("[GetArenaRankReward][%v] selfRank err:%v %v", uid, err, arenaRewardPrefix)
  554. return 0, 0
  555. }
  556. util.DebugF("[GetArenaRankReward][%v] selfRank:%v %v", uid, selfRank+1, arenaRewardPrefix)
  557. return int32(selfRank + 1), rewardSeasonId
  558. }
  559. var arenaTopRankReward = map[uint64]int{}
  560. //赛季结算,并生成赛季排行数据
  561. func UpdateArenaRank(lastSeasonId int32, rewardPlayerList *[]uint64, outList *[]*serverproto.KeyValueType64) serverproto.ErrorCode {
  562. rankReward := model.ArenaTopRankPrefix + strconv.Itoa(int(lastSeasonId))
  563. //判断记录数据是否存在
  564. if !model.ExistKey(rankReward) {
  565. //_,err := service.GetRedis().Rename(model2.ArenaTopRankPrefix, rankReward).Result()
  566. _, err := service.GetRedis().ZUnionStore(rankReward, service.BaseStore{}, model.ArenaTopRankPrefix).Result()
  567. if err != nil {
  568. util.ErrorF("[UpdateArenaRank] store rank record err1:%v %v", err, rankReward)
  569. return serverproto.ErrorCode_ERROR_FAIL
  570. }
  571. //_, err1 := service.GetRedis().Rename(model.ArenaRankPrefix, model.ArenaPreRankPrefix).Result()
  572. _, err1 := service.GetRedis().ZUnionStore(model.ArenaPreRankPrefix, service.BaseStore{}, model.ArenaRankPrefix).Result()
  573. if err1 != nil {
  574. util.ErrorF("[UpdateArenaRank] store rank record err1:%v %v", err, model.ArenaPreRankPrefix)
  575. return serverproto.ErrorCode_ERROR_FAIL
  576. }
  577. //清空当前榜单数据
  578. service.GetRedis().Del(model.ArenaTopRankPrefix)
  579. service.GetRedis().Del(model.ArenaRankPrefix)
  580. }
  581. if len(arenaTopRankReward) <= 0 {
  582. //获得前100排行玩家数据
  583. for idx := 0; idx < 5; idx++ {
  584. startIdx := int64(idx * 20)
  585. rankNumList, err2 := service.GetRedis().ZRevRange(rankReward, startIdx, startIdx+19).Result()
  586. if err2 != nil {
  587. break
  588. }
  589. if len(rankNumList) <= 0 {
  590. break
  591. }
  592. for i := 0; i < len(rankNumList); i++ {
  593. rankUid, _ := model.Str2NumU64(rankNumList[i])
  594. arenaTopRankReward[rankUid] = int(startIdx) + i + 1
  595. }
  596. }
  597. }
  598. for i := 0; i < len(*rewardPlayerList); i++ {
  599. uid := (*rewardPlayerList)[i]
  600. *outList = append(*outList, &serverproto.KeyValueType64{
  601. Key: uid,
  602. Value: int32(arenaTopRankReward[uid]),
  603. })
  604. }
  605. return serverproto.ErrorCode_ERROR_OK
  606. }
  607. ///competition
  608. //赛季结算时保存地图推进排名列表,并返回在线玩家奖励排名信息
  609. func RecordCompMapRankByCompId(competitionId, competitionIdSubId int32, uidList []*serverproto.KeyValueType64, rewardUidList *[]*serverproto.KeyValueType64) (bool, int32) {
  610. convertData, ok := model.ConvertCompTypeList[competitionId]
  611. if !ok {
  612. util.ErrorF("RecordCompArenaRankByCompId comp data invalid err=%v", competitionId)
  613. return false, 0
  614. }
  615. //competitionId
  616. compIdStr := strconv.Itoa(int(competitionId*100 + competitionIdSubId))
  617. prefixStr := model.CompetitionMapRankPrefix + compIdStr
  618. if !model.ExistKey(prefixStr) {
  619. _, err := service.GetRedis().ZUnionStore(prefixStr, service.BaseStore{}, model.MapRankPrefix).Result()
  620. if err != nil {
  621. util.ErrorF("RecordCompMapRankByCompId store rank record err=%v prefixStr=%v", err, prefixStr)
  622. return false, 0
  623. }
  624. }
  625. //当前服务器没有在线玩家,不做奖励处理
  626. if uidList == nil || len(uidList) <= 0 {
  627. return true, 0
  628. }
  629. rankListCount, err := service.GetRedis().ZCard(prefixStr).Result()
  630. if err != nil {
  631. util.ErrorF("RecordCompMapRankByCompId totalRanks err=%v", err)
  632. return false, 0
  633. }
  634. for _, data := range uidList {
  635. //uid
  636. keyStr := strconv.FormatUint(data.Key, 10)
  637. selfRank, err2 := service.GetRedis().ZRevRank(prefixStr, keyStr).Result()
  638. if err2 != nil {
  639. util.ErrorF("RecordCompMapRankByCompId selfRank err=%v key=%v", err2, data.Key)
  640. continue
  641. }
  642. //util.DebugF("[GetMapRank] selfRank:%v", selfRank + 1)
  643. //获取宝箱档位
  644. _, _, sectionId := convertData.GetRankSection(selfRank+1, rankListCount)
  645. if sectionId <= 0 {
  646. util.ErrorF("RecordCompMapRankByCompId sectionId err=%v key=%v", err2, data.Key)
  647. continue
  648. }
  649. *rewardUidList = append(*rewardUidList, &serverproto.KeyValueType64{
  650. Key: data.Key,
  651. Value: sectionId,
  652. })
  653. }
  654. return true, int32(rankListCount)
  655. }
  656. //赛季结算时根据当前赛季累计积分获取排行,并返回在线玩家奖励排名信息
  657. func RecordCompScoreRankByCompId(prefixKeyStr string, competitionId, competitionIdSubId int32, endCompId bool, uidList []*serverproto.KeyValueType64, rewardUidList *[]*serverproto.KeyValueType64) (bool, int32) {
  658. convertData, ok := model.ConvertCompTypeList[competitionId]
  659. if !ok {
  660. util.ErrorF("RecordCompScoreRankByCompId comp data invalid err=%v prefixKeyStr=%v", competitionId, prefixKeyStr)
  661. return false, 0
  662. }
  663. //competitionId
  664. compIdStr := strconv.Itoa(int(competitionId*100 + competitionIdSubId))
  665. prefixStr := prefixKeyStr + compIdStr
  666. if endCompId {
  667. if !model.ExistKey(prefixStr) {
  668. //_, err := service.GetRedis().Rename(model.CompetitionScoreRankPrefix, prefixStr).Result()
  669. _, err := service.GetRedis().Rename(prefixKeyStr, prefixStr).Result()
  670. //special
  671. //specialPrefixStr := model.CompetitionScoreRankPrefix + ":sp"
  672. specialPrefixStr := prefixKeyStr + ":sp"
  673. _, err1 := service.GetRedis().Rename(specialPrefixStr, specialPrefixStr+compIdStr).Result()
  674. if err1 != nil && err != nil {
  675. util.ErrorF("RecordCompScoreRankByCompId store rank record err=%v prefixStr=%v", err1, specialPrefixStr)
  676. return false, 0
  677. }
  678. }
  679. } else {
  680. if !model.ExistKey(prefixStr) {
  681. //_, err := service.GetRedis().ZUnionStore(prefixStr, service.BaseStore{}, model.CompetitionScoreRankPrefix).Result()
  682. _, err := service.GetRedis().ZUnionStore(prefixStr, service.BaseStore{}, prefixKeyStr).Result()
  683. if err != nil {
  684. util.ErrorF("RecordCompScoreRankByCompId store rank record err=%v prefixStr=%v", err, prefixStr)
  685. return false, 0
  686. }
  687. //special
  688. //specialPrefixStr := model.CompetitionScoreRankPrefix + ":sp"
  689. specialPrefixStr := prefixKeyStr + ":sp"
  690. _, err1 := service.GetRedis().ZUnionStore(specialPrefixStr+compIdStr, service.BaseStore{}, specialPrefixStr).Result()
  691. if err1 != nil {
  692. util.ErrorF("RecordCompScoreRankByCompId store rank record err=%v prefixStr=%v", err1, specialPrefixStr)
  693. return false, 0
  694. }
  695. }
  696. }
  697. //当前服务器没有在线玩家,不做奖励处理
  698. if uidList == nil || len(uidList) <= 0 {
  699. return true, 0
  700. }
  701. rankListCount, err := service.GetRedis().ZCard(prefixStr).Result()
  702. if err != nil {
  703. util.ErrorF("RecordCompScoreRankByCompId totalRanks err=%v", err)
  704. return false, 0
  705. }
  706. for _, data := range uidList {
  707. //uid
  708. keyStr := strconv.FormatUint(data.Key, 10)
  709. //特殊队列中查找是否存在该玩家,存在数据说明直接属于最后一档
  710. //spStr := model.CompetitionScoreRankPrefix + ":sp" + compIdStr
  711. spStr := prefixKeyStr + ":sp" + compIdStr
  712. selfRank, err2 := service.GetRedis().ZRevRank(spStr, keyStr).Result()
  713. if err2 == nil && err2 != service.NIL {
  714. *rewardUidList = append(*rewardUidList, &serverproto.KeyValueType64{
  715. Key: data.Key,
  716. Value: convertData.LastConditionId,
  717. })
  718. continue
  719. }
  720. selfRank, err2 = service.GetRedis().ZRevRank(prefixStr, keyStr).Result()
  721. if err2 != nil {
  722. continue
  723. }
  724. //获取宝箱档位
  725. _, _, sectionId := convertData.GetRankSection(selfRank+1, rankListCount)
  726. if sectionId <= 0 {
  727. util.ErrorF("RecordCompScoreRankByCompId sectionId err=%v key=%v", err2, data.Key)
  728. continue
  729. }
  730. *rewardUidList = append(*rewardUidList, &serverproto.KeyValueType64{
  731. Key: data.Key,
  732. Value: sectionId,
  733. })
  734. }
  735. return true, int32(rankListCount)
  736. }
  737. func GetActivitiesCollectionData(activityId, rewardIdx, serverLimitNum int32, ackMsg *serverproto.SSActivitiesCollectionServerDataAck) bool {
  738. keyStr := strconv.Itoa(int(activityId))
  739. saveData := &serverproto.CollectionSaveData{}
  740. err := model.GetMessageFromRedis(model.ActivitiesCollectionDataPrefix, keyStr, saveData)
  741. if err != nil && err != service.NIL {
  742. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
  743. util.ErrorF("GetActivitiesCollectionData key=%v err=%v", model.ActivitiesCollectionDataPrefix, err)
  744. return true
  745. }
  746. if rewardIdx > 0 {
  747. //清空全局数据
  748. if serverLimitNum <= 0 {
  749. bFind := false
  750. for idx := 0; idx < len(saveData.DataList); idx++ {
  751. if saveData.DataList[idx].Key == rewardIdx {
  752. saveData.DataList[idx].Value = 0
  753. bFind = true
  754. break
  755. }
  756. }
  757. if bFind {
  758. err = model.SetMessageToRedis(model.ActivitiesCollectionDataPrefix, keyStr, saveData)
  759. if err != nil {
  760. util.ErrorF("GetActivitiesCollectionData key=%v err=%v", model.ActivitiesCollectionDataPrefix, err)
  761. }
  762. }
  763. return false
  764. }
  765. saveData.ActivityId = activityId
  766. var itemData *serverproto.KeyValueType = nil
  767. for idx := 0; idx < len(saveData.DataList); idx++ {
  768. if saveData.DataList[idx].Key == rewardIdx {
  769. itemData = saveData.DataList[idx]
  770. break
  771. }
  772. }
  773. //增加次数并获得奖励
  774. if itemData != nil {
  775. if itemData.Value >= serverLimitNum {
  776. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_ACTIVITIES_EXCHANGE_NUM_LIMIT)
  777. return true
  778. }
  779. itemData.Value++
  780. } else {
  781. itemData = &serverproto.KeyValueType{Key: rewardIdx, Value: 1}
  782. saveData.DataList = append(saveData.DataList, itemData)
  783. }
  784. err = model.SetMessageToRedis(model.ActivitiesCollectionDataPrefix, keyStr, saveData)
  785. if err != nil {
  786. util.ErrorF("GetActivitiesCollectionData key=%v err=%v", model.ActivitiesCollectionDataPrefix, err)
  787. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
  788. return true
  789. }
  790. ackMsg.ActivityId = activityId
  791. ackMsg.DataList = append(ackMsg.DataList, itemData)
  792. } else {
  793. ackMsg.ActivityId = activityId
  794. if len(saveData.DataList) > 0 {
  795. ackMsg.DataList = append(ackMsg.DataList, saveData.DataList...)
  796. }
  797. }
  798. return true
  799. }
  800. func UpdateExpeditionScoreRank(score uint32, uid uint64) {
  801. if uid <= 0 {
  802. return
  803. }
  804. passTime := util.GetTimeMilliseconds()
  805. //score
  806. scoreStr := model.GetRankScoreCommon(uint64(score), passTime)
  807. //scoreStr := getRankScore(uint64(score), passTime)
  808. //uid
  809. keyStr := strconv.FormatUint(uid, 10)
  810. _, err := service.GetRedis().ZAdd(model.ExpeditionScoreRankPrefix, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  811. if err != nil {
  812. util.ErrorF("UpdateExpeditionScoreRank err=%v uid=%v", err, uid)
  813. return
  814. }
  815. }
  816. func ExpeditionScoreRank(startIdx int32, ackMsg *serverproto.SSExpeditionScoreRankListAck, selfUid uint64) {
  817. if startIdx <= 0 {
  818. startIdx = 1
  819. }
  820. //获取top排行
  821. begin := int64(startIdx - 1)
  822. end := int64(begin + 19)
  823. ////获取top排行
  824. //begin := int64(startIdx*10 - 10)
  825. //end := int64(startIdx*10 - 1)
  826. rankListWithScore, err := service.GetRedis().ZRevRangeWithScores(model.ExpeditionScoreRankPrefix, begin, end).Result()
  827. if err != nil {
  828. return
  829. }
  830. //rank list
  831. for idx := 0; idx < len(rankListWithScore); idx++ {
  832. rankUid, err := strconv.ParseUint(rankListWithScore[idx].Member.(string), 10, 64)
  833. if err != nil {
  834. continue
  835. }
  836. //getScoreTimeByRankScore(rankListWithScore[idx].Score)
  837. score := model.GetValByRankScoreCommon(rankListWithScore[idx].Score)
  838. rankInfo := &serverproto.ExpeditionRankInfo{
  839. Rank: int32(idx+1) + int32(begin),
  840. Score: uint32(score),
  841. }
  842. nowTime := util.GetTimeMilliseconds()
  843. bf, ok := playerBriefInfoCache[rankUid]
  844. if !ok {
  845. bf = &BriefInfoCache{
  846. refreshTime: 0,
  847. briefInfo: &serverproto.CommonPlayerBriefInfo{},
  848. }
  849. }
  850. if bf.refreshTime+BriefInfoRefreshTime < nowTime {
  851. bf.refreshTime = nowTime
  852. //获取top rank player nickName
  853. err = selfmodel.GetSystemDataFromRedis(selfmodel.RolePlayerBriefPrefix, rankUid, bf.briefInfo)
  854. }
  855. rankInfo.BriefInfo = bf.briefInfo
  856. playerBriefInfoCache[rankUid] = bf
  857. ackMsg.RankList = append(ackMsg.RankList, rankInfo)
  858. if rankUid == selfUid {
  859. ackMsg.SelfRankInfo = rankInfo
  860. }
  861. }
  862. //self rank
  863. if ackMsg.SelfRankInfo == nil {
  864. //uid
  865. keyStr := strconv.FormatUint(selfUid, 10)
  866. selfRank, err := service.GetRedis().ZRevRank(model.ExpeditionScoreRankPrefix, keyStr).Result()
  867. if err == nil && err != service.NIL {
  868. ackMsg.SelfRankInfo = &serverproto.ExpeditionRankInfo{
  869. Rank: int32(selfRank + 1),
  870. }
  871. }
  872. }
  873. }