role_tower.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975
  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. //towerCfg, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  388. //if !ok {
  389. // return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND
  390. //}
  391. ////战斗力校验
  392. //curTotalFightPower := this.role.roleBattleAttr.curTotalFightPower
  393. //if curTotalFightPower > 0 && curTotalFightPower < uint32(towerCfg.FightCheck) {
  394. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  395. //}
  396. //if this.role.GetRoleFightPower() != nil && this.role.GetRoleFightPower().TotalFightPower < uint64(towerCfg.FightCheck) {
  397. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  398. //}
  399. //deltaTime := util.GetTimeSeconds() - this.nowTowerPassTime
  400. ////时间判断 CloseDown
  401. //tmpStrList := strings.Split(towerCfg.CloseDown, ";")
  402. //if len(tmpStrList) >= 2 {
  403. // tmpChallengeTime, _ := model.Str2Num(tmpStrList[0])
  404. // tmpRecharge, _ := model.Str2Num(tmpStrList[1])
  405. // //1 在对应关卡或者爬塔层的停留时间≥60分钟时,不会触发判定外挂机制
  406. // //2 玩家战力≥2.5*最低通关战力时,不会触发判定机制
  407. // fightCheck := uint64(towerCfg.FightCheck) * 25 / 10
  408. // if tmpChallengeTime > 0 && deltaTime < 60*60 && curTotalFightPower < uint32(fightCheck) && curTotalFightPower > 0 {
  409. // if int(this.role.GetTotalRecharge()) < tmpRecharge && fightTime < int32(tmpChallengeTime) {
  410. // this.role.GetRoleStatistic().RecordCheatData(CheatType_TowerLevel)
  411. // return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_CD_TIME
  412. // }
  413. // }
  414. //}
  415. //if fightTime < 0 || (towerCfg.MaxFightingTime+1 < fightTime) { //1秒修正时间
  416. // util.DebugF("[RoleTower] OnTowerFightEnd...fight time out %v, %v--%v--%v, %v ", this.role.GetUUid(), this.fightBeginTime, util.GetTimeSeconds(), fightTime, towerCfg.MaxFightingTime)
  417. // return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_OUT_OF_TIME
  418. //}
  419. //给奖励
  420. //var rewardList *model.TowerWjReward
  421. for _, v := range model.ConvertTowerWjData[TowerMag.day] {
  422. if this.nowTowerWjLevel >= v.Max && this.rewardLevel < v.Max {
  423. var addItemList = map[int32]int32{}
  424. for _, exItems := range v.ExItemList {
  425. addItemList[exItems.Key] += exItems.Value
  426. }
  427. this.role.AddItemList(addItemList, AddFrom_Tower, true)
  428. this.rewardLevel = this.nowTowerWjLevel
  429. ackMsg.ExRewardList = v.ExItemList
  430. }
  431. }
  432. if this.nowTowerWjLevel == 1000 {
  433. TowerMag.isRefresh = true
  434. this.nowTowerWjLevel = -1
  435. } else {
  436. this.nowTowerWjLevel++
  437. }
  438. //当前关卡通过//跟新当前关卡,战力到rank,排名
  439. //this.passTowerInfoToRank(recordTimeStamp, int32(fightTime), false)
  440. this.nowTowerWjPassTime = util.GetTimeSeconds()
  441. this.TowerBossRandom() //随机下一关boss
  442. this.refreshTowerWj = int64(fightTime)
  443. this.SetDirty(true)
  444. util.InfoF("uuid:%v tower wj get level:%v", this.role.GetUUid(), this.nowTowerWjLevel)
  445. //this.onTowerLevelChange(this.nowTowerLevel - 1)
  446. //更新排行榜
  447. this.passTowerWjInfoToRank(recordTimeStamp, fightTime, false)
  448. ackMsg.TowerLevel = this.nowTowerWjLevel
  449. ackMsg.PassTime = this.nowTowerWjPassTime
  450. ntf := &serverproto.SCClimbingTowerWjBossNtf{
  451. Boos: this.boss,
  452. Buff1: this.buff1,
  453. Buff2: this.buff2,
  454. Buff3: this.buff3,
  455. WjLevel: this.nowTowerWjLevel,
  456. Duration: TowerMag.day,
  457. RefreshTowerWj: this.refreshTowerWj,
  458. RewardLevel: this.rewardLevel,
  459. }
  460. this.role.ReplayGate(ntf, true)
  461. //if this.role.GetRoleCard() != nil {
  462. // this.role.GetRoleCard().CheckUnLockState()
  463. //}
  464. return serverproto.ErrorCode_ERROR_OK
  465. }
  466. func (this *RoleTower) OnTowerFightEnd(towerLevel, fightTime int32, recordTimeStamp uint64, ackMsg *serverproto.SCClimbingTowerEndAck) serverproto.ErrorCode {
  467. if ackMsg == nil {
  468. return serverproto.ErrorCode_ERROR_FAIL
  469. }
  470. if this.IsTowerUnlock() == false {
  471. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_IS_LOCKED
  472. }
  473. if towerLevel != this.nowTowerLevel+1 {
  474. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_NOT_CUR_TOWER
  475. }
  476. towerCfg, ok := serverproto.ClimbingTowerCfgLoader[towerLevel]
  477. if !ok {
  478. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_CONFIG_NOT_FOUND
  479. }
  480. //战斗力校验
  481. curTotalFightPower := this.role.roleBattleAttr.curTotalFightPower
  482. if curTotalFightPower > 0 && curTotalFightPower < uint32(towerCfg.FightCheck) {
  483. return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  484. }
  485. //if this.role.GetRoleFightPower() != nil && this.role.GetRoleFightPower().TotalFightPower < uint64(towerCfg.FightCheck) {
  486. // return serverproto.ErrorCode_ERROR_FIGHT_CHECK
  487. //}
  488. //deltaTime := util.GetTimeSeconds() - this.nowTowerPassTime
  489. ////时间判断 CloseDown
  490. //tmpStrList := strings.Split(towerCfg.CloseDown, ";")
  491. //if len(tmpStrList) >= 2 {
  492. // tmpChallengeTime, _ := model.Str2Num(tmpStrList[0])
  493. // tmpRecharge, _ := model.Str2Num(tmpStrList[1])
  494. // //1 在对应关卡或者爬塔层的停留时间≥60分钟时,不会触发判定外挂机制
  495. // //2 玩家战力≥2.5*最低通关战力时,不会触发判定机制
  496. // fightCheck := uint64(towerCfg.FightCheck) * 25 / 10
  497. // if tmpChallengeTime > 0 && deltaTime < 60*60 && curTotalFightPower < uint32(fightCheck) && curTotalFightPower > 0 {
  498. // if int(this.role.GetTotalRecharge()) < tmpRecharge && fightTime < int32(tmpChallengeTime) {
  499. // this.role.GetRoleStatistic().RecordCheatData(CheatType_TowerLevel)
  500. // return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_CD_TIME
  501. // }
  502. // }
  503. //}
  504. if fightTime < 0 || (towerCfg.MaxFightingTime+1 < fightTime) { //1秒修正时间
  505. util.ErrorF("[RoleTower] OnTowerFightEnd...fight time out %v, %v--%v--%v, %v ", this.role.GetUUid(), this.fightBeginTime, util.GetTimeSeconds(), fightTime, towerCfg.MaxFightingTime)
  506. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_OUT_OF_TIME
  507. }
  508. //给奖励
  509. data, ok := model.ConvertTowerData[towerLevel]
  510. if ok {
  511. var addItemList = map[int32]int32{}
  512. for _, items := range data.ItemList {
  513. addItemList[items.Key] += items.Value
  514. }
  515. for _, exItems := range data.ExItemList {
  516. addItemList[exItems.Key] += exItems.Value
  517. }
  518. this.role.AddItemList(addItemList, AddFrom_Tower, true)
  519. }
  520. this.nowTowerLevel++
  521. //当前关卡通过//跟新当前关卡,战力到rank,排名
  522. this.passTowerInfoToRank(recordTimeStamp, int32(fightTime), false)
  523. this.nowTowerPassTime = util.GetTimeSeconds()
  524. this.SetDirty(true)
  525. this.onTowerLevelChange(this.nowTowerLevel - 1)
  526. ackMsg.TowerLevel = this.nowTowerLevel
  527. ackMsg.PassTime = this.nowTowerPassTime
  528. ackMsg.RewardList = data.ItemList
  529. ackMsg.ExRewardList = data.ExItemList
  530. if this.role.GetRoleCard() != nil {
  531. this.role.GetRoleCard().CheckUnLockState()
  532. }
  533. return serverproto.ErrorCode_ERROR_OK
  534. }
  535. func (this *RoleTower) onTowerLevelChange(oldTowerLevel int32) {
  536. if this.role.GetRoleCard() != nil {
  537. this.role.GetRoleCard().CheckUnLockState()
  538. }
  539. //超值礼包开启
  540. if this.role.GetRoleActivity() != nil {
  541. this.role.GetRoleActivity().SuperChargeUnlockCheck(
  542. serverproto.UnlockChargeType_UChargeType_ClimbTowerLevel, &SuperChargeUnlockST{oldValue: oldTowerLevel})
  543. }
  544. //跟新简介信息
  545. this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
  546. //爬塔层数
  547. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Level, this.nowTowerLevel)
  548. }
  549. func (this *RoleTower) PackFriendFightTower(towerLevel int32, ackMsg *serverproto.SCClimbingTowerEndAck) {
  550. if ackMsg == nil {
  551. return
  552. }
  553. tower, ok := this.friendTower[towerLevel]
  554. if !ok {
  555. return
  556. }
  557. info := &serverproto.FriendTowerInfo{
  558. TowerLevel: towerLevel,
  559. }
  560. for _, brief := range tower {
  561. info.Infos = append(info.Infos, brief)
  562. }
  563. ackMsg.PassInfo = info
  564. }
  565. // 通关更新榜单
  566. func (this *RoleTower) passTowerInfoToRank(recordTimeStamp uint64, battleTime int32, isGM bool) {
  567. ntfMsg := &serverproto.SSTowerPassFightPowerNtf{
  568. TowerBfInfo: &serverproto.TowerBriefInfo{
  569. CommonInfo: &serverproto.CommonPlayerBriefInfo{
  570. BattleRecordId: model.GenerateUid(),
  571. },
  572. BattleTime: battleTime,
  573. },
  574. RecordTimeStamp: recordTimeStamp,
  575. }
  576. levelCfgData, ok := serverproto.ClimbingTowerCfgLoader[this.nowTowerLevel]
  577. if ok {
  578. ntfMsg.TowerBfInfo.BattleVersion = levelCfgData.Version
  579. }
  580. this.role.GetRoleBriefInfo(ntfMsg.TowerBfInfo.CommonInfo)
  581. //获取当前最新战力
  582. //ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.GetRoleFightPower().TotalFightPower)
  583. ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.roleBattleAttr.curTotalFightPower)
  584. //修正通关数据
  585. ntfMsg.TowerBfInfo.CommonInfo.TowerLevel = this.nowTowerLevel
  586. ntfMsg.TowerBfInfo.CommonInfo.TowerTime = uint64(util.GetTimeSeconds())
  587. this.role.SendRank(ntfMsg)
  588. }
  589. // 通关更新榜单
  590. func (this *RoleTower) passTowerWjInfoToRank(recordTimeStamp uint64, battleTime int32, isGM bool) {
  591. ntfMsg := &serverproto.SSTowerPassFightPowerNtf{
  592. TowerBfInfo: &serverproto.TowerBriefInfo{
  593. CommonInfo: &serverproto.CommonPlayerBriefInfo{
  594. BattleRecordId: model.GenerateUid(),
  595. },
  596. BattleTime: battleTime,
  597. },
  598. RecordTimeStamp: recordTimeStamp,
  599. Type: 1,
  600. }
  601. this.role.GetRoleBriefInfo(ntfMsg.TowerBfInfo.CommonInfo)
  602. //获取当前最新战力
  603. //ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.GetRoleFightPower().TotalFightPower)
  604. ntfMsg.TowerBfInfo.CommonInfo.FightPower = int32(this.role.roleBattleAttr.curTotalFightPower)
  605. //修正通关数据
  606. ntfMsg.TowerBfInfo.CommonInfo.TowerLevel = this.nowTowerWjLevel - 1
  607. ntfMsg.TowerBfInfo.CommonInfo.TowerTime = uint64(util.GetTimeSeconds())
  608. this.role.SendRank(ntfMsg)
  609. }
  610. func (this *RoleTower) SendFriendInfoReqToDB(begin, end int32) {
  611. ntfMsg := &serverproto.SSGetFriendTowerInfoReq{}
  612. UidList := this.role.GetRoleSocial().GetFriendList()
  613. if UidList == nil {
  614. //清空好友爬塔数据
  615. this.friendTower = make(map[int32][]*serverproto.CommonPlayerBriefInfo)
  616. return
  617. }
  618. for _, data := range UidList {
  619. ntfMsg.UidList = append(ntfMsg.UidList, data)
  620. }
  621. ntfMsg.Begin = begin
  622. ntfMsg.End = end
  623. this.role.SendDb(ntfMsg)
  624. }
  625. func (this *RoleTower) GetClimbingTowerInfo() {
  626. ackMsg := &serverproto.SCClimbingTowerInfoAck{}
  627. ackMsg.NowTowerLevel = this.nowTowerLevel
  628. ackMsg.PassTime = this.nowTowerPassTime
  629. ackMsg.TowerLevelDayRewardTime = this.towerLevelDayRewardTime
  630. //判断有没有到刷新时间
  631. if this.RefreshTime != 0 && (this.RefreshTime+Refresh_Time_Gap >= util.GetTimeSeconds()) {
  632. //取[towerLevel+1 - towerLevel + 5]的数据
  633. if len(this.friendTower) > 0 {
  634. for level := this.nowTowerLevel + 1; level <= this.nowTowerLevel+5; level++ {
  635. towerData, ok := this.friendTower[level]
  636. if !ok || len(towerData) <= 0 {
  637. continue
  638. }
  639. info := &serverproto.FriendTowerInfo{}
  640. info.TowerLevel = level
  641. for _, data := range towerData {
  642. info.Infos = append(info.Infos, data)
  643. }
  644. ackMsg.Infos = append(ackMsg.Infos, info)
  645. }
  646. }
  647. } else {
  648. //发送请求到DB刷新一遍好友信息
  649. this.SendFriendInfoReqToDB(this.nowTowerLevel+1, this.nowTowerLevel+5)
  650. }
  651. this.role.ReplayGate(ackMsg, true)
  652. }
  653. // 获得层数区间的所有好友
  654. func (this *RoleTower) GetFriendTowerRange(begin, end int32) serverproto.ErrorCode {
  655. if begin > end || begin <= 0 || end <= 0 {
  656. return serverproto.ErrorCode_ERROR_CLIMBING_TOWER_FRIEND_ARGS
  657. }
  658. //还在刷新时间内
  659. if this.RefreshTime != 0 && (this.RefreshTime+Refresh_Time_Gap >= util.GetTimeSeconds()) {
  660. ackMsg := &serverproto.SCFriendPassTowerInfoAck{}
  661. //取[begin, end]的数据
  662. for level := begin; level <= end; level++ {
  663. towerData, ok := this.friendTower[level]
  664. if !ok || len(towerData) <= 0 {
  665. continue
  666. }
  667. info := &serverproto.FriendTowerInfo{}
  668. info.TowerLevel = level
  669. for _, data := range towerData {
  670. info.Infos = append(info.Infos, data)
  671. }
  672. ackMsg.Infos = append(ackMsg.Infos, info)
  673. }
  674. this.role.ReplayGate(ackMsg, true)
  675. } else {
  676. //发送请求到DB刷新一遍好友信息
  677. this.SendFriendInfoReqToDB(begin, end)
  678. }
  679. return serverproto.ErrorCode_ERROR_OK
  680. }
  681. func (this *RoleTower) SendClimbingTowerInfo(begin int32, end int32) {
  682. ackMsg := &serverproto.SCFriendPassTowerInfoAck{}
  683. //取[begin, end]的数据
  684. for level := begin; level <= end; level++ {
  685. towerData, ok := this.friendTower[level]
  686. if !ok || len(towerData) <= 0 {
  687. continue
  688. }
  689. info := &serverproto.FriendTowerInfo{}
  690. info.TowerLevel = level
  691. for _, data := range towerData {
  692. info.Infos = append(info.Infos, data)
  693. }
  694. ackMsg.Infos = append(ackMsg.Infos, info)
  695. }
  696. this.role.ReplayGate(ackMsg, true)
  697. }
  698. func (this *RoleTower) SetFriendBriefInfo(briefs []*serverproto.CommonPlayerBriefInfo) serverproto.ErrorCode {
  699. if briefs == nil {
  700. this.RefreshTime = util.GetTimeSeconds()
  701. return serverproto.ErrorCode_ERROR_OK
  702. }
  703. //重置
  704. this.friendTower = make(map[int32][]*serverproto.CommonPlayerBriefInfo)
  705. for _, data := range briefs {
  706. this.friendTower[data.TowerLevel] = append(this.friendTower[data.TowerLevel], data)
  707. }
  708. this.RefreshTime = util.GetTimeSeconds()
  709. return serverproto.ErrorCode_ERROR_OK
  710. }
  711. func (this *RoleTower) SetTowerLevel(level int32) {
  712. if this.nowTowerLevel >= level {
  713. return
  714. }
  715. _, ok := serverproto.ClimbingTowerCfgLoader[level]
  716. if !ok {
  717. return
  718. }
  719. this.nowTowerLevel = level
  720. this.nowTowerPassTime = util.GetTimeSeconds()
  721. this.passTowerInfoToRank(0, 0, true)
  722. this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
  723. TaskMagCheck(this.role, serverproto.TaskType_Climbing_Tower_Level, this.nowTowerLevel)
  724. this.SetDirty(true)
  725. if this.role.GetRoleCard() != nil {
  726. this.role.GetRoleCard().CheckUnLockState()
  727. }
  728. }
  729. //============================================= 爬塔冲榜 ============================================================
  730. func (this *RoleTower) OnlineGetRushTowerBaseReward(rewardRound int32) {
  731. if rewardRound < 0 {
  732. return
  733. }
  734. if this.FightCountReward >= rewardRound {
  735. this.RushFightCount = 0
  736. this.SetDirty(true)
  737. return
  738. }
  739. var addItemList = map[int32]int32{}
  740. model.GetRushActivityBaseReward(this.RushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  741. if len(addItemList) > 0 {
  742. this.role.AddMail(model.GlobalMailRushTowerBaseReward, serverproto.MailType_MailType_RushTower,
  743. addItemList, []int32{this.RushFightCount}, "", "")
  744. }
  745. this.FightCountReward = rewardRound
  746. this.SetDirty(true)
  747. }
  748. func (this *RoleTower) GetRushTowerBaseReward(ackMsg *serverproto.SCRushActivityRewardAck, rushRound int32) serverproto.ErrorCode {
  749. if ackMsg == nil {
  750. return serverproto.ErrorCode_ERROR_FAIL
  751. }
  752. if this.FightCountReward >= rushRound {
  753. return serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH
  754. }
  755. var addItemList = map[int32]int32{}
  756. model.GetRushActivityBaseReward(rushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  757. if len(addItemList) <= 0 {
  758. return serverproto.ErrorCode_ERROR_FAIL
  759. }
  760. for key, value := range addItemList {
  761. ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
  762. Key: key,
  763. Value: value,
  764. })
  765. }
  766. this.role.AddItemList(addItemList, AddFrom_RushTower, true)
  767. this.FightCountReward = rushRound
  768. this.SetDirty(true)
  769. return serverproto.ErrorCode_ERROR_OK
  770. }
  771. func (this *RoleTower) GetRushTowerRankReward(ssAck *serverproto.SSGetRushRewardAck) serverproto.ErrorCode {
  772. if ssAck == nil {
  773. return serverproto.ErrorCode_ERROR_FAIL
  774. }
  775. if this.RankRewardRound >= ssAck.RushRound {
  776. return serverproto.ErrorCode_ERROR_RUSH_ACTIVITY_REWARD_FINISH
  777. }
  778. var addItemList = map[int32]int32{}
  779. for _, data := range ssAck.ItemList {
  780. addItemList[data.Key] += data.Value
  781. }
  782. this.role.AddItemList(addItemList, AddFrom_RushTower, true)
  783. this.RankRewardRound = ssAck.RushRound
  784. this.SetDirty(true)
  785. return serverproto.ErrorCode_ERROR_OK
  786. }
  787. func (this *RoleTower) GetRushTowerInfo(ackMsg *serverproto.SCTowerActivityAck, curRushRound int32) {
  788. if ackMsg == nil {
  789. return
  790. }
  791. ackMsg.FightCount = this.RushFightCount
  792. ackMsg.RankReward = false
  793. if this.RankRewardRound >= curRushRound {
  794. ackMsg.RankReward = true
  795. }
  796. ackMsg.ChallengReward = false
  797. if this.FightCountReward >= curRushRound {
  798. ackMsg.ChallengReward = true
  799. }
  800. }
  801. // 增加冲榜分数
  802. func (this *RoleTower) AddRushTowerScore(rushRound int32, score int32) {
  803. if rushRound == 0 {
  804. return
  805. }
  806. if rushRound == this.RushRound {
  807. this.RushFightCount++
  808. } else {
  809. this.RushRound = rushRound
  810. this.RushFightCount = 1
  811. }
  812. this.SetDirty(true)
  813. }
  814. func (this *RoleTower) CheckRankReward(finishRound int32) serverproto.ErrorCode {
  815. if this.RankRewardRound >= finishRound {
  816. return serverproto.ErrorCode_ERROR_FAIL
  817. }
  818. return serverproto.ErrorCode_ERROR_OK
  819. }
  820. func (this *RoleTower) SetRankReward(finishRound int32) {
  821. this.RankRewardRound = finishRound
  822. this.SetDirty(true)
  823. }
  824. // todo 根据round来设置
  825. func (this *RoleTower) GetFightCountMailReward(rushRound int32) {
  826. if rushRound <= 0 {
  827. return
  828. }
  829. if this.FightCountReward < rushRound {
  830. //发送上一轮冲榜战斗次数的奖励邮件
  831. var addItemList = map[int32]int32{}
  832. model.GetRushActivityBaseReward(this.RushRound, model.Rush_Type_Tower, this.RushFightCount, addItemList)
  833. if len(addItemList) > 0 {
  834. this.role.AddMail(model.GlobalMailRushTowerBaseReward, serverproto.MailType_MailType_RushTower,
  835. addItemList, []int32{this.RushFightCount}, "", "")
  836. }
  837. this.FightCountReward = rushRound
  838. this.RushFightCount = 0
  839. this.SetDirty(true)
  840. }
  841. }
  842. // 获取试炼馈赠
  843. func (this *RoleTower) GetTowerLevelDayReward() serverproto.ErrorCode {
  844. curTime := util.GetTimeMilliseconds()
  845. //判断当前是否已经领取
  846. if curTime <= this.towerLevelDayRewardTime {
  847. return serverproto.ErrorCode_ERROR_FAIL
  848. }
  849. dayRewardIdx := -1
  850. for idx := 0; idx < len(model.GlobalClimbingTowerDayReward); idx++ {
  851. if model.GlobalClimbingTowerDayReward[idx].Key > this.nowTowerLevel {
  852. break
  853. }
  854. dayRewardIdx = idx
  855. }
  856. if dayRewardIdx < 0 || dayRewardIdx >= len(model.GlobalClimbingTowerDayReward) {
  857. return serverproto.ErrorCode_ERROR_FAIL
  858. }
  859. this.role.AddItem(int32(serverproto.ResType_Res_CreditRecharge),
  860. model.GlobalClimbingTowerDayReward[dayRewardIdx].Value, AddFrom_Tower)
  861. this.towerLevelDayRewardTime = util.GetLatest5Hour()
  862. this.SetDirty(true)
  863. // reward ack msg
  864. ackMsg := &serverproto.SCClimbingTowerDayRewardAck{
  865. NextDayRewardTime: this.towerLevelDayRewardTime,
  866. }
  867. ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{
  868. Key: int32(serverproto.ResType_Res_CreditRecharge),
  869. Value: model.GlobalClimbingTowerDayReward[dayRewardIdx].Value,
  870. })
  871. this.role.ReplayGate(ackMsg, true)
  872. return serverproto.ErrorCode_ERROR_OK
  873. }