role_tower.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978
  1. package model
  2. import (
  3. "rocommon/util"
  4. "roserver/baseserver/model"
  5. "roserver/serverproto"
  6. )
  7. const Refresh_Time_Gap = 6 * 60 * 60 //暂定6个小时刷新
  8. /*
  9. type FriendTowerInfo struct {
  10. UUId uint64
  11. NickName string
  12. ImgId int32
  13. }
  14. */
  15. type RoleTower struct {
  16. SaveObject
  17. nowTowerLevel int32
  18. nowTowerPassTime int64
  19. fightBeginTime int64
  20. fightBegin bool
  21. //无尽模式
  22. nowTowerWjLevel int32
  23. nowTowerWjPassTime int64 //过关时间点
  24. boss []int32 //无尽模式当前关卡boss
  25. buff1 int32
  26. buff2 int32
  27. buff3 int32
  28. refreshTowerWj int64 //战斗时间
  29. duration int32 //周期
  30. rewardLevel int32 //当前周期奖励层数
  31. RushRound int32
  32. RushFightCount int32
  33. FightCountReward int32
  34. RankRewardRound int32
  35. SysRewardTime uint64 //宠物印记奖励补偿(领取奖励时的时间戳)
  36. friendTower map[int32][]*serverproto.CommonPlayerBriefInfo //好友简介数据
  37. RefreshTime int64 //好友数据刷新时间
  38. towerLevelDayRewardTime uint64 //下次可领取奖励时间戳(馈赠奖励)
  39. }
  40. func newRoleTower(r *Role) *RoleTower {
  41. roleTower := &RoleTower{
  42. SaveObject: SaveObject{
  43. role: r,
  44. },
  45. }
  46. roleTower.nowTowerLevel = 0
  47. roleTower.nowTowerPassTime = 0
  48. roleTower.fightBeginTime = 0
  49. roleTower.fightBegin = false
  50. roleTower.RushRound = 0
  51. roleTower.RushFightCount = 0
  52. roleTower.FightCountReward = 0
  53. roleTower.RankRewardRound = 0
  54. //roleTower.boss = make([]int32, 0)
  55. roleTower.friendTower = map[int32][]*serverproto.CommonPlayerBriefInfo{}
  56. return roleTower
  57. }
  58. func (this *RoleTower) Load(msg interface{}) bool {
  59. proRole := msg.(*serverproto.Role)
  60. if proRole.RoleTower != nil {
  61. if proRole.RoleTower.NowTowerLevel >= 1 {
  62. this.nowTowerLevel = proRole.RoleTower.NowTowerLevel
  63. this.nowTowerPassTime = proRole.RoleTower.NowTowerTime
  64. //无尽模式数据
  65. this.nowTowerWjLevel = proRole.RoleTower.NowTowerWjLevel
  66. this.nowTowerWjPassTime = proRole.RoleTower.NowTowerWjTime
  67. this.boss = proRole.RoleTower.Boss
  68. this.rewardLevel = proRole.RoleTower.RewardLevel
  69. this.buff1 = proRole.RoleTower.Buff1
  70. this.buff2 = proRole.RoleTower.Buff2
  71. this.buff3 = proRole.RoleTower.Buff3
  72. this.duration = proRole.RoleTower.Duration
  73. this.refreshTowerWj = proRole.RoleTower.RefreshTowerWj
  74. if proRole.RoleTower.RushTower == nil {
  75. proRole.RoleTower.RushTower = &serverproto.RushTower{}
  76. this.SetDirty(true)
  77. } else {
  78. this.RushRound = proRole.RoleTower.RushTower.RushRound
  79. this.RushFightCount = proRole.RoleTower.RushTower.Count
  80. this.FightCountReward = proRole.RoleTower.RushTower.Reward
  81. this.RankRewardRound = proRole.RoleTower.RushTower.RankReward
  82. }
  83. }
  84. //初始化
  85. if proRole.RoleTower.RushTower == nil {
  86. proRole.RoleTower.RushTower = &serverproto.RushTower{}
  87. proRole.RoleTower.RushTower.Count = 0
  88. proRole.RoleTower.RushTower.RushRound = 0
  89. proRole.RoleTower.RushTower.Reward = 0
  90. this.SetDirty(true)
  91. }
  92. //无尽模式初始化第一层boss
  93. if this.nowTowerWjLevel == 0 {
  94. this.nowTowerWjLevel = 1
  95. this.duration = TowerMag.day
  96. //this.TowerRefreshRankTime()
  97. this.TowerBossRandom()
  98. this.SetDirty(true)
  99. }
  100. this.towerLevelDayRewardTime = proRole.RoleTower.TowerLevelDayRewardTime
  101. this.SysRewardTime = proRole.RoleTower.SysRewardTime
  102. }
  103. return true
  104. }
  105. func (this *RoleTower) TowerBossRandom() {
  106. this.boss = make([]int32, 0)
  107. count := 0
  108. for k, _ := range serverproto.TowerWjBossCfgLoader {
  109. if count >= 4 {
  110. break
  111. }
  112. this.boss = append(this.boss, k)
  113. count++
  114. }
  115. util.InfoF("uuid:%v tower random tower boss: %v", this.role.GetUUid(), this.boss)
  116. }
  117. func (this *RoleTower) OnlineProcess() {
  118. //圣典优化 后,玩家第一次查询保底奖励,根据this.RushRound作为最后一轮未领取的奖励
  119. //保底战斗次数为0 表示,已经领取过奖励.
  120. if this.RushRound != 0 && this.RushRound > this.FightCountReward {
  121. reqMsg := &serverproto.SSGetRushBaseRewardReq{}
  122. reqMsg.Uid = this.role.GetUUid()
  123. reqMsg.RushType = model.Rush_Type_Tower
  124. reqMsg.RushRound = this.RushRound
  125. this.role.SendRank(reqMsg)
  126. }
  127. // 上线请求下冲榜是否有历史奖励可以领取
  128. /*
  129. reqMsg := &serverproto.SSGetRushRankReq{
  130. Uid: this.role.GetUUid(),
  131. RushType: model.Rush_Type_Tower,
  132. RushRound: this.RankRewardRound,
  133. }
  134. this.role.SendRank(reqMsg)
  135. */
  136. //宠物印记奖励补偿
  137. if this.SysRewardTime <= 0 {
  138. this.OnlineSysReward()
  139. }
  140. }
  141. func (this *RoleTower) Save() {
  142. this.SetDirty(false)
  143. //util.InfoF("[RoleTower] save...[%v]", this.role.GetUUid())
  144. saveMsg := &serverproto.SSTowerDataSaveReq{
  145. Tower: &serverproto.RoleTower{
  146. TowerLevelDayRewardTime: this.towerLevelDayRewardTime,
  147. },
  148. }
  149. //处理购买信息相关数据
  150. saveMsg.Tower.SysRewardTime = this.SysRewardTime
  151. saveMsg.Tower.NowTowerLevel = this.nowTowerLevel
  152. saveMsg.Tower.NowTowerTime = this.nowTowerPassTime
  153. saveMsg.Tower.NowTowerWjLevel = this.nowTowerWjLevel
  154. saveMsg.Tower.NowTowerWjTime = this.nowTowerWjPassTime
  155. saveMsg.Tower.Boss = this.boss
  156. saveMsg.Tower.RefreshTowerWj = this.refreshTowerWj
  157. saveMsg.Tower.Duration = this.duration
  158. saveMsg.Tower.Buff1 = this.buff1
  159. saveMsg.Tower.Buff2 = this.buff2
  160. saveMsg.Tower.Buff3 = this.buff3
  161. saveMsg.Tower.RushTower = &serverproto.RushTower{
  162. RushRound: this.RushRound,
  163. Count: this.RushFightCount,
  164. Reward: this.FightCountReward,
  165. RankReward: this.RankRewardRound,
  166. }
  167. this.role.SendDb(saveMsg)
  168. }
  169. func (this *RoleTower) CopyData(data *serverproto.RoleTower) {
  170. data.NowTowerLevel = this.nowTowerLevel
  171. data.NowTowerWjLevel = this.nowTowerWjLevel
  172. data.Boss = this.boss
  173. data.Buff2 = this.buff2
  174. data.Buff3 = this.buff3
  175. data.Buff1 = this.buff1
  176. data.Duration = this.duration
  177. data.RewardLevel = this.rewardLevel
  178. data.TowerLevelDayRewardTime = this.towerLevelDayRewardTime
  179. data.NowTowerWjTime = this.nowTowerWjPassTime
  180. }
  181. func (this *RoleTower) Update(ms uint64) {
  182. }
  183. func (this *RoleTower) DailyReset(notify bool) {
  184. if this.duration != TowerMag.day {
  185. this.boss = make([]int32, 0)
  186. this.nowTowerWjLevel = 1
  187. this.duration = TowerMag.day
  188. this.TowerBossRandom()
  189. this.buff1 = 0
  190. this.buff2 = 0
  191. this.buff3 = 0
  192. this.rewardLevel = 0
  193. }
  194. if notify {
  195. ntf := &serverproto.SCClimbingTowerWjBossNtf{
  196. Boos: this.boss,
  197. WjLevel: this.nowTowerWjLevel,
  198. Buff1: this.buff1,
  199. Buff2: this.buff2,
  200. Buff3: this.buff3,
  201. Duration: this.duration,
  202. RewardLevel: this.rewardLevel,
  203. }
  204. this.role.ReplayGate(ntf, true)
  205. }
  206. //this.dailyResetExpedition(notify)
  207. this.SetDirty(true)
  208. }
  209. func (this *RoleTower) OnlineSysReward() {
  210. this.SysRewardTime = util.GetTimeMilliseconds()
  211. this.SetDirty(true)
  212. var rewardTower *model.ConvertSysRewardData = nil
  213. for idx := 0; idx < len(model.ConvertSysRewardList); idx++ {
  214. if this.nowTowerLevel < model.ConvertSysRewardList[idx].TowerLevel {
  215. break
  216. }
  217. rewardTower = model.ConvertSysRewardList[idx]
  218. }
  219. if rewardTower != nil && this.role.GetRolePet() != nil {
  220. this.role.GetRolePet().AddPetEquipByMapList(rewardTower.RewardList, false)
  221. }
  222. //util.InfoF("uid=%v OnlineSysReward rewardlist=%v", this.role.GetUUid(), rewardTower)
  223. }
  224. func (this *RoleTower) GetCurTower() int32 {
  225. return this.nowTowerLevel
  226. }
  227. func (this *RoleTower) IsTowerUnlock() bool {
  228. globalCfg, ok := serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_Climbing_Tower_Unlock)]
  229. if !ok {
  230. util.InfoF("uid=%v signup version not found", this.role.GetUUid())
  231. return false
  232. }
  233. if this.role.GetRoleBattle().GetLevelId() < globalCfg.IVal {
  234. return false
  235. }
  236. return true
  237. }
  238. func (this *RoleTower) OnTowerFightBegin(towerLevel int32) (serverproto.ErrorCode, []*serverproto.KeyValueType) {
  239. if this.IsTowerUnlock() == false {
  240. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED, nil
  241. }
  242. if towerLevel != this.nowTowerLevel+1 {
  243. util.DebugF("[RoleTower] OnTowerFightBegin....tower level error [%v]: %v - %v", this.role.GetUUid(), towerLevel, this.nowTowerLevel)
  244. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER, nil
  245. }
  246. cfgData, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  247. if !ok {
  248. util.DebugF("[RoleTower] OnTowerFightBegin....config not found [%v]:%v", this.role.GetUUid(), towerLevel)
  249. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND, nil
  250. }
  251. //先判定是否通过
  252. this.fightBeginTime = util.GetTimeSeconds()
  253. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Count, 1)
  254. util.DebugF("[RoleTower] OnTowerFightBegin....new tower battle begin [%v]", this.role.GetUUid())
  255. //获取衰减系数
  256. var decayList []*serverproto.KeyValueType
  257. if this.role.roleBattleAttr.curTotalFightPower > uint32(cfgData.FightCheck) {
  258. //if this.role.GetRoleFightPower().TotalFightPower > uint64(cfgData.FightCheck) {
  259. var kvList = map[int32]int32{}
  260. this.getDecayList(kvList)
  261. for k, v := range kvList {
  262. decayList = append(decayList, &serverproto.KeyValueType{Key: k, Value: v})
  263. }
  264. }
  265. reqMsg := &serverproto.SSRushDataChangeReq{}
  266. reqMsg.Uid = this.role.GetUUid()
  267. reqMsg.RushType = model.Rush_Type_Tower
  268. reqMsg.Score = 1
  269. this.role.SendRank(reqMsg)
  270. //todo wangzhaocan 发送到rank服务器
  271. return serverproto.ErrorCode_ERROR_OK, decayList
  272. }
  273. func (this *RoleTower) OnTowerWjFightBegin(towerLevel int32) serverproto.ErrorCode {
  274. if this.IsTowerUnlock() == false {
  275. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  276. }
  277. if towerLevel != this.nowTowerWjLevel {
  278. util.DebugF("[RoleTower] OnTowerFightBegin....tower level error [%v]: %v - %v", this.role.GetUUid(), towerLevel, this.nowTowerLevel)
  279. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER
  280. }
  281. //先判定是否通过
  282. //this.fightBeginTime = util.GetTimeSeconds()
  283. //TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Count, 1)
  284. //util.DebugF("[RoleTower] OnTowerFightBegin....new tower battle begin [%v]", this.role.GetUUid())
  285. //reqMsg := &serverproto.SSRushDataChangeReq{}
  286. //reqMsg.Uid = this.role.GetUUid()
  287. //reqMsg.RushType = model.Rush_Type_Tower
  288. //reqMsg.Score = 1
  289. //this.role.SendRank(reqMsg)
  290. //todo wangzhaocan 发送到rank服务器
  291. return serverproto.ErrorCode_ERROR_OK
  292. }
  293. func (this *RoleTower) OnTowerWjFightBuff(buff1, buff2, buff3 int32) (b1, b2, b3 int32, err serverproto.ErrorCode) {
  294. if this.IsTowerUnlock() == false {
  295. return 0, 0, 0, serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  296. }
  297. var globalData *serverproto.GlobalCfg
  298. var costItemList = map[int32]int32{}
  299. if buff1 > 0 {
  300. globalData = serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_TowerBuff1Cost)]
  301. if this.buff1 < globalData.IVal {
  302. util.InfoF("1111111:%v", model.TowerBuff1Cost)
  303. for i, v := range model.TowerBuff1Cost {
  304. if int32(i) == this.buff1 {
  305. costItemList[v.Key] = v.Value
  306. }
  307. }
  308. }
  309. } else if buff2 > 0 {
  310. globalData = serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_TowerBuff2Cost)]
  311. if this.buff2 < globalData.IVal {
  312. util.InfoF("1111111:%v", model.TowerBuff2Cost)
  313. for i, v := range model.TowerBuff2Cost {
  314. if int32(i) == this.buff2 {
  315. costItemList[v.Key] = v.Value
  316. }
  317. }
  318. }
  319. } else if buff3 > 0 {
  320. globalData = serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_TowerBuff3Cost)]
  321. if this.buff3 < globalData.IVal {
  322. util.InfoF("1111111:%v", model.TowerBuff3Cost)
  323. for i, v := range model.TowerBuff3Cost {
  324. if int32(i) == this.buff3 {
  325. costItemList[v.Key] = v.Value
  326. }
  327. }
  328. }
  329. } else {
  330. return 0, 0, 0, serverproto.ErrorCode_ERROR_FAIL
  331. }
  332. if this.role.CheckResLitNum(costItemList) == false {
  333. util.ErrorF("uid=%v towerWjBuff buy error resource not enough!! costItemList=%v", this.role.GetUUid(), costItemList)
  334. return 0, 0, 0, serverproto.ErrorCode_ERROR_FAIL
  335. }
  336. this.role.DelItemList(costItemList, AddItemST{AddFrom: AddFrom_Tower})
  337. if buff1 > 0 {
  338. this.buff1++
  339. } else if buff2 > 0 {
  340. this.buff2++
  341. } else if buff3 > 0 {
  342. this.buff3++
  343. } else {
  344. return 0, 0, 0, serverproto.ErrorCode_ERROR_FAIL
  345. }
  346. this.SetDirty(true)
  347. ntf := &serverproto.SCClimbingTowerWjBossNtf{
  348. Boos: this.boss,
  349. WjLevel: this.nowTowerWjLevel,
  350. Buff1: this.buff1,
  351. Buff2: this.buff2,
  352. Buff3: this.buff3,
  353. Duration: this.duration,
  354. RewardLevel: this.rewardLevel,
  355. }
  356. this.role.ReplayGate(ntf, true)
  357. util.InfoF("uuid:%v tower buff buy buff1:%v,buff2:%v,buff3:%v", this.role.GetUUid(), this.buff1, this.buff2, this.buff3)
  358. return this.buff1, this.buff2, this.buff3, serverproto.ErrorCode_ERROR_OK
  359. }
  360. func (this *RoleTower) getDecayList(kvList map[int32]int32) {
  361. convertData, ok := model.ConvertClimbPowerDecayFactorList[this.nowTowerLevel+1]
  362. if ok {
  363. convertData.GetDecayList(kvList, uint64(this.role.roleBattleAttr.curTotalFightPower))
  364. //convertData.GetDecayList(kvList, this.role.GetRoleFightPower().TotalFightPower)
  365. }
  366. convertData, ok = model.ConvertClimbTimeDecayFactorList[this.nowTowerLevel+1]
  367. if ok {
  368. deltaTime := (util.GetTimeSeconds() - this.nowTowerPassTime) / 60
  369. convertData.GetDecayList(kvList, uint64(deltaTime))
  370. }
  371. cfgData, ok := model.ConvertTowerData[this.nowTowerLevel+1]
  372. if ok && cfgData.SPAdd != nil {
  373. kvList[cfgData.SPAdd.Key] += cfgData.SPAdd.Value
  374. }
  375. util.InfoF("uid=%v RoleTowerDecay kv=%v", this.role.GetUUid(), kvList)
  376. }
  377. func (this *RoleTower) OnTowerWjFightEnd(towerLevel, fightTime int32, recordTimeStamp uint64, ackMsg *serverproto.SCClimbingTowerWjEndAck) serverproto.ErrorCode {
  378. if ackMsg == nil {
  379. return serverproto.ErrorCode_ERROR_FAIL
  380. }
  381. if this.IsTowerUnlock() == false {
  382. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  383. }
  384. if towerLevel != this.nowTowerWjLevel {
  385. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER
  386. }
  387. if this.duration != TowerMag.day {
  388. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER
  389. }
  390. //towerCfg, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  391. //if !ok {
  392. // return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND
  393. //}
  394. ////战斗力校验
  395. //curTotalFightPower := this.role.roleBattleAttr.curTotalFightPower
  396. //if curTotalFightPower > 0 && curTotalFightPower < uint32(towerCfg.FightCheck) {
  397. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  398. //}
  399. //if this.role.GetRoleFightPower() != nil && this.role.GetRoleFightPower().TotalFightPower < uint64(towerCfg.FightCheck) {
  400. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  401. //}
  402. //deltaTime := util.GetTimeSeconds() - this.nowTowerPassTime
  403. ////时间判断 CloseDown
  404. //tmpStrList := strings.Split(towerCfg.CloseDown, ";")
  405. //if len(tmpStrList) >= 2 {
  406. // tmpChallengeTime, _ := model.Str2Num(tmpStrList[0])
  407. // tmpRecharge, _ := model.Str2Num(tmpStrList[1])
  408. // //1 在对应关卡或者爬塔层的停留时间≥60分钟时,不会触发判定外挂机制
  409. // //2 玩家战力≥2.5*最低通关战力时,不会触发判定机制
  410. // fightCheck := uint64(towerCfg.FightCheck) * 25 / 10
  411. // if tmpChallengeTime > 0 && deltaTime < 60*60 && curTotalFightPower < uint32(fightCheck) && curTotalFightPower > 0 {
  412. // if int(this.role.GetTotalRecharge()) < tmpRecharge && fightTime < int32(tmpChallengeTime) {
  413. // this.role.GetRoleStatistic().RecordCheatData(CheatType_TowerLevel)
  414. // return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_CD_TIME
  415. // }
  416. // }
  417. //}
  418. //if fightTime < 0 || (towerCfg.MaxFightingTime+1 < fightTime) { //1秒修正时间
  419. // util.DebugF("[RoleTower] OnTowerFightEnd...fight time out %v, %v--%v--%v, %v ", this.role.GetUUid(), this.fightBeginTime, util.GetTimeSeconds(), fightTime, towerCfg.MaxFightingTime)
  420. // return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_OUT_OF_TIME
  421. //}
  422. //给奖励
  423. //var rewardList *model.TowerWjReward
  424. for _, v := range model.ConvertTowerWjData[TowerMag.day] {
  425. if this.nowTowerWjLevel >= v.Max && this.rewardLevel < v.Max {
  426. var addItemList = map[int32]int32{}
  427. for _, exItems := range v.ExItemList {
  428. addItemList[exItems.Key] += exItems.Value
  429. }
  430. this.role.AddItemList(addItemList, AddFrom_Tower, true)
  431. this.rewardLevel = this.nowTowerWjLevel
  432. ackMsg.ExRewardList = v.ExItemList
  433. }
  434. }
  435. if this.nowTowerWjLevel == 1000 {
  436. TowerMag.isRefresh = true
  437. this.nowTowerWjLevel = -1
  438. } else {
  439. this.nowTowerWjLevel++
  440. }
  441. //当前关卡通过//跟新当前关卡,战力到rank,排名
  442. //this.passTowerInfoToRank(recordTimeStamp, int32(fightTime), false)
  443. this.nowTowerWjPassTime = util.GetTimeSeconds()
  444. this.TowerBossRandom() //随机下一关boss
  445. this.refreshTowerWj = int64(fightTime)
  446. this.SetDirty(true)
  447. util.InfoF("uuid:%v tower wj get level:%v", this.role.GetUUid(), this.nowTowerWjLevel)
  448. //this.onTowerLevelChange(this.nowTowerLevel - 1)
  449. //更新排行榜
  450. this.passTowerWjInfoToRank(recordTimeStamp, fightTime, false)
  451. ackMsg.TowerLevel = this.nowTowerWjLevel
  452. ackMsg.PassTime = this.nowTowerWjPassTime
  453. ntf := &serverproto.SCClimbingTowerWjBossNtf{
  454. Boos: this.boss,
  455. Buff1: this.buff1,
  456. Buff2: this.buff2,
  457. Buff3: this.buff3,
  458. WjLevel: this.nowTowerWjLevel,
  459. Duration: TowerMag.day,
  460. RefreshTowerWj: this.refreshTowerWj,
  461. RewardLevel: this.rewardLevel,
  462. }
  463. this.role.ReplayGate(ntf, true)
  464. //if this.role.GetRoleCard() != nil {
  465. // this.role.GetRoleCard().CheckUnLockState()
  466. //}
  467. return serverproto.ErrorCode_ERROR_OK
  468. }
  469. func (this *RoleTower) OnTowerFightEnd(towerLevel, fightTime int32, recordTimeStamp uint64, ackMsg *serverproto.SCClimbingTowerEndAck) serverproto.ErrorCode {
  470. if ackMsg == nil {
  471. return serverproto.ErrorCode_ERROR_FAIL
  472. }
  473. if this.IsTowerUnlock() == false {
  474. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  475. }
  476. if towerLevel != this.nowTowerLevel+1 {
  477. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER
  478. }
  479. towerCfg, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  480. if !ok {
  481. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND
  482. }
  483. //战斗力校验
  484. curTotalFightPower := this.role.roleBattleAttr.curTotalFightPower
  485. if curTotalFightPower > 0 && curTotalFightPower < uint32(towerCfg.FightCheck) {
  486. return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  487. }
  488. //if this.role.GetRoleFightPower() != nil && this.role.GetRoleFightPower().TotalFightPower < uint64(towerCfg.FightCheck) {
  489. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  490. //}
  491. //deltaTime := util.GetTimeSeconds() - this.nowTowerPassTime
  492. ////时间判断 CloseDown
  493. //tmpStrList := strings.Split(towerCfg.CloseDown, ";")
  494. //if len(tmpStrList) >= 2 {
  495. // tmpChallengeTime, _ := model.Str2Num(tmpStrList[0])
  496. // tmpRecharge, _ := model.Str2Num(tmpStrList[1])
  497. // //1 在对应关卡或者爬塔层的停留时间≥60分钟时,不会触发判定外挂机制
  498. // //2 玩家战力≥2.5*最低通关战力时,不会触发判定机制
  499. // fightCheck := uint64(towerCfg.FightCheck) * 25 / 10
  500. // if tmpChallengeTime > 0 && deltaTime < 60*60 && curTotalFightPower < uint32(fightCheck) && curTotalFightPower > 0 {
  501. // if int(this.role.GetTotalRecharge()) < tmpRecharge && fightTime < int32(tmpChallengeTime) {
  502. // this.role.GetRoleStatistic().RecordCheatData(CheatType_TowerLevel)
  503. // return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_CD_TIME
  504. // }
  505. // }
  506. //}
  507. if fightTime < 0 || (towerCfg.MaxFightingTime+1 < fightTime) { //1秒修正时间
  508. util.DebugF("[RoleTower] OnTowerFightEnd...fight time out %v, %v--%v--%v, %v ", this.role.GetUUid(), this.fightBeginTime, util.GetTimeSeconds(), fightTime, towerCfg.MaxFightingTime)
  509. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_OUT_OF_TIME
  510. }
  511. //给奖励
  512. data, ok := model.ConvertTowerData[towerLevel]
  513. if ok {
  514. var addItemList = map[int32]int32{}
  515. for _, items := range data.ItemList {
  516. addItemList[items.Key] += items.Value
  517. }
  518. for _, exItems := range data.ExItemList {
  519. addItemList[exItems.Key] += exItems.Value
  520. }
  521. this.role.AddItemList(addItemList, AddFrom_Tower, true)
  522. }
  523. this.nowTowerLevel++
  524. //当前关卡通过//跟新当前关卡,战力到rank,排名
  525. this.passTowerInfoToRank(recordTimeStamp, int32(fightTime), false)
  526. this.nowTowerPassTime = util.GetTimeSeconds()
  527. this.SetDirty(true)
  528. this.onTowerLevelChange(this.nowTowerLevel - 1)
  529. ackMsg.TowerLevel = this.nowTowerLevel
  530. ackMsg.PassTime = this.nowTowerPassTime
  531. ackMsg.RewardList = data.ItemList
  532. ackMsg.ExRewardList = data.ExItemList
  533. if this.role.GetRoleCard() != nil {
  534. this.role.GetRoleCard().CheckUnLockState()
  535. }
  536. return serverproto.ErrorCode_ERROR_OK
  537. }
  538. func (this *RoleTower) onTowerLevelChange(oldTowerLevel int32) {
  539. if this.role.GetRoleCard() != nil {
  540. this.role.GetRoleCard().CheckUnLockState()
  541. }
  542. //超值礼包开启
  543. if this.role.GetRoleActivity() != nil {
  544. this.role.GetRoleActivity().SuperChargeUnlockCheck(
  545. serverproto.UnlockChargeType_UChargeType_ClimbTowerLevel, &SuperChargeUnlockST{oldValue: oldTowerLevel})
  546. }
  547. //跟新简介信息
  548. this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
  549. //爬塔层数
  550. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Level, this.nowTowerLevel)
  551. }
  552. func (this *RoleTower) PackFriendFightTower(towerLevel int32, ackMsg *serverproto.SCClimbingTowerEndAck) {
  553. if ackMsg == nil {
  554. return
  555. }
  556. tower, ok := this.friendTower[towerLevel]
  557. if !ok {
  558. return
  559. }
  560. info := &serverproto.FriendTowerInfo{
  561. TowerLevel: towerLevel,
  562. }
  563. for _, brief := range tower {
  564. info.Infos = append(info.Infos, brief)
  565. }
  566. ackMsg.PassInfo = info
  567. }
  568. // 通关更新榜单
  569. func (this *RoleTower) passTowerInfoToRank(recordTimeStamp uint64, battleTime int32, isGM bool) {
  570. ntfMsg := &serverproto.SSTowerPassFightPowerNtf{
  571. TowerBfInfo: &serverproto.TowerBriefInfo{
  572. CommonInfo: &serverproto.CommonPlayerBriefInfo{
  573. BattleRecordId: model.GenerateUid(),
  574. },
  575. BattleTime: battleTime,
  576. },
  577. RecordTimeStamp: recordTimeStamp,
  578. }
  579. levelCfgData, ok := serverproto.ClimbingTowerCfgLoader[this.nowTowerLevel]
  580. if ok {
  581. ntfMsg.TowerBfInfo.BattleVersion = levelCfgData.Version
  582. }
  583. this.role.GetRoleBriefInfo(ntfMsg.TowerBfInfo.CommonInfo)
  584. //获取当前最新战力
  585. //ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.GetRoleFightPower().TotalFightPower)
  586. ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.roleBattleAttr.curTotalFightPower)
  587. //修正通关数据
  588. ntfMsg.TowerBfInfo.CommonInfo.TowerLevel = this.nowTowerLevel
  589. ntfMsg.TowerBfInfo.CommonInfo.TowerTime = uint64(util.GetTimeSeconds())
  590. this.role.SendRank(ntfMsg)
  591. }
  592. // 通关更新榜单
  593. func (this *RoleTower) passTowerWjInfoToRank(recordTimeStamp uint64, battleTime int32, isGM bool) {
  594. ntfMsg := &serverproto.SSTowerPassFightPowerNtf{
  595. TowerBfInfo: &serverproto.TowerBriefInfo{
  596. CommonInfo: &serverproto.CommonPlayerBriefInfo{
  597. BattleRecordId: model.GenerateUid(),
  598. },
  599. BattleTime: battleTime,
  600. },
  601. RecordTimeStamp: recordTimeStamp,
  602. Type: 1,
  603. }
  604. this.role.GetRoleBriefInfo(ntfMsg.TowerBfInfo.CommonInfo)
  605. //获取当前最新战力
  606. //ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.GetRoleFightPower().TotalFightPower)
  607. ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.roleBattleAttr.curTotalFightPower)
  608. //修正通关数据
  609. ntfMsg.TowerBfInfo.CommonInfo.TowerLevel = this.nowTowerWjLevel - 1
  610. ntfMsg.TowerBfInfo.CommonInfo.TowerTime = uint64(util.GetTimeSeconds())
  611. this.role.SendRank(ntfMsg)
  612. }
  613. func (this *RoleTower) SendFriendInfoReqToDB(begin, end int32) {
  614. ntfMsg := &serverproto.SSGetFriendTowerInfoReq{}
  615. UidList := this.role.GetRoleSocial().GetFriendList()
  616. if UidList == nil {
  617. //清空好友爬塔数据
  618. this.friendTower = make(map[int32][]*serverproto.CommonPlayerBriefInfo)
  619. return
  620. }
  621. for _, data := range UidList {
  622. ntfMsg.UidList = append(ntfMsg.UidList, data)
  623. }
  624. ntfMsg.Begin = begin
  625. ntfMsg.End = end
  626. this.role.SendDb(ntfMsg)
  627. }
  628. func (this *RoleTower) GetClimbingTowerInfo() {
  629. ackMsg := &serverproto.SCClimbingTowerInfoAck{}
  630. ackMsg.NowTowerLevel = this.nowTowerLevel
  631. ackMsg.PassTime = this.nowTowerPassTime
  632. ackMsg.TowerLevelDayRewardTime = this.towerLevelDayRewardTime
  633. //判断有没有到刷新时间
  634. if this.RefreshTime != 0 && (this.RefreshTime+Refresh_Time_Gap >= util.GetTimeSeconds()) {
  635. //取[towerLevel+1 - towerLevel + 5]的数据
  636. if len(this.friendTower) > 0 {
  637. for level := this.nowTowerLevel + 1; level <= this.nowTowerLevel+5; level++ {
  638. towerData, ok := this.friendTower[level]
  639. if !ok || len(towerData) <= 0 {
  640. continue
  641. }
  642. info := &serverproto.FriendTowerInfo{}
  643. info.TowerLevel = level
  644. for _, data := range towerData {
  645. info.Infos = append(info.Infos, data)
  646. }
  647. ackMsg.Infos = append(ackMsg.Infos, info)
  648. }
  649. }
  650. } else {
  651. //发送请求到DB刷新一遍好友信息
  652. this.SendFriendInfoReqToDB(this.nowTowerLevel+1, this.nowTowerLevel+5)
  653. }
  654. this.role.ReplayGate(ackMsg, true)
  655. }
  656. // 获得层数区间的所有好友
  657. func (this *RoleTower) GetFriendTowerRange(begin, end int32) serverproto.ErrorCode {
  658. if begin > end || begin <= 0 || end <= 0 {
  659. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_FRIEND_ARGS
  660. }
  661. //还在刷新时间内
  662. if this.RefreshTime != 0 && (this.RefreshTime+Refresh_Time_Gap >= util.GetTimeSeconds()) {
  663. ackMsg := &serverproto.SCFriendPassTowerInfoAck{}
  664. //取[begin, end]的数据
  665. for level := begin; level <= end; level++ {
  666. towerData, ok := this.friendTower[level]
  667. if !ok || len(towerData) <= 0 {
  668. continue
  669. }
  670. info := &serverproto.FriendTowerInfo{}
  671. info.TowerLevel = level
  672. for _, data := range towerData {
  673. info.Infos = append(info.Infos, data)
  674. }
  675. ackMsg.Infos = append(ackMsg.Infos, info)
  676. }
  677. this.role.ReplayGate(ackMsg, true)
  678. } else {
  679. //发送请求到DB刷新一遍好友信息
  680. this.SendFriendInfoReqToDB(begin, end)
  681. }
  682. return serverproto.ErrorCode_ERROR_OK
  683. }
  684. func (this *RoleTower) SendClimbingTowerInfo(begin int32, end int32) {
  685. ackMsg := &serverproto.SCFriendPassTowerInfoAck{}
  686. //取[begin, end]的数据
  687. for level := begin; level <= end; level++ {
  688. towerData, ok := this.friendTower[level]
  689. if !ok || len(towerData) <= 0 {
  690. continue
  691. }
  692. info := &serverproto.FriendTowerInfo{}
  693. info.TowerLevel = level
  694. for _, data := range towerData {
  695. info.Infos = append(info.Infos, data)
  696. }
  697. ackMsg.Infos = append(ackMsg.Infos, info)
  698. }
  699. this.role.ReplayGate(ackMsg, true)
  700. }
  701. func (this *RoleTower) SetFriendBriefInfo(briefs []*serverproto.CommonPlayerBriefInfo) serverproto.ErrorCode {
  702. if briefs == nil {
  703. this.RefreshTime = util.GetTimeSeconds()
  704. return serverproto.ErrorCode_ERROR_OK
  705. }
  706. //重置
  707. this.friendTower = make(map[int32][]*serverproto.CommonPlayerBriefInfo)
  708. for _, data := range briefs {
  709. this.friendTower[data.TowerLevel] = append(this.friendTower[data.TowerLevel], data)
  710. }
  711. this.RefreshTime = util.GetTimeSeconds()
  712. return serverproto.ErrorCode_ERROR_OK
  713. }
  714. func (this *RoleTower) SetTowerLevel(level int32) {
  715. if this.nowTowerLevel >= level {
  716. return
  717. }
  718. _, ok := serverproto.ClimbingTowerCfgLoader[level]
  719. if !ok {
  720. return
  721. }
  722. this.nowTowerLevel = level
  723. this.nowTowerPassTime = util.GetTimeSeconds()
  724. this.passTowerInfoToRank(0, 0, true)
  725. this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
  726. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Level, this.nowTowerLevel)
  727. this.SetDirty(true)
  728. if this.role.GetRoleCard() != nil {
  729. this.role.GetRoleCard().CheckUnLockState()
  730. }
  731. }
  732. //============================================= 爬塔冲榜 ============================================================
  733. func (this *RoleTower) OnlineGetRushTowerBaseReward(rewardRound int32) {
  734. if rewardRound < 0 {
  735. return
  736. }
  737. if this.FightCountReward >= rewardRound {
  738. this.RushFightCount = 0
  739. this.SetDirty(true)
  740. return
  741. }
  742. var addItemList = map[int32]int32{}
  743. model.GetRushActivityBaseReward(this.RushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  744. if len(addItemList) > 0 {
  745. this.role.AddMail(model.GlobalMailRushTowerBaseReward, serverproto.MailType_MailType_RushTower,
  746. addItemList, []int32{this.RushFightCount}, "", "")
  747. }
  748. this.FightCountReward = rewardRound
  749. this.SetDirty(true)
  750. }
  751. func (this *RoleTower) GetRushTowerBaseReward(ackMsg *serverproto.SCRushActivityRewardAck, rushRound int32) serverproto.ErrorCode {
  752. if ackMsg == nil {
  753. return serverproto.ErrorCode_ERROR_FAIL
  754. }
  755. if this.FightCountReward >= rushRound {
  756. return serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH
  757. }
  758. var addItemList = map[int32]int32{}
  759. model.GetRushActivityBaseReward(rushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  760. if len(addItemList) <= 0 {
  761. return serverproto.ErrorCode_ERROR_FAIL
  762. }
  763. for key, value := range addItemList {
  764. ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
  765. Key: key,
  766. Value: value,
  767. })
  768. }
  769. this.role.AddItemList(addItemList, AddFrom_RushTower, true)
  770. this.FightCountReward = rushRound
  771. this.SetDirty(true)
  772. return serverproto.ErrorCode_ERROR_OK
  773. }
  774. func (this *RoleTower) GetRushTowerRankReward(ssAck *serverproto.SSGetRushRewardAck) serverproto.ErrorCode {
  775. if ssAck == nil {
  776. return serverproto.ErrorCode_ERROR_FAIL
  777. }
  778. if this.RankRewardRound >= ssAck.RushRound {
  779. return serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH
  780. }
  781. var addItemList = map[int32]int32{}
  782. for _, data := range ssAck.ItemList {
  783. addItemList[data.Key] += data.Value
  784. }
  785. this.role.AddItemList(addItemList, AddFrom_RushTower, true)
  786. this.RankRewardRound = ssAck.RushRound
  787. this.SetDirty(true)
  788. return serverproto.ErrorCode_ERROR_OK
  789. }
  790. func (this *RoleTower) GetRushTowerInfo(ackMsg *serverproto.SCTowerActivityAck, curRushRound int32) {
  791. if ackMsg == nil {
  792. return
  793. }
  794. ackMsg.FightCount = this.RushFightCount
  795. ackMsg.RankReward = false
  796. if this.RankRewardRound >= curRushRound {
  797. ackMsg.RankReward = true
  798. }
  799. ackMsg.ChallengReward = false
  800. if this.FightCountReward >= curRushRound {
  801. ackMsg.ChallengReward = true
  802. }
  803. }
  804. // 增加冲榜分数
  805. func (this *RoleTower) AddRushTowerScore(rushRound int32, score int32) {
  806. if rushRound == 0 {
  807. return
  808. }
  809. if rushRound == this.RushRound {
  810. this.RushFightCount++
  811. } else {
  812. this.RushRound = rushRound
  813. this.RushFightCount = 1
  814. }
  815. this.SetDirty(true)
  816. }
  817. func (this *RoleTower) CheckRankReward(finishRound int32) serverproto.ErrorCode {
  818. if this.RankRewardRound >= finishRound {
  819. return serverproto.ErrorCode_ERROR_FAIL
  820. }
  821. return serverproto.ErrorCode_ERROR_OK
  822. }
  823. func (this *RoleTower) SetRankReward(finishRound int32) {
  824. this.RankRewardRound = finishRound
  825. this.SetDirty(true)
  826. }
  827. // todo 根据round来设置
  828. func (this *RoleTower) GetFightCountMailReward(rushRound int32) {
  829. if rushRound <= 0 {
  830. return
  831. }
  832. if this.FightCountReward < rushRound {
  833. //发送上一轮冲榜战斗次数的奖励邮件
  834. var addItemList = map[int32]int32{}
  835. model.GetRushActivityBaseReward(this.RushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  836. if len(addItemList) > 0 {
  837. this.role.AddMail(model.GlobalMailRushTowerBaseReward, serverproto.MailType_MailType_RushTower,
  838. addItemList, []int32{this.RushFightCount}, "", "")
  839. }
  840. this.FightCountReward = rushRound
  841. this.RushFightCount = 0
  842. this.SetDirty(true)
  843. }
  844. }
  845. // 获取试炼馈赠
  846. func (this *RoleTower) GetTowerLevelDayReward() serverproto.ErrorCode {
  847. curTime := util.GetTimeMilliseconds()
  848. //判断当前是否已经领取
  849. if curTime <= this.towerLevelDayRewardTime {
  850. return serverproto.ErrorCode_ERROR_FAIL
  851. }
  852. dayRewardIdx := -1
  853. for idx := 0; idx < len(model.GlobalClimbingTowerDayReward); idx++ {
  854. if model.GlobalClimbingTowerDayReward[idx].Key > this.nowTowerLevel {
  855. break
  856. }
  857. dayRewardIdx = idx
  858. }
  859. if dayRewardIdx < 0 || dayRewardIdx >= len(model.GlobalClimbingTowerDayReward) {
  860. return serverproto.ErrorCode_ERROR_FAIL
  861. }
  862. this.role.AddItem(int32(serverproto.ResType_Res_CreditRecharge),
  863. model.GlobalClimbingTowerDayReward[dayRewardIdx].Value, AddFrom_Tower)
  864. this.towerLevelDayRewardTime = util.GetLatest5Hour()
  865. this.SetDirty(true)
  866. // reward ack msg
  867. ackMsg := &serverproto.SCClimbingTowerDayRewardAck{
  868. NextDayRewardTime: this.towerLevelDayRewardTime,
  869. }
  870. ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{
  871. Key: int32(serverproto.ResType_Res_CreditRecharge),
  872. Value: model.GlobalClimbingTowerDayReward[dayRewardIdx].Value,
  873. })
  874. this.role.ReplayGate(ackMsg, true)
  875. return serverproto.ErrorCode_ERROR_OK
  876. }