guild_demon.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. package model
  2. import (
  3. "encoding/base64"
  4. "rocommon"
  5. "rocommon/service"
  6. "rocommon/util"
  7. model2 "roserver/baseserver/model"
  8. model3 "roserver/db/model"
  9. "roserver/serverproto"
  10. "strconv"
  11. )
  12. /*
  13. func (this *GuildManager) RemoveGuildBoss(bossId uint32, guild *GuildData) {
  14. if guild == nil || guild.GuildBoss == nil || len(guild.GuildBoss) <= 0 {
  15. return
  16. }
  17. fieldStr := strconv.FormatUint(uint64(bossId), 10)
  18. value := strconv.FormatUint(uint64(guild.GuildBase.GuildBrief.GuildId), 10)
  19. keyStr := model2.GuildBossPrefix + value
  20. service.GetRedis().HDel(keyStr, fieldStr)
  21. delete(guild.GuildBoss, bossId)
  22. }
  23. */
  24. func (this *GuildManager) SaveGuildDemon(guild *GuildData) {
  25. if guild == nil || guild.GuildDemon == nil {
  26. return
  27. }
  28. fieldStr := strconv.FormatUint(uint64(guild.GuildBase.GuildBrief.GuildId), 10)
  29. keyStr := model2.GuildDemonPrefix
  30. msgData, err := rocommon.GetCodec().Marshal(guild.GuildDemon)
  31. if err != nil {
  32. util.InfoF("[SaveGuildDemon] Marshal err:%v %v", err, fieldStr)
  33. return
  34. }
  35. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  36. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  37. if err != nil {
  38. util.InfoF("[SaveGuildDemon] err:%v %v", err, ret)
  39. return
  40. }
  41. }
  42. //加载1个公会的公会BOSS
  43. func (this *GuildManager) LoadGuildDemon(guild *GuildData) error {
  44. if guild == nil {
  45. return nil
  46. }
  47. if guild.GuildDemon == nil {
  48. guild.GuildDemon = &serverproto.GuildDemon{}
  49. }
  50. fieldStr := strconv.FormatUint(uint64(guild.GuildBase.GuildBrief.GuildId), 10)
  51. baseStr := model2.GuildDemonPrefix
  52. guildBaseStr, baseErr := service.GetRedis().HGet(baseStr, fieldStr).Result()
  53. if baseErr == nil {
  54. guildDemon := &serverproto.GuildDemon{}
  55. err := model2.GetDecodeMessage(guildDemon, guildBaseStr)
  56. if err == nil {
  57. guild.GuildDemon = guildDemon
  58. } else {
  59. util.ErrorF("[LoadGuildDemon] get guilddemonStr [%v] err:%v", guildBaseStr, err)
  60. }
  61. }
  62. this.RefreshGuildDemon(guild, 0)
  63. return nil
  64. }
  65. func (this *GuildManager) RemoveGuildDemonRank(guildId uint64, guildDemon *serverproto.GuildDemon) {
  66. if guildDemon == nil || guildDemon.TotalDamage <= 0 || len(guildDemon.DamageList) <= 0 {
  67. return
  68. }
  69. keyStr := strconv.FormatUint(uint64(guildId), 10)
  70. //删除公会榜
  71. service.GetRedis().ZRem(model2.GuildDemonGuildPrefix, keyStr)
  72. //删除公会MVP榜
  73. service.GetRedis().ZRem(model2.GuildDemonMVPPrefix, keyStr)
  74. util.InfoF("[RemoveGuildDemonRank] uid:%v", guildId)
  75. }
  76. //保存公会魔王总伤害排名榜单
  77. func (this *GuildManager) SaveDemonGuildDamageRank(guildId uint64, guildDemon *serverproto.GuildDemon) {
  78. scoreStr := this.GetDemonRankScoreDailyReset(uint64(guildDemon.TotalDamage), util.GetCurrentTime())
  79. // scoreStr := model2.GetRankScoreCommon(uint64(guildDemon.TotalDamage), util.GetCurrentTime())
  80. keyStr := strconv.FormatUint(uint64(guildId), 10)
  81. _, err := service.GetRedis().ZAdd(model2.GuildDemonGuildPrefix, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  82. if err != nil {
  83. util.ErrorF("[AddSkillScoreRank] err:%v uid:%v", err, guildId)
  84. }
  85. }
  86. //清除公会魔王总伤害排名榜单
  87. func (this *GuildManager) ClearDemonGuildDamageRank() {
  88. service.GetRedis().Del(model2.GuildDemonGuildPrefix)
  89. util.InfoF("[ClearDemonGuildDamageRank] clean guild rank")
  90. }
  91. func (this *GuildManager) SaveDemonMVPDamageRank(guildId, damage uint64) {
  92. //公会没有人,或者公会第一名就是本人
  93. scoreStr := this.GetDemonRankScoreDailyReset(uint64(damage), util.GetCurrentTime())
  94. keyStr := strconv.FormatUint(uint64(guildId), 10)
  95. _, err := service.GetRedis().ZAdd(model2.GuildDemonMVPPrefix, service.BaseZ{Score: float64(scoreStr), Member: keyStr}).Result()
  96. if err != nil {
  97. util.ErrorF("[AddSkillScoreRank] err:%v guildId:%v", err, guildId)
  98. }
  99. }
  100. //保存公会魔王总伤害排名榜单
  101. func (this *GuildManager) ClearDemonMVPDamageRank() {
  102. service.GetRedis().Del(model2.GuildDemonMVPPrefix)
  103. util.InfoF("[ClearDemonMVPDamageRank] clean mvp rank")
  104. }
  105. func (this *GuildManager)GetCurStartDay() {
  106. }
  107. func (this *GuildManager)RefreshGuildDemon(guild *GuildData, curTime uint64) bool {
  108. if guild == nil {
  109. return false
  110. }
  111. if guild.GuildDemon.RefreshTime == 0 {
  112. guild.GuildDemon.RefreshTime = util.GetLatest5Hour()
  113. return false
  114. }
  115. if curTime == 0 {
  116. curTime = util.GetCurrentTime()
  117. }
  118. if curTime < guild.GuildDemon.RefreshTime {
  119. return false
  120. }
  121. util.DebugF("[RefreshGuildDemon] save guild demon reward data begin damage :%v count :%v ", guild.GuildDemon.TotalDamage, len(guild.GuildDemon.DamageList))
  122. if guild.GuildDemon != nil && guild.GuildDemon.TotalDamage != 0 && len(guild.GuildDemon.DamageList) > 0 {
  123. nowTime := util.GetCurrentTimeNow()
  124. curWeekDay := nowTime.Weekday()
  125. if curWeekDay == 0 {
  126. curWeekDay = 7
  127. }
  128. demonData := model2.GetDemonInfoByTimeStamp(guild.GuildDemon.RefreshTime)
  129. if demonData == nil {
  130. util.InfoF("[RefreshGuildDemon] guild demon config not found err:%v ", curWeekDay)
  131. return false
  132. }
  133. util.DebugF("[RefreshGuildDemon] save guild demon reward data success :%v refTime :%v, demonId :%v", curWeekDay, guild.GuildDemon.RefreshTime, demonData.DemonId)
  134. //保存当天的战斗结果(参与战斗的人,和战斗的结算等级)
  135. value := strconv.FormatUint(uint64(guild.GuildBase.GuildBrief.GuildId), 10)
  136. keyStr := model2.GuildDemonRewardPrefix + value
  137. fieldStr := strconv.FormatUint(uint64(demonData.DemonId), 10) //存储配置ID
  138. reward := &serverproto.GuildDemonReward{}
  139. reward.TotalDamage = guild.GuildDemon.TotalDamage
  140. reward.DamageList = guild.GuildDemon.DamageList
  141. reward.DemonId = demonData.DemonId
  142. msgData, err := rocommon.GetCodec().Marshal(reward)
  143. if err != nil {
  144. util.InfoF("[RefreshGuildDemonf] DamageList Marshal err:%v %v", err, fieldStr)
  145. return false
  146. }
  147. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  148. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  149. if err != nil {
  150. util.InfoF("[RefreshGuildDemon] DamageList err:%v %v", err, ret)
  151. return false
  152. }
  153. //打包奖励
  154. rewardNtf := &serverproto.SSGuildDemonRewardNtf{
  155. DemonId: reward.DemonId,
  156. DemonLevel: demonData.DemonLevel,
  157. TotalDamage: reward.TotalDamage,
  158. }
  159. for _, data := range guild.GuildDemon.DamageList {
  160. if data.Uid != 0 {
  161. rewardNtf.UidList = append(rewardNtf.UidList, data.Uid)
  162. }
  163. }
  164. SendToAllGame(rewardNtf)
  165. //当天战斗的数据,和伤害,全部清除
  166. guild.GuildDemon.TotalDamage = 0
  167. guild.GuildDemon.DamageList = append(guild.GuildDemon.DamageList[0:0])
  168. }
  169. guild.GuildDemon.RefreshTime = util.GetLatest5Hour()
  170. this.SaveGuildDemon(guild)
  171. return true
  172. }
  173. const TickGapTime = 5*1000
  174. //刷新公会魔王
  175. func (this *GuildManager) RefreshGuildDemonAll(nowTime uint64) {
  176. if this.DemonTickTime == 0 {
  177. this.DemonTickTime = nowTime
  178. return
  179. }
  180. if this.DemonTickTime + TickGapTime > nowTime {
  181. return
  182. }
  183. this.DemonTickTime = nowTime
  184. needClear := false
  185. for _, guild := range this.Guilds {
  186. bRet := this.RefreshGuildDemon(guild, nowTime)
  187. if bRet == true {
  188. needClear = true
  189. }
  190. }
  191. if needClear == true {
  192. //清除排行榜
  193. this.ClearDemonGuildDamageRank()
  194. this.ClearDemonMVPDamageRank()
  195. }
  196. }
  197. //初始化公会魔王
  198. func (this *GuildManager) InitGuildDemon(guildId uint64) {
  199. //如果公会数据为空,则初始化
  200. }
  201. //是否在魔王战斗时间
  202. func (this *GuildManager) IsInDemonFightTime() serverproto.ErrorCode {
  203. nowTime := util.GetCurrentTimeNow()
  204. //凌晨4.30 到 5点前
  205. if nowTime.Hour() == 4 && 30 <= nowTime.Minute() && nowTime.Minute()<= 59 {
  206. return serverproto.ErrorCode_ERROR_FAIL
  207. }
  208. return serverproto.ErrorCode_ERROR_OK
  209. }
  210. func (this *GuildManager) GetNextUpTime(demonData *model2.GuildDemonData, durationDay int32) uint64 {
  211. if demonData == nil {
  212. return 0
  213. }
  214. levelUpDay := demonData.EndDay - demonData.StartDay + 1
  215. if levelUpDay <= 0 {
  216. return 0
  217. }
  218. if durationDay > demonData.EndDay {
  219. return 0
  220. } else if durationDay < demonData.EndDay {
  221. util.DebugF("[GetNextUpTime] durationDay: %v, demonData.EndDay: %v, demonData.WeekDay: %v ",durationDay, demonData.EndDay, demonData.WeekDay)
  222. return util.GetLatest5Hour() + uint64((demonData.EndDay - durationDay - 1)*DayMillSecond)
  223. }
  224. return 0
  225. }
  226. const DayMillSecond = 24*3600*1000
  227. func (this *GuildManager) GetGuildDemonInfo(uid, guildid uint64, ackMsg *serverproto.SCGuildDemonInfoAck) {
  228. if ackMsg == nil {
  229. return
  230. }
  231. guild := this.GetGuild(guildid)
  232. if guild == nil || guild.GuildDemon == nil {
  233. return
  234. }
  235. ackMsg.DemonId = guild.GuildDemon.CurDemonId
  236. ackMsg.TotalBossDamage = guild.GuildDemon.TotalDamage
  237. nowTime := util.GetCurrentTimeNow()
  238. curWeekDay := nowTime.Weekday()
  239. if curWeekDay == 0 {
  240. curWeekDay = 7
  241. }
  242. demonData, durationDay := model2.GetDemonInfo(int32(curWeekDay), nowTime)
  243. ackMsg.DemonId = demonData.DemonId
  244. ackMsg.DemonLevel = demonData.DemonLevel
  245. ackMsg.NextUpTime = this.GetNextUpTime(demonData, durationDay)
  246. ackMsg.Damage = 0
  247. ackMsg.MvpDamage = 0
  248. ackMsg.MvpBrief = nil
  249. ackMsg.EndTime = util.GetLatest5Hour() - 30*60*1000
  250. maxUid := uint64(0)
  251. fightTime := uint64(0)
  252. if len(guild.GuildDemon.DamageList) > 0 {
  253. //打包列表
  254. ackMsg.RankList = guild.GuildDemon.DamageList
  255. for _, data := range guild.GuildDemon.DamageList {
  256. if ackMsg.MvpDamage < data.Damage || (ackMsg.MvpDamage == data.Damage && data.FightTime < fightTime) {
  257. ackMsg.MvpDamage = data.Damage
  258. maxUid = data.Uid
  259. fightTime = data.FightTime
  260. }
  261. if uid == data.Uid {
  262. ackMsg.Damage = data.Damage
  263. }
  264. }
  265. }
  266. if maxUid != 0 {
  267. ackMsg.MvpBrief = &serverproto.CommonPlayerBriefInfo{}
  268. model3.GetSystemDataFromRedis(model3.RolePlayerBriefPrefix, maxUid, ackMsg.MvpBrief)
  269. }
  270. }
  271. //todo msg.Damage <= 0 在 game就要屏蔽掉
  272. func (this *GuildManager) GuildDemonFight(msg *serverproto.SSGuildDemonFightReq, ackMsg *serverproto.SSGuildDemonFightAck) {
  273. if msg == nil || ackMsg == nil || msg.Damage <= 0 {
  274. return
  275. }
  276. nowTime := util.GetCurrentTimeNow()
  277. curWeekDay := nowTime.Weekday()
  278. if curWeekDay == 0 {
  279. curWeekDay = 7
  280. }
  281. demonData, _ := model2.GetDemonInfo(int32(curWeekDay), nowTime)
  282. if demonData == nil {
  283. return
  284. }
  285. if demonData.DemonId != msg.DemonId {
  286. return
  287. }
  288. bRet := this.IsInDemonFightTime()
  289. if bRet != serverproto.ErrorCode_ERROR_OK {
  290. return
  291. }
  292. guild := this.GetGuild(msg.GuildId)
  293. if guild == nil || guild.GuildDemon == nil {
  294. return
  295. }
  296. oldTotalDamage := guild.GuildDemon.TotalDamage
  297. //
  298. oldMvpDamage := uint64(0)
  299. curUidDamage := msg.Damage
  300. //找到这个公会成员是否参加过
  301. bFind := false
  302. if len(guild.GuildDemon.DamageList) > 0 {
  303. for _, data := range guild.GuildDemon.DamageList {
  304. if oldMvpDamage < data.Damage {
  305. oldMvpDamage = data.Damage
  306. }
  307. //跟新本次战斗的玩家数据
  308. if data.Uid == msg.Uid {
  309. bFind = true
  310. data.Damage += msg.Damage
  311. //总伤害
  312. guild.GuildDemon.TotalDamage += msg.Damage
  313. curUidDamage = data.Damage
  314. }
  315. }
  316. }
  317. if bFind == false {
  318. guild.GuildDemon.DamageList = append(guild.GuildDemon.DamageList, &serverproto.DemonDamage{
  319. Uid: msg.Uid,
  320. Damage: msg.Damage,
  321. })
  322. guild.GuildDemon.TotalDamage += msg.Damage
  323. }
  324. this.SaveGuildDemon(guild)
  325. //如果本公会最大伤害有变化
  326. if oldMvpDamage < curUidDamage {
  327. this.SaveDemonMVPDamageRank(msg.GuildId, curUidDamage)
  328. }
  329. util.InfoF("guild demon mvp changed guildId:%v , uid:%v, damage:%v, totalDamage:%v, guilddamage:%v", msg.GuildId, msg.Uid, msg.Damage, curUidDamage, guild.GuildDemon.TotalDamage)
  330. //刷新公会总伤害榜单
  331. this.SaveDemonGuildDamageRank(msg.GuildId, guild.GuildDemon)
  332. ackMsg.RefreshTime = uint64(demonData.DemonId)
  333. ackMsg.TotalDamage = guild.GuildDemon.TotalDamage
  334. ackMsg.DemonId = demonData.DemonId
  335. ackMsg.FreeFightCount = demonData.ChallengeCount
  336. oldDamageLevel := int32(0)
  337. for _, levelData := range demonData.RewardStage {
  338. if levelData.StageMin <= guild.GuildDemon.TotalDamage &&
  339. (guild.GuildDemon.TotalDamage <= levelData.StageMax || levelData.Level >=int32( len(demonData.RewardStage))) &&
  340. levelData.Level >= model2.GlobalGuildDemonBroadCastLevel {
  341. //发送全局播报
  342. ackMsg.GuildName = guild.GuildBase.GuildBrief.GuildName
  343. ackMsg.RewardLevel = levelData.Level
  344. }
  345. if levelData.StageMin <= oldTotalDamage &&
  346. (oldTotalDamage <= levelData.StageMax || levelData.Level >= int32( len(demonData.RewardStage))) &&
  347. levelData.Level >= model2.GlobalGuildDemonBroadCastLevel {
  348. //发送全局播报
  349. oldDamageLevel = levelData.Level
  350. }
  351. }
  352. //如果本次战斗为提升奖励档位,则不发送广播
  353. if oldDamageLevel >= ackMsg.RewardLevel {
  354. ackMsg.GuildName = ""
  355. ackMsg.RewardLevel = 0
  356. }
  357. }
  358. func (this *GuildManager) GetDemonGuildRank(page int32, guildId uint64, ackMsg *serverproto.SCGuildDemonGuildRankAck) {
  359. if ackMsg == nil || page == 0 {
  360. return
  361. }
  362. rankBegin := (page - 1) * 10
  363. rankEnd := (page * 10) - 1
  364. rankCount, err3 := service.GetRedis().ZCard(model2.GuildDemonGuildPrefix).Result()
  365. if err3 == nil {
  366. if rankCount > 0 {
  367. topListWithScore, err := service.GetRedis().ZRevRangeWithScores(model2.GuildDemonGuildPrefix, int64(rankBegin), int64(rankEnd)).Result()
  368. if err == nil && len(topListWithScore) > 0 {
  369. for i := 0; i < len(topListWithScore); i++ {
  370. // rankUid, _ := strconv.ParseUint(topListWithScore[i].Member.(string), 10, 64)
  371. score := this.GetDemonValByRankScoreDailyReset(topListWithScore[i].Score)
  372. guildUid, _ := strconv.ParseUint(topListWithScore[i].Member.(string), 10, 64)
  373. guild := this.GetGuild(guildUid)
  374. if guild == nil {
  375. continue
  376. }
  377. ntfData := &serverproto.GuildNotifyData{
  378. Brief: &serverproto.GuildBrief{},
  379. }
  380. ntfData.Brief = guild.GuildBase.GuildBrief
  381. //todo wangzhaocan 公会数据打包
  382. ackMsg.RankList = append(ackMsg.RankList, &serverproto.GuildDemonGuildRank{
  383. Data: ntfData,
  384. Rank: rankBegin + int32(i+1),
  385. Damage: score,
  386. })
  387. }
  388. }
  389. }
  390. } else {
  391. util.DebugF("GetDemonGuildRank totalRanks err=%v", err3)
  392. }
  393. if int32(rankCount) <= rankEnd {
  394. ackMsg.IsEnd = true
  395. }
  396. //获得本公会的相关数据
  397. if guildId != 0 && page == 1 {
  398. guild := this.GetGuild(guildId)
  399. if guild == nil {
  400. return
  401. }
  402. ackMsg.SelfGuild = &serverproto.GuildDemonGuildRank{
  403. Data:&serverproto.GuildNotifyData{
  404. Brief:&serverproto.GuildBrief{},
  405. },
  406. }
  407. prefixStr := model2.GuildDemonGuildPrefix
  408. keyStr := strconv.FormatUint(guildId, 10)
  409. selfRank, rankErr := service.GetRedis().ZRevRank(prefixStr, keyStr).Result()
  410. if rankErr == nil && rankErr != service.NIL {
  411. topListWithScore, err := service.GetRedis().ZRevRangeWithScores(prefixStr, selfRank, selfRank).Result()
  412. if err == nil {
  413. for index, _ := range topListWithScore {
  414. rankGuildId, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  415. if rankGuildId == guildId {
  416. skillScore := this.GetDemonValByRankScoreDailyReset(topListWithScore[index].Score)
  417. ackMsg.SelfGuild.Rank = int32(selfRank + 1)
  418. ackMsg.SelfGuild.Damage = skillScore
  419. break
  420. }
  421. }
  422. } else {
  423. util.DebugF("[GetTopSkillRank] selfRank err:%v", err)
  424. return
  425. }
  426. }
  427. ackMsg.SelfGuild.Data.Brief = guild.GuildBase.GuildBrief
  428. }
  429. }
  430. func (this *GuildManager) GetGuildDemonMVPReq(page int32, guildId uint64, ackMsg *serverproto.SCGuildDemonMVPRankAck) {
  431. if ackMsg == nil {
  432. return
  433. }
  434. rankBegin := (page - 1) * 10
  435. rankEnd := (page * 10) - 1
  436. rankCount, err3 := service.GetRedis().ZCard(model2.GuildDemonMVPPrefix).Result()
  437. if err3 == nil {
  438. topListWithScore, err := service.GetRedis().ZRevRangeWithScores(model2.GuildDemonMVPPrefix, int64(rankBegin), int64(rankEnd)).Result()
  439. if err == nil && len(topListWithScore) > 0 {
  440. for i := 0; i < len(topListWithScore); i++ {
  441. // rankUid, _ := strconv.ParseUint(topListWithScore[i].Member.(string), 10, 64)
  442. rankGuildId, _ := strconv.ParseUint(topListWithScore[i].Member.(string), 10, 64)
  443. score := this.GetDemonValByRankScoreDailyReset(topListWithScore[i].Score)
  444. guild := this.GetGuild(rankGuildId)
  445. if guild == nil || guild.GuildBase == nil || guild.GuildDemon == nil {
  446. continue
  447. }
  448. mvpUid, _ := this.GetGuildDemonMvp(guild.GuildDemon)
  449. /*
  450. guildId := this.GetPlayerGuildId(rankUid)
  451. guild := this.GetGuild(guildId)
  452. */
  453. ackMsg.RankList = append(ackMsg.RankList, &serverproto.GuildDemonRank{
  454. Uuid: mvpUid,
  455. Rank: rankBegin + int32(i+1),
  456. Damage: score,
  457. GuildBadge: guild.GuildBase.GuildBrief.GuildBadge,
  458. GuildName: guild.GuildBase.GuildBrief.GuildName,
  459. })
  460. }
  461. }
  462. } else {
  463. util.DebugF("GetGuildDemonMVPReq totalRanks err=%v", err3)
  464. }
  465. if int32(rankCount) <= rankEnd {
  466. ackMsg.IsEnd = true
  467. }
  468. //获得本公会相关MVP数据
  469. if guildId != 0 && page == 1 {
  470. guild := this.GetGuild(guildId)
  471. if guild == nil || guild.GuildBase == nil {
  472. return
  473. }
  474. mvpUid, mvpDamage := this.GetGuildDemonMvp(guild.GuildDemon)
  475. if mvpUid != 0 {
  476. prefixStr := model2.GuildDemonMVPPrefix
  477. // keyStr := strconv.FormatUint(mvpUid, 10)
  478. keyStr := strconv.FormatUint(guildId, 10)
  479. selfRank, rankErr := service.GetRedis().ZRevRank(prefixStr, keyStr).Result()
  480. if rankErr == nil && rankErr != service.NIL {
  481. topListWithScore, err := service.GetRedis().ZRevRangeWithScores(prefixStr, selfRank, selfRank).Result()
  482. if err == nil {
  483. for index, _ := range topListWithScore {
  484. rankGuildId, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
  485. if rankGuildId == guildId {
  486. ackMsg.SelfGuildMvp = &serverproto.GuildDemonRank{}
  487. // skillScore := model2.GetValByRankScoreDailyReset(topListWithScore[index].Score)
  488. ackMsg.SelfGuildMvp.Rank = int32(selfRank + 1)
  489. ackMsg.SelfGuildMvp.Damage = mvpDamage
  490. ackMsg.SelfGuildMvp.Uuid = mvpUid
  491. ackMsg.SelfGuildMvp.GuildName = guild.GuildBase.GuildBrief.GuildName
  492. ackMsg.MvpBrief = &serverproto.CommonPlayerBriefInfo{}
  493. model3.GetSystemDataFromRedis(model3.RolePlayerBriefPrefix, mvpUid, ackMsg.MvpBrief)
  494. break
  495. }
  496. }
  497. } else {
  498. util.DebugF("[GetTopSkillRank] selfRank err:%v", err)
  499. return
  500. }
  501. }
  502. }
  503. }
  504. }
  505. //return :mvpUid, mvpDamage
  506. func (this *GuildManager) GetGuildDemonMvp(guildDemon *serverproto.GuildDemon) (uint64, uint64) {
  507. if guildDemon == nil || len(guildDemon.DamageList) <= 0 || guildDemon.TotalDamage <= 0 {
  508. return 0, 0
  509. }
  510. mvpDamage := uint64(0)
  511. mvpUid := uint64(0)
  512. mvpTime := uint64(0)
  513. for _, data := range guildDemon.DamageList {
  514. if mvpDamage < data.Damage || (mvpDamage == data.Damage && data.FightTime < mvpTime){
  515. mvpDamage = data.Damage
  516. mvpUid = data.Uid
  517. mvpTime = data.FightTime
  518. }
  519. }
  520. return mvpUid, mvpDamage
  521. }
  522. func (this *GuildManager) OnlineGetDemonReward(uid, demonConfigId uint64, ev rocommon.ProcEvent) {
  523. if demonConfigId <= 0 { //表示没有参加过公会魔王挑战
  524. return
  525. }
  526. guildId := this.GetPlayerGuildId(uid)
  527. if guildId == 0 {
  528. util.InfoF("guild get demon reward error guild not found: uid:%v", uid)
  529. return
  530. }
  531. guildData := this.GetGuild(guildId)
  532. if guildData == nil {
  533. util.InfoF("guild get demon reward error guild data not found: uid:%v, guildId:%v", uid, guildId)
  534. return
  535. }
  536. value := strconv.FormatUint(uint64(guildId), 10)
  537. demonStr := model2.GuildDemonRewardPrefix + value
  538. fieldStr := strconv.FormatUint(uint64(demonConfigId), 10)
  539. guildDemonStr, demonErr := service.GetRedis().HGet(demonStr, fieldStr).Result()
  540. rewardData := &serverproto.GuildDemonReward{}
  541. if demonErr == nil {
  542. err := model2.GetDecodeMessage(rewardData, guildDemonStr)
  543. if err != nil {
  544. util.InfoF("[OnlineGetDemonReward] get guildDemonStr [%v] err:%v", guildDemonStr, err)
  545. return
  546. }
  547. } else {
  548. util.InfoF("[OnlineGetDemonReward] get guildDemonStr [%v] demonErr:%v", guildDemonStr, demonErr)
  549. return
  550. }
  551. //查找这个人是否参与过战斗
  552. bFind := false
  553. for _, data := range rewardData.DamageList {
  554. if data.Uid == uid {
  555. bFind = true
  556. }
  557. }
  558. if bFind == true {
  559. demonData := model2.GetDemonDataByConfigId(rewardData.DemonId)
  560. if demonData == nil {
  561. util.ErrorF("guild get demon reward config error uid:%v, demon:%v demonConfigId:%v", uid, rewardData.DemonId, demonConfigId)
  562. return
  563. }
  564. //给奖励
  565. rewardMsg := &serverproto.SSGuildDemonOnlineGetRewardNtf{
  566. DemonId: rewardData.DemonId,
  567. }
  568. for _, data := range demonData.RewardStage {
  569. if data.StageMin <= rewardData.TotalDamage && (rewardData.TotalDamage <= data.StageMax || data.Level >= int32(len(demonData.RewardStage))) {
  570. if len(data.Reward) <= 0 {
  571. util.ErrorF("guild get demon reward failed uid:%v, demonId:%v", uid, rewardData.DemonId)
  572. return
  573. }
  574. rewardMsg.RewardList = data.Reward
  575. util.InfoF("guild get demon reward success uid:%v, demonId:%v, reward%v, demonConfigId:%v", uid, rewardData.DemonId, data.Reward, demonConfigId)
  576. break
  577. }
  578. }
  579. model2.ServiceReplay(ev, rewardMsg)
  580. }
  581. }
  582. //排行榜每日重置时使用,切记!!!
  583. func (this *GuildManager)GetDemonRankScoreDailyReset(val uint64, passTime uint64) uint64 {
  584. //score
  585. var scoreStr = val
  586. if scoreStr >= (1 << 40) {
  587. scoreStr = (1 << 40) - 1
  588. }
  589. //时间修改成以一天内的时间
  590. tmpTime := util.GetCurrentTimeNow()
  591. if tmpTime.Hour() >= 5 {
  592. passTime = uint64(tmpTime.Hour()*60*60+tmpTime.Minute()*60+tmpTime.Second()) * 1000
  593. } else {
  594. passTime = uint64((23+tmpTime.Hour())*60*60+tmpTime.Minute()*60+tmpTime.Second()) * 1000
  595. }
  596. scoreStr <<= 24
  597. scoreStr |= 0xffffff - passTime/50
  598. return scoreStr
  599. }
  600. func (this *GuildManager)GetDemonValByRankScoreDailyReset(score float64) uint64 {
  601. val := uint64(score) >> 24
  602. return val
  603. }