role_tower.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  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. }
  180. func (this *RoleTower) Update(ms uint64) {
  181. }
  182. func (this *RoleTower) OnlineSysReward() {
  183. this.SysRewardTime = util.GetTimeMilliseconds()
  184. this.SetDirty(true)
  185. var rewardTower *model.ConvertSysRewardData = nil
  186. for idx := 0; idx < len(model.ConvertSysRewardList); idx++ {
  187. if this.nowTowerLevel < model.ConvertSysRewardList[idx].TowerLevel {
  188. break
  189. }
  190. rewardTower = model.ConvertSysRewardList[idx]
  191. }
  192. if rewardTower != nil && this.role.GetRolePet() != nil {
  193. this.role.GetRolePet().AddPetEquipByMapList(rewardTower.RewardList, false)
  194. }
  195. //util.InfoF("uid=%v OnlineSysReward rewardlist=%v", this.role.GetUUid(), rewardTower)
  196. }
  197. func (this *RoleTower) GetCurTower() int32 {
  198. return this.nowTowerLevel
  199. }
  200. func (this *RoleTower) IsTowerUnlock() bool {
  201. globalCfg, ok := serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_Climbing_Tower_Unlock)]
  202. if !ok {
  203. util.InfoF("uid=%v signup version not found", this.role.GetUUid())
  204. return false
  205. }
  206. if this.role.GetRoleBattle().GetLevelId() < globalCfg.IVal {
  207. return false
  208. }
  209. return true
  210. }
  211. func (this *RoleTower) OnTowerFightBegin(towerLevel int32) (serverproto.ErrorCode, []*serverproto.KeyValueType) {
  212. if this.IsTowerUnlock() == false {
  213. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED, nil
  214. }
  215. if towerLevel != this.nowTowerLevel+1 {
  216. util.DebugF("[RoleTower] OnTowerFightBegin....tower level error [%v]: %v - %v", this.role.GetUUid(), towerLevel, this.nowTowerLevel)
  217. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER, nil
  218. }
  219. cfgData, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  220. if !ok {
  221. util.DebugF("[RoleTower] OnTowerFightBegin....config not found [%v]:%v", this.role.GetUUid(), towerLevel)
  222. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND, nil
  223. }
  224. //先判定是否通过
  225. this.fightBeginTime = util.GetTimeSeconds()
  226. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Count, 1)
  227. util.DebugF("[RoleTower] OnTowerFightBegin....new tower battle begin [%v]", this.role.GetUUid())
  228. //获取衰减系数
  229. var decayList []*serverproto.KeyValueType
  230. if this.role.roleBattleAttr.curTotalFightPower > uint32(cfgData.FightCheck) {
  231. //if this.role.GetRoleFightPower().TotalFightPower > uint64(cfgData.FightCheck) {
  232. var kvList = map[int32]int32{}
  233. this.getDecayList(kvList)
  234. for k, v := range kvList {
  235. decayList = append(decayList, &serverproto.KeyValueType{Key: k, Value: v})
  236. }
  237. }
  238. reqMsg := &serverproto.SSRushDataChangeReq{}
  239. reqMsg.Uid = this.role.GetUUid()
  240. reqMsg.RushType = model.Rush_Type_Tower
  241. reqMsg.Score = 1
  242. this.role.SendRank(reqMsg)
  243. //todo wangzhaocan 发送到rank服务器
  244. return serverproto.ErrorCode_ERROR_OK, decayList
  245. }
  246. func (this *RoleTower) OnTowerWjFightBegin(towerLevel int32) serverproto.ErrorCode {
  247. if this.IsTowerUnlock() == false {
  248. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  249. }
  250. if towerLevel != this.nowTowerWjLevel {
  251. util.DebugF("[RoleTower] OnTowerFightBegin....tower level error [%v]: %v - %v", this.role.GetUUid(), towerLevel, this.nowTowerLevel)
  252. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER
  253. }
  254. //先判定是否通过
  255. //this.fightBeginTime = util.GetTimeSeconds()
  256. //TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Count, 1)
  257. //util.DebugF("[RoleTower] OnTowerFightBegin....new tower battle begin [%v]", this.role.GetUUid())
  258. //reqMsg := &serverproto.SSRushDataChangeReq{}
  259. //reqMsg.Uid = this.role.GetUUid()
  260. //reqMsg.RushType = model.Rush_Type_Tower
  261. //reqMsg.Score = 1
  262. //this.role.SendRank(reqMsg)
  263. //todo wangzhaocan 发送到rank服务器
  264. return serverproto.ErrorCode_ERROR_OK
  265. }
  266. func (this *RoleTower) OnTowerWjFightBuff(buff1, buff2, buff3 int32) (b1, b2, b3 int32, err serverproto.ErrorCode) {
  267. if this.IsTowerUnlock() == false {
  268. return 0, 0, 0, serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  269. }
  270. var globalData *serverproto.GlobalCfg
  271. var costItemList = map[int32]int32{}
  272. if buff1 > 0 {
  273. globalData = serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_TowerBuff1Cost)]
  274. if this.buff1 < globalData.IVal {
  275. util.InfoF("1111111:%v", model.TowerBuff1Cost)
  276. for i, v := range model.TowerBuff1Cost {
  277. if int32(i) == this.buff1 {
  278. costItemList[v.Key] = v.Value
  279. }
  280. }
  281. }
  282. } else if buff2 > 0 {
  283. globalData = serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_TowerBuff2Cost)]
  284. if this.buff2 < globalData.IVal {
  285. util.InfoF("1111111:%v", model.TowerBuff2Cost)
  286. for i, v := range model.TowerBuff2Cost {
  287. if int32(i) == this.buff2 {
  288. costItemList[v.Key] = v.Value
  289. }
  290. }
  291. }
  292. } else if buff3 > 0 {
  293. globalData = serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_TowerBuff3Cost)]
  294. if this.buff3 < globalData.IVal {
  295. util.InfoF("1111111:%v", model.TowerBuff3Cost)
  296. for i, v := range model.TowerBuff3Cost {
  297. if int32(i) == this.buff3 {
  298. costItemList[v.Key] = v.Value
  299. }
  300. }
  301. }
  302. } else {
  303. return 0, 0, 0, serverproto.ErrorCode_ERROR_FAIL
  304. }
  305. if this.role.CheckResLitNum(costItemList) == false {
  306. util.ErrorF("uid=%v towerWjBuff buy error resource not enough!! costItemList=%v", this.role.GetUUid(), costItemList)
  307. return 0, 0, 0, serverproto.ErrorCode_ERROR_FAIL
  308. }
  309. this.role.DelItemList(costItemList, AddItemST{AddFrom: AddFrom_Tower})
  310. if buff1 > 0 {
  311. this.buff1++
  312. } else if buff2 > 0 {
  313. this.buff2++
  314. } else if buff3 > 0 {
  315. this.buff3++
  316. } else {
  317. return 0, 0, 0, serverproto.ErrorCode_ERROR_FAIL
  318. }
  319. this.SetDirty(true)
  320. ntf := &serverproto.SCClimbingTowerWjBossNtf{
  321. Boos: this.boss,
  322. WjLevel: this.nowTowerWjLevel,
  323. Buff1: this.buff1,
  324. Buff2: this.buff2,
  325. Buff3: this.buff3,
  326. Duration: this.duration,
  327. RewardLevel: this.rewardLevel,
  328. }
  329. this.role.ReplayGate(ntf, true)
  330. util.InfoF("uuid:%v tower buff buy buff1:%v,buff2:%v,buff3:%v", this.role.GetUUid(), this.buff1, this.buff2, this.buff3)
  331. return this.buff1, this.buff2, this.buff3, serverproto.ErrorCode_ERROR_OK
  332. }
  333. func (this *RoleTower) getDecayList(kvList map[int32]int32) {
  334. convertData, ok := model.ConvertClimbPowerDecayFactorList[this.nowTowerLevel+1]
  335. if ok {
  336. convertData.GetDecayList(kvList, uint64(this.role.roleBattleAttr.curTotalFightPower))
  337. //convertData.GetDecayList(kvList, this.role.GetRoleFightPower().TotalFightPower)
  338. }
  339. convertData, ok = model.ConvertClimbTimeDecayFactorList[this.nowTowerLevel+1]
  340. if ok {
  341. deltaTime := (util.GetTimeSeconds() - this.nowTowerPassTime) / 60
  342. convertData.GetDecayList(kvList, uint64(deltaTime))
  343. }
  344. cfgData, ok := model.ConvertTowerData[this.nowTowerLevel+1]
  345. if ok && cfgData.SPAdd != nil {
  346. kvList[cfgData.SPAdd.Key] += cfgData.SPAdd.Value
  347. }
  348. util.InfoF("uid=%v RoleTowerDecay kv=%v", this.role.GetUUid(), kvList)
  349. }
  350. func (this *RoleTower) OnTowerWjFightEnd(towerLevel, fightTime int32, recordTimeStamp uint64, ackMsg *serverproto.SCClimbingTowerWjEndAck) serverproto.ErrorCode {
  351. if ackMsg == nil {
  352. return serverproto.ErrorCode_ERROR_FAIL
  353. }
  354. if this.IsTowerUnlock() == false {
  355. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  356. }
  357. if towerLevel != this.nowTowerWjLevel {
  358. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER
  359. }
  360. //towerCfg, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  361. //if !ok {
  362. // return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND
  363. //}
  364. ////战斗力校验
  365. //curTotalFightPower := this.role.roleBattleAttr.curTotalFightPower
  366. //if curTotalFightPower > 0 && curTotalFightPower < uint32(towerCfg.FightCheck) {
  367. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  368. //}
  369. //if this.role.GetRoleFightPower() != nil && this.role.GetRoleFightPower().TotalFightPower < uint64(towerCfg.FightCheck) {
  370. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  371. //}
  372. //deltaTime := util.GetTimeSeconds() - this.nowTowerPassTime
  373. ////时间判断 CloseDown
  374. //tmpStrList := strings.Split(towerCfg.CloseDown, ";")
  375. //if len(tmpStrList) >= 2 {
  376. // tmpChallengeTime, _ := model.Str2Num(tmpStrList[0])
  377. // tmpRecharge, _ := model.Str2Num(tmpStrList[1])
  378. // //1 在对应关卡或者爬塔层的停留时间≥60分钟时,不会触发判定外挂机制
  379. // //2 玩家战力≥2.5*最低通关战力时,不会触发判定机制
  380. // fightCheck := uint64(towerCfg.FightCheck) * 25 / 10
  381. // if tmpChallengeTime > 0 && deltaTime < 60*60 && curTotalFightPower < uint32(fightCheck) && curTotalFightPower > 0 {
  382. // if int(this.role.GetTotalRecharge()) < tmpRecharge && fightTime < int32(tmpChallengeTime) {
  383. // this.role.GetRoleStatistic().RecordCheatData(CheatType_TowerLevel)
  384. // return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_CD_TIME
  385. // }
  386. // }
  387. //}
  388. //if fightTime < 0 || (towerCfg.MaxFightingTime+1 < fightTime) { //1秒修正时间
  389. // util.DebugF("[RoleTower] OnTowerFightEnd...fight time out %v, %v--%v--%v, %v ", this.role.GetUUid(), this.fightBeginTime, util.GetTimeSeconds(), fightTime, towerCfg.MaxFightingTime)
  390. // return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_OUT_OF_TIME
  391. //}
  392. //给奖励
  393. //var rewardList *model.TowerWjReward
  394. for _, v := range model.ConvertTowerWjData[TowerMag.day] {
  395. if this.nowTowerWjLevel >= v.Max && this.rewardLevel < v.Max {
  396. var addItemList = map[int32]int32{}
  397. for _, exItems := range v.ExItemList {
  398. addItemList[exItems.Key] += exItems.Value
  399. }
  400. this.role.AddItemList(addItemList, AddFrom_Tower, true)
  401. this.rewardLevel = this.nowTowerWjLevel
  402. ackMsg.ExRewardList = v.ExItemList
  403. }
  404. }
  405. this.nowTowerWjLevel++
  406. //当前关卡通过//跟新当前关卡,战力到rank,排名
  407. //this.passTowerInfoToRank(recordTimeStamp, int32(fightTime), false)
  408. this.nowTowerWjPassTime = util.GetTimeSeconds()
  409. this.TowerBossRandom() //随机下一关boss
  410. this.SetDirty(true)
  411. util.InfoF("uuid:%v tower wj get level:%v", this.role.GetUUid(), this.nowTowerWjLevel)
  412. //this.onTowerLevelChange(this.nowTowerLevel - 1)
  413. //更新排行榜
  414. ackMsg.TowerLevel = this.nowTowerWjLevel
  415. ackMsg.PassTime = this.nowTowerWjPassTime
  416. ntf := &serverproto.SCClimbingTowerWjBossNtf{
  417. Boos: this.boss,
  418. Buff1: this.buff1,
  419. Buff2: this.buff2,
  420. Buff3: this.buff3,
  421. WjLevel: this.nowTowerWjLevel,
  422. Duration: TowerMag.day,
  423. RefreshTowerWj: this.refreshTowerWj,
  424. RewardLevel: this.rewardLevel,
  425. }
  426. this.role.ReplayGate(ntf, true)
  427. //if this.role.GetRoleCard() != nil {
  428. // this.role.GetRoleCard().CheckUnLockState()
  429. //}
  430. return serverproto.ErrorCode_ERROR_OK
  431. }
  432. func (this *RoleTower) OnTowerFightEnd(towerLevel, fightTime int32, recordTimeStamp uint64, ackMsg *serverproto.SCClimbingTowerEndAck) serverproto.ErrorCode {
  433. if ackMsg == nil {
  434. return serverproto.ErrorCode_ERROR_FAIL
  435. }
  436. if this.IsTowerUnlock() == false {
  437. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  438. }
  439. if towerLevel != this.nowTowerLevel+1 {
  440. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER
  441. }
  442. towerCfg, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  443. if !ok {
  444. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND
  445. }
  446. //战斗力校验
  447. curTotalFightPower := this.role.roleBattleAttr.curTotalFightPower
  448. if curTotalFightPower > 0 && curTotalFightPower < uint32(towerCfg.FightCheck) {
  449. return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  450. }
  451. //if this.role.GetRoleFightPower() != nil && this.role.GetRoleFightPower().TotalFightPower < uint64(towerCfg.FightCheck) {
  452. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  453. //}
  454. //deltaTime := util.GetTimeSeconds() - this.nowTowerPassTime
  455. ////时间判断 CloseDown
  456. //tmpStrList := strings.Split(towerCfg.CloseDown, ";")
  457. //if len(tmpStrList) >= 2 {
  458. // tmpChallengeTime, _ := model.Str2Num(tmpStrList[0])
  459. // tmpRecharge, _ := model.Str2Num(tmpStrList[1])
  460. // //1 在对应关卡或者爬塔层的停留时间≥60分钟时,不会触发判定外挂机制
  461. // //2 玩家战力≥2.5*最低通关战力时,不会触发判定机制
  462. // fightCheck := uint64(towerCfg.FightCheck) * 25 / 10
  463. // if tmpChallengeTime > 0 && deltaTime < 60*60 && curTotalFightPower < uint32(fightCheck) && curTotalFightPower > 0 {
  464. // if int(this.role.GetTotalRecharge()) < tmpRecharge && fightTime < int32(tmpChallengeTime) {
  465. // this.role.GetRoleStatistic().RecordCheatData(CheatType_TowerLevel)
  466. // return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_CD_TIME
  467. // }
  468. // }
  469. //}
  470. if fightTime < 0 || (towerCfg.MaxFightingTime+1 < fightTime) { //1秒修正时间
  471. util.DebugF("[RoleTower] OnTowerFightEnd...fight time out %v, %v--%v--%v, %v ", this.role.GetUUid(), this.fightBeginTime, util.GetTimeSeconds(), fightTime, towerCfg.MaxFightingTime)
  472. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_OUT_OF_TIME
  473. }
  474. //给奖励
  475. data, ok := model.ConvertTowerData[towerLevel]
  476. if ok {
  477. var addItemList = map[int32]int32{}
  478. for _, items := range data.ItemList {
  479. addItemList[items.Key] += items.Value
  480. }
  481. for _, exItems := range data.ExItemList {
  482. addItemList[exItems.Key] += exItems.Value
  483. }
  484. this.role.AddItemList(addItemList, AddFrom_Tower, true)
  485. }
  486. this.nowTowerLevel++
  487. //当前关卡通过//跟新当前关卡,战力到rank,排名
  488. this.passTowerInfoToRank(recordTimeStamp, int32(fightTime), false)
  489. this.nowTowerPassTime = util.GetTimeSeconds()
  490. this.SetDirty(true)
  491. this.onTowerLevelChange(this.nowTowerLevel - 1)
  492. ackMsg.TowerLevel = this.nowTowerLevel
  493. ackMsg.PassTime = this.nowTowerPassTime
  494. ackMsg.RewardList = data.ItemList
  495. ackMsg.ExRewardList = data.ExItemList
  496. if this.role.GetRoleCard() != nil {
  497. this.role.GetRoleCard().CheckUnLockState()
  498. }
  499. return serverproto.ErrorCode_ERROR_OK
  500. }
  501. func (this *RoleTower) onTowerLevelChange(oldTowerLevel int32) {
  502. if this.role.GetRoleCard() != nil {
  503. this.role.GetRoleCard().CheckUnLockState()
  504. }
  505. //超值礼包开启
  506. if this.role.GetRoleActivity() != nil {
  507. this.role.GetRoleActivity().SuperChargeUnlockCheck(
  508. serverproto.UnlockChargeType_UChargeType_ClimbTowerLevel, &SuperChargeUnlockST{oldValue: oldTowerLevel})
  509. }
  510. //跟新简介信息
  511. this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
  512. //爬塔层数
  513. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Level, this.nowTowerLevel)
  514. }
  515. func (this *RoleTower) PackFriendFightTower(towerLevel int32, ackMsg *serverproto.SCClimbingTowerEndAck) {
  516. if ackMsg == nil {
  517. return
  518. }
  519. tower, ok := this.friendTower[towerLevel]
  520. if !ok {
  521. return
  522. }
  523. info := &serverproto.FriendTowerInfo{
  524. TowerLevel: towerLevel,
  525. }
  526. for _, brief := range tower {
  527. info.Infos = append(info.Infos, brief)
  528. }
  529. ackMsg.PassInfo = info
  530. }
  531. // 通关更新榜单
  532. func (this *RoleTower) passTowerInfoToRank(recordTimeStamp uint64, battleTime int32, isGM bool) {
  533. ntfMsg := &serverproto.SSTowerPassFightPowerNtf{
  534. TowerBfInfo: &serverproto.TowerBriefInfo{
  535. CommonInfo: &serverproto.CommonPlayerBriefInfo{
  536. BattleRecordId: model.GenerateUid(),
  537. },
  538. BattleTime: battleTime,
  539. },
  540. RecordTimeStamp: recordTimeStamp,
  541. }
  542. levelCfgData, ok := serverproto.ClimbingTowerCfgLoader[this.nowTowerLevel]
  543. if ok {
  544. ntfMsg.TowerBfInfo.BattleVersion = levelCfgData.Version
  545. }
  546. this.role.GetRoleBriefInfo(ntfMsg.TowerBfInfo.CommonInfo)
  547. //获取当前最新战力
  548. //ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.GetRoleFightPower().TotalFightPower)
  549. ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.roleBattleAttr.curTotalFightPower)
  550. //修正通关数据
  551. ntfMsg.TowerBfInfo.CommonInfo.TowerLevel = this.nowTowerLevel
  552. ntfMsg.TowerBfInfo.CommonInfo.TowerTime = uint64(util.GetTimeSeconds())
  553. this.role.SendRank(ntfMsg)
  554. }
  555. // 通关更新榜单
  556. func (this *RoleTower) passTowerWjInfoToRank(recordTimeStamp uint64, battleTime int32, isGM bool) {
  557. ntfMsg := &serverproto.SSTowerPassFightPowerNtf{
  558. TowerBfInfo: &serverproto.TowerBriefInfo{
  559. CommonInfo: &serverproto.CommonPlayerBriefInfo{
  560. BattleRecordId: model.GenerateUid(),
  561. },
  562. BattleTime: battleTime,
  563. },
  564. RecordTimeStamp: recordTimeStamp,
  565. }
  566. this.role.GetRoleBriefInfo(ntfMsg.TowerBfInfo.CommonInfo)
  567. //获取当前最新战力
  568. //ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.GetRoleFightPower().TotalFightPower)
  569. ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.roleBattleAttr.curTotalFightPower)
  570. //修正通关数据
  571. ntfMsg.TowerBfInfo.CommonInfo.TowerLevel = this.nowTowerWjLevel
  572. ntfMsg.TowerBfInfo.CommonInfo.TowerTime = uint64(util.GetTimeSeconds())
  573. this.role.SendRank(ntfMsg)
  574. }
  575. func (this *RoleTower) SendFriendInfoReqToDB(begin, end int32) {
  576. ntfMsg := &serverproto.SSGetFriendTowerInfoReq{}
  577. UidList := this.role.GetRoleSocial().GetFriendList()
  578. if UidList == nil {
  579. //清空好友爬塔数据
  580. this.friendTower = make(map[int32][]*serverproto.CommonPlayerBriefInfo)
  581. return
  582. }
  583. for _, data := range UidList {
  584. ntfMsg.UidList = append(ntfMsg.UidList, data)
  585. }
  586. ntfMsg.Begin = begin
  587. ntfMsg.End = end
  588. this.role.SendDb(ntfMsg)
  589. }
  590. func (this *RoleTower) GetClimbingTowerInfo() {
  591. ackMsg := &serverproto.SCClimbingTowerInfoAck{}
  592. ackMsg.NowTowerLevel = this.nowTowerLevel
  593. ackMsg.PassTime = this.nowTowerPassTime
  594. ackMsg.TowerLevelDayRewardTime = this.towerLevelDayRewardTime
  595. //判断有没有到刷新时间
  596. if this.RefreshTime != 0 && (this.RefreshTime+Refresh_Time_Gap >= util.GetTimeSeconds()) {
  597. //取[towerLevel+1 - towerLevel + 5]的数据
  598. if len(this.friendTower) > 0 {
  599. for level := this.nowTowerLevel + 1; level <= this.nowTowerLevel+5; level++ {
  600. towerData, ok := this.friendTower[level]
  601. if !ok || len(towerData) <= 0 {
  602. continue
  603. }
  604. info := &serverproto.FriendTowerInfo{}
  605. info.TowerLevel = level
  606. for _, data := range towerData {
  607. info.Infos = append(info.Infos, data)
  608. }
  609. ackMsg.Infos = append(ackMsg.Infos, info)
  610. }
  611. }
  612. } else {
  613. //发送请求到DB刷新一遍好友信息
  614. this.SendFriendInfoReqToDB(this.nowTowerLevel+1, this.nowTowerLevel+5)
  615. }
  616. this.role.ReplayGate(ackMsg, true)
  617. }
  618. // 获得层数区间的所有好友
  619. func (this *RoleTower) GetFriendTowerRange(begin, end int32) serverproto.ErrorCode {
  620. if begin > end || begin <= 0 || end <= 0 {
  621. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_FRIEND_ARGS
  622. }
  623. //还在刷新时间内
  624. if this.RefreshTime != 0 && (this.RefreshTime+Refresh_Time_Gap >= util.GetTimeSeconds()) {
  625. ackMsg := &serverproto.SCFriendPassTowerInfoAck{}
  626. //取[begin, end]的数据
  627. for level := begin; level <= end; level++ {
  628. towerData, ok := this.friendTower[level]
  629. if !ok || len(towerData) <= 0 {
  630. continue
  631. }
  632. info := &serverproto.FriendTowerInfo{}
  633. info.TowerLevel = level
  634. for _, data := range towerData {
  635. info.Infos = append(info.Infos, data)
  636. }
  637. ackMsg.Infos = append(ackMsg.Infos, info)
  638. }
  639. this.role.ReplayGate(ackMsg, true)
  640. } else {
  641. //发送请求到DB刷新一遍好友信息
  642. this.SendFriendInfoReqToDB(begin, end)
  643. }
  644. return serverproto.ErrorCode_ERROR_OK
  645. }
  646. func (this *RoleTower) SendClimbingTowerInfo(begin int32, end int32) {
  647. ackMsg := &serverproto.SCFriendPassTowerInfoAck{}
  648. //取[begin, end]的数据
  649. for level := begin; level <= end; level++ {
  650. towerData, ok := this.friendTower[level]
  651. if !ok || len(towerData) <= 0 {
  652. continue
  653. }
  654. info := &serverproto.FriendTowerInfo{}
  655. info.TowerLevel = level
  656. for _, data := range towerData {
  657. info.Infos = append(info.Infos, data)
  658. }
  659. ackMsg.Infos = append(ackMsg.Infos, info)
  660. }
  661. this.role.ReplayGate(ackMsg, true)
  662. }
  663. func (this *RoleTower) SetFriendBriefInfo(briefs []*serverproto.CommonPlayerBriefInfo) serverproto.ErrorCode {
  664. if briefs == nil {
  665. this.RefreshTime = util.GetTimeSeconds()
  666. return serverproto.ErrorCode_ERROR_OK
  667. }
  668. //重置
  669. this.friendTower = make(map[int32][]*serverproto.CommonPlayerBriefInfo)
  670. for _, data := range briefs {
  671. this.friendTower[data.TowerLevel] = append(this.friendTower[data.TowerLevel], data)
  672. }
  673. this.RefreshTime = util.GetTimeSeconds()
  674. return serverproto.ErrorCode_ERROR_OK
  675. }
  676. func (this *RoleTower) SetTowerLevel(level int32) {
  677. if this.nowTowerLevel >= level {
  678. return
  679. }
  680. _, ok := serverproto.ClimbingTowerCfgLoader[level]
  681. if !ok {
  682. return
  683. }
  684. this.nowTowerLevel = level
  685. this.nowTowerPassTime = util.GetTimeSeconds()
  686. this.passTowerInfoToRank(0, 0, true)
  687. this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
  688. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Level, this.nowTowerLevel)
  689. this.SetDirty(true)
  690. if this.role.GetRoleCard() != nil {
  691. this.role.GetRoleCard().CheckUnLockState()
  692. }
  693. }
  694. //============================================= 爬塔冲榜 ============================================================
  695. func (this *RoleTower) OnlineGetRushTowerBaseReward(rewardRound int32) {
  696. if rewardRound < 0 {
  697. return
  698. }
  699. if this.FightCountReward >= rewardRound {
  700. this.RushFightCount = 0
  701. this.SetDirty(true)
  702. return
  703. }
  704. var addItemList = map[int32]int32{}
  705. model.GetRushActivityBaseReward(this.RushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  706. if len(addItemList) > 0 {
  707. this.role.AddMail(model.GlobalMailRushTowerBaseReward, serverproto.MailType_MailType_RushTower,
  708. addItemList, []int32{this.RushFightCount}, "", "")
  709. }
  710. this.FightCountReward = rewardRound
  711. this.SetDirty(true)
  712. }
  713. func (this *RoleTower) GetRushTowerBaseReward(ackMsg *serverproto.SCRushActivityRewardAck, rushRound int32) serverproto.ErrorCode {
  714. if ackMsg == nil {
  715. return serverproto.ErrorCode_ERROR_FAIL
  716. }
  717. if this.FightCountReward >= rushRound {
  718. return serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH
  719. }
  720. var addItemList = map[int32]int32{}
  721. model.GetRushActivityBaseReward(rushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  722. if len(addItemList) <= 0 {
  723. return serverproto.ErrorCode_ERROR_FAIL
  724. }
  725. for key, value := range addItemList {
  726. ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
  727. Key: key,
  728. Value: value,
  729. })
  730. }
  731. this.role.AddItemList(addItemList, AddFrom_RushTower, true)
  732. this.FightCountReward = rushRound
  733. this.SetDirty(true)
  734. return serverproto.ErrorCode_ERROR_OK
  735. }
  736. func (this *RoleTower) GetRushTowerRankReward(ssAck *serverproto.SSGetRushRewardAck) serverproto.ErrorCode {
  737. if ssAck == nil {
  738. return serverproto.ErrorCode_ERROR_FAIL
  739. }
  740. if this.RankRewardRound >= ssAck.RushRound {
  741. return serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH
  742. }
  743. var addItemList = map[int32]int32{}
  744. for _, data := range ssAck.ItemList {
  745. addItemList[data.Key] += data.Value
  746. }
  747. this.role.AddItemList(addItemList, AddFrom_RushTower, true)
  748. this.RankRewardRound = ssAck.RushRound
  749. this.SetDirty(true)
  750. return serverproto.ErrorCode_ERROR_OK
  751. }
  752. func (this *RoleTower) GetRushTowerInfo(ackMsg *serverproto.SCTowerActivityAck, curRushRound int32) {
  753. if ackMsg == nil {
  754. return
  755. }
  756. ackMsg.FightCount = this.RushFightCount
  757. ackMsg.RankReward = false
  758. if this.RankRewardRound >= curRushRound {
  759. ackMsg.RankReward = true
  760. }
  761. ackMsg.ChallengReward = false
  762. if this.FightCountReward >= curRushRound {
  763. ackMsg.ChallengReward = true
  764. }
  765. }
  766. // 增加冲榜分数
  767. func (this *RoleTower) AddRushTowerScore(rushRound int32, score int32) {
  768. if rushRound == 0 {
  769. return
  770. }
  771. if rushRound == this.RushRound {
  772. this.RushFightCount++
  773. } else {
  774. this.RushRound = rushRound
  775. this.RushFightCount = 1
  776. }
  777. this.SetDirty(true)
  778. }
  779. func (this *RoleTower) CheckRankReward(finishRound int32) serverproto.ErrorCode {
  780. if this.RankRewardRound >= finishRound {
  781. return serverproto.ErrorCode_ERROR_FAIL
  782. }
  783. return serverproto.ErrorCode_ERROR_OK
  784. }
  785. func (this *RoleTower) SetRankReward(finishRound int32) {
  786. this.RankRewardRound = finishRound
  787. this.SetDirty(true)
  788. }
  789. // todo 根据round来设置
  790. func (this *RoleTower) GetFightCountMailReward(rushRound int32) {
  791. if rushRound <= 0 {
  792. return
  793. }
  794. if this.FightCountReward < rushRound {
  795. //发送上一轮冲榜战斗次数的奖励邮件
  796. var addItemList = map[int32]int32{}
  797. model.GetRushActivityBaseReward(this.RushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  798. if len(addItemList) > 0 {
  799. this.role.AddMail(model.GlobalMailRushTowerBaseReward, serverproto.MailType_MailType_RushTower,
  800. addItemList, []int32{this.RushFightCount}, "", "")
  801. }
  802. this.FightCountReward = rushRound
  803. this.RushFightCount = 0
  804. this.SetDirty(true)
  805. }
  806. }
  807. // 获取试炼馈赠
  808. func (this *RoleTower) GetTowerLevelDayReward() serverproto.ErrorCode {
  809. curTime := util.GetTimeMilliseconds()
  810. //判断当前是否已经领取
  811. if curTime <= this.towerLevelDayRewardTime {
  812. return serverproto.ErrorCode_ERROR_FAIL
  813. }
  814. dayRewardIdx := -1
  815. for idx := 0; idx < len(model.GlobalClimbingTowerDayReward); idx++ {
  816. if model.GlobalClimbingTowerDayReward[idx].Key > this.nowTowerLevel {
  817. break
  818. }
  819. dayRewardIdx = idx
  820. }
  821. if dayRewardIdx < 0 || dayRewardIdx >= len(model.GlobalClimbingTowerDayReward) {
  822. return serverproto.ErrorCode_ERROR_FAIL
  823. }
  824. this.role.AddItem(int32(serverproto.ResType_Res_CreditRecharge),
  825. model.GlobalClimbingTowerDayReward[dayRewardIdx].Value, AddFrom_Tower)
  826. this.towerLevelDayRewardTime = util.GetLatest5Hour()
  827. this.SetDirty(true)
  828. // reward ack msg
  829. ackMsg := &serverproto.SCClimbingTowerDayRewardAck{
  830. NextDayRewardTime: this.towerLevelDayRewardTime,
  831. }
  832. ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{
  833. Key: int32(serverproto.ResType_Res_CreditRecharge),
  834. Value: model.GlobalClimbingTowerDayReward[dayRewardIdx].Value,
  835. })
  836. this.role.ReplayGate(ackMsg, true)
  837. return serverproto.ErrorCode_ERROR_OK
  838. }