rank_map.go 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211
  1. package model
  2. import (
  3. "encoding/base64"
  4. "github.com/go-redis/redis"
  5. "rocommon"
  6. "rocommon/service"
  7. "rocommon/util"
  8. model2 "roserver/baseserver/model"
  9. "roserver/db/model"
  10. "roserver/serverproto"
  11. "strconv"
  12. "time"
  13. )
  14. // 排名前3玩家uid列表
  15. const (
  16. MAPRANK_TOP_3 = 3
  17. MAPSCORE_TOP_3000 = 3000
  18. )
  19. const (
  20. Rush_Map_Rank_Rush = 1 //冲榜阶段
  21. Rush_Map_Rank_Reward = 2 //领奖阶段
  22. Rush_Map_Rank_End = 3 //结束
  23. )
  24. var MapRankTopThree []*serverproto.RankPlayerInfo
  25. var MapHardRankTopThree []*serverproto.RankPlayerInfo
  26. var MapHard2RankTopThree []*serverproto.RankPlayerInfo
  27. // zSet rank
  28. // https://www.jianshu.com/p/2cbf358b933b
  29. // https://www.jianshu.com/p/2cbf358b933b
  30. func AddMapRank(uid uint64, newMapLevel uint32, passTime uint64, recordInfo *serverproto.BattleRecordInfo) (uint32, uint32, uint64) {
  31. if uid <= 0 {
  32. return 0, 0, 0
  33. }
  34. //score
  35. scoreStr := getRankScore(uint64(newMapLevel), passTime)
  36. //uid
  37. keyStr := strconv.FormatUint(uid, 10)
  38. //todo... 通过多命令方式处理
  39. _, err := service.GetRedis().ZAdd(model2.MapRankPrefix, redis.Z{Score: float64(scoreStr), Member: keyStr}).Result()
  40. if err != nil {
  41. util.ErrorF("AddMapRank err=%v uid=%v", err, uid)
  42. return 0, 0, 0
  43. }
  44. //util.InfoF("[AddMapRank] ret:%v %v %v", ret, scoreStr, keyStr)
  45. //retRank,err1 := service.GetRedis().ZRevRange(MapRankPrefix, 0, -1).Result()
  46. //if err1 == nil {
  47. // util.DebugF("[AddMapRank] rankList:%v", retRank)
  48. //}
  49. selfRank, err2 := service.GetRedis().ZRevRank(model2.MapRankPrefix, keyStr).Result()
  50. if err2 != nil {
  51. util.DebugF("AddMapRank selfRank err=%v uid=%v", err2, uid)
  52. return 0, 0, 0
  53. }
  54. util.DebugF("AddMapRank selfRank=%v uid=%v score=%v", selfRank+1, uid, scoreStr)
  55. rankList, err3 := service.GetRedis().ZCard(model2.MapRankPrefix).Result()
  56. if err3 != nil {
  57. util.DebugF("AddMapRank totalRanks err=%v uid=%v", err2, uid)
  58. return 0, 0, 0
  59. }
  60. util.DebugF("AddMapRank totalRanks=%v uid=%v", rankList, uid)
  61. //记录战斗回复记录数据(不包括战斗过程记录)
  62. recordId := battleRecord(uid, int32(selfRank), recordInfo)
  63. if recordId > 0 {
  64. service.GetRedis().SAdd(model2.BattleRecordDetailCheckPrefix, recordId)
  65. }
  66. //如果自己在前3名内,重新获取排名前3的玩家列表
  67. if selfRank < MAPRANK_TOP_3 {
  68. getTop3MapRank()
  69. }
  70. return uint32(selfRank), uint32(rankList), recordId
  71. }
  72. func AddHardMapRank(uid uint64, newMapLevel uint32, passTime uint64, recordInfo *serverproto.BattleRecordInfo) (uint32, uint32, uint64) {
  73. if uid <= 0 {
  74. return 0, 0, 0
  75. }
  76. //score
  77. scoreStr := getRankScore(uint64(newMapLevel), passTime)
  78. //uid
  79. keyStr := strconv.FormatUint(uid, 10)
  80. //todo... 通过多命令方式处理
  81. _, err := service.GetRedis().ZAdd(model2.MapHardRankPrefix, redis.Z{Score: float64(scoreStr), Member: keyStr}).Result()
  82. if err != nil {
  83. util.ErrorF("AddMapRank err=%v uid=%v", err, uid)
  84. return 0, 0, 0
  85. }
  86. //util.InfoF("[AddMapRank] ret:%v %v %v", ret, scoreStr, keyStr)
  87. //retRank,err1 := service.GetRedis().ZRevRange(MapRankPrefix, 0, -1).Result()
  88. //if err1 == nil {
  89. // util.DebugF("[AddMapRank] rankList:%v", retRank)
  90. //}
  91. selfRank, err2 := service.GetRedis().ZRevRank(model2.MapHardRankPrefix, keyStr).Result()
  92. if err2 != nil {
  93. util.DebugF("AddMapRank selfRank err=%v uid=%v", err2, uid)
  94. return 0, 0, 0
  95. }
  96. util.DebugF("AddMapRank selfRank=%v uid=%v score=%v", selfRank+1, uid, scoreStr)
  97. rankList, err3 := service.GetRedis().ZCard(model2.MapHardRankPrefix).Result()
  98. if err3 != nil {
  99. util.DebugF("AddMapRank totalRanks err=%v uid=%v", err2, uid)
  100. return 0, 0, 0
  101. }
  102. util.DebugF("AddMapRank totalRanks=%v uid=%v", rankList, uid)
  103. ////记录战斗回复记录数据(不包括战斗过程记录)
  104. //recordId := battleRecord(uid, int32(selfRank), recordInfo)
  105. //if recordId > 0 {
  106. // service.GetRedis().SAdd(model2.BattleRecordDetailCheckPrefix, recordId)
  107. //}
  108. //如果自己在前3名内,重新获取排名前3的玩家列表
  109. if selfRank < MAPRANK_TOP_3 {
  110. getTop3MapHardRank()
  111. }
  112. return uint32(selfRank), uint32(rankList), 0
  113. }
  114. func AddHard2MapRank(uid uint64, newMapLevel uint32, passTime uint64, recordInfo *serverproto.BattleRecordInfo) (uint32, uint32, uint64) {
  115. if uid <= 0 {
  116. return 0, 0, 0
  117. }
  118. //score
  119. scoreStr := getRankScore(uint64(newMapLevel), passTime)
  120. //uid
  121. keyStr := strconv.FormatUint(uid, 10)
  122. //todo... 通过多命令方式处理
  123. _, err := service.GetRedis().ZAdd(model2.MapHard2RankPrefix, redis.Z{Score: float64(scoreStr), Member: keyStr}).Result()
  124. if err != nil {
  125. util.ErrorF("AddMapRank err=%v uid=%v", err, uid)
  126. return 0, 0, 0
  127. }
  128. //util.InfoF("[AddMapRank] ret:%v %v %v", ret, scoreStr, keyStr)
  129. //retRank,err1 := service.GetRedis().ZRevRange(MapRankPrefix, 0, -1).Result()
  130. //if err1 == nil {
  131. // util.DebugF("[AddMapRank] rankList:%v", retRank)
  132. //}
  133. selfRank, err2 := service.GetRedis().ZRevRank(model2.MapHard2RankPrefix, keyStr).Result()
  134. if err2 != nil {
  135. util.DebugF("AddMapRank selfRank err=%v uid=%v", err2, uid)
  136. return 0, 0, 0
  137. }
  138. util.DebugF("AddMapRank selfRank=%v uid=%v score=%v", selfRank+1, uid, scoreStr)
  139. rankList, err3 := service.GetRedis().ZCard(model2.MapHard2RankPrefix).Result()
  140. if err3 != nil {
  141. util.DebugF("AddMapRank totalRanks err=%v uid=%v", err2, uid)
  142. return 0, 0, 0
  143. }
  144. util.DebugF("AddMapRank totalRanks=%v uid=%v", rankList, uid)
  145. ////记录战斗回复记录数据(不包括战斗过程记录)
  146. //recordId := battleRecord(uid, int32(selfRank), recordInfo)
  147. //if recordId > 0 {
  148. // service.GetRedis().SAdd(model2.BattleRecordDetailCheckPrefix, recordId)
  149. //}
  150. //如果自己在前3名内,重新获取排名前3的玩家列表
  151. if selfRank < MAPRANK_TOP_3 {
  152. getTop3MapHard2Rank()
  153. }
  154. return uint32(selfRank), uint32(rankList), 0
  155. }
  156. func GetMapRank(uid uint64) (uint32, uint32) {
  157. //获取排名前3的玩家列表
  158. //if len(MapRankTopThree) <= 0 {
  159. // getTop3MapRank()
  160. //}
  161. //暂时处理成每次重新获取,因为简介信息可能发生变化
  162. getTop3MapRank()
  163. //uid
  164. keyStr := strconv.FormatUint(uid, 10)
  165. selfRank, err2 := service.GetRedis().ZRevRank(model2.MapRankPrefix, keyStr).Result()
  166. if err2 != nil {
  167. util.DebugF("uid=%v GetMapRank selfRank keystr=%v err=%v", uid, model2.MapRankPrefix, err2)
  168. return 0, 0
  169. }
  170. util.DebugF("uid=%v GetMapRank keystr=%v selfRank=%v", uid, model2.MapRankPrefix, selfRank+1)
  171. rankList, err3 := service.GetRedis().ZCard(model2.MapRankPrefix).Result()
  172. if err3 != nil {
  173. util.DebugF("uid=%v GetMapRank keystr=%v totalRanks err=%v", uid, model2.MapRankPrefix, err2)
  174. return 0, 0
  175. }
  176. util.DebugF("uid=%v GetMapRank keystr=%v totalRanks=%v", uid, model2.MapRankPrefix, rankList)
  177. return uint32(selfRank), uint32(rankList)
  178. }
  179. func GetMapHardRank(uid uint64) (uint32, uint32) {
  180. //获取排名前3的玩家列表
  181. //if len(MapRankTopThree) <= 0 {
  182. // getTop3MapRank()
  183. //}
  184. //暂时处理成每次重新获取,因为简介信息可能发生变化
  185. getTop3MapHardRank()
  186. //uid
  187. keyStr := strconv.FormatUint(uid, 10)
  188. selfRank, err2 := service.GetRedis().ZRevRank(model2.MapHardRankPrefix, keyStr).Result()
  189. if err2 != nil {
  190. util.DebugF("uid=%v GetMapRank selfRank keystr=%v err=%v", uid, model2.MapHardRankPrefix, err2)
  191. return 0, 0
  192. }
  193. util.DebugF("uid=%v GetMapRank keystr=%v selfRank=%v", uid, model2.MapHardRankPrefix, selfRank+1)
  194. rankList, err3 := service.GetRedis().ZCard(model2.MapHardRankPrefix).Result()
  195. if err3 != nil {
  196. util.DebugF("uid=%v GetMapRank keystr=%v totalRanks err=%v", uid, model2.MapHardRankPrefix, err2)
  197. return 0, 0
  198. }
  199. util.DebugF("uid=%v GetMapRank keystr=%v totalRanks=%v", uid, model2.MapHardRankPrefix, rankList)
  200. return uint32(selfRank), uint32(rankList)
  201. }
  202. func GetMapHard2Rank(uid uint64) (uint32, uint32) {
  203. //获取排名前3的玩家列表
  204. //if len(MapRankTopThree) <= 0 {
  205. // getTop3MapRank()
  206. //}
  207. //暂时处理成每次重新获取,因为简介信息可能发生变化
  208. getTop3MapHard2Rank()
  209. //uid
  210. keyStr := strconv.FormatUint(uid, 10)
  211. selfRank, err2 := service.GetRedis().ZRevRank(model2.MapHard2RankPrefix, keyStr).Result()
  212. if err2 != nil {
  213. util.DebugF("uid=%v GetMapRank selfRank keystr=%v err=%v", uid, model2.MapHard2RankPrefix, err2)
  214. return 0, 0
  215. }
  216. util.DebugF("uid=%v GetMapRank keystr=%v selfRank=%v", uid, model2.MapHard2RankPrefix, selfRank+1)
  217. rankList, err3 := service.GetRedis().ZCard(model2.MapHard2RankPrefix).Result()
  218. if err3 != nil {
  219. util.DebugF("uid=%v GetMapRank keystr=%v totalRanks err=%v", uid, model2.MapHard2RankPrefix, err2)
  220. return 0, 0
  221. }
  222. util.DebugF("uid=%v GetMapRank keystr=%v totalRanks=%v", uid, model2.MapHard2RankPrefix, rankList)
  223. return uint32(selfRank), uint32(rankList)
  224. }
  225. func GetRankByKeyUid(KeyStr string, uid uint64, compId int32) (uint32, uint32, uint32) {
  226. //uid
  227. uidStr := strconv.FormatUint(uid, 10)
  228. selfRank, err2 := service.GetRedis().ZRevRank(KeyStr, uidStr).Result()
  229. if err2 != nil {
  230. //util.DebugF("GetMapRank selfRank uid=%v keystr=%v err=%v", KeyStr, uid, err2)
  231. return 0, 0, 0
  232. }
  233. util.DebugF("GetMapRank uid=%v keystr=%v selfRank:%v", KeyStr, uid, selfRank+1)
  234. rankList, err3 := service.GetRedis().ZCard(KeyStr).Result()
  235. if err3 != nil {
  236. //util.DebugF("GetMapRank uid=%v keystr=%v totalRanks err:%v", KeyStr, uid, err2)
  237. return 0, 0, 0
  238. }
  239. util.DebugF("GetMapRank uid=%v keystr=%v totalRanks:%v", KeyStr, uid, rankList)
  240. selfScore := uint32(0)
  241. selfRank, rankErr := service.GetRedis().ZRevRank(KeyStr, uidStr).Result()
  242. if rankErr == nil && rankErr != service.NIL {
  243. topListWithScore, err3 := service.GetRedis().ZRevRangeWithScores(KeyStr, selfRank, selfRank).Result()
  244. if err3 == nil {
  245. for index, _ := range topListWithScore {
  246. rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  247. if rankUid == uid {
  248. if compId != int32(model2.CompetitionType_Idol) {
  249. _, _, oldScore := getValByRankScore(topListWithScore[index].Score)
  250. selfScore = uint32(oldScore)
  251. } else {
  252. _, _, oldScore := getIdolValByRankScore(topListWithScore[index].Score)
  253. selfScore = uint32(oldScore)
  254. }
  255. }
  256. }
  257. } else {
  258. util.DebugF("[GetIdolTotalScore] selfRank err:%v", err3)
  259. }
  260. }
  261. return uint32(selfRank), uint32(rankList), selfScore
  262. }
  263. func GetBattleRecordMap(ackMsg *serverproto.SCPlayerBattleRecordAck, paramList []uint32) {
  264. if len(paramList) < 2 {
  265. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
  266. return
  267. }
  268. nowTime := util.GetTimeMilliseconds()
  269. //最近通关
  270. mapId := paramList[0]
  271. mapLevel := paramList[1]
  272. passMapLevel := strconv.Itoa(int(mapId*10000+mapLevel)) + "_pass"
  273. recordInfoStr, err := service.GetRedis().HGet(model2.BattleRecordMapPrefix, passMapLevel).Result()
  274. if err == nil {
  275. recordInfo := &serverproto.BattleRecordInfo{}
  276. err = model2.GetDecodeMessage(recordInfo, recordInfoStr)
  277. if err == nil {
  278. //判断战斗记录是否存在(有可能还没上传,有一定延迟)
  279. battleKeyStr := model2.BattleRecordDetailPrefix + strconv.FormatUint(recordInfo.BattleRecordId, 10)
  280. if service.GetRedis().Exists(battleKeyStr).Val() > 0 {
  281. recordInfo.RecordIdx = 1
  282. ackMsg.RecordList = append(ackMsg.RecordList, recordInfo)
  283. } else {
  284. if recordInfo.RecordTime+10*60 >= nowTime {
  285. recordInfo.RecordIdx = 1
  286. ackMsg.RecordList = append(ackMsg.RecordList, recordInfo)
  287. } else {
  288. //不存在战斗相信记录,删除通关记录
  289. service.GetRedis().HDel(model2.BattleRecordMapPrefix, passMapLevel)
  290. }
  291. }
  292. }
  293. }
  294. //最低战斗力通关
  295. passMapMinFPower := strconv.Itoa(int(mapId*10000+mapLevel)) + "_power" //brecord:map:10001_power
  296. recordInfoStr, err = service.GetRedis().HGet(model2.BattleRecordMapPrefix, passMapMinFPower).Result()
  297. if err == nil {
  298. recordInfo := &serverproto.BattleRecordInfo{}
  299. err = model2.GetDecodeMessage(recordInfo, recordInfoStr)
  300. if err == nil {
  301. //判断战斗记录是否存在(有可能还没上传,有一定延迟)
  302. battleKeyStr := model2.BattleRecordDetailPrefix + strconv.FormatUint(recordInfo.BattleRecordId, 10)
  303. if service.GetRedis().Exists(battleKeyStr).Val() > 0 {
  304. recordInfo.RecordIdx = 2
  305. ackMsg.RecordList = append(ackMsg.RecordList, recordInfo)
  306. } else {
  307. if recordInfo.RecordTime+10*60 >= nowTime {
  308. recordInfo.RecordIdx = 2
  309. ackMsg.RecordList = append(ackMsg.RecordList, recordInfo)
  310. } else {
  311. //不存在战斗相信记录,删除通关记录
  312. service.GetRedis().HDel(model2.BattleRecordMapPrefix, passMapMinFPower)
  313. }
  314. }
  315. }
  316. }
  317. }
  318. func getTop3MapRank() {
  319. //topList,err4 := service.GetRedis().ZRevRange(MapRankPrefix, 0, MAPRANK_TOP_3 -1).Result()
  320. topListWithScore, err4 := service.GetRedis().ZRevRangeWithScores(model2.MapRankPrefix, 0, MAPRANK_TOP_3-1).Result()
  321. if err4 == nil {
  322. MapRankTopThree = MapRankTopThree[:0]
  323. for index, _ := range topListWithScore {
  324. rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  325. mapId, mapLevel, _ := getValByRankScore(topListWithScore[index].Score)
  326. topRankPlayer := &serverproto.RankPlayerInfo{
  327. Uid: rankUid,
  328. MapId: mapId,
  329. MapLevel: mapLevel,
  330. Brief: &serverproto.CommonPlayerBriefInfo{},
  331. }
  332. //获取top rank player nickName
  333. model.GetSystemDataFromRedis(model.RolePlayerBriefPrefix, rankUid, topRankPlayer.Brief)
  334. MapRankTopThree = append(MapRankTopThree, topRankPlayer)
  335. }
  336. }
  337. }
  338. func getTop3MapHardRank() {
  339. //topList,err4 := service.GetRedis().ZRevRange(MapRankPrefix, 0, MAPRANK_TOP_3 -1).Result()
  340. topListWithScore, err4 := service.GetRedis().ZRevRangeWithScores(model2.MapHardRankPrefix, 0, MAPRANK_TOP_3-1).Result()
  341. if err4 == nil {
  342. MapHardRankTopThree = MapHardRankTopThree[:0]
  343. for index, _ := range topListWithScore {
  344. rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  345. mapId, mapLevel, _ := getValByRankScore(topListWithScore[index].Score)
  346. topRankPlayer := &serverproto.RankPlayerInfo{
  347. Uid: rankUid,
  348. MapId: mapId,
  349. MapLevel: mapLevel,
  350. Brief: &serverproto.CommonPlayerBriefInfo{},
  351. }
  352. //获取top rank player nickName
  353. model.GetSystemDataFromRedis(model.RolePlayerBriefPrefix, rankUid, topRankPlayer.Brief)
  354. MapHardRankTopThree = append(MapHardRankTopThree, topRankPlayer)
  355. }
  356. }
  357. }
  358. func getTop3MapHard2Rank() {
  359. //topList,err4 := service.GetRedis().ZRevRange(MapRankPrefix, 0, MAPRANK_TOP_3 -1).Result()
  360. topListWithScore, err4 := service.GetRedis().ZRevRangeWithScores(model2.MapHard2RankPrefix, 0, MAPRANK_TOP_3-1).Result()
  361. if err4 == nil {
  362. MapHard2RankTopThree = MapHard2RankTopThree[:0]
  363. for index, _ := range topListWithScore {
  364. rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  365. mapId, mapLevel, _ := getValByRankScore(topListWithScore[index].Score)
  366. topRankPlayer := &serverproto.RankPlayerInfo{
  367. Uid: rankUid,
  368. MapId: mapId,
  369. MapLevel: mapLevel,
  370. Brief: &serverproto.CommonPlayerBriefInfo{},
  371. }
  372. //获取top rank player nickName
  373. model.GetSystemDataFromRedis(model.RolePlayerBriefPrefix, rankUid, topRankPlayer.Brief)
  374. MapHard2RankTopThree = append(MapHard2RankTopThree, topRankPlayer)
  375. }
  376. }
  377. }
  378. func battleRecord(uid uint64, selfRank int32, recordInfo *serverproto.BattleRecordInfo) uint64 {
  379. var retId uint64 = 0
  380. if recordInfo.RecordTime <= 0 {
  381. return retId
  382. }
  383. err, recordInfoStr := model2.GetEncodeMessage(recordInfo)
  384. if err != nil {
  385. return retId
  386. }
  387. //最近通关
  388. var oldRecordId uint64 = 0
  389. passMapLevel := strconv.Itoa(int(recordInfo.MapLevelId)) + "_pass" //brecord:map:10001_pass
  390. oldPassStr, err1 := service.GetRedis().HGet(model2.BattleRecordMapPrefix, passMapLevel).Result()
  391. if err1 == nil {
  392. oldPassRecordInfo := &serverproto.BattleRecordInfo{}
  393. err1 = model2.GetDecodeMessage(oldPassRecordInfo, oldPassStr)
  394. if err1 == nil && oldPassRecordInfo.BattleRecordId > 0 {
  395. oldRecordId = oldPassRecordInfo.BattleRecordId
  396. }
  397. }
  398. _, err = service.GetRedis().HSet(model2.BattleRecordMapPrefix, passMapLevel, recordInfoStr).Result()
  399. if err != nil {
  400. util.DebugF("AddMapRank set pass map record failed[map pass] uid=%v", uid)
  401. } else {
  402. retId = recordInfo.BattleRecordId
  403. //设置之前的战斗记录过期时间,过期时间为10分钟
  404. oldRecordIdStr := strconv.FormatUint(oldRecordId, 10)
  405. service.GetRedis().Expire(model2.BattleRecordDetailPrefix+oldRecordIdStr, time.Minute*1)
  406. }
  407. //min fight power pass map
  408. passMapMinFPower := strconv.Itoa(int(recordInfo.MapLevelId)) + "_power" //brecord:map:10001_power
  409. oldRecordInfoStr, err1 := service.GetRedis().HGet(model2.BattleRecordMapPrefix, passMapMinFPower).Result()
  410. if err1 != nil && err1 != service.NIL {
  411. return retId
  412. }
  413. oldRecordInfo := &serverproto.BattleRecordInfo{}
  414. err = model2.GetDecodeMessage(oldRecordInfo, oldRecordInfoStr)
  415. if err != nil {
  416. return retId
  417. }
  418. if recordInfo.BattleVersion > oldRecordInfo.BattleVersion || oldRecordInfo.FightPower == 0 ||
  419. (recordInfo.BattleVersion == oldRecordInfo.BattleVersion && oldRecordInfo.FightPower > recordInfo.FightPower) {
  420. _, err := service.GetRedis().HSet(model2.BattleRecordMapPrefix, passMapMinFPower, recordInfoStr).Result()
  421. if err != nil {
  422. util.DebugF("AddMapRank set pass map record failed[min fight power] uid=%v", uid)
  423. return retId
  424. }
  425. if oldRecordInfo.BattleRecordId > 0 {
  426. oldRecordId = oldRecordInfo.BattleRecordId
  427. //设置之前的战斗记录过期时间,过期时间为10分钟
  428. oldRecordIdStr := strconv.FormatUint(oldRecordId, 10)
  429. service.GetRedis().Expire(model2.BattleRecordDetailPrefix+oldRecordIdStr, time.Minute*10)
  430. }
  431. retId = recordInfo.BattleRecordId
  432. //util.InfoF("AddMapRank battleRecord ")
  433. }
  434. return retId
  435. }
  436. //================================= 推图冲榜 ===========================================
  437. //================================= 推图冲榜 ===========================================
  438. type MapScoreManger struct {
  439. TickTime uint64
  440. //冲榜数据
  441. RushId int32 //冲榜序号(第几次冲榜)
  442. RushStage int32 //冲榜阶段
  443. RewardList map[uint64]int32 //自己领奖则不再邮件发送
  444. RoundData []*serverproto.RushRoundData
  445. initRushTime bool
  446. }
  447. func newMapScoreManger() *MapScoreManger {
  448. mag := &MapScoreManger{}
  449. mag.TickTime = 0
  450. mag.RushId = 0
  451. mag.RushStage = 0
  452. mag.RewardList = make(map[uint64]int32)
  453. mag.initRushTime = false
  454. return mag
  455. }
  456. // 1秒刷新
  457. func (this *MapScoreManger) Update(ms uint64) {
  458. if service.GetRedis() == nil {
  459. return
  460. }
  461. if this.TickTime == 0 {
  462. err1 := this.loadRushMapDataFromRedis()
  463. if err1 != nil && err1 != service.NIL {
  464. util.ErrorF("[MapScoreManger] loadRushMapDataFromRedis err:%v", err1)
  465. return
  466. }
  467. this.TickTime = ms
  468. util.InfoF("[MapScoreManger] init success")
  469. //上线加载崇拜活动数据
  470. return
  471. }
  472. if this.TickTime != 0 && this.initRushTime == false {
  473. startUpTime := service.GetServiceStartupTime()
  474. if startUpTime > 0 {
  475. this.CheckAddInitRoundData()
  476. this.initRushTime = true
  477. }
  478. }
  479. //5秒中刷新
  480. if this.TickTime != 0 && this.TickTime+RefreshTime < ms {
  481. //写数据库
  482. this.SwitchRushActivityState()
  483. this.TickTime = ms
  484. return
  485. }
  486. }
  487. // 全服爬塔排名逻辑
  488. func (this *MapScoreManger) AddMapScoreRank(uid uint64, score uint32) uint32 {
  489. //不在冲榜阶段
  490. if this.RushStage != Rush_Map_Rank_Rush {
  491. return 0
  492. }
  493. //精确到10毫秒
  494. curTime := util.GetCurrentTime() / 10
  495. //score
  496. scoreStr := getRushMapScore(uint64(score), uint64(curTime))
  497. //uid
  498. keyStr := strconv.FormatUint(uid, 10)
  499. _, err := service.GetRedis().ZAdd(model2.RushMapScorePrefix, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  500. if err != nil {
  501. util.ErrorF("[AddMapScoreRank] err:%v uid:%v", err, uid)
  502. return 0
  503. }
  504. selfRank, err2 := service.GetRedis().ZRevRank(model2.RushMapScorePrefix, keyStr).Result()
  505. if err2 != nil {
  506. util.DebugF("[AddMapScoreRank] selfRank err:%v", err2)
  507. return 0
  508. }
  509. util.DebugF("[AddMapScoreRank] selfRank:%v", selfRank+1)
  510. //超过1000人的情况
  511. rankListCount, err1 := service.GetRedis().ZCard(model2.RushMapScorePrefix).Result()
  512. if err1 != nil {
  513. util.DebugF("[AddMapScoreRank] totalRanks err:%v", err1)
  514. return uint32(selfRank)
  515. }
  516. if rankListCount > MAPSCORE_TOP_3000 {
  517. count := rankListCount - MAPSCORE_TOP_3000
  518. for i := 0; i < int(count); i++ {
  519. _, err := service.GetRedis().ZRemRangeByRank(model2.RushMapScorePrefix, 0, 0).Result()
  520. if err != nil {
  521. util.ErrorF("[AddMapScoreRank] remove top rank err:%v uid:%v", err)
  522. break
  523. }
  524. }
  525. }
  526. return uint32(selfRank + 1)
  527. }
  528. // 加载赛季数据
  529. func (this *MapScoreManger) loadRushMapDataFromRedis() error {
  530. keyStr := model2.RushMapPrefix
  531. ret, err := service.GetRedis().Get(keyStr).Result()
  532. if err != nil {
  533. util.InfoF("loadRushMap get guildId key=%v err=%v\n", keyStr, err)
  534. return err
  535. }
  536. if ret == "" {
  537. util.InfoF("key(%v)->val empty", keyStr)
  538. return err
  539. }
  540. str, err := base64.StdEncoding.DecodeString(ret)
  541. if err != nil {
  542. util.InfoF("key(%v)->val DecodeString error", keyStr)
  543. return err
  544. }
  545. rushData := &serverproto.RushData{}
  546. err = rocommon.GetCodec().Unmarshal(str, rushData)
  547. if err == nil {
  548. this.RushId = rushData.RushId
  549. this.RushStage = rushData.RushStage
  550. this.RewardList = make(map[uint64]int32)
  551. this.RoundData = rushData.RoundData
  552. if len(rushData.RewardList) > 0 {
  553. for _, data := range rushData.RewardList {
  554. this.RewardList[data] = 1
  555. }
  556. }
  557. util.InfoF("loadRushMap success:%v", rushData)
  558. return nil
  559. }
  560. util.InfoF("loadRushMap failed")
  561. return err
  562. }
  563. func (this *MapScoreManger) CheckAddInitRoundData() {
  564. if this.RushId == 0 {
  565. return
  566. }
  567. for _, data := range this.RoundData {
  568. if data.RushId == this.RushId {
  569. return
  570. }
  571. }
  572. //初始化一下
  573. rankData := model2.GetRushActivityByRound(model2.Rush_Type_Map, this.RushId)
  574. if rankData == nil {
  575. util.ErrorF("[MapScoreManger] CheckAddInitRoundData config not found error:curRushId", this.RushId)
  576. return
  577. }
  578. //判定开始时间是否已经过了。
  579. startTime := model2.GetRushActivityTimeStamp(rankData.StartDay, rankData.StartTime)
  580. closeTime := model2.GetRushActivityTimeStamp(rankData.CloseDay, rankData.CloseTime)
  581. resetTime := model2.GetRushActivityTimeStamp(rankData.RestDay, rankData.RestTime)
  582. this.RoundData = append(this.RoundData, &serverproto.RushRoundData{
  583. RushId: this.RushId,
  584. StartTime: startTime,
  585. CloseTime: closeTime,
  586. ResetTime: resetTime,
  587. })
  588. util.InfoF("[TowerRankManger] init time: %v - %v - %v, this.RoundData :%v", startTime, closeTime, resetTime, this.RoundData)
  589. this.saveRushMapDataToRedis()
  590. }
  591. func (this *MapScoreManger) saveRushMapDataToRedis() {
  592. keyStr := model2.RushMapPrefix
  593. rushData := &serverproto.RushData{
  594. RushId: this.RushId,
  595. RushStage: this.RushStage,
  596. RoundData: this.RoundData,
  597. }
  598. for key, _ := range this.RewardList {
  599. rushData.RewardList = append(rushData.RewardList, key)
  600. }
  601. msgData, err := rocommon.GetCodec().Marshal(rushData)
  602. if err != nil {
  603. return
  604. }
  605. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  606. ret, err := service.GetRedis().Set(keyStr, msgStr, 0).Result()
  607. if err != nil {
  608. util.InfoF("saveRushMapDataToRedis err=%v ret=%v", keyStr, ret)
  609. return
  610. }
  611. util.InfoF("saveRushMapDataToRedis save rushData success : %v", rushData)
  612. }
  613. // 当前是否有冲榜活动
  614. func (this *MapScoreManger) CheckInRushActivity() bool {
  615. if this.RushId == 0 || (this.RushId != 0 && this.RushStage == int32(Rush_Map_Rank_End)) {
  616. return false
  617. }
  618. return true
  619. }
  620. // 是否有新的冲榜开启
  621. func (this *MapScoreManger) CheckNewRushActivity() {
  622. //如果在活动内,不做处理
  623. if this.RushId != 0 && this.RushStage != int32(Rush_Map_Rank_End) {
  624. return
  625. }
  626. //配置有问题
  627. rankData := model2.GetRushActivityByRound(model2.Rush_Type_Map, this.RushId+1)
  628. if rankData == nil {
  629. return
  630. }
  631. curTime := util.GetCurrentTime()
  632. bFind := false
  633. for _, data := range this.RoundData {
  634. if data.RushId == this.RushId+1 {
  635. bFind = true
  636. if data.StartTime <= curTime {
  637. this.RushId = this.RushId + 1
  638. this.RushStage = Rush_Map_Rank_Rush
  639. this.RewardList = make(map[uint64]int32)
  640. this.saveRushMapDataToRedis()
  641. util.InfoF("start new rushMap this.RoundData:%v, ", data)
  642. }
  643. return
  644. }
  645. }
  646. if bFind == false {
  647. //判定开始时间是否已经过了。
  648. startTime := model2.GetRushActivityTimeStamp(rankData.StartDay, rankData.StartTime)
  649. closeTime := model2.GetRushActivityTimeStamp(rankData.CloseDay, rankData.CloseTime)
  650. resetTime := model2.GetRushActivityTimeStamp(rankData.RestDay, rankData.RestTime)
  651. //如果当前时间 >= startTime 则,设定开启时间 return
  652. newStartTime := startTime
  653. newCloseTime := closeTime
  654. newResetTime := resetTime
  655. //计算今天的开启时间//超过今天的开启时间,则开启时间定为第二天的开启时间
  656. loc := util.GetLoc()
  657. todayStartHour := util.GetLatest5Hour() - 24*3600*1000
  658. startServer := time.Unix(int64(todayStartHour/1000), 0).In(loc).Format(util.DATE_FORMAT1)
  659. startUpDayStr := util.GetDayByTimeStr1(startServer)
  660. todayRushBegin := util.GetTimeByStr(startUpDayStr.Format(util.DATE_FORMAT1) + " " + rankData.StartTime)
  661. todayRushStart := time.Unix(todayRushBegin.Unix(), 0).In(loc)
  662. todayRushTime := uint64(todayRushStart.UnixNano() / 1e6)
  663. //已经过了开服时间,才需要顺延。正常不需要顺延
  664. if startTime < curTime {
  665. if curTime <= todayRushTime {
  666. newStartTime = todayRushTime
  667. } else {
  668. newStartTime = todayRushTime + 24*3600*1000
  669. }
  670. newCloseTime = newStartTime + (closeTime - startTime)
  671. newResetTime = newStartTime + (resetTime - startTime)
  672. }
  673. //重置数据
  674. this.RoundData = append(this.RoundData, &serverproto.RushRoundData{
  675. RushId: this.RushId + 1,
  676. StartTime: newStartTime,
  677. CloseTime: newCloseTime,
  678. ResetTime: newResetTime,
  679. })
  680. util.InfoF("init next rushMap newStartTime:%v, newCloseTime:%v, newResetTime:%v", newStartTime, newCloseTime, newResetTime)
  681. this.saveRushMapDataToRedis()
  682. }
  683. }
  684. func (this *MapScoreManger) GetRoundTime(rushId int32) (uint64, uint64, uint64) {
  685. for _, data := range this.RoundData {
  686. if data.RushId == rushId {
  687. return data.StartTime, data.CloseTime, data.ResetTime
  688. }
  689. }
  690. return 0, 0, 0
  691. }
  692. // 是否冲榜状态更新
  693. func (this *MapScoreManger) SwitchRushActivityState() {
  694. if this.CheckInRushActivity() == false {
  695. this.CheckNewRushActivity()
  696. return
  697. }
  698. //活动结束。且又没有新的赛季直接返回
  699. if this.RushId == 0 || this.RushStage == int32(Rush_Map_Rank_End) {
  700. return
  701. }
  702. //切换状态
  703. curTime := util.GetCurrentTime()
  704. _, closeTime, resetTime := this.GetRoundTime(this.RushId)
  705. if closeTime == 0 || resetTime == 0 {
  706. util.ErrorF("TimeError : closeTime:%v, resetTime:%v, curTime:%v, this.RushId:%v", closeTime, resetTime, curTime, this.RushId)
  707. return
  708. }
  709. //找到活动,说明还在活动内
  710. if closeTime < curTime && curTime <= resetTime {
  711. if this.RushStage < Rush_Map_Rank_Reward {
  712. //进入领奖阶段,备份排行榜单
  713. this.backUpMapRankData()
  714. this.RushStage = Rush_Map_Rank_Reward
  715. this.saveRushMapDataToRedis()
  716. }
  717. } else if curTime > resetTime {
  718. //未找到,备份数据。直接结束活动
  719. if this.RushStage == Rush_Map_Rank_Rush || this.RushStage == Rush_Map_Rank_Reward {
  720. //活动结束了,则备份榜单。函数本身已经判定Key是否存在
  721. this.backUpMapRankData()
  722. //发送未领取的排行版邮件
  723. this.SendRushMapReward()
  724. this.RushStage = Rush_Map_Rank_End
  725. this.saveRushMapDataToRedis()
  726. }
  727. }
  728. }
  729. // 备份爬塔数据
  730. func (this *MapScoreManger) backUpMapRankData() {
  731. roundStr := strconv.Itoa(int(this.RushId))
  732. prefixStr := model2.RushMapRankPrefix + roundStr
  733. if !model2.ExistKey(prefixStr) {
  734. // _, err := service.GetRedis().ZUnionStore(prefixStr, service.BaseStore{}, model2.RushMapScorePrefix).Result()
  735. _, err := service.GetRedis().Rename(model2.RushMapScorePrefix, prefixStr).Result()
  736. if err != nil {
  737. util.ErrorF("backUpMapRankData store rank record err=%v prefixStr=%v", err, prefixStr)
  738. return
  739. }
  740. }
  741. }
  742. func (this *MapScoreManger) GetSelfRushRank(uid uint64, rushId int32) (int32, int32) {
  743. //从爬塔榜单上取数据
  744. if this.RushStage == Rush_Map_Rank_Rush {
  745. keyStr := strconv.FormatUint(uid, 10)
  746. selfRank, rankErr := service.GetRedis().ZRevRank(model2.RushMapScorePrefix, keyStr).Result()
  747. if rankErr == nil && rankErr != service.NIL {
  748. topListWithScore, err3 := service.GetRedis().ZRevRangeWithScores(model2.RushMapScorePrefix, selfRank, selfRank).Result()
  749. if err3 == nil {
  750. for index, _ := range topListWithScore {
  751. rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  752. if rankUid == uid {
  753. _, _, score := getValByRushMapScore(topListWithScore[index].Score)
  754. return int32(selfRank + 1), int32(score)
  755. }
  756. }
  757. } else {
  758. util.DebugF("[GetTopMapRank] selfRank err:%v", err3)
  759. }
  760. }
  761. } else {
  762. rushRound := this.RushId
  763. if rushId != 0 {
  764. rushRound = rushId
  765. }
  766. roundStr := strconv.Itoa(int(rushRound))
  767. prefixStr := model2.RushMapRankPrefix + roundStr
  768. keyStr := strconv.FormatUint(uid, 10)
  769. selfRank, rankErr := service.GetRedis().ZRevRank(prefixStr, keyStr).Result()
  770. if rankErr == nil && rankErr != service.NIL {
  771. topListWithScore, err3 := service.GetRedis().ZRevRangeWithScores(prefixStr, selfRank, selfRank).Result()
  772. if err3 == nil {
  773. for index, _ := range topListWithScore {
  774. rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  775. if rankUid == uid {
  776. _, _, score := getValByRushMapScore(topListWithScore[index].Score)
  777. return int32(selfRank + 1), int32(score)
  778. }
  779. }
  780. } else {
  781. util.DebugF("[GetTopMapRank] selfRank err:%v", err3)
  782. }
  783. }
  784. }
  785. return 0, 0
  786. }
  787. func (this *MapScoreManger) GetCurrentRushActivity() *model2.RankList {
  788. curRushId := int32(0)
  789. if Rush_Map_Rank_Rush <= this.RushStage && this.RushStage < Rush_Map_Rank_End {
  790. curRushId = this.RushId
  791. if curRushId == 0 {
  792. return nil
  793. }
  794. }
  795. return model2.GetRushActivityByRound(model2.Rush_Type_Map, curRushId)
  796. }
  797. func (this *MapScoreManger) GetRewardLevel(rank int32) *model2.RewardRank {
  798. rankData := this.GetCurrentRushActivity()
  799. if rankData == nil {
  800. return nil
  801. }
  802. for _, data := range rankData.Reward {
  803. if data.RankBegin <= rank && rank <= data.RankEnd {
  804. return data
  805. }
  806. }
  807. return nil
  808. }
  809. func (this *MapScoreManger) SendRushMapReward() {
  810. rankData := model2.GetRushActivityByRound(model2.Rush_Type_Map, this.RushId)
  811. if rankData == nil {
  812. return
  813. }
  814. //发送邮件奖励
  815. roundStr := strconv.Itoa(int(this.RushId))
  816. prefixStr := model2.RushMapRankPrefix + roundStr
  817. topListWithScore, err3 := service.GetRedis().ZRevRangeWithScores(prefixStr, 0, MAPSCORE_TOP_3000-1).Result()
  818. if err3 == nil {
  819. ntfMsg := &serverproto.SSRushActivityRankRewardNtf{
  820. MailCfgId: model2.GlobalMailIdRushMap,
  821. MailType: int32(serverproto.MailType_MailType_RushMap),
  822. RushRound: this.RushId,
  823. }
  824. for index, _ := range topListWithScore {
  825. rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  826. realRank := int32(index + 1)
  827. Uid := rankUid
  828. mailData := &serverproto.RushMailData{
  829. Uid: Uid,
  830. }
  831. bFind := false
  832. for _, data := range rankData.Reward {
  833. if data.RankBegin <= realRank && realRank <= data.RankEnd {
  834. mailData.MailParamList = append(mailData.MailParamList, realRank)
  835. mailData.MailParamList = append(mailData.MailParamList, data.RankLevel)
  836. mailData.RewardList = data.RewardList
  837. bFind = true
  838. break
  839. }
  840. }
  841. if !bFind { //没有排名奖励
  842. continue
  843. }
  844. ntfMsg.MailData = append(ntfMsg.MailData, mailData)
  845. if len(ntfMsg.MailData) >= MailMaxUids {
  846. SendToAllGame(ntfMsg)
  847. ntfMsg.MailData = ntfMsg.MailData[0:0]
  848. }
  849. }
  850. if len(ntfMsg.MailData) >= 1 {
  851. SendToAllGame(ntfMsg)
  852. }
  853. }
  854. }
  855. // 打包冲榜信息给客户端
  856. func (this *MapScoreManger) GetCurRushInfo(rushMapData *serverproto.RushActivityData) {
  857. if rushMapData == nil {
  858. return
  859. }
  860. if this.CheckInRushActivity() == false {
  861. rushMapData.InRush = false
  862. bFind := false
  863. for _, data := range this.RoundData {
  864. if data.RushId == this.RushId+1 {
  865. rushMapData.NextRush = data.StartTime
  866. bFind = true
  867. break
  868. }
  869. }
  870. if bFind == false {
  871. rushMapData.NextRush = 0
  872. }
  873. return
  874. }
  875. rankData := this.GetCurrentRushActivity()
  876. if rankData == nil {
  877. util.ErrorF("map config not found %v", this.RushId)
  878. return
  879. }
  880. rushMapData.InRush = true
  881. rushMapData.Stage = this.RushStage
  882. rushMapData.RushCount = rankData.RankRound
  883. _, closeTime, resetTime := this.GetRoundTime(this.RushId)
  884. if this.RushStage == Rush_Pet_Rank_Rush {
  885. rushMapData.StageEnd = closeTime
  886. } else {
  887. rushMapData.StageEnd = resetTime
  888. }
  889. }
  890. func (this *MapScoreManger) GetTop3RushMapData(rankData *model2.RankList, ackMsg *serverproto.SSGetRushDataAck) int32 {
  891. //从爬塔榜单上取数据
  892. for _, data := range rankData.Reward {
  893. if this.RushStage == Rush_Map_Rank_Rush {
  894. topListWithScore, err := service.GetRedis().ZRevRangeWithScores(model2.RushMapScorePrefix, int64(data.RankEnd-1), int64(data.RankEnd-1)).Result()
  895. if err == nil {
  896. for index, _ := range topListWithScore {
  897. rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  898. _, _, level := getValByRushMapScore(topListWithScore[index].Score)
  899. brief := &serverproto.CommonPlayerBriefInfo{}
  900. err2 := model.GetSystemDataFromRedis(model.RolePlayerBriefPrefix, rankUid, brief)
  901. if err2 != nil {
  902. continue
  903. }
  904. top3 := &serverproto.RushRankTop3{
  905. Name: brief.NickName,
  906. Rank: int32(data.RankEnd),
  907. Data: int32(level),
  908. }
  909. ackMsg.TopData = append(ackMsg.TopData, top3)
  910. break
  911. }
  912. }
  913. } else if this.RushStage == Rush_Map_Rank_Reward {
  914. roundStr := strconv.Itoa(int(this.RushId))
  915. prefixStr := model2.RushMapRankPrefix + roundStr
  916. topListWithScore, err3 := service.GetRedis().ZRevRangeWithScores(prefixStr, int64(data.RankEnd-1), int64(data.RankEnd-1)).Result()
  917. if err3 == nil {
  918. for index, _ := range topListWithScore {
  919. rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  920. _, _, level := getValByRushMapScore(topListWithScore[index].Score)
  921. brief := &serverproto.CommonPlayerBriefInfo{}
  922. err2 := model.GetSystemDataFromRedis(model.RolePlayerBriefPrefix, rankUid, brief)
  923. if err2 != nil {
  924. continue
  925. }
  926. top3 := &serverproto.RushRankTop3{
  927. Name: brief.NickName,
  928. Rank: int32(data.RankEnd),
  929. Data: int32(level),
  930. }
  931. ackMsg.TopData = append(ackMsg.TopData, top3)
  932. break
  933. }
  934. }
  935. }
  936. }
  937. return 0
  938. }
  939. func (this *MapScoreManger) GetSelfRushData(ackMsg *serverproto.SSGetRushDataAck) {
  940. if ackMsg == nil {
  941. return
  942. }
  943. rankData := this.GetCurrentRushActivity()
  944. if rankData == nil {
  945. util.ErrorF("map config not found %v", this.RushId)
  946. return
  947. }
  948. ackMsg.CurRushRound = this.RushId
  949. ackMsg.SelfRank, ackMsg.SelfLevel = this.GetSelfRushRank(ackMsg.Uid, 0)
  950. _, closeTime, resetTime := this.GetRoundTime(this.RushId)
  951. if this.RushStage == Rush_Map_Rank_Rush {
  952. ackMsg.EndTime = closeTime
  953. } else {
  954. ackMsg.EndTime = resetTime
  955. }
  956. this.GetTop3RushMapData(rankData, ackMsg)
  957. }
  958. func (this *MapScoreManger) CheckRushMapAddScore(ackMsg *serverproto.SSRushDataChangeAck) {
  959. if ackMsg == nil {
  960. return
  961. }
  962. if this.RushStage == Rush_Map_Rank_Rush {
  963. ackMsg.RushRound = this.RushId
  964. return
  965. }
  966. ackMsg.RushRound = 0
  967. }
  968. func (this *MapScoreManger) GetRushMapReward(ackMsg *serverproto.SSGetRushRewardAck, rewardType int32) {
  969. if rewardType == model2.Rush_Reward_Type_FightCount {
  970. this.GetRushMapBaseReward(ackMsg)
  971. } else if rewardType == model2.Rush_Reward_Type_Rank {
  972. this.GetRushMapRankReward(ackMsg)
  973. }
  974. }
  975. func (this *MapScoreManger) GetRushMapBaseReward(ackMsg *serverproto.SSGetRushRewardAck) {
  976. if ackMsg == nil {
  977. return
  978. }
  979. rankData := this.GetCurrentRushActivity()
  980. if rankData == nil {
  981. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH)
  982. return
  983. }
  984. if this.RushStage != Rush_Map_Rank_Reward {
  985. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
  986. return
  987. }
  988. ackMsg.RushRound = this.RushId
  989. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
  990. }
  991. func (this *MapScoreManger) GetRushMapRankReward(ackMsg *serverproto.SSGetRushRewardAck) {
  992. if ackMsg == nil {
  993. return
  994. }
  995. rankData := this.GetCurrentRushActivity()
  996. if rankData == nil {
  997. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH)
  998. return
  999. }
  1000. if this.RushStage != Rush_Map_Rank_Reward {
  1001. return
  1002. }
  1003. rank, _ := this.GetSelfRushRank(ackMsg.Uid, 0)
  1004. if rank == 0 {
  1005. return
  1006. }
  1007. ackMsg.RushRound = this.RushId
  1008. for _, data := range rankData.Reward {
  1009. if data.RankBegin <= rank && rank <= data.RankEnd {
  1010. for _, item := range data.RewardList {
  1011. ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
  1012. Key: item.Key,
  1013. Value: item.Value,
  1014. })
  1015. }
  1016. break
  1017. }
  1018. }
  1019. }
  1020. func (this *MapScoreManger) GetRushInfo() (int32, int32) {
  1021. if this.RushId == 0 || this.RushStage == Rush_Map_Rank_End {
  1022. return Rush_Map_Rank_End, 0
  1023. }
  1024. return this.RushStage, this.RushId
  1025. }
  1026. func (this *MapScoreManger) GetRushBaseReward(uid uint64, rushRound int32, ackMsg *serverproto.SSGetRushBaseRewardAck) {
  1027. ackMsg.Reward = false
  1028. if this.RushId > rushRound {
  1029. ackMsg.Reward = true
  1030. ackMsg.RewardRound = rushRound
  1031. return
  1032. }
  1033. if this.RushId > rushRound || (this.RushId == rushRound && this.RushStage == Rush_Map_Rank_End) {
  1034. ackMsg.Reward = true
  1035. ackMsg.RewardRound = rushRound
  1036. }
  1037. }
  1038. func (this *MapScoreManger) GetRushReward(uid uint64, rankRound int32, ackMsg *serverproto.RankRewardList) {
  1039. finishRound := this.RushId
  1040. if this.RushStage < Rush_Map_Rank_End {
  1041. finishRound = this.RushId - 1
  1042. }
  1043. if finishRound <= 0 || finishRound <= rankRound {
  1044. return
  1045. }
  1046. ackMsg.FinishRound = finishRound
  1047. for round := rankRound + 1; round <= finishRound; round++ {
  1048. selfRank, _ := this.GetSelfRushRank(uid, round)
  1049. if selfRank == 0 {
  1050. return
  1051. }
  1052. rankData := model2.GetRushActivityByRound(model2.Rush_Type_Map, round)
  1053. if rankData == nil {
  1054. return
  1055. }
  1056. rankRewardData := &serverproto.RankRewardData{
  1057. RushRound: round,
  1058. }
  1059. rankRewardData.MailParamList = append(rankRewardData.MailParamList, selfRank)
  1060. for _, data := range rankData.Reward {
  1061. if data.RankBegin <= selfRank && selfRank <= data.RankEnd {
  1062. for _, item := range data.RewardList {
  1063. rankRewardData.RewardList = append(rankRewardData.RewardList, &serverproto.KeyValueType{
  1064. Key: item.Key,
  1065. Value: item.Value,
  1066. })
  1067. }
  1068. rankRewardData.MailParamList = append(rankRewardData.MailParamList, data.RankLevel)
  1069. break
  1070. }
  1071. }
  1072. ackMsg.RankReward = append(ackMsg.RankReward, rankRewardData)
  1073. }
  1074. }