role_tower.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. package model
  2. import (
  3. "rocommon/util"
  4. "roserver/baseserver/model"
  5. "roserver/serverproto"
  6. "strings"
  7. )
  8. const Refresh_Time_Gap = 6 * 60 * 60 //暂定6个小时刷新
  9. /*
  10. type FriendTowerInfo struct {
  11. UUId uint64
  12. NickName string
  13. ImgId int32
  14. }
  15. */
  16. type RoleTower struct {
  17. SaveObject
  18. nowTowerLevel int32
  19. nowTowerPassTime int64
  20. fightBeginTime int64
  21. fightBegin bool
  22. RushRound int32
  23. RushFightCount int32
  24. FightCountReward int32
  25. RankRewardRound int32
  26. SysRewardTime uint64 //宠物印记奖励补偿(领取奖励时的时间戳)
  27. friendTower map[int32][]*serverproto.CommonPlayerBriefInfo //好友简介数据
  28. RefreshTime int64 //好友数据刷新时间
  29. towerLevelDayRewardTime uint64 //下次可领取奖励时间戳(馈赠奖励)
  30. }
  31. func newRoleTower(r *Role) *RoleTower {
  32. roleTower := &RoleTower{
  33. SaveObject: SaveObject{
  34. role: r,
  35. },
  36. }
  37. roleTower.nowTowerLevel = 0
  38. roleTower.nowTowerPassTime = 0
  39. roleTower.fightBeginTime = 0
  40. roleTower.fightBegin = false
  41. roleTower.RushRound = 0
  42. roleTower.RushFightCount = 0
  43. roleTower.FightCountReward = 0
  44. roleTower.RankRewardRound = 0
  45. roleTower.friendTower = map[int32][]*serverproto.CommonPlayerBriefInfo{}
  46. return roleTower
  47. }
  48. func (this *RoleTower) Load(msg interface{}) bool {
  49. proRole := msg.(*serverproto.Role)
  50. if proRole.RoleTower != nil {
  51. if proRole.RoleTower.NowTowerLevel >= 1 {
  52. this.nowTowerLevel = proRole.RoleTower.NowTowerLevel
  53. this.nowTowerPassTime = proRole.RoleTower.NowTowerTime
  54. if proRole.RoleTower.RushTower == nil {
  55. proRole.RoleTower.RushTower = &serverproto.RushTower{}
  56. this.SetDirty(true)
  57. } else {
  58. this.RushRound = proRole.RoleTower.RushTower.RushRound
  59. this.RushFightCount = proRole.RoleTower.RushTower.Count
  60. this.FightCountReward = proRole.RoleTower.RushTower.Reward
  61. this.RankRewardRound = proRole.RoleTower.RushTower.RankReward
  62. }
  63. }
  64. //初始化
  65. if proRole.RoleTower.RushTower == nil {
  66. proRole.RoleTower.RushTower = &serverproto.RushTower{}
  67. proRole.RoleTower.RushTower.Count = 0
  68. proRole.RoleTower.RushTower.RushRound = 0
  69. proRole.RoleTower.RushTower.Reward = 0
  70. this.SetDirty(true)
  71. }
  72. this.towerLevelDayRewardTime = proRole.RoleTower.TowerLevelDayRewardTime
  73. this.SysRewardTime = proRole.RoleTower.SysRewardTime
  74. }
  75. return true
  76. }
  77. func (this *RoleTower) OnlineProcess() {
  78. //圣典优化 后,玩家第一次查询保底奖励,根据this.RushRound作为最后一轮未领取的奖励
  79. //保底战斗次数为0 表示,已经领取过奖励.
  80. if this.RushRound != 0 && this.RushRound > this.FightCountReward {
  81. reqMsg := &serverproto.SSGetRushBaseRewardReq{}
  82. reqMsg.Uid = this.role.GetUUid()
  83. reqMsg.RushType = model.Rush_Type_Tower
  84. reqMsg.RushRound = this.RushRound
  85. this.role.SendRank(reqMsg)
  86. }
  87. // 上线请求下冲榜是否有历史奖励可以领取
  88. /*
  89. reqMsg := &serverproto.SSGetRushRankReq{
  90. Uid: this.role.GetUUid(),
  91. RushType: model.Rush_Type_Tower,
  92. RushRound: this.RankRewardRound,
  93. }
  94. this.role.SendRank(reqMsg)
  95. */
  96. //宠物印记奖励补偿
  97. if this.SysRewardTime <= 0 {
  98. this.OnlineSysReward()
  99. }
  100. }
  101. func (this *RoleTower) Save() {
  102. this.SetDirty(false)
  103. //util.InfoF("[RoleTower] save...[%v]", this.role.GetUUid())
  104. saveMsg := &serverproto.SSTowerDataSaveReq{
  105. Tower: &serverproto.RoleTower{
  106. TowerLevelDayRewardTime: this.towerLevelDayRewardTime,
  107. },
  108. }
  109. //处理购买信息相关数据
  110. saveMsg.Tower.SysRewardTime = this.SysRewardTime
  111. saveMsg.Tower.NowTowerLevel = this.nowTowerLevel
  112. saveMsg.Tower.NowTowerTime = this.nowTowerPassTime
  113. saveMsg.Tower.RushTower = &serverproto.RushTower{
  114. RushRound: this.RushRound,
  115. Count: this.RushFightCount,
  116. Reward: this.FightCountReward,
  117. RankReward: this.RankRewardRound,
  118. }
  119. this.role.SendDb(saveMsg)
  120. }
  121. func (this *RoleTower) CopyData(data *serverproto.RoleTower) {
  122. data.NowTowerLevel = this.nowTowerLevel
  123. data.TowerLevelDayRewardTime = this.towerLevelDayRewardTime
  124. }
  125. func (this *RoleTower) Update(ms uint64) {
  126. }
  127. func (this *RoleTower) OnlineSysReward() {
  128. this.SysRewardTime = util.GetTimeMilliseconds()
  129. this.SetDirty(true)
  130. var rewardTower *model.ConvertSysRewardData = nil
  131. for idx := 0; idx < len(model.ConvertSysRewardList); idx++ {
  132. if this.nowTowerLevel < model.ConvertSysRewardList[idx].TowerLevel {
  133. break
  134. }
  135. rewardTower = model.ConvertSysRewardList[idx]
  136. }
  137. if rewardTower != nil && this.role.GetRolePet() != nil {
  138. this.role.GetRolePet().AddPetEquipByMapList(rewardTower.RewardList, false)
  139. }
  140. //util.InfoF("uid=%v OnlineSysReward rewardlist=%v", this.role.GetUUid(), rewardTower)
  141. }
  142. func (this *RoleTower) GetCurTower() int32 {
  143. return this.nowTowerLevel
  144. }
  145. func (this *RoleTower) IsTowerUnlock() bool {
  146. globalCfg, ok := serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_Climbing_Tower_Unlock)]
  147. if !ok {
  148. util.InfoF("uid=%v signup version not found", this.role.GetUUid())
  149. return false
  150. }
  151. if this.role.GetRoleBattle().GetLevelId() < globalCfg.IVal {
  152. return false
  153. }
  154. return true
  155. }
  156. func (this *RoleTower) OnTowerFightBegin(towerLevel int32) (serverproto.ErrorCode, []*serverproto.KeyValueType) {
  157. if this.IsTowerUnlock() == false {
  158. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED, nil
  159. }
  160. if towerLevel != this.nowTowerLevel+1 {
  161. util.DebugF("[RoleTower] OnTowerFightBegin....tower level error [%v]: %v - %v", this.role.GetUUid(), towerLevel, this.nowTowerLevel)
  162. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER, nil
  163. }
  164. cfgData, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  165. if !ok {
  166. util.DebugF("[RoleTower] OnTowerFightBegin....config not found [%v]:%v", this.role.GetUUid(), towerLevel)
  167. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND, nil
  168. }
  169. //先判定是否通过
  170. this.fightBeginTime = util.GetTimeSeconds()
  171. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Count, 1)
  172. util.DebugF("[RoleTower] OnTowerFightBegin....new tower battle begin [%v]", this.role.GetUUid())
  173. //获取衰减系数
  174. var decayList []*serverproto.KeyValueType
  175. if this.role.roleBattleAttr.curTotalFightPower > uint32(cfgData.FightCheck) {
  176. //if this.role.GetRoleFightPower().TotalFightPower > uint64(cfgData.FightCheck) {
  177. var kvList = map[int32]int32{}
  178. this.getDecayList(kvList)
  179. for k, v := range kvList {
  180. decayList = append(decayList, &serverproto.KeyValueType{Key: k, Value: v})
  181. }
  182. }
  183. reqMsg := &serverproto.SSRushDataChangeReq{}
  184. reqMsg.Uid = this.role.GetUUid()
  185. reqMsg.RushType = model.Rush_Type_Tower
  186. reqMsg.Score = 1
  187. this.role.SendRank(reqMsg)
  188. //todo wangzhaocan 发送到rank服务器
  189. return serverproto.ErrorCode_ERROR_OK, decayList
  190. }
  191. func (this *RoleTower) getDecayList(kvList map[int32]int32) {
  192. convertData, ok := model.ConvertClimbPowerDecayFactorList[this.nowTowerLevel+1]
  193. if ok {
  194. convertData.GetDecayList(kvList, uint64(this.role.roleBattleAttr.curTotalFightPower))
  195. //convertData.GetDecayList(kvList, this.role.GetRoleFightPower().TotalFightPower)
  196. }
  197. convertData, ok = model.ConvertClimbTimeDecayFactorList[this.nowTowerLevel+1]
  198. if ok {
  199. deltaTime := (util.GetTimeSeconds() - this.nowTowerPassTime) / 60
  200. convertData.GetDecayList(kvList, uint64(deltaTime))
  201. }
  202. cfgData, ok := model.ConvertTowerData[this.nowTowerLevel+1]
  203. if ok && cfgData.SPAdd != nil {
  204. kvList[cfgData.SPAdd.Key] += cfgData.SPAdd.Value
  205. }
  206. util.InfoF("uid=%v RoleTowerDecay kv=%v", this.role.GetUUid(), kvList)
  207. }
  208. func (this *RoleTower) OnTowerFightEnd(towerLevel, fightTime int32, recordTimeStamp uint64, ackMsg *serverproto.SCClimbingTowerEndAck) serverproto.ErrorCode {
  209. if ackMsg == nil {
  210. return serverproto.ErrorCode_ERROR_FAIL
  211. }
  212. if this.IsTowerUnlock() == false {
  213. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  214. }
  215. if towerLevel != this.nowTowerLevel+1 {
  216. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER
  217. }
  218. towerCfg, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  219. if !ok {
  220. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND
  221. }
  222. //战斗力校验
  223. curTotalFightPower := this.role.roleBattleAttr.curTotalFightPower
  224. if curTotalFightPower > 0 && curTotalFightPower < uint32(towerCfg.FightCheck) {
  225. return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  226. }
  227. //if this.role.GetRoleFightPower() != nil && this.role.GetRoleFightPower().TotalFightPower < uint64(towerCfg.FightCheck) {
  228. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  229. //}
  230. deltaTime := util.GetTimeSeconds() - this.nowTowerPassTime
  231. //时间判断 CloseDown
  232. tmpStrList := strings.Split(towerCfg.CloseDown, ";")
  233. if len(tmpStrList) >= 2 {
  234. tmpChallengeTime, _ := model.Str2Num(tmpStrList[0])
  235. tmpRecharge, _ := model.Str2Num(tmpStrList[1])
  236. //1 在对应关卡或者爬塔层的停留时间≥60分钟时,不会触发判定外挂机制
  237. //2 玩家战力≥2.5*最低通关战力时,不会触发判定机制
  238. fightCheck := uint64(towerCfg.FightCheck) * 25 / 10
  239. if tmpChallengeTime > 0 && deltaTime < 60*60 && curTotalFightPower < uint32(fightCheck) && curTotalFightPower > 0 {
  240. if int(this.role.GetTotalRecharge()) < tmpRecharge && fightTime < int32(tmpChallengeTime) {
  241. this.role.GetRoleStatistic().RecordCheatData(CheatType_TowerLevel)
  242. return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_CD_TIME
  243. }
  244. }
  245. }
  246. if fightTime < 0 || (towerCfg.MaxFightingTime+1 < fightTime) { //1秒修正时间
  247. util.DebugF("[RoleTower] OnTowerFightEnd...fight time out %v, %v--%v--%v, %v ", this.role.GetUUid(), this.fightBeginTime, util.GetTimeSeconds(), fightTime, towerCfg.MaxFightingTime)
  248. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_OUT_OF_TIME
  249. }
  250. //给奖励
  251. data, ok := model.ConvertTowerData[towerLevel]
  252. if ok {
  253. var addItemList = map[int32]int32{}
  254. for _, items := range data.ItemList {
  255. addItemList[items.Key] += items.Value
  256. }
  257. for _, exItems := range data.ExItemList {
  258. addItemList[exItems.Key] += exItems.Value
  259. }
  260. this.role.AddItemList(addItemList, AddFrom_Tower, true)
  261. }
  262. this.nowTowerLevel++
  263. //当前关卡通过//跟新当前关卡,战力到rank,排名
  264. this.passTowerInfoToRank(recordTimeStamp, int32(fightTime), false)
  265. this.nowTowerPassTime = util.GetTimeSeconds()
  266. this.SetDirty(true)
  267. this.onTowerLevelChange(this.nowTowerLevel - 1)
  268. ackMsg.TowerLevel = this.nowTowerLevel
  269. ackMsg.PassTime = this.nowTowerPassTime
  270. ackMsg.RewardList = data.ItemList
  271. ackMsg.ExRewardList = data.ExItemList
  272. if this.role.GetRoleCard() != nil {
  273. this.role.GetRoleCard().CheckUnLockState()
  274. }
  275. return serverproto.ErrorCode_ERROR_OK
  276. }
  277. func (this *RoleTower) onTowerLevelChange(oldTowerLevel int32) {
  278. if this.role.GetRoleCard() != nil {
  279. this.role.GetRoleCard().CheckUnLockState()
  280. }
  281. //超值礼包开启
  282. if this.role.GetRoleActivity() != nil {
  283. this.role.GetRoleActivity().SuperChargeUnlockCheck(
  284. serverproto.UnlockChargeType_UChargeType_ClimbTowerLevel, &SuperChargeUnlockST{oldValue: oldTowerLevel})
  285. }
  286. //跟新简介信息
  287. this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
  288. //爬塔层数
  289. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Level, this.nowTowerLevel)
  290. }
  291. func (this *RoleTower) PackFriendFightTower(towerLevel int32, ackMsg *serverproto.SCClimbingTowerEndAck) {
  292. if ackMsg == nil {
  293. return
  294. }
  295. tower, ok := this.friendTower[towerLevel]
  296. if !ok {
  297. return
  298. }
  299. info := &serverproto.FriendTowerInfo{
  300. TowerLevel: towerLevel,
  301. }
  302. for _, brief := range tower {
  303. info.Infos = append(info.Infos, brief)
  304. }
  305. ackMsg.PassInfo = info
  306. }
  307. //通关更新榜单
  308. func (this *RoleTower) passTowerInfoToRank(recordTimeStamp uint64, battleTime int32, isGM bool) {
  309. ntfMsg := &serverproto.SSTowerPassFightPowerNtf{
  310. TowerBfInfo: &serverproto.TowerBriefInfo{
  311. CommonInfo: &serverproto.CommonPlayerBriefInfo{
  312. BattleRecordId: model.GenerateUid(),
  313. },
  314. BattleTime: battleTime,
  315. },
  316. RecordTimeStamp: recordTimeStamp,
  317. }
  318. levelCfgData, ok := serverproto.ClimbingTowerCfgLoader[this.nowTowerLevel]
  319. if ok {
  320. ntfMsg.TowerBfInfo.BattleVersion = levelCfgData.Version
  321. }
  322. this.role.GetRoleBriefInfo(ntfMsg.TowerBfInfo.CommonInfo)
  323. //获取当前最新战力
  324. //ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.GetRoleFightPower().TotalFightPower)
  325. ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.roleBattleAttr.curTotalFightPower)
  326. //修正通关数据
  327. ntfMsg.TowerBfInfo.CommonInfo.TowerLevel = this.nowTowerLevel
  328. ntfMsg.TowerBfInfo.CommonInfo.TowerTime = uint64(util.GetTimeSeconds())
  329. this.role.SendRank(ntfMsg)
  330. }
  331. func (this *RoleTower) SendFriendInfoReqToDB(begin, end int32) {
  332. ntfMsg := &serverproto.SSGetFriendTowerInfoReq{}
  333. UidList := this.role.GetRoleSocial().GetFriendList()
  334. if UidList == nil {
  335. //清空好友爬塔数据
  336. this.friendTower = make(map[int32][]*serverproto.CommonPlayerBriefInfo)
  337. return
  338. }
  339. for _, data := range UidList {
  340. ntfMsg.UidList = append(ntfMsg.UidList, data)
  341. }
  342. ntfMsg.Begin = begin
  343. ntfMsg.End = end
  344. this.role.SendDb(ntfMsg)
  345. }
  346. func (this *RoleTower) GetClimbingTowerInfo() {
  347. ackMsg := &serverproto.SCClimbingTowerInfoAck{}
  348. ackMsg.NowTowerLevel = this.nowTowerLevel
  349. ackMsg.PassTime = this.nowTowerPassTime
  350. ackMsg.TowerLevelDayRewardTime = this.towerLevelDayRewardTime
  351. //判断有没有到刷新时间
  352. if this.RefreshTime != 0 && (this.RefreshTime+Refresh_Time_Gap >= util.GetTimeSeconds()) {
  353. //取[towerLevel+1 - towerLevel + 5]的数据
  354. if len(this.friendTower) > 0 {
  355. for level := this.nowTowerLevel + 1; level <= this.nowTowerLevel+5; level++ {
  356. towerData, ok := this.friendTower[level]
  357. if !ok || len(towerData) <= 0 {
  358. continue
  359. }
  360. info := &serverproto.FriendTowerInfo{}
  361. info.TowerLevel = level
  362. for _, data := range towerData {
  363. info.Infos = append(info.Infos, data)
  364. }
  365. ackMsg.Infos = append(ackMsg.Infos, info)
  366. }
  367. }
  368. } else {
  369. //发送请求到DB刷新一遍好友信息
  370. this.SendFriendInfoReqToDB(this.nowTowerLevel+1, this.nowTowerLevel+5)
  371. }
  372. this.role.ReplayGate(ackMsg, true)
  373. }
  374. //获得层数区间的所有好友
  375. func (this *RoleTower) GetFriendTowerRange(begin, end int32) serverproto.ErrorCode {
  376. if begin > end || begin <= 0 || end <= 0 {
  377. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_FRIEND_ARGS
  378. }
  379. //还在刷新时间内
  380. if this.RefreshTime != 0 && (this.RefreshTime+Refresh_Time_Gap >= util.GetTimeSeconds()) {
  381. ackMsg := &serverproto.SCFriendPassTowerInfoAck{}
  382. //取[begin, end]的数据
  383. for level := begin; level <= end; level++ {
  384. towerData, ok := this.friendTower[level]
  385. if !ok || len(towerData) <= 0 {
  386. continue
  387. }
  388. info := &serverproto.FriendTowerInfo{}
  389. info.TowerLevel = level
  390. for _, data := range towerData {
  391. info.Infos = append(info.Infos, data)
  392. }
  393. ackMsg.Infos = append(ackMsg.Infos, info)
  394. }
  395. this.role.ReplayGate(ackMsg, true)
  396. } else {
  397. //发送请求到DB刷新一遍好友信息
  398. this.SendFriendInfoReqToDB(begin, end)
  399. }
  400. return serverproto.ErrorCode_ERROR_OK
  401. }
  402. func (this *RoleTower) SendClimbingTowerInfo(begin int32, end int32) {
  403. ackMsg := &serverproto.SCFriendPassTowerInfoAck{}
  404. //取[begin, end]的数据
  405. for level := begin; level <= end; level++ {
  406. towerData, ok := this.friendTower[level]
  407. if !ok || len(towerData) <= 0 {
  408. continue
  409. }
  410. info := &serverproto.FriendTowerInfo{}
  411. info.TowerLevel = level
  412. for _, data := range towerData {
  413. info.Infos = append(info.Infos, data)
  414. }
  415. ackMsg.Infos = append(ackMsg.Infos, info)
  416. }
  417. this.role.ReplayGate(ackMsg, true)
  418. }
  419. func (this *RoleTower) SetFriendBriefInfo(briefs []*serverproto.CommonPlayerBriefInfo) serverproto.ErrorCode {
  420. if briefs == nil {
  421. this.RefreshTime = util.GetTimeSeconds()
  422. return serverproto.ErrorCode_ERROR_OK
  423. }
  424. //重置
  425. this.friendTower = make(map[int32][]*serverproto.CommonPlayerBriefInfo)
  426. for _, data := range briefs {
  427. this.friendTower[data.TowerLevel] = append(this.friendTower[data.TowerLevel], data)
  428. }
  429. this.RefreshTime = util.GetTimeSeconds()
  430. return serverproto.ErrorCode_ERROR_OK
  431. }
  432. func (this *RoleTower) SetTowerLevel(level int32) {
  433. if this.nowTowerLevel >= level {
  434. return
  435. }
  436. _, ok := serverproto.ClimbingTowerCfgLoader[level]
  437. if !ok {
  438. return
  439. }
  440. this.nowTowerLevel = level
  441. this.nowTowerPassTime = util.GetTimeSeconds()
  442. this.passTowerInfoToRank(0, 0, true)
  443. this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
  444. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Level, this.nowTowerLevel)
  445. this.SetDirty(true)
  446. if this.role.GetRoleCard() != nil {
  447. this.role.GetRoleCard().CheckUnLockState()
  448. }
  449. }
  450. //============================================= 爬塔冲榜 ============================================================
  451. func (this *RoleTower) OnlineGetRushTowerBaseReward(rewardRound int32) {
  452. if rewardRound < 0 {
  453. return
  454. }
  455. if this.FightCountReward >= rewardRound {
  456. this.RushFightCount = 0
  457. this.SetDirty(true)
  458. return
  459. }
  460. var addItemList = map[int32]int32{}
  461. model.GetRushActivityBaseReward(this.RushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  462. if len(addItemList) > 0 {
  463. this.role.AddMail(model.GlobalMailRushTowerBaseReward, serverproto.MailType_MailType_RushTower,
  464. addItemList, []int32{this.RushFightCount}, "", "")
  465. }
  466. this.FightCountReward = rewardRound
  467. this.SetDirty(true)
  468. }
  469. func (this *RoleTower) GetRushTowerBaseReward(ackMsg *serverproto.SCRushActivityRewardAck, rushRound int32) serverproto.ErrorCode {
  470. if ackMsg == nil {
  471. return serverproto.ErrorCode_ERROR_FAIL
  472. }
  473. if this.FightCountReward >= rushRound {
  474. return serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH
  475. }
  476. var addItemList = map[int32]int32{}
  477. model.GetRushActivityBaseReward(rushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  478. if len(addItemList) <= 0 {
  479. return serverproto.ErrorCode_ERROR_FAIL
  480. }
  481. for key, value := range addItemList {
  482. ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
  483. Key: key,
  484. Value: value,
  485. })
  486. }
  487. this.role.AddItemList(addItemList, AddFrom_RushTower, true)
  488. this.FightCountReward = rushRound
  489. this.SetDirty(true)
  490. return serverproto.ErrorCode_ERROR_OK
  491. }
  492. func (this *RoleTower) GetRushTowerRankReward(ssAck *serverproto.SSGetRushRewardAck) serverproto.ErrorCode {
  493. if ssAck == nil {
  494. return serverproto.ErrorCode_ERROR_FAIL
  495. }
  496. if this.RankRewardRound >= ssAck.RushRound {
  497. return serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH
  498. }
  499. var addItemList = map[int32]int32{}
  500. for _, data := range ssAck.ItemList {
  501. addItemList[data.Key] += data.Value
  502. }
  503. this.role.AddItemList(addItemList, AddFrom_RushTower, true)
  504. this.RankRewardRound = ssAck.RushRound
  505. this.SetDirty(true)
  506. return serverproto.ErrorCode_ERROR_OK
  507. }
  508. func (this *RoleTower) GetRushTowerInfo(ackMsg *serverproto.SCTowerActivityAck, curRushRound int32) {
  509. if ackMsg == nil {
  510. return
  511. }
  512. ackMsg.FightCount = this.RushFightCount
  513. ackMsg.RankReward = false
  514. if this.RankRewardRound >= curRushRound {
  515. ackMsg.RankReward = true
  516. }
  517. ackMsg.ChallengReward = false
  518. if this.FightCountReward >= curRushRound {
  519. ackMsg.ChallengReward = true
  520. }
  521. }
  522. //增加冲榜分数
  523. func (this *RoleTower) AddRushTowerScore(rushRound int32, score int32) {
  524. if rushRound == 0 {
  525. return
  526. }
  527. if rushRound == this.RushRound {
  528. this.RushFightCount++
  529. } else {
  530. this.RushRound = rushRound
  531. this.RushFightCount = 1
  532. }
  533. this.SetDirty(true)
  534. }
  535. func (this *RoleTower) CheckRankReward(finishRound int32) serverproto.ErrorCode {
  536. if this.RankRewardRound >= finishRound {
  537. return serverproto.ErrorCode_ERROR_FAIL
  538. }
  539. return serverproto.ErrorCode_ERROR_OK
  540. }
  541. func (this *RoleTower) SetRankReward(finishRound int32) {
  542. this.RankRewardRound = finishRound
  543. this.SetDirty(true)
  544. }
  545. //todo 根据round来设置
  546. func (this *RoleTower) GetFightCountMailReward(rushRound int32) {
  547. if rushRound <= 0 {
  548. return
  549. }
  550. if this.FightCountReward < rushRound {
  551. //发送上一轮冲榜战斗次数的奖励邮件
  552. var addItemList = map[int32]int32{}
  553. model.GetRushActivityBaseReward(this.RushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  554. if len(addItemList) > 0 {
  555. this.role.AddMail(model.GlobalMailRushTowerBaseReward, serverproto.MailType_MailType_RushTower,
  556. addItemList, []int32{this.RushFightCount}, "", "")
  557. }
  558. this.FightCountReward = rushRound
  559. this.RushFightCount = 0
  560. this.SetDirty(true)
  561. }
  562. }
  563. //获取试炼馈赠
  564. func (this *RoleTower) GetTowerLevelDayReward() serverproto.ErrorCode {
  565. curTime := util.GetTimeMilliseconds()
  566. //判断当前是否已经领取
  567. if curTime <= this.towerLevelDayRewardTime {
  568. return serverproto.ErrorCode_ERROR_FAIL
  569. }
  570. dayRewardIdx := -1
  571. for idx := 0; idx < len(model.GlobalClimbingTowerDayReward); idx++ {
  572. if model.GlobalClimbingTowerDayReward[idx].Key > this.nowTowerLevel {
  573. break
  574. }
  575. dayRewardIdx = idx
  576. }
  577. if dayRewardIdx < 0 || dayRewardIdx >= len(model.GlobalClimbingTowerDayReward) {
  578. return serverproto.ErrorCode_ERROR_FAIL
  579. }
  580. this.role.AddItem(int32(serverproto.ResType_Res_CreditRecharge),
  581. model.GlobalClimbingTowerDayReward[dayRewardIdx].Value, AddFrom_Tower)
  582. this.towerLevelDayRewardTime = util.GetLatest5Hour()
  583. this.SetDirty(true)
  584. // reward ack msg
  585. ackMsg := &serverproto.SCClimbingTowerDayRewardAck{
  586. NextDayRewardTime: this.towerLevelDayRewardTime,
  587. }
  588. ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{
  589. Key: int32(serverproto.ResType_Res_CreditRecharge),
  590. Value: model.GlobalClimbingTowerDayReward[dayRewardIdx].Value,
  591. })
  592. this.role.ReplayGate(ackMsg, true)
  593. return serverproto.ErrorCode_ERROR_OK
  594. }