yuanhang_trial.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. package model
  2. import (
  3. "container/heap"
  4. "math/rand"
  5. "rocommon/service"
  6. "rocommon/util"
  7. "roserver/baseserver/model"
  8. "roserver/baseserver/set"
  9. "roserver/serverproto"
  10. "sort"
  11. "strconv"
  12. )
  13. // 远航试炼
  14. const (
  15. YuanHangTrialViewMaxNum = 200 //最大客户端可视列表数量
  16. //1 你被xxx挑战,失去xxx奖励
  17. //2 你对xx发起了抢夺,获得了xxx奖励
  18. //3 你对xx发起了抢夺,但是自己无法获取到奖励
  19. TrialLogDataType_1 = 1
  20. TrialLogDataType_2 = 2
  21. TrialLogDataType_3 = 3
  22. )
  23. type yuanHangTrialList struct {
  24. isDirty bool
  25. itemList []*serverproto.YuanHangTrialData
  26. trailItemList map[uint64]*serverproto.YuanHangTrialData
  27. }
  28. func (this *yuanHangTrialList) addItem(item *serverproto.YuanHangTrialData) {
  29. this.itemList = append(this.itemList, item)
  30. this.isDirty = true
  31. this.trailItemList[item.Uid] = item
  32. }
  33. func (this *yuanHangTrialList) delItem(uid uint64) {
  34. //后续使用二分查找实现
  35. for idx := 0; idx < len(this.itemList); idx++ {
  36. if this.itemList[idx].Uid == uid {
  37. this.itemList = append(this.itemList[idx:], this.itemList[:idx+1]...)
  38. this.isDirty = true
  39. break
  40. }
  41. }
  42. delete(this.trailItemList, uid)
  43. }
  44. func (this *yuanHangTrialList) binarySearch(leftIndex, rightIndex int, findVal uint64) int {
  45. if leftIndex > rightIndex {
  46. return 0
  47. }
  48. middle := (leftIndex + rightIndex) / 2
  49. if this.itemList[middle].DirtyStamp > findVal {
  50. this.binarySearch(middle+1, rightIndex, findVal)
  51. } else if this.itemList[middle].DirtyStamp < findVal {
  52. this.binarySearch(leftIndex, middle-1, findVal)
  53. }
  54. return middle
  55. }
  56. // minheap
  57. type TrailItemMinHeap struct {
  58. ItemList []*serverproto.YuanHangTrialData
  59. }
  60. func (h *TrailItemMinHeap) Len() int {
  61. return len(h.ItemList)
  62. }
  63. func (h *TrailItemMinHeap) Less(i, j int) bool {
  64. return h.ItemList[i].EndTimeStamp < h.ItemList[j].EndTimeStamp
  65. }
  66. func (h *TrailItemMinHeap) Swap(i, j int) {
  67. h.ItemList[i], h.ItemList[j] = h.ItemList[j], h.ItemList[i]
  68. }
  69. func (h *TrailItemMinHeap) Push(item interface{}) {
  70. h.ItemList = append(h.ItemList, item.(*serverproto.YuanHangTrialData))
  71. }
  72. func (h *TrailItemMinHeap) Pop() (ret interface{}) {
  73. l := len(h.ItemList)
  74. h.ItemList, ret = h.ItemList[:l-1], h.ItemList[l-1]
  75. return
  76. }
  77. // //
  78. type YuanHangTrialManager struct {
  79. trailItemMinHeap *TrailItemMinHeap
  80. tailItemLeftList *TrailItemMinHeap //超过200后的存储列表(排序)
  81. trialItemMapList map[uint64]*serverproto.YuanHangTrialData //total
  82. //cache fightInfo
  83. cacheFightRoleInfoList map[uint64]*serverproto.FightRoleInfo
  84. dbChangeTrialItemList set.Interface
  85. lineNum int32
  86. latestTrialTime uint64 //玩家最近一次的远航操作时间戳
  87. notifyList []*serverproto.YuanHangTrialData
  88. bInit bool
  89. updateTimer util.ServerTimer //主循环定时器
  90. }
  91. func newYuanHangTrialManager() *YuanHangTrialManager {
  92. mag := &YuanHangTrialManager{
  93. trialItemMapList: map[uint64]*serverproto.YuanHangTrialData{},
  94. trailItemMinHeap: &TrailItemMinHeap{},
  95. tailItemLeftList: &TrailItemMinHeap{},
  96. cacheFightRoleInfoList: map[uint64]*serverproto.FightRoleInfo{},
  97. dbChangeTrialItemList: set.New(set.NonThreadSafe),
  98. }
  99. mag.updateTimer = util.NewDurationTimer(util.GetCurrentTime(), 3000)
  100. heap.Init(mag.trailItemMinHeap)
  101. heap.Init(mag.tailItemLeftList)
  102. return mag
  103. }
  104. func (this *YuanHangTrialManager) Update(ms uint64) {
  105. //if !this.bInit {
  106. // if this.initTrialDataFromDB() {
  107. // this.bInit = true
  108. // }
  109. // return
  110. //}
  111. //util.InfoF("notifyList Trial5:%v", this.notifyList)
  112. if !this.updateTimer.IsStart() || !this.updateTimer.IsExpired(ms) {
  113. return
  114. }
  115. this.initTrialDataFromDB()
  116. //util.InfoF("notifyList Trial1:%v", this.notifyList)
  117. this.refreshViewList(ms)
  118. //util.InfoF("notifyList Trial2:%v", this.notifyList)
  119. //save change uid
  120. this.saveItemData()
  121. //util.InfoF("notifyList Trial3:%v", this.notifyList)
  122. //notify list
  123. if len(this.notifyList) > 0 {
  124. util.InfoF("notifyList Trial4:%v", this.notifyList)
  125. ssNotifyMsg := &serverproto.SSCrossYuanHangTrialViewNtf{}
  126. ssNotifyMsg.TrialViewList = append(ssNotifyMsg.TrialViewList, this.notifyList...)
  127. SendAllZoneSocial(ssNotifyMsg)
  128. this.notifyList = this.notifyList[:0]
  129. }
  130. }
  131. // 服务器启动时数据初始化
  132. func (this *YuanHangTrialManager) initTrialDataFromDB() bool {
  133. tmpItemList, bOk := GetTrialItemFromRedis()
  134. if !bOk {
  135. return false
  136. }
  137. sort.Slice(tmpItemList, func(i, j int) bool {
  138. return tmpItemList[i].EndTimeStamp < tmpItemList[j].EndTimeStamp
  139. })
  140. for idx := 0; idx < len(tmpItemList); idx++ {
  141. if _, ok := this.trialItemMapList[tmpItemList[idx].Uid]; ok {
  142. continue
  143. }
  144. //if idx < YuanHangTrialViewMaxNum {
  145. // heap.Push(this.trailItemMinHeap, tmpItemList[idx])
  146. //} else {
  147. heap.Push(this.tailItemLeftList, tmpItemList[idx])
  148. //}
  149. util.InfoF("addtrailItem info=%v", tmpItemList[idx])
  150. this.trialItemMapList[tmpItemList[idx].Uid] = tmpItemList[idx]
  151. }
  152. list, _ := GetBeChallengeFromRedis()
  153. if list == nil || len(list) == 0 {
  154. return true
  155. }
  156. //通知被挑战者
  157. util.InfoF("addBeChallengeLog list=%v", list)
  158. for _, v := range list {
  159. SendZoneSocial(v, 0)
  160. }
  161. return true
  162. }
  163. func (this *YuanHangTrialManager) refreshViewList(ms uint64) {
  164. //更新可视列表中是否有玩家远航结束
  165. if this.trailItemMinHeap.Len() <= 0 && this.tailItemLeftList.Len() <= 0 {
  166. return
  167. }
  168. //当前可视列表中过期的玩家移除
  169. for {
  170. if this.trailItemMinHeap.Len() <= 0 {
  171. break
  172. }
  173. itemInfo := heap.Pop(this.trailItemMinHeap).(*serverproto.YuanHangTrialData)
  174. if itemInfo == nil {
  175. break
  176. }
  177. //玩家远航结束,需要添加新玩家到可视列表中
  178. if ms >= itemInfo.EndTimeStamp {
  179. if this.tailItemLeftList.Len() > 0 {
  180. addItemInfo := heap.Pop(this.tailItemLeftList).(*serverproto.YuanHangTrialData)
  181. if addItemInfo != nil {
  182. heap.Push(this.trailItemMinHeap, addItemInfo)
  183. this.dbChangeTrialItemList.Add(addItemInfo.Uid)
  184. //添加到通知列表中
  185. this.addNotifyList(addItemInfo)
  186. }
  187. }
  188. this.dbChangeTrialItemList.Add(itemInfo.Uid)
  189. delete(this.trialItemMapList, itemInfo.Uid)
  190. } else {
  191. heap.Push(this.trailItemMinHeap, itemInfo)
  192. break
  193. }
  194. }
  195. //添加新玩家到可视列表中(填充可视列表最大数量)
  196. needAddNum := YuanHangTrialViewMaxNum - this.trailItemMinHeap.Len()
  197. if needAddNum > 0 {
  198. for idx := 0; idx < needAddNum; idx++ {
  199. if this.tailItemLeftList.Len() <= 0 {
  200. break
  201. }
  202. addItemInfo := heap.Pop(this.tailItemLeftList).(*serverproto.YuanHangTrialData)
  203. if addItemInfo != nil {
  204. heap.Push(this.trailItemMinHeap, addItemInfo)
  205. //添加到通知列表中
  206. this.addNotifyList(addItemInfo)
  207. }
  208. }
  209. }
  210. }
  211. func (this *YuanHangTrialManager) saveItemData() {
  212. if this.dbChangeTrialItemList.Size() <= 0 {
  213. return
  214. }
  215. saveList := this.dbChangeTrialItemList.List()
  216. for idx := 0; idx < len(saveList); idx++ {
  217. saveUid := saveList[idx].(uint64)
  218. if item, ok := this.trialItemMapList[saveUid]; ok {
  219. SetTrialItemToRedis(item, saveUid)
  220. } else {
  221. //数据库中需要在获取奖励之后才删除
  222. //SetTrialItemToRedis(nil, saveUid)
  223. }
  224. }
  225. this.dbChangeTrialItemList.Clear()
  226. }
  227. func (this *YuanHangTrialManager) addTrialItem(uid uint64, trialType int32, endTimeStamp uint64, durationTime int32,
  228. zone, fromZone int32) *serverproto.YuanHangTrialData {
  229. nowTime := util.GetTimeMilliseconds()
  230. this.lineNum = (this.lineNum+1)%10 + 1
  231. if this.latestTrialTime <= 0 {
  232. this.latestTrialTime = nowTime
  233. } else if this.latestTrialTime+30000 < nowTime {
  234. this.latestTrialTime = nowTime
  235. this.lineNum = rand.Int31n(10) + 1
  236. }
  237. item := &serverproto.YuanHangTrialData{
  238. Uid: uid,
  239. TrialType: trialType,
  240. DirtyStamp: nowTime,
  241. EndTimeStamp: endTimeStamp,
  242. Zone: zone,
  243. FromRealZone: fromZone,
  244. DurationTime: durationTime,
  245. LineNum: this.lineNum,
  246. }
  247. this.trialItemMapList[item.Uid] = item
  248. //添加到可见列表中
  249. if this.trailItemMinHeap.Len() < YuanHangTrialViewMaxNum {
  250. heap.Push(this.trailItemMinHeap, item)
  251. this.addNotifyList(item)
  252. } else {
  253. heap.Push(this.tailItemLeftList, item)
  254. }
  255. this.dbChangeTrialItemList.Add(uid)
  256. return item
  257. }
  258. func (this *YuanHangTrialManager) addNotifyList(notifyItem *serverproto.YuanHangTrialData) {
  259. for idx := 0; idx < len(this.notifyList); idx++ {
  260. if this.notifyList[idx].Uid == notifyItem.Uid {
  261. this.notifyList[idx] = notifyItem
  262. return
  263. }
  264. }
  265. this.notifyList = append(this.notifyList, notifyItem)
  266. }
  267. func (this *YuanHangTrialManager) getFightRoleInfo(uid uint64) *serverproto.FightRoleInfo {
  268. if fightInfo, ok := this.cacheFightRoleInfoList[uid]; ok {
  269. return fightInfo
  270. }
  271. err, fightInfo := GetFightInfoFromRedis(uid)
  272. if err != nil {
  273. util.InfoF("getFightRoleInfo uid=%v err=%v", uid, err)
  274. return nil
  275. }
  276. this.cacheFightRoleInfoList[uid] = fightInfo
  277. return fightInfo
  278. }
  279. // 获取远航可视列表
  280. func (this *YuanHangTrialManager) GetTrialViewList(bViewList bool, uidTrialInfo uint64) ([]*serverproto.YuanHangTrialData, *serverproto.YuanHangTrialData) {
  281. if uidTrialInfo > 0 {
  282. if item, ok := this.trialItemMapList[uidTrialInfo]; ok {
  283. if bViewList {
  284. return this.trailItemMinHeap.ItemList, item
  285. } else {
  286. return nil, item
  287. }
  288. }
  289. }
  290. if bViewList {
  291. return this.trailItemMinHeap.ItemList, nil
  292. }
  293. return nil, nil
  294. }
  295. // 发起远航试炼
  296. // @trialType 远航类型 (1,2,3,4,5...)
  297. func (this *YuanHangTrialManager) YuanHangTrial(fromZone int32, uid uint64, trialType int32, endTimeStamp uint64,
  298. fightInfo *serverproto.FightRoleInfo, durationTime int32) *serverproto.YuanHangTrialData {
  299. zone := fightInfo.BriefInfo.SelectZone
  300. if zone <= 0 {
  301. zone = fromZone
  302. }
  303. addTrialItem := this.addTrialItem(uid, trialType, endTimeStamp, durationTime, zone, fromZone)
  304. err := SetFightInfoToRedis(uid, fightInfo)
  305. util.InfoF("uid=%v YuanHangTrial err=%v addTrialItem=%v", uid, err, addTrialItem)
  306. this.cacheFightRoleInfoList[uid] = fightInfo
  307. //notify other
  308. return addTrialItem
  309. }
  310. // 非正常情况下不调用该接口
  311. func (this *YuanHangTrialManager) YuanHangTrialForceSelf(ssMsg *serverproto.SSCrossYuanHangTrialSelfReq, fromZone int32) {
  312. _, ok := this.trialItemMapList[ssMsg.SelfUid]
  313. if !ok {
  314. nowTime := util.GetTimeMilliseconds()
  315. if ssMsg.EndTimeStamp > nowTime {
  316. zone := ssMsg.SelfFightInfo.BriefInfo.SelectZone
  317. if zone <= 0 {
  318. zone = fromZone
  319. }
  320. addTrialItem := this.addTrialItem(ssMsg.SelfUid, ssMsg.TrialType, ssMsg.EndTimeStamp, ssMsg.DurationTime, zone, fromZone)
  321. //err := SetFightInfoToRedis(ssMsg.SelfUid, ssMsg.SelfFightInfo)
  322. util.InfoF("uid=%v YuanHangTrialForceSelf addTrialItem=%v", ssMsg.SelfUid, addTrialItem)
  323. this.cacheFightRoleInfoList[ssMsg.SelfUid] = ssMsg.SelfFightInfo
  324. }
  325. }
  326. SetFightInfoToRedis(ssMsg.SelfUid, ssMsg.SelfFightInfo)
  327. }
  328. // 飞艇信息
  329. // trialUid 飞艇对应玩家
  330. // trialUidEndTime 当前玩家飞艇对应的结束时间
  331. func (this *YuanHangTrialManager) GetTrialInfo(trialUid, trialUidEndTime uint64) (serverproto.ErrorCode, *serverproto.YuanHangTrialData) {
  332. trialItem, ok := this.trialItemMapList[trialUid]
  333. if !ok {
  334. //必须是该玩家的本次远航试炼
  335. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_JOIN, nil
  336. }
  337. nowTime := util.GetTimeMilliseconds()
  338. if trialItem.EndTimeStamp <= nowTime {
  339. //本次查询的玩家对应的飞艇已经结束
  340. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_JOIN, nil
  341. }
  342. return serverproto.ErrorCode_ERROR_OK, trialItem
  343. }
  344. // @param selfUid 发起挑战玩家
  345. // @param challengeUid 被挑战玩家
  346. // @param beChallengeMaxNum 最大被挑战次数
  347. func (this *YuanHangTrialManager) GetChallengeTrialItem(selfUid, challengeUid, challengeUidEndTime uint64,
  348. beChallengeMaxNum int32, ssAckMsg *serverproto.SSCrossYuanHangTrialChallengeAck) serverproto.ErrorCode {
  349. trialItem, ok := this.trialItemMapList[challengeUid]
  350. if !ok || trialItem.EndTimeStamp < challengeUidEndTime {
  351. //必须是该玩家的本次远航试炼
  352. util.InfoF("uid=%v GetChallengeTrialItem challenge item not exist existUidAndTime[%v,%v] not[%v,%v]", selfUid,
  353. trialItem.Uid, trialItem.EndTimeStamp, challengeUid, challengeUidEndTime)
  354. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_JOIN
  355. }
  356. nowTime := util.GetTimeMilliseconds()
  357. if trialItem.EndTimeStamp <= nowTime {
  358. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_JOIN
  359. }
  360. //是否已经抢夺过一次该玩家
  361. for idx := 0; idx < len(trialItem.BeChallengeUidList); idx++ {
  362. if trialItem.BeChallengeUidList[idx] == selfUid {
  363. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_CHALLENGED
  364. }
  365. }
  366. //抢夺次数上限判断
  367. if beChallengeMaxNum <= 0 {
  368. convertData, ok := model.ConvertYuanHangTrail[trialItem.TrialType]
  369. if ok {
  370. beChallengeMaxNum = convertData.BeAttackNum
  371. }
  372. }
  373. if trialItem.BeChallengeNum >= beChallengeMaxNum {
  374. return serverproto.ErrorCode_ERROR_CORSS_YUANHANGTRIAL_BE_CHALLENGE_LIMIT
  375. }
  376. //获取挑战玩家信息
  377. fightInfo := this.getFightRoleInfo(challengeUid)
  378. if fightInfo == nil {
  379. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_JOIN
  380. }
  381. ssAckMsg.FightInfo = fightInfo
  382. ssAckMsg.ChallengeUid = challengeUid
  383. ssAckMsg.ChallengeUidEndTime = challengeUidEndTime
  384. return serverproto.ErrorCode_ERROR_OK
  385. }
  386. // 挑战结果通知
  387. func (this *YuanHangTrialManager) ChallengeTrialItemResult(selfUid, challengeUid, challengeUidEndTime uint64,
  388. selfNickName string, selfZone int32, bWin bool, fightInfo *serverproto.FightRoleInfo, ssAckMsg *serverproto.SSCrossYuanHangTrialChallengeResultAck) serverproto.ErrorCode {
  389. trialItem, ok := this.trialItemMapList[challengeUid]
  390. if !ok || trialItem.EndTimeStamp < challengeUidEndTime {
  391. //必须是该玩家的本次远航试炼
  392. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_JOIN
  393. }
  394. nowTime := util.GetTimeMilliseconds()
  395. if trialItem.EndTimeStamp <= nowTime {
  396. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_JOIN
  397. }
  398. convertData, ok := model.ConvertYuanHangTrail[trialItem.TrialType]
  399. if ok {
  400. if trialItem.BeChallengeNum >= convertData.BeAttackNum {
  401. return serverproto.ErrorCode_ERROR_CORSS_YUANHANGTRIAL_BE_CHALLENGE_LIMIT
  402. }
  403. }
  404. SetFightInfoToRedis(selfUid, fightInfo)
  405. this.cacheFightRoleInfoList[selfUid] = fightInfo
  406. //挑战日志记录
  407. beChallengePlayer := this.getFightRoleInfo(trialItem.Uid)
  408. if beChallengePlayer != nil {
  409. ssAckMsg.LogData = &serverproto.YuanHangTrialLogData{
  410. Type: TrialLogDataType_2,
  411. RecordTime: nowTime,
  412. State: true,
  413. TargetPlayerUid: trialItem.Uid,
  414. TargetPlayerZone: trialItem.Zone,
  415. TargetPlayerName: beChallengePlayer.BriefInfo.NickName,
  416. TrialType: trialItem.TrialType,
  417. }
  418. }
  419. ssAckMsg.ShipTrialLevel = trialItem.TrialType
  420. trialItem.BeChallengeNum++
  421. trialItem.BeChallengeUidList = append(trialItem.BeChallengeUidList, selfUid)
  422. trialItem.DirtyStamp = nowTime
  423. this.dbChangeTrialItemList.Add(challengeUid)
  424. this.addNotifyList(trialItem)
  425. //被挑战日志记录
  426. //通知被挑战玩家
  427. this.addBeChallengeLog(trialItem, nowTime, selfUid, selfZone, selfNickName)
  428. return serverproto.ErrorCode_ERROR_OK
  429. }
  430. func (this *YuanHangTrialManager) UpdateRankScore(uid, rankScore uint64) {
  431. UpdateTrialRankScore(uid, rankScore)
  432. }
  433. // 远航试炼排行榜
  434. func (this *YuanHangTrialManager) GetTrialRankList(uid uint64, startIdx int32,
  435. ssAckMsg *serverproto.SSCrossYuanHangTrialRankListAck) {
  436. selfRank, selfScore, totalRank, rankList := GetTrialRankList(uid, startIdx)
  437. ssAckMsg.SelfRank = selfRank
  438. ssAckMsg.SelfScore = selfScore
  439. ssAckMsg.TotalRank = totalRank
  440. ssAckMsg.RankList = rankList
  441. }
  442. func (this *YuanHangTrialManager) GetTrialRankReward(uid uint64, score int32, seasonId int32) int32 {
  443. //uid
  444. keyStr := strconv.FormatUint(uid, 10)
  445. //获取自身排名
  446. selfRank, err := service.GetRedis().ZRevRank(YuanHangTrialRankPrefix, keyStr).Result()
  447. if err != nil {
  448. util.ErrorF("[GetTrialRankReward][%v] selfRank err:%v", uid, err)
  449. return 0
  450. }
  451. util.InfoF("[GetTrialRankReward][%v] selfRank:%v", uid, selfRank+1)
  452. return int32(selfRank + 1)
  453. }
  454. var crossTopRankReward = map[uint64]int{}
  455. // 远航试炼排行榜刷新
  456. func (this *YuanHangTrialManager) RefreshTrialRank(lastSeasonId int32, rewardPlayerList *[]uint64, outList *[]*serverproto.KeyValueType64) serverproto.ErrorCode {
  457. if len(crossTopRankReward) <= 0 {
  458. //获得前100排行玩家数据
  459. for idx := 0; idx < 5; idx++ {
  460. startIdx := int64(idx * 20)
  461. rankNumList, err2 := service.GetRedis().ZRevRange(YuanHangTrialRankPrefix, startIdx, startIdx+19).Result()
  462. if err2 != nil {
  463. break
  464. }
  465. if len(rankNumList) <= 0 {
  466. break
  467. }
  468. for i := 0; i < len(rankNumList); i++ {
  469. rankUid, _ := model.Str2NumU64(rankNumList[i])
  470. crossTopRankReward[rankUid] = int(startIdx) + i + 1
  471. }
  472. }
  473. }
  474. for i := 0; i < len(*rewardPlayerList); i++ {
  475. uid := (*rewardPlayerList)[i]
  476. *outList = append(*outList, &serverproto.KeyValueType64{
  477. Key: uid,
  478. Value: int32(crossTopRankReward[uid]),
  479. })
  480. }
  481. return serverproto.ErrorCode_ERROR_OK
  482. }
  483. func (this *YuanHangTrialManager) addBeChallengeLog(trialItem *serverproto.YuanHangTrialData,
  484. nowTime uint64, targetPlayerUid uint64, targetPlayerZone int32, targetPlayerNickName string) {
  485. //通知被挑战玩家
  486. logNtf := &serverproto.SSCrossYuanHangTrialLogNtf{
  487. NtfUid: trialItem.Uid,
  488. }
  489. logNtf.LogData = &serverproto.YuanHangTrialLogData{
  490. Type: TrialLogDataType_1,
  491. RecordTime: nowTime,
  492. State: true,
  493. TargetPlayerUid: targetPlayerUid,
  494. TargetPlayerZone: targetPlayerZone,
  495. TargetPlayerName: targetPlayerNickName,
  496. TrialType: trialItem.TrialType,
  497. }
  498. //失去的奖励
  499. convertData, ok := model.ConvertYuanHangTrail[trialItem.TrialType]
  500. if ok {
  501. logNtf.LogData.ItemList = append(logNtf.LogData.ItemList, convertData.BeAttackLoseItemListSlice...)
  502. }
  503. util.InfoF("uid=%v addBeChallengeLog trialType=%v beAttackedUid=%v realZone=%v", targetPlayerUid, trialItem.TrialType, trialItem.Uid, trialItem.FromRealZone)
  504. //SendZoneSocial(logNtf, trialItem.FromRealZone)
  505. err := SetBeChallengeToRedis(trialItem.Uid, logNtf.LogData, trialItem.FromRealZone)
  506. if err != nil {
  507. util.ErrorF("uid=%v addBeChallengeLog error:%v", err)
  508. }
  509. }