role_competition.go 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401
  1. package model
  2. import (
  3. "math/rand"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. "roserver/serverproto"
  7. "time"
  8. )
  9. //competition
  10. //获取给定赛季信息
  11. func (this *Role) GetCompetition(competitionId int32) {
  12. if this.roleCompetition != nil {
  13. ret := this.roleCompetition.GetCompetition(competitionId)
  14. if ret != serverproto.ErrorCode_ERROR_OK {
  15. ackMsg := &serverproto.SCCompetitionAck{
  16. Error: int32(ret),
  17. }
  18. this.ReplayGate(ackMsg, true)
  19. }
  20. }
  21. }
  22. func (this *Role) CompetitionAddScore(itemList []*serverproto.KeyValueType) {
  23. if this.roleCompetition != nil {
  24. ret := this.roleCompetition.CompetitionAddScore(itemList)
  25. if ret != serverproto.ErrorCode_ERROR_OK {
  26. ackMsg := &serverproto.SCCompetitionScoreAck{
  27. Error: int32(ret),
  28. }
  29. this.ReplayGate(ackMsg, true)
  30. }
  31. }
  32. }
  33. func (this *Role) DoUpdateScoreNtf(msg *serverproto.SSCompetitionUpdateScoreAck) {
  34. if this.roleCompetition != nil {
  35. this.roleCompetition.DoUpdateScoreNtf(msg)
  36. }
  37. }
  38. func (this *Role)GetDivineInfo() {
  39. ackMsg := &serverproto.SCCompetitionStarInfoAck{}
  40. if this.roleCompetition != nil {
  41. this.roleCompetition.GetDivineInfo(ackMsg)
  42. }
  43. this.ReplayGate(ackMsg, true)
  44. }
  45. func (this *Role)OnStarDivine(useTicket bool) {
  46. ackMsg := &serverproto.SCCompetitionStarDivineAck{
  47. Error: int32(serverproto.ErrorCode_ERROR_FAIL),
  48. }
  49. if this.roleCompetition != nil {
  50. bRet := this.roleCompetition.OnStarDivine(useTicket, ackMsg)
  51. ackMsg.Error = int32(bRet)
  52. }
  53. this.ReplayGate(ackMsg, true)
  54. }
  55. func (this *Role)GetDivineReward() {
  56. ackMsg := &serverproto.SCCompetitionStarCloseRewardAck{
  57. Error: int32(serverproto.ErrorCode_ERROR_FAIL),
  58. }
  59. if this.roleCompetition != nil {
  60. bRet := this.roleCompetition.GetDivineReward(ackMsg)
  61. ackMsg.Error = int32(bRet)
  62. }
  63. this.ReplayGate(ackMsg, true)
  64. }
  65. func (this *Role)VoteIdol(uid uint64, ticketCount int32) {
  66. ackMsg := &serverproto.SCCompetitionOnVoteAck{
  67. Error: int32(serverproto.ErrorCode_ERROR_FAIL),
  68. }
  69. if this.roleCompetition != nil {
  70. bRet := this.roleCompetition.VoteIdol(uid, ticketCount, true)
  71. ackMsg.Error = int32(bRet)
  72. if bRet != serverproto.ErrorCode_ERROR_OK {
  73. this.ReplayGate(ackMsg, true)
  74. }
  75. }
  76. }
  77. func (this *Role)CheckInSeason() (serverproto.ErrorCode, int32) {
  78. if this.roleCompetition != nil {
  79. bRet, competitionId := this.roleCompetition.CheckInIdolSeason()
  80. return bRet, competitionId
  81. }
  82. return serverproto.ErrorCode_ERROR_FAIL, 0
  83. }
  84. func (this *Role)GetSelfVoteData(ackMsg *serverproto.SCCompetitionFansRewardRankAck) {
  85. if this.roleCompetition != nil {
  86. this.roleCompetition.GetSelfVoteData(ackMsg)
  87. }
  88. }
  89. func (this *Role)CheckFansReward(uid uint64, rewardLevel int32) serverproto.ErrorCode {
  90. if this.roleCompetition != nil {
  91. bRet := this.roleCompetition.CheckFansReward(uid, rewardLevel)
  92. return bRet
  93. }
  94. return serverproto.ErrorCode_ERROR_FAIL
  95. }
  96. func (this *Role)GetFansReward(idolUid uint64, rewardLevel int32, boxCount int32) {
  97. ackMsg := &serverproto.SCCompetitionFansGetRewardAck{
  98. Error: int32(serverproto.ErrorCode_ERROR_FAIL),
  99. Uid: idolUid,
  100. RewardLevel: rewardLevel,
  101. }
  102. if this.roleCompetition != nil {
  103. addItemList := map[int32]int32{}
  104. bRet, rewardFlag := this.roleCompetition.GetFansReward(idolUid, boxCount, true, addItemList)
  105. for itemId, itemCount := range addItemList {
  106. ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{
  107. Key: itemId,
  108. Value: itemCount,
  109. })
  110. }
  111. ackMsg.RewardFlag = rewardFlag
  112. ackMsg.Error = int32(bRet)
  113. }
  114. this.ReplayGate(ackMsg, true)
  115. }
  116. func (this *Role)GetAllFansReward(idol_list []*serverproto.KeyValueType64) {
  117. if this.roleCompetition != nil {
  118. this.roleCompetition.GetAllFansReward(idol_list)
  119. }
  120. }
  121. func (this *Role)GetIdolDayReward(id int32) {
  122. ackMsg := &serverproto.SCCompetitionFansDayRewardAck{
  123. Error: int32(serverproto.ErrorCode_ERROR_FAIL),
  124. Id: id,
  125. }
  126. if this.roleCompetition != nil {
  127. bRet := this.roleCompetition.GetIdolDayReward(id)
  128. ackMsg.Error = int32(bRet)
  129. }
  130. this.ReplayGate(ackMsg, true)
  131. }
  132. //上交道具获取积分
  133. type RoleCompetition struct {
  134. SaveObject
  135. //当前进行中的赛季时间信息
  136. curCompInfo *serverproto.CompetitionInfo
  137. rewardCompetitionId int32
  138. rewardCompetitionSubId int32
  139. divineInfo *serverproto.DivineInfo
  140. idolInfo *serverproto.IdolInfo
  141. tempAddScore int32
  142. }
  143. func newRoleCompetition(r *Role) *RoleCompetition {
  144. com := &RoleCompetition{
  145. SaveObject: SaveObject{
  146. role: r,
  147. },
  148. curCompInfo: &serverproto.CompetitionInfo{},
  149. divineInfo: &serverproto.DivineInfo{},
  150. idolInfo: &serverproto.IdolInfo{},
  151. }
  152. return com
  153. }
  154. func (this *RoleCompetition) Load(msg interface{}) bool {
  155. proRole := msg.(*serverproto.Role)
  156. if proRole != nil && proRole.RoleCompetition != nil {
  157. this.rewardCompetitionId = proRole.RoleCompetition.RewardCompetitionId
  158. this.rewardCompetitionSubId = proRole.RoleCompetition.RewardCompetitionSubId
  159. if proRole.RoleCompetition.CurCompetition != nil {
  160. this.curCompInfo = proRole.RoleCompetition.CurCompetition
  161. }
  162. if proRole.RoleCompetition.Divine != nil {
  163. this.divineInfo = proRole.RoleCompetition.Divine
  164. }
  165. if proRole.RoleCompetition.Idol != nil {
  166. this.idolInfo = proRole.RoleCompetition.Idol
  167. }
  168. }
  169. util.GetTimeMilliseconds()
  170. if CompetitionMag.curCompetitionId > 0 {
  171. if this.curCompInfo.CompetitionId != CompetitionMag.curCompetitionId {
  172. this.curCompInfo.ComParam = 0
  173. this.curCompInfo.ComParamAddTime = 0
  174. }
  175. this.curCompInfo.CompetitionId = CompetitionMag.curCompetitionId
  176. this.curCompInfo.CurEndTime = uint64(CompetitionMag.curComEndTime.UnixNano() / 1e6)
  177. } else {
  178. this.curCompInfo.CompetitionId = CompetitionMag.preCompetitionId
  179. this.curCompInfo.ComParam = 0
  180. this.curCompInfo.ComParamAddTime = 0
  181. this.curCompInfo.CurEndTime = 0
  182. }
  183. util.DebugF("uid=%v RoleCompetition Load...", this.role.GetUUid())
  184. return true
  185. }
  186. func (this *RoleCompetition) CompetitionRefresh() {
  187. util.GetTimeMilliseconds()
  188. if CompetitionMag.curCompetitionId > 0 {
  189. if this.curCompInfo.CompetitionId != CompetitionMag.curCompetitionId {
  190. this.curCompInfo.ComParam = 0
  191. this.curCompInfo.ComParamAddTime = 0
  192. }
  193. this.curCompInfo.CompetitionId = CompetitionMag.curCompetitionId
  194. this.curCompInfo.CurEndTime = uint64(CompetitionMag.curComEndTime.UnixNano() / 1e6)
  195. } else {
  196. this.curCompInfo.CompetitionId = CompetitionMag.preCompetitionId
  197. this.curCompInfo.ComParam = 0
  198. this.curCompInfo.ComParamAddTime = 0
  199. this.curCompInfo.CurEndTime = 0
  200. }
  201. }
  202. func (this *RoleCompetition) CopyData(data *serverproto.RoleCompetition) {
  203. //重新登录刷新赛季信息
  204. if CompetitionMag.curCompetitionId > 0 {
  205. this.curCompInfo.CompetitionId = CompetitionMag.curCompetitionId
  206. this.curCompInfo.CurEndTime = uint64(CompetitionMag.curComEndTime.UnixNano() / 1e6)
  207. } else {
  208. this.curCompInfo.CompetitionId = CompetitionMag.preCompetitionId
  209. this.curCompInfo.CurEndTime = 0
  210. }
  211. data.CurCompetition = this.curCompInfo
  212. }
  213. func (this *RoleCompetition) Save() {
  214. this.SetDirty(false)
  215. util.DebugF("uid=%v RoleCompetition save...", this.role.GetUUid())
  216. ssSaveMsg := &serverproto.SSCompetitionSaveReq{
  217. CompetitionData: &serverproto.RoleCompetition{
  218. RewardCompetitionId: this.rewardCompetitionId,
  219. RewardCompetitionSubId: this.rewardCompetitionSubId,
  220. CurCompetition: &serverproto.CompetitionInfo{
  221. ComParam: this.curCompInfo.ComParam,
  222. ComParamAddTime: this.curCompInfo.ComParamAddTime,
  223. CompetitionId: this.curCompInfo.CompetitionId,
  224. },
  225. Divine: this.divineInfo,
  226. Idol: this.idolInfo,
  227. },
  228. }
  229. this.role.SendDb(ssSaveMsg)
  230. }
  231. func (this *RoleCompetition)DailyReset(notify bool) {
  232. if this.idolInfo != nil {
  233. this.idolInfo.DayReward = this.idolInfo.DayReward[0:0]
  234. this.NeedResetIdolRewardTime()
  235. util.InfoF("uid=%v RoleCompetition DailyReset ... this.idolInfo:%v ", this.role.GetUUid(), this.idolInfo)
  236. this.SetDirty(true)
  237. }
  238. }
  239. //上交道具获得积分
  240. func (this RoleCompetition) UpdateRankByCompetitionScore(isOnline bool) {
  241. if CompetitionMag.IsCompetitionOnline() {
  242. compData, ok := model.ConvertCompTimeList[CompetitionMag.curCompetitionId]
  243. if !ok {
  244. util.ErrorF("uid=%v UpdateRankByArenaScore data not find!!!! id=%v", this.role.GetUUid(), CompetitionMag.curCompetitionId)
  245. return
  246. }
  247. //第二赛季上交道具获得积分赛季,上线就进入排行榜
  248. if compData.CompetitionType == int32(model.CompetitionType_XuanBa) ||
  249. compData.CompetitionType == int32(model.CompetitionType_DuoBao) ||
  250. compData.CompetitionType == int32(model.CompetitionType_ZhanBu) ||
  251. compData.CompetitionType == int32(model.CompetitionType_Idol) {
  252. //上线更新的方式,积分必须为0
  253. if isOnline && this.curCompInfo.ComParam > 0 {
  254. return
  255. }
  256. if this.curCompInfo.CompetitionId != CompetitionMag.curCompetitionId {
  257. this.curCompInfo.ComParam = 0
  258. this.SetDirty(true)
  259. }
  260. if this.curCompInfo.CompetitionId == CompetitionMag.curCompetitionId || this.curCompInfo.CompetitionId <= 0 {
  261. ssUpdateScoreMsg := &serverproto.SSCompetitionUpdateScoreReq{
  262. CompetitionId: CompetitionMag.curCompetitionId,
  263. Uid: this.role.GetUUid(),
  264. Score: this.curCompInfo.ComParam,
  265. }
  266. if compData.CompetitionType == int32(model.CompetitionType_Idol) {
  267. ssUpdateScoreMsg.FansUid = this.role.GetUUid()
  268. }
  269. this.role.SendRank(ssUpdateScoreMsg)
  270. }
  271. }
  272. }
  273. }
  274. func (this *RoleCompetition) OnlineGetCompetitionReward() {
  275. this.CompetitionRefresh()
  276. //第二赛季上交道具获得积分赛季,上线就进入排行榜
  277. this.UpdateRankByCompetitionScore(true)
  278. //处理玩家注册时所在的赛季,之前的赛季不做奖励处理
  279. if this.rewardCompetitionId <= 0 {
  280. this.rewardCompetitionId = CompetitionMag.GetCompetitionIdByTime(this.role.RegisterTime) + 1
  281. }
  282. //获取历史赛季奖励
  283. ssMsg := &serverproto.SSCompetitionRewardHistoryReq{
  284. SCompetitionId: this.rewardCompetitionId,
  285. SCompetitionSubId: this.rewardCompetitionSubId,
  286. }
  287. if CompetitionMag.curCompetitionId != 0 {
  288. ssMsg.ECompetitionId = CompetitionMag.curCompetitionId
  289. ssMsg.ECompetitionSubId = CompetitionMag.curCompetitionSubId - 1
  290. } else {
  291. ssMsg.ECompetitionId = CompetitionMag.preCompetitionId
  292. compData, ok := model.ConvertCompTimeList[CompetitionMag.preCompetitionId]
  293. if !ok {
  294. //该错误发生在数据未初始化完成时玩家登陆和配置数据出错时
  295. //可以比较log时间和服务器启动时间
  296. util.ErrorF("uid=%v DoCompetitionNtf data not find!!!! id=%v", this.role.GetUUid(), CompetitionMag.preCompetitionId)
  297. return
  298. }
  299. ssMsg.ECompetitionSubId = int32(len(compData.PeriodEndTimeList))
  300. }
  301. //无赛季,或者赛季已经过了,上线领取奖励
  302. if (CompetitionMag.preCompetitionId >= int32(model.CompetitionType_Idol)) {
  303. if len(this.idolInfo.VoteData) > 0 {
  304. ssMsg := &serverproto.SSCompetitionFansGetAllRewardReq{
  305. CompetitionId: int32(model.CompetitionType_Idol),
  306. CompetitionType: int32(model.CompetitionType_Idol),
  307. CompetitionSubId: 3,
  308. IsFinish: true,
  309. }
  310. fansData := &serverproto.FansVoteRewardData{
  311. Uid: this.role.GetUUid(),
  312. }
  313. for _, voteData := range this.idolInfo.VoteData {
  314. fansData.IdolList = append(fansData.IdolList, &serverproto.KeyValueType64{
  315. Key: voteData.Key,
  316. })
  317. }
  318. ssMsg.Data = append(ssMsg.Data, fansData)
  319. SendRankService(ssMsg)
  320. }
  321. }
  322. if ssMsg.SCompetitionId >= ssMsg.ECompetitionId && ssMsg.SCompetitionSubId >= ssMsg.ECompetitionSubId {
  323. return
  324. }
  325. this.role.SendRank(ssMsg)
  326. }
  327. func (this *RoleCompetition) GetCompetition(competitionId int32) serverproto.ErrorCode {
  328. reqCompetitionId := competitionId
  329. if reqCompetitionId <= 0 {
  330. if CompetitionMag.curCompetitionId != 0 {
  331. reqCompetitionId = CompetitionMag.curCompetitionId
  332. } else if CompetitionMag.preCompetitionId != 0 {
  333. reqCompetitionId = CompetitionMag.preCompetitionId
  334. }
  335. }
  336. compData, ok := model.ConvertCompTimeList[reqCompetitionId]
  337. if !ok && reqCompetitionId > 0 {
  338. return serverproto.ErrorCode_ERROR_COMPETITION_DATA_NOT_FOUND
  339. }
  340. //判断获取的赛季是否合法
  341. nowTime := util.GetCurrentTimeNow()
  342. if compData != nil && nowTime.Before(compData.CalBeginTime) {
  343. return serverproto.ErrorCode_ERROR_COMPETITION_NOT_OPEN
  344. }
  345. registerCompId := CompetitionMag.GetCompetitionIdByTime(this.role.RegisterTime)
  346. //无赛季数据
  347. if reqCompetitionId <= registerCompId {
  348. ntfMsg := &serverproto.SCCompetitionNtf{
  349. CompetitionData: &serverproto.CompetitionInfo{
  350. CompetitionId: reqCompetitionId,
  351. CurEndTime: 0,
  352. },
  353. NextCompetitionTime: 0,
  354. }
  355. if reqCompetitionId == CompetitionMag.preCompetitionId && CompetitionMag.curCompetitionId == 0 {
  356. ret, nextData, _ := CompetitionMag.getNexCompetitionTime()
  357. if ret {
  358. ntfMsg.NextCompetitionTime = uint64(nextData.CalBeginTime.UnixNano() / 1e6)
  359. }
  360. }
  361. this.role.ReplayGate(ntfMsg, true)
  362. //ack for client show
  363. ackMsg := &serverproto.SCCompetitionAck{
  364. Error: int32(serverproto.ErrorCode_ERROR_OK),
  365. CompetitionId: reqCompetitionId,
  366. }
  367. this.role.ReplayGate(ackMsg, true)
  368. return serverproto.ErrorCode_ERROR_OK
  369. }
  370. if compData != nil {
  371. //对应赛季ID
  372. ssMsg := &serverproto.SSGetCompetitionDataReq{
  373. CompetitionId: reqCompetitionId,
  374. CompetitionType: compData.CompetitionType,
  375. SubIdNum: int32(len(compData.PeriodEndTimeList)),
  376. }
  377. if CompetitionMag.curCompetitionId == reqCompetitionId {
  378. ssMsg.IsNowCompetition = true
  379. }
  380. this.role.SendRank(ssMsg)
  381. }
  382. return serverproto.ErrorCode_ERROR_OK
  383. }
  384. //from rank
  385. func (this *RoleCompetition) DoGetCompetitionNtf(ssAckMsg *serverproto.SSGetCompetitionDataAck) {
  386. competitionId := ssAckMsg.CompetitionData.CompetitionId
  387. compData, ok := model.ConvertCompTimeList[competitionId]
  388. if !ok {
  389. util.ErrorF("uid=%v DoCompetitionNtf data not find!!!! id=%v", this.role.GetUUid(), competitionId)
  390. return
  391. }
  392. convertData, ok := model.ConvertCompTypeList[competitionId]
  393. if !ok {
  394. util.ErrorF("DoGetCompetitionNtf comp data invalid err compId=%v", competitionId)
  395. return
  396. }
  397. ntfMsg := &serverproto.SCCompetitionNtf{
  398. CompetitionData: ssAckMsg.CompetitionData,
  399. Data: ssAckMsg.IdolData,
  400. //RankList: append(ssAckMsg.RankList),
  401. }
  402. if ssAckMsg.Error == int32(serverproto.ErrorCode_ERROR_OK) {
  403. ntfMsg.CompetitionData.CurEndTime = uint64(compData.GetCalEndTime().UnixNano() / 1e6)
  404. if ssAckMsg.CompetitionData.CompetitionId == CompetitionMag.preCompetitionId {
  405. if CompetitionMag.curCompetitionId == 0 {
  406. ret, nextData, _ := CompetitionMag.getNexCompetitionTime()
  407. if ret {
  408. ntfMsg.NextCompetitionTime = uint64(nextData.CalBeginTime.UnixNano() / 1e6)
  409. }
  410. }
  411. }
  412. curFind := false
  413. //周期结算信息
  414. for idx := 0; idx < len(ssAckMsg.CompetitionData.RewardInfoList); idx++ {
  415. tmpRewardIdx := ssAckMsg.CompetitionData.RewardInfoList[idx].RewardIdx
  416. endTime := compData.PeriodEndTimeList[tmpRewardIdx-1].UnixNano() / 1e6
  417. ntfMsg.CompetitionData.RewardInfoList[idx].RewardEndTme = uint64(endTime)
  418. if tmpRewardIdx == CompetitionMag.curCompetitionSubId && CompetitionMag.curCompetitionSubId > 0 {
  419. curFind = true
  420. }
  421. }
  422. //当前周期数据
  423. if !curFind && CompetitionMag.curCompetitionSubId > 0 {
  424. curSubInfo := &serverproto.CompetitionRewardInfo{
  425. RewardIdx: CompetitionMag.curCompetitionSubId,
  426. RewardEndTme: uint64(CompetitionMag.curComPeriodTimeList[CompetitionMag.curCompetitionSubId-1].UnixNano() / 1e6),
  427. ParamList: []int32{ssAckMsg.CompetitionData.TotalRank},
  428. }
  429. //表示未参加
  430. if ssAckMsg.CompetitionData.SelfRank <= 0 {
  431. curSubInfo.ParamList = []int32{ssAckMsg.CompetitionData.TotalRank} //这是TotalRank返回的数值表示最后一档
  432. } else {
  433. _, _, sectionId := convertData.GetRankSection(int64(ssAckMsg.CompetitionData.SelfRank),
  434. int64(ssAckMsg.CompetitionData.TotalRank))
  435. curSubInfo.ParamList = []int32{sectionId}
  436. }
  437. ntfMsg.CompetitionData.RewardInfoList = append(ntfMsg.CompetitionData.RewardInfoList, curSubInfo)
  438. if ntfMsg.CompetitionData.CompetitionId == int32(model.CompetitionType_Idol) {
  439. if len(this.idolInfo.DayReward) > 0 {
  440. // ntfMsg.Data.DayReward = this.idolInfo.DayReward
  441. ntfMsg.Data.DayReward = append(ntfMsg.Data.DayReward, this.idolInfo.DayReward[0:]...)
  442. }
  443. //打包领奖数据
  444. if len(model.GlobalCompetitionIdolDayReward) >= 2 {
  445. if this.idolInfo != nil {
  446. if this.idolInfo.FirstBegin == 0 || this.idolInfo.FirstEnd == 0 ||
  447. this.idolInfo.SecondBegin == 0 || this.idolInfo.SecondEnd == 0 {
  448. this.NeedResetIdolRewardTime()
  449. }
  450. ntfMsg.Data.FirstBegin = this.idolInfo.FirstBegin
  451. ntfMsg.Data.FirstEnd = this.idolInfo.FirstEnd
  452. ntfMsg.Data.SecondBegin = this.idolInfo.SecondBegin
  453. ntfMsg.Data.SecondEnd = this.idolInfo.SecondEnd
  454. }
  455. }
  456. }
  457. }
  458. } else {
  459. //表示非法数据
  460. //无赛季数据
  461. ntfMsg.CompetitionData.CurEndTime = 0
  462. ntfMsg.NextCompetitionTime = 0
  463. }
  464. if competitionId != int32(model.CompetitionType_Idol) { //偶像季的赛季分数,是从Rank带过来的。
  465. ntfMsg.CompetitionData.ComParam = this.curCompInfo.ComParam
  466. }
  467. this.role.ReplayGate(ntfMsg, true)
  468. //ack for client show
  469. ackMsg := &serverproto.SCCompetitionAck{
  470. Error: int32(ssAckMsg.Error),
  471. CompetitionId: ssAckMsg.CompetitionData.CompetitionId,
  472. }
  473. util.DebugF("uid=%v DoCompetitionNtf ntfMsg=%v", this.role.GetUUid(), ntfMsg)
  474. this.role.ReplayGate(ackMsg, true)
  475. }
  476. func (this *RoleCompetition)NeedResetIdolRewardTime() {
  477. loc := util.GetLoc()
  478. nowTime := util.GetCurrentTimeNow()
  479. dayStartTimeStr := nowTime.Format(util.DATE_FORMAT1)
  480. startUpDayStr := util.GetDayByTimeStr1(dayStartTimeStr)
  481. //reqRewardStart 领奖开始时间,reqRewardEnd领奖结束时间
  482. begin1 := util.GetTimeByStr(startUpDayStr.Format(util.DATE_FORMAT1) + " " + model.GlobalCompetitionIdolDayReward[1].StartTime)
  483. rewardStart1 := time.Unix(begin1.Unix(), 0).In(loc)
  484. end1 := util.GetTimeByStr(startUpDayStr.Format(util.DATE_FORMAT1) + " " + model.GlobalCompetitionIdolDayReward[1].EndTime)
  485. rewardEnd1 := time.Unix(end1.Unix(), 0).In(loc)
  486. this.idolInfo.FirstBegin = uint64(rewardStart1.UnixNano() / 1e6)
  487. this.idolInfo.FirstEnd = uint64(rewardEnd1.UnixNano() / 1e6)
  488. begin2 := util.GetTimeByStr(startUpDayStr.Format(util.DATE_FORMAT1) + " " + model.GlobalCompetitionIdolDayReward[2].StartTime)
  489. rewardStart2 := time.Unix(begin2.Unix(), 0).In(loc)
  490. end2 := util.GetTimeByStr(startUpDayStr.Format(util.DATE_FORMAT1) + " " + model.GlobalCompetitionIdolDayReward[2].EndTime)
  491. rewardEnd2 := time.Unix(end2.Unix(), 0).In(loc)
  492. this.idolInfo.SecondBegin = uint64(rewardStart2.UnixNano() / 1e6)
  493. this.idolInfo.SecondEnd = uint64(rewardEnd2.UnixNano() / 1e6)
  494. this.SetDirty(true)
  495. }
  496. //from rank,获取赛季奖励ZhaoMu
  497. func (this *RoleCompetition) DoCompetitionReward(CompetitionData *model.CompetitionTypeData, compSubId, sectionId int32) {
  498. //已经获取奖励
  499. if this.rewardCompetitionId > CompetitionData.CompetitionId {
  500. return
  501. }
  502. //发起多次领取奖励操作
  503. if this.rewardCompetitionId == CompetitionData.CompetitionId && this.rewardCompetitionSubId == compSubId {
  504. return
  505. }
  506. rewardDataList, ok := CompetitionData.ConditionList[sectionId]
  507. if !ok {
  508. util.ErrorF("uid=%v DoCompetitionReward invalid CompetitionId=%v sectionId=%v", this.role.GetUUid(),
  509. CompetitionData.CompetitionId, sectionId)
  510. return
  511. }
  512. if len(rewardDataList.ConditionList) > 0 {
  513. //对应周期奖励
  514. addItemList := rewardDataList.RewardList[int32(compSubId-1)]
  515. mailId := this.getMailConfigId(CompetitionData.CompetitionType)
  516. this.role.GetRoleMail().AddMail(mailId, serverproto.MailType_MailType_Competition,
  517. addItemList, []int32{sectionId}, "", "")
  518. }
  519. //第四赛季的占卜奖励发放//且最后一个阶段奖励发送完
  520. if CompetitionData.CompetitionId == int32(model.CompetitionType_ZhanBu) && compSubId == int32(len(rewardDataList.RewardList)) {
  521. this.SendDivineReward()
  522. }
  523. this.rewardCompetitionId = CompetitionData.CompetitionId
  524. this.rewardCompetitionSubId = compSubId
  525. this.SetDirty(true)
  526. util.InfoF("uid=%v DoCompetitionReward CompetitionId=%v sectionId=%v", this.role.GetUUid(),
  527. CompetitionData.CompetitionId, sectionId)
  528. }
  529. //from rank上线时一次性获取历史赛季奖励
  530. func (this *RoleCompetition) DoCompetitionRewardHistory(rewardList []*serverproto.KeyValueTypeList,
  531. competitionId, competitionSubId int32) {
  532. for _, data := range rewardList {
  533. compId := data.Key
  534. if compId < this.rewardCompetitionId {
  535. continue
  536. }
  537. if this.rewardCompetitionId < compId {
  538. this.rewardCompetitionId = compId
  539. this.SetDirty(true)
  540. }
  541. if this.rewardCompetitionSubId < data.ValueList[0] {
  542. this.rewardCompetitionSubId = data.ValueList[0]
  543. this.SetDirty(true)
  544. }
  545. //获取奖励
  546. compData, ok := model.ConvertCompTypeList[compId]
  547. if !ok || len(data.ValueList) <= 0 {
  548. util.ErrorF("uid=%v DoCompetitionRewardHistory invalid compId=%v %v", this.role.GetUUid(), compId, data.ValueList)
  549. continue
  550. }
  551. //所在宝箱档位数据
  552. switch model.CompetitionType(compData.CompetitionType) {
  553. case model.CompetitionType_ZhaoMu:
  554. sectionId := data.ValueList[1]
  555. sectionRewardData, ok1 := compData.ConditionList[sectionId]
  556. if !ok1 {
  557. continue
  558. }
  559. if len(sectionRewardData.ConditionList) > 0 {
  560. //对应周期奖励
  561. addItemList := sectionRewardData.RewardList[data.ValueList[0]-1]
  562. this.role.GetRoleMail().AddMail(this.getMailConfigId(compData.CompetitionType), serverproto.MailType_MailType_Competition,
  563. addItemList, []int32{sectionId}, "", "")
  564. }
  565. case model.CompetitionType_XuanBa:
  566. fallthrough
  567. case model.CompetitionType_DuoBao:
  568. fallthrough
  569. case model.CompetitionType_Idol:
  570. fallthrough
  571. case model.CompetitionType_ZhanBu:
  572. sectionId := data.ValueList[1]
  573. sectionRewardData, ok1 := compData.ConditionList[sectionId]
  574. if !ok1 {
  575. continue
  576. }
  577. if len(sectionRewardData.ConditionList) > 0 {
  578. //对应周期奖励
  579. addItemList := sectionRewardData.RewardList[data.ValueList[0]-1]
  580. this.role.GetRoleMail().AddMail(this.getMailConfigId(compData.CompetitionType), serverproto.MailType_MailType_Competition,
  581. addItemList, []int32{sectionId}, "", "")
  582. }
  583. //第四赛季的占卜奖励发放
  584. if competitionId == int32(model.CompetitionType_ZhanBu) && competitionSubId == int32(len(sectionRewardData.RewardList)) {
  585. this.SendDivineReward()
  586. }
  587. }
  588. }
  589. if competitionId >= 0 {
  590. this.rewardCompetitionId = competitionId
  591. }
  592. if competitionSubId >= 0 {
  593. this.rewardCompetitionSubId = competitionSubId
  594. }
  595. util.InfoF("uid=%v DoCompetitionRewardHistory rewardCompetitionId=%v rewardCompetitionSubId=%v",
  596. this.role.GetUUid(), this.rewardCompetitionId, this.rewardCompetitionSubId)
  597. }
  598. //检查是否在对应的赛季内
  599. func (this *RoleCompetition)CheckInCompetitionSeason(competitionId int32) (int32, int32) {
  600. if !CompetitionMag.IsCompetitionOnline() {
  601. return Shop_Time_Not_Ready_To_Show, 0
  602. }
  603. if this.curCompInfo.CompetitionId < competitionId { //未到开始赛季
  604. return Shop_Time_Not_Ready_To_Show, 0
  605. } else if this.curCompInfo.CompetitionId > competitionId { //当前赛季已过
  606. return Shop_Time_Out_Of_Date, 0
  607. }
  608. return Shop_Time_Show, competitionId
  609. }
  610. //选拔季积分添加
  611. func (this *RoleCompetition) CompetitionAddScore(itemList []*serverproto.KeyValueType) serverproto.ErrorCode {
  612. if !CompetitionMag.IsCompetitionOnline() {
  613. return serverproto.ErrorCode_ERROR_FAIL
  614. }
  615. compData, ok := model.ConvertCompTimeList[CompetitionMag.curCompetitionId]
  616. if !ok {
  617. util.ErrorF("uid=%v CompetitionAddScore data not find!!!! id=%v", this.role.GetUUid(), CompetitionMag.curCompetitionId)
  618. return serverproto.ErrorCode_ERROR_FAIL
  619. }
  620. if compData.CompetitionType != int32(model.CompetitionType_XuanBa) {
  621. util.ErrorF("uid=%v CompetitionAddScore curr compType invalid id=%v", this.role.GetUUid(), CompetitionMag.curCompetitionId)
  622. return serverproto.ErrorCode_ERROR_FAIL
  623. }
  624. //相同赛季类型,不同赛季
  625. if this.curCompInfo.ComParamAddTime > 0 {
  626. tmpCompId := CompetitionMag.GetCompetitionIdByTime(this.curCompInfo.ComParamAddTime) + 1
  627. if tmpCompId != CompetitionMag.curCompetitionId ||
  628. this.curCompInfo.CompetitionId != CompetitionMag.curCompetitionId {
  629. this.curCompInfo.ComParam = 0
  630. }
  631. }
  632. rand.Seed(int64(util.GetTimeMilliseconds()))
  633. var addScore int32 = 0
  634. //特殊道具系统消息通知得分处理
  635. var systemMessageScore int32 = 0
  636. for idx := 0; idx < len(itemList); idx++ {
  637. if itemList[idx].Value <= 0 {
  638. continue
  639. }
  640. itemNum := this.role.GetItemNum(itemList[idx].Key)
  641. if itemNum >= uint32(itemList[idx].Value) {
  642. itemNum = uint32(itemList[idx].Value)
  643. }
  644. itemData, ok := model.GlobalCompetitionScoreItem[itemList[idx].Key]
  645. if !ok {
  646. continue
  647. }
  648. this.role.DelItem(itemList[idx].Key, int32(itemNum), AddItemST{AddFrom: AddFrom_Competition})
  649. //random score
  650. if itemData.Value > 0 {
  651. for k := 0; k < int(itemNum); k++ {
  652. tmpScore := this.getSpecialItemScore()
  653. addScore += tmpScore
  654. systemMessageScore += tmpScore
  655. }
  656. } else {
  657. addScore += itemData.Key * int32(itemNum)
  658. }
  659. }
  660. this.curCompInfo.ComParam += addScore
  661. this.curCompInfo.ComParamAddTime = util.GetTimeMilliseconds()
  662. this.SetDirty(true)
  663. util.InfoF("uid=%v CompetitionAddScore score=%v addScore=%v", this.role.GetUUid(), this.curCompInfo.ComParam, addScore)
  664. this.UpdateRankByCompetitionScore(false)
  665. if systemMessageScore > 0 {
  666. this.role.AddSystemMessage(SystemMessageType_Competition, AddSystemMsg{ParamId: systemMessageScore})
  667. }
  668. return serverproto.ErrorCode_ERROR_OK
  669. }
  670. //夺宝季积分添加
  671. func (this *RoleCompetition) CompetitionAddScoreDuoBao(addScore int32) serverproto.ErrorCode {
  672. compData, ok := model.ConvertCompTimeList[CompetitionMag.curCompetitionId]
  673. if !ok {
  674. util.ErrorF("uid=%v CompetitionAddScoreDuoBao data not find!!!! curCompetitionId=%v",
  675. this.role.GetUUid(), CompetitionMag.curCompetitionId)
  676. return serverproto.ErrorCode_ERROR_FAIL
  677. }
  678. if compData.CompetitionType != int32(model.CompetitionType_DuoBao) &&
  679. compData.CompetitionType != int32(model.CompetitionType_ZhanBu) &&
  680. compData.CompetitionType != int32(model.CompetitionType_Idol) {
  681. util.ErrorF("uid=%v CompetitionAddScore curr compType invalid curCompetitionId=%v compType=%v",
  682. this.role.GetUUid(), CompetitionMag.curCompetitionId, compData.CompetitionType)
  683. return serverproto.ErrorCode_ERROR_FAIL
  684. }
  685. //相同赛季类型,不同赛季
  686. if this.curCompInfo.ComParamAddTime > 0 {
  687. tmpCompId := CompetitionMag.GetCompetitionIdByTime(this.curCompInfo.ComParamAddTime) + 1
  688. if tmpCompId != CompetitionMag.curCompetitionId ||
  689. this.curCompInfo.CompetitionId != CompetitionMag.curCompetitionId {
  690. this.curCompInfo.ComParam = 0
  691. }
  692. }
  693. this.curCompInfo.ComParam += addScore
  694. this.curCompInfo.ComParamAddTime = util.GetTimeMilliseconds()
  695. this.SetDirty(true)
  696. util.InfoF("uid=%v CompetitionAddScoreDuoBao addscore=%v", this.role.GetUUid(), this.curCompInfo.ComParam)
  697. this.UpdateRankByCompetitionScore(false)
  698. return serverproto.ErrorCode_ERROR_OK
  699. }
  700. func (this *RoleCompetition) DoUpdateScoreNtf(msg *serverproto.SSCompetitionUpdateScoreAck) {
  701. if this.curCompInfo.ComParam > 0 {
  702. ackMsg := &serverproto.SCCompetitionScoreAck{
  703. Error: int32(serverproto.ErrorCode_ERROR_OK),
  704. ComScore: this.curCompInfo.ComParam,
  705. NextComScore: msg.NextComScore,
  706. SelfRank: msg.SelfRank,
  707. TotalRank: msg.TotalRank,
  708. SectionId: msg.SectionId,
  709. LastComScore: msg.LastComScore,
  710. }
  711. this.role.ReplayGate(ackMsg, true)
  712. }
  713. }
  714. func (this *RoleCompetition) getMailConfigId(compType int32) int32 {
  715. switch model.CompetitionType(compType) {
  716. case model.CompetitionType_ZhaoMu:
  717. return 20001
  718. case model.CompetitionType_XuanBa:
  719. return 20002
  720. case model.CompetitionType_DuoBao:
  721. return 20003
  722. case model.CompetitionType_ZhanBu:
  723. return 20004
  724. case model.CompetitionType_Idol:
  725. return 20005
  726. }
  727. return 0
  728. }
  729. func (this *RoleCompetition) getSpecialItemScore() int32 {
  730. tmpLen := len(model.GlobalCompetitionScoreItemFactor)
  731. randVal := rand.Int31n(model.GlobalCompetitionScoreItemFactor[tmpLen-1].Key) + 1
  732. tmpIdx := 0
  733. for idx := 0; idx < len(model.GlobalCompetitionScoreItemFactor); idx++ {
  734. tmpIdx = idx
  735. if model.GlobalCompetitionScoreItemFactor[idx].Key >= randVal {
  736. break
  737. }
  738. }
  739. left := model.GlobalCompetitionScoreItemFactor[tmpIdx].ValueList[0]
  740. right := model.GlobalCompetitionScoreItemFactor[tmpIdx].ValueList[1]
  741. return left + rand.Int31n(right-left) + 1
  742. }
  743. //========================================== 占卜季 开始 ==========================================
  744. //占星数据请求
  745. func (this *RoleCompetition) GetDivineInfo(ackMsg *serverproto.SCCompetitionStarInfoAck) {
  746. if this.divineInfo == nil || ackMsg == nil {
  747. return
  748. }
  749. ackMsg.Stars = this.divineInfo.CurStars
  750. }
  751. //占星请求
  752. func (this *RoleCompetition) OnStarDivine(useTicket bool, ackMsg *serverproto.SCCompetitionStarDivineAck) serverproto.ErrorCode {
  753. if this.divineInfo == nil || ackMsg == nil {
  754. return serverproto.ErrorCode_ERROR_FAIL
  755. }
  756. //全部点亮,退出
  757. starCount := len(this.divineInfo.CurStars)
  758. if starCount >= 12 {
  759. return serverproto.ErrorCode_ERROR_FAIL
  760. }
  761. //配置都没找到,瞎扯淡了。
  762. cfgData, ok := model.ConvertCompetitionDevine[int32(starCount)]
  763. if !ok {
  764. //日志
  765. return serverproto.ErrorCode_ERROR_FAIL
  766. }
  767. //计算消耗
  768. var costItemList = map[int32]int32{}
  769. if this.role.CheckResLitNum(cfgData.ItemCost) {
  770. for key, value := range cfgData.ItemCost {
  771. costItemList[key] = value
  772. }
  773. } else if this.role.CheckResLitNum(cfgData.GoldCost) {
  774. for key, value := range cfgData.GoldCost {
  775. costItemList[key] = value
  776. }
  777. } else {
  778. return serverproto.ErrorCode_ERROR_FAIL
  779. }
  780. //计算概率//幸运券逻辑
  781. useProbability := cfgData.NormalRate
  782. ticketCount := int32(0)
  783. if useTicket == true {
  784. if cfgData.LuckyTicket == 0 {
  785. return serverproto.ErrorCode_ERROR_FAIL
  786. }
  787. ticketCount = int32(this.role.GetResNum(cfgData.LuckyTicket))
  788. if ticketCount < cfgData.TicketCount {
  789. return serverproto.ErrorCode_ERROR_FAIL
  790. }
  791. useProbability = 10000
  792. ticketCount = cfgData.TicketCount
  793. this.divineInfo.FailedCount = 0
  794. }
  795. if ticketCount != 0 {
  796. costItemList[cfgData.LuckyTicket] += cfgData.TicketCount
  797. }
  798. if useTicket == false {
  799. if this.divineInfo.FailedCount >= 2 {
  800. useProbability = cfgData.SpecialRate
  801. }
  802. }
  803. //抽取逻辑
  804. //计算是否成功
  805. success := false
  806. if useProbability == 10000 {
  807. success = true
  808. } else {
  809. randNum := rand.Int31n(10000)
  810. if randNum+1 <= useProbability {
  811. success = true
  812. }
  813. }
  814. //创建抽取池//成功,从未抽取库中抽取//失败,从现有库中抽取
  815. var starPool []int32
  816. if success == true {
  817. for i := 1; i <= 12; i++ {
  818. bFind := false
  819. for _, star := range this.divineInfo.CurStars {
  820. if star == int32(i) {
  821. bFind = true
  822. }
  823. }
  824. if bFind == true {
  825. continue
  826. }
  827. starPool = append(starPool, int32(i))
  828. }
  829. this.divineInfo.FailedCount = 0
  830. } else {
  831. for _, star := range this.divineInfo.CurStars {
  832. starPool = append(starPool, star)
  833. }
  834. this.divineInfo.FailedCount++
  835. }
  836. //捕获异常
  837. if starPool == nil {
  838. return serverproto.ErrorCode_ERROR_FAIL
  839. }
  840. newStarCount := len(starPool)
  841. if newStarCount <= 0 {
  842. return serverproto.ErrorCode_ERROR_FAIL
  843. }
  844. startId := int32(0)
  845. poolIndex := rand.Int31n(int32(newStarCount))
  846. if poolIndex < int32(newStarCount) {
  847. startId = starPool[poolIndex]
  848. }
  849. if 1 <= startId && startId <= 12 {
  850. //扣除道具,
  851. this.role.DelItemList(costItemList, AddItemST{AddFrom: AddFrom_Divine})
  852. //进行抽取操作。
  853. if success == true {
  854. this.divineInfo.CurStars = append(this.divineInfo.CurStars, startId)
  855. ackMsg.Light = true
  856. } else {
  857. for i := 0; i < len(this.divineInfo.CurStars); i++ {
  858. if this.divineInfo.CurStars[i] == startId {
  859. this.divineInfo.CurStars = append(this.divineInfo.CurStars[:i], this.divineInfo.CurStars[i+1:]...)
  860. }
  861. }
  862. ackMsg.Light = false
  863. }
  864. }
  865. //赛季增加积分。
  866. this.role.GetRoleCompetition().CompetitionAddScoreDuoBao(cfgData.ScorePoint)
  867. //增加积分
  868. this.SetDirty(true)
  869. ackMsg.Star = startId
  870. ackMsg.Stars = this.divineInfo.CurStars
  871. return serverproto.ErrorCode_ERROR_OK
  872. }
  873. //
  874. func (this *RoleCompetition) GetDivineReward(ackMsg *serverproto.SCCompetitionStarCloseRewardAck) serverproto.ErrorCode {
  875. if this.divineInfo == nil || ackMsg == nil {
  876. return serverproto.ErrorCode_ERROR_FAIL
  877. }
  878. starCount := len(this.divineInfo.CurStars)
  879. if starCount <= 0 {
  880. return serverproto.ErrorCode_ERROR_FAIL
  881. }
  882. cfgData, ok := model.ConvertCompetitionDevine[int32(starCount)]
  883. if !ok {
  884. //日志
  885. util.ErrorF("uid=%v SendDivineReward send divine reward config not found starCount=%v ", starCount)
  886. return serverproto.ErrorCode_ERROR_FAIL
  887. }
  888. if len(cfgData.RewardList) > 0 {
  889. this.role.AddItemList(cfgData.RewardList, AddFrom_DrawCard, true)
  890. } else {
  891. //日志
  892. util.ErrorF("uid=%v SendDivineReward send divine reward empty starCount=%v ", starCount)
  893. return serverproto.ErrorCode_ERROR_FAIL
  894. }
  895. this.divineInfo.CurStars = []int32{}
  896. this.divineInfo.FailedCount = 0
  897. this.SetDirty(true)
  898. ackMsg.Stars = this.divineInfo.CurStars
  899. for key, value := range cfgData.RewardList {
  900. ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{
  901. Key: key,
  902. Value: value,
  903. })
  904. }
  905. //播报
  906. if cfgData.BroadCast == 1 {
  907. this.role.AddSystemMessage(SystemmessageType_Divine,
  908. AddSystemMsg{ParamId: int32(starCount)})
  909. }
  910. return serverproto.ErrorCode_ERROR_OK
  911. }
  912. func (this *RoleCompetition) SendDivineReward() {
  913. if this.divineInfo == nil {
  914. return
  915. }
  916. starCount := int32(len(this.divineInfo.CurStars))
  917. if starCount <= 0 {
  918. return
  919. }
  920. cfgData, ok := model.ConvertCompetitionDevine[starCount]
  921. if !ok {
  922. //日志
  923. util.ErrorF("uid=%v SendDivineReward send divine reward config not found starCount=%v ", starCount)
  924. return
  925. }
  926. if len(cfgData.RewardList) <= 0 {
  927. //日志
  928. util.ErrorF("uid=%v SendDivineReward send divine reward empty starCount=%v ", starCount)
  929. return
  930. }
  931. this.divineInfo.CurStars = []int32{}
  932. this.divineInfo.FailedCount = 0
  933. if len(cfgData.RewardList) > 0 {
  934. this.role.GetRoleMail().AddMail(model.GloablMailDivineReward, serverproto.MailType_MailType_Competition,
  935. cfgData.RewardList, []int32{int32(model.CompetitionType_ZhanBu)}, "", "")
  936. }
  937. this.SetDirty(true)
  938. return
  939. }
  940. //========================================== 占卜季 结束 ==========================================
  941. //========================================== 偶像季 开始 ==========================================
  942. //上交道具获得积分
  943. func (this *RoleCompetition) UpdateIdolRankByCompetitionScore(score int32, curScore int32, idolUid uint64) {
  944. if CompetitionMag.IsCompetitionOnline() {
  945. compData, ok := model.ConvertCompTimeList[CompetitionMag.curCompetitionId]
  946. if !ok {
  947. util.ErrorF("uid=%v UpdateIdolRankByCompetitionScore data not find!!!! id=%v", this.role.GetUUid(), CompetitionMag.curCompetitionId)
  948. return
  949. }
  950. //第二赛季上交道具获得积分赛季,上线就进入排行榜
  951. if compData.CompetitionType == int32(model.CompetitionType_Idol) {
  952. //上线更新的方式,积分必须为0
  953. if this.curCompInfo.CompetitionId != CompetitionMag.curCompetitionId {
  954. this.curCompInfo.ComParam = 0
  955. this.SetDirty(true)
  956. }
  957. if this.curCompInfo.CompetitionId == CompetitionMag.curCompetitionId || this.curCompInfo.CompetitionId <= 0 {
  958. ssUpdateScoreMsg := &serverproto.SSCompetitionUpdateScoreReq{
  959. CompetitionId: CompetitionMag.curCompetitionId,
  960. Uid: idolUid,
  961. Score: score,
  962. FansUid: this.role.GetUUid(),
  963. CurVoteScore: curScore,
  964. }
  965. this.role.SendRank(ssUpdateScoreMsg)
  966. }
  967. }
  968. }
  969. }
  970. //赛季给别人加分
  971. func (this *RoleCompetition) CompetitionAddScoreIdol(addScore int32, curScore int32, idolUid uint64) serverproto.ErrorCode {
  972. compData, ok := model.ConvertCompTimeList[CompetitionMag.curCompetitionId]
  973. if !ok {
  974. util.ErrorF("uid=%v CompetitionAddScoreDuoBao data not find!!!! curCompetitionId=%v",
  975. this.role.GetUUid(), CompetitionMag.curCompetitionId)
  976. return serverproto.ErrorCode_ERROR_FAIL
  977. }
  978. if compData.CompetitionType != int32(model.CompetitionType_Idol) {
  979. util.ErrorF("uid=%v CompetitionAddScore curr compType invalid curCompetitionId=%v compType=%v",
  980. this.role.GetUUid(), CompetitionMag.curCompetitionId, compData.CompetitionType)
  981. return serverproto.ErrorCode_ERROR_FAIL
  982. }
  983. //相同赛季类型,不同赛季
  984. if this.curCompInfo.ComParamAddTime > 0 {
  985. tmpCompId := CompetitionMag.GetCompetitionIdByTime(this.curCompInfo.ComParamAddTime) + 1
  986. if tmpCompId != CompetitionMag.curCompetitionId ||
  987. this.curCompInfo.CompetitionId != CompetitionMag.curCompetitionId {
  988. this.curCompInfo.ComParam = 0
  989. }
  990. }
  991. this.curCompInfo.ComParamAddTime = util.GetTimeMilliseconds()
  992. this.SetDirty(true)
  993. util.InfoF("uid=%v CompetitionAddScoreDuoBao addscore=%v", this.role.GetUUid(), this.curCompInfo.ComParam)
  994. this.UpdateIdolRankByCompetitionScore(addScore, curScore, idolUid)
  995. return serverproto.ErrorCode_ERROR_OK
  996. }
  997. const VoteItemId = 238
  998. func (this *RoleCompetition) VoteIdol(uid uint64, ticketCount int32, needItem bool) (serverproto.ErrorCode) {
  999. if ticketCount <= 0 {
  1000. return serverproto.ErrorCode_ERROR_FAIL
  1001. }
  1002. if this.idolInfo == nil {
  1003. return serverproto.ErrorCode_ERROR_FAIL
  1004. }
  1005. if CompetitionMag.curCompetitionId != int32(model.CompetitionType_Idol) {
  1006. return serverproto.ErrorCode_ERROR_ARENA_NOT_IN_SEASON
  1007. }
  1008. //道具是否够
  1009. costItemList := map[int32]int32{}
  1010. if needItem == true {
  1011. costItemList[VoteItemId] = ticketCount
  1012. if this.role.CheckResLitNum(costItemList) == false {
  1013. util.DebugF("uid=%v build_guild error resource not enough!! costItemList=%v", this.role.GetUUid(), costItemList)
  1014. return serverproto.ErrorCode_ERROR_FAIL
  1015. }
  1016. }
  1017. totalTicket := ticketCount
  1018. //是否在赛季内,
  1019. bFind := false
  1020. if len(this.idolInfo.VoteData) > 0 {
  1021. for _, data := range this.idolInfo.VoteData {
  1022. if data.Key == uid {
  1023. data.Value += ticketCount
  1024. totalTicket = data.Value
  1025. bFind = true
  1026. break
  1027. }
  1028. }
  1029. }
  1030. if bFind == false {
  1031. this.idolInfo.VoteData = append(this.idolInfo.VoteData, &serverproto.KeyValueType64{
  1032. Key: uid,
  1033. Value: ticketCount,
  1034. })
  1035. }
  1036. bRet := this.CompetitionAddScoreIdol(totalTicket, ticketCount, uid)
  1037. if bRet != serverproto.ErrorCode_ERROR_OK {
  1038. return bRet
  1039. }
  1040. if needItem == true {
  1041. this.role.DelItemList(costItemList, AddItemST{AddFrom: AddFrom_IdolSeason})
  1042. }
  1043. this.SetDirty(true)
  1044. util.InfoF("uid=%v VoteIdol, totalTicket:%v, ticketCount:%v", this.role.GetUUid(), totalTicket, ticketCount)
  1045. return serverproto.ErrorCode_ERROR_OK
  1046. }
  1047. func (this *RoleCompetition)CheckInIdolSeason() (serverproto.ErrorCode, int32) {
  1048. bRet, competitionId := this.CheckInCompetitionSeason(int32(model.CompetitionType_Idol))
  1049. if bRet == Shop_Time_Show {
  1050. return serverproto.ErrorCode_ERROR_OK, competitionId
  1051. }
  1052. return serverproto.ErrorCode_ERROR_FAIL, 01
  1053. }
  1054. func (this *RoleCompetition)GetSelfVoteData(ackMsg *serverproto.SCCompetitionFansRewardRankAck) {
  1055. if ackMsg == nil || this.idolInfo == nil {
  1056. return
  1057. }
  1058. ackMsg.RewardData = this.idolInfo.VoteData
  1059. }
  1060. //简单校验是否透过这个人
  1061. func (this *RoleCompetition)CheckFansReward(uid uint64, rewardLevel int32) serverproto.ErrorCode {
  1062. if this.idolInfo == nil {
  1063. return serverproto.ErrorCode_ERROR_FAIL
  1064. }
  1065. if uid == this.role.GetUUid() {
  1066. return serverproto.ErrorCode_ERROR_OK
  1067. }
  1068. bFind := false
  1069. for _, data := range this.idolInfo.VoteData {
  1070. if data.Key != uid {
  1071. continue
  1072. }
  1073. bFind = true
  1074. break
  1075. }
  1076. if bFind == false {
  1077. return serverproto.ErrorCode_ERROR_FAIL
  1078. }
  1079. return serverproto.ErrorCode_ERROR_OK
  1080. }
  1081. //uid 爱豆UID , rewardLevel 领取的奖励等级,boxScore 爱豆的宝箱分数
  1082. func (this *RoleCompetition)GetFansReward(idolUid uint64, boxScore int32, needAdd bool, itemList map[int32]int32) (serverproto.ErrorCode, int32) {
  1083. if this.idolInfo == nil {
  1084. return serverproto.ErrorCode_ERROR_FAIL, 0
  1085. }
  1086. bFind := false
  1087. rewardFlag := int32(0)
  1088. for _, data := range this.idolInfo.VoteData {
  1089. if data.Key != idolUid {
  1090. continue
  1091. }
  1092. bFind = true
  1093. addItemList := map[int32]int32{}
  1094. //从第一档开始
  1095. for i:=int32(1); i <= int32(len(model.ConvertIdolBoxData)); i++ {
  1096. _, ok := model.ConvertIdolBoxData[i]
  1097. if !ok {
  1098. continue
  1099. }
  1100. //判定分数是否够
  1101. if boxScore < model.ConvertIdolBoxData[i].BoxCount {
  1102. break
  1103. }
  1104. //判定领取非自己的粉丝馈赠,票数是否够
  1105. if idolUid != this.role.GetUUid() && data.Value < model.ConvertIdolBoxData[i].TicketCount {
  1106. continue
  1107. }
  1108. //检查这个奖励是否领取过//防止game-rank卡顿,多条从rank返回的领取包,刷奖励。所以给奖励还要判定一下
  1109. if (data.Value2 & (1 << uint32(i-1))) != 0 {
  1110. continue
  1111. }
  1112. //记录领奖标示
  1113. data.Value2 |= 1 << uint32(i-1)
  1114. //打包数据
  1115. for _, reward := range model.ConvertIdolBoxData[i].Reward {
  1116. itemList[reward.Key] += reward.Value
  1117. if needAdd == true {
  1118. addItemList[reward.Key] += reward.Value
  1119. }
  1120. }
  1121. }
  1122. if needAdd == true && len(addItemList) > 0 {
  1123. this.role.AddItemList(addItemList, AddFrom_IdolSeason, true)
  1124. }
  1125. rewardFlag = data.Value2
  1126. break
  1127. }
  1128. if bFind == false {
  1129. return serverproto.ErrorCode_ERROR_FAIL, 0
  1130. }
  1131. this.SetDirty(true)
  1132. return serverproto.ErrorCode_ERROR_OK, rewardFlag
  1133. }
  1134. func (this *RoleCompetition)GetAllFansReward(idol_list []*serverproto.KeyValueType64) {
  1135. if this.idolInfo == nil || len(this.idolInfo.VoteData) <= 0 {
  1136. return
  1137. }
  1138. addItemList := map[int32]int32{}
  1139. for _, data := range idol_list {
  1140. util.DebugF("uid=%v GetAllFansReward addItemList:%v", this.role.GetUUid(), addItemList)
  1141. this.GetFansReward(data.Key, data.Value, false, addItemList)
  1142. }
  1143. this.idolInfo.VoteData = this.idolInfo.VoteData[0:0]
  1144. this.SetDirty(true)
  1145. util.DebugF("uid=%v GetAllFansReward final addItemList:%v", this.role.GetUUid(), addItemList)
  1146. if len(addItemList) > 0 {
  1147. this.role.GetRoleMail().AddMail(model.GloablMailIdolFansReward, serverproto.MailType_MailType_Idol,
  1148. addItemList, []int32{int32(model.CompetitionType_Idol)}, "", "")
  1149. }
  1150. }
  1151. func (this *RoleCompetition)GetIdolDayReward(id int32) serverproto.ErrorCode {
  1152. if this.role.GetRoleBase().GetRoleLevel() < model.GlobalCompetitonDayRewardLevel {
  1153. return serverproto.ErrorCode_ERROR_USEITEM_ROLE_LEVEL_NOT_ENOUGH
  1154. }
  1155. rewardData, ok:= model.GlobalCompetitionIdolDayReward[id]
  1156. if !ok {
  1157. return serverproto.ErrorCode_ERROR_FAIL
  1158. }
  1159. //判定是否在时间内
  1160. curTime := util.GetCurrentTime()
  1161. loc := util.GetLoc()
  1162. nowTime := util.GetCurrentTimeNow()
  1163. dayStartTimeStr := nowTime.Format(util.DATE_FORMAT1)
  1164. startUpDayStr := util.GetDayByTimeStr1(dayStartTimeStr)
  1165. //reqRewardStart 领奖开始时间,reqRewardEnd领奖结束时间
  1166. reqBegin := util.GetTimeByStr(startUpDayStr.Format(util.DATE_FORMAT1) + " " + rewardData.StartTime)
  1167. reqRewardStart := time.Unix(reqBegin.Unix(), 0).In(loc)
  1168. reqEnd := util.GetTimeByStr(startUpDayStr.Format(util.DATE_FORMAT1) + " " + rewardData.EndTime)
  1169. reqRewardEnd := time.Unix(reqEnd.Unix(), 0).In(loc)
  1170. startTime := uint64(reqRewardStart.UnixNano() / 1e6)
  1171. endTime := uint64(reqRewardEnd.UnixNano() / 1e6)
  1172. if curTime < startTime || endTime < curTime {
  1173. return serverproto.ErrorCode_ERROR_FAIL
  1174. }
  1175. //判定是否领取过
  1176. for _, reward := range this.idolInfo.DayReward {
  1177. if reward == id {
  1178. return serverproto.ErrorCode_ERROR_FAIL
  1179. }
  1180. }
  1181. //给道具
  1182. addItemList := map[int32]int32{}
  1183. addItemList[rewardData.ItemId] = rewardData.ItemCount
  1184. this.role.AddItemList(addItemList, AddFrom_IdolSeason, true)
  1185. //打标记
  1186. this.idolInfo.DayReward = append(this.idolInfo.DayReward, id)
  1187. this.SetDirty(true)
  1188. return serverproto.ErrorCode_ERROR_OK
  1189. }
  1190. func (this *RoleCompetition)GetRewardDate(ackMsg *serverproto.SCCompetitionOnVoteAck) {
  1191. if ackMsg == nil {
  1192. return
  1193. }
  1194. ackMsg.RewardData = this.idolInfo.VoteData
  1195. }
  1196. func (this *RoleCompetition)AddSeasonBoxScore(score int32, broadCast bool) {
  1197. if this.idolInfo == nil {
  1198. util.InfoF("uid=%v AddSeasonBoxScore this.idolInfo is nil", this.role.GetUUid())
  1199. return
  1200. }
  1201. //非第五赛季
  1202. if CompetitionMag.curCompetitionId != int32(model.CompetitionType_Idol) {
  1203. return
  1204. }
  1205. bFind := false
  1206. myUid := uint64(this.role.GetUUid())
  1207. for _, data := range this.idolInfo.VoteData {
  1208. if data.Key == myUid {
  1209. bFind = true
  1210. break
  1211. }
  1212. }
  1213. if bFind == false {
  1214. this.idolInfo.VoteData = append(this.idolInfo.VoteData, &serverproto.KeyValueType64{
  1215. Key: myUid,
  1216. Value: 0,
  1217. })
  1218. this.SetDirty(true)
  1219. }
  1220. this.idolInfo.BoxScore += score
  1221. ntfMsg := &serverproto.SSCompetitionAddIdolBoxScoreNtf{
  1222. Uid: this.role.GetUUid(),
  1223. Score: this.idolInfo.BoxScore,
  1224. CompetitionId: int32(model.CompetitionType_Idol),
  1225. }
  1226. this.role.SendRank(ntfMsg)
  1227. //播报
  1228. if broadCast {
  1229. this.role.AddSystemMessage(SystemmessageType_Idol, AddSystemMsg{})
  1230. }
  1231. }
  1232. const (
  1233. IdolSeason_Box = 243 //箱子补偿道具ID
  1234. IdolSeason_Ticket = 244 //票数补偿道具ID
  1235. )
  1236. func (this *RoleCompetition)UseIdolSeasonItem(itemId int32, count int32) {
  1237. if itemId == IdolSeason_Ticket {
  1238. this.role.GetRoleCompetition().VoteIdol(this.role.GetUUid(), count, false)
  1239. } else if itemId == IdolSeason_Box {
  1240. this.role.GetRoleCompetition().AddSeasonBoxScore(count, false)
  1241. }
  1242. }
  1243. //========================================== 偶像季 结束 ==========================================