role_cross.go 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  1. package model
  2. import (
  3. "math/rand"
  4. "rocommon/service"
  5. "rocommon/util"
  6. "roserver/baseserver/model"
  7. model2 "roserver/cross_server/model"
  8. "roserver/serverproto"
  9. "sort"
  10. )
  11. // 远航试炼
  12. func (this *Role) YuanHangTrialViewList() {
  13. if this.GetRoleCross() != nil {
  14. this.GetRoleCross().YuanHangTrialViewList()
  15. }
  16. }
  17. func (this *Role) RefreshYuanHangTrialType(force bool) {
  18. if this.GetRoleCross() != nil {
  19. ret := this.GetRoleCross().RefreshYuanHangTrialType(force)
  20. ackMsg := &serverproto.SCCrossYuanHangTrialRefreshTrialTypeAck{
  21. Error: int32(ret),
  22. }
  23. this.ReplayGate(ackMsg, true)
  24. }
  25. }
  26. func (this *Role) YuanHangTrial() {
  27. ackMsg := &serverproto.SCCrossYuanHangTrialAck{
  28. Error: int32(serverproto.ErrorCode_ERROR_FAIL),
  29. }
  30. if this.GetRoleCross() != nil {
  31. ret := this.GetRoleCross().YuanHangTrialProcess()
  32. ackMsg.Error = int32(ret)
  33. }
  34. this.ReplayGate(ackMsg, true)
  35. }
  36. func (this *Role) YuanHangTrialReward() {
  37. if this.GetRoleCross() != nil {
  38. ret := this.GetRoleCross().YuanHangTrialReward()
  39. if ret != serverproto.ErrorCode_ERROR_OK {
  40. ackMsg := &serverproto.SCCrossYuanHangTrialRewardAck{
  41. Error: int32(ret),
  42. }
  43. this.ReplayGate(ackMsg, true)
  44. }
  45. }
  46. }
  47. func (this *Role) YuanHangTrialChallenge(challengeUid, challengeUidEndTime uint64) {
  48. if this.GetRoleCross() != nil {
  49. crossMsg := &serverproto.SSCrossYuanHangTrialChallengeReq{
  50. ChallengeUid: challengeUid,
  51. ChallengeUidEndTime: challengeUidEndTime,
  52. }
  53. this.SendSocial(crossMsg)
  54. }
  55. }
  56. func (this *Role) YuanHangTrialChallengeResult(msg *serverproto.CSCrossYuanHangTrialChallengeResultReq) {
  57. if this.GetRoleCross() != nil {
  58. //FightTime check
  59. if !msg.Win {
  60. ackMsg := &serverproto.SCCrossYuanHangTrialChallengeResultAck{
  61. Error: int32(serverproto.ErrorCode_ERROR_FAIL),
  62. }
  63. this.ReplayGate(ackMsg, true)
  64. } else {
  65. crossMsg := &serverproto.SSCrossYuanHangTrialChallengeResultReq{
  66. ChallengedUid: msg.ChallengeUid,
  67. ChallengedUidEndTime: msg.ChallengeUidEndTime,
  68. FightTime: msg.FightTime,
  69. Win: msg.Win,
  70. FightInfo: &serverproto.FightRoleInfo{},
  71. SelfNickName: this.GetNickName(),
  72. SelfZone: this.GetSelectZone(),
  73. }
  74. this.GetRoleFightInfo(crossMsg.FightInfo, false)
  75. this.SendSocial(crossMsg)
  76. }
  77. }
  78. }
  79. func (this *Role) OnYuanHangTrialChallengeResult(msg *serverproto.SSCrossYuanHangTrialChallengeResultAck) {
  80. if this.GetRoleCross() != nil {
  81. this.GetRoleCross().OnYuanHangTrialChallengeResult(msg)
  82. }
  83. }
  84. func (this *Role) YuanHangTrialRankList(startIdx int32) {
  85. if this.GetRoleCross() != nil {
  86. this.GetRoleCross().YuanHangTrialRankList(startIdx)
  87. }
  88. }
  89. func (this *Role) YuanHangTrialInfoQuery(trialUid, trialEndTime uint64) {
  90. if this.GetRoleCross() != nil {
  91. this.GetRoleCross().TrialInfoQuery(trialUid, trialEndTime)
  92. }
  93. }
  94. func (this *Role) YuanHangTrialLog(logTime uint64) {
  95. if this.GetRoleCross() != nil {
  96. this.GetRoleCross().TrialLog(logTime)
  97. }
  98. }
  99. // //巅峰之塔
  100. func (this *Role) TopTowerFightListReq() {
  101. if this.GetRoleCross() != nil {
  102. this.GetRoleCross().TopTowerFightListReq()
  103. }
  104. }
  105. func (this *Role) TopTowerChallengeResultReq(bWin bool, fightIdx int32) {
  106. if this.GetRoleCross() != nil {
  107. ret := this.GetRoleCross().TopTowerChallengeResultReq(bWin, fightIdx)
  108. if ret != serverproto.ErrorCode_ERROR_OK {
  109. ackMsg := &serverproto.SCCrossTopTowerChallengeResultAck{
  110. Error: int32(ret),
  111. }
  112. this.ReplayGate(ackMsg, true)
  113. }
  114. }
  115. }
  116. func (this *Role) TopTowerForceWinReq(fightIdx int32) {
  117. if this.GetRoleCross() != nil {
  118. ret := this.GetRoleCross().TopTowerForceWinReq(fightIdx)
  119. if ret != serverproto.ErrorCode_ERROR_OK {
  120. ackMsg := &serverproto.SCCrossTopTowerForceWinAck{
  121. Error: int32(ret),
  122. }
  123. this.ReplayGate(ackMsg, true)
  124. }
  125. }
  126. }
  127. func (this *Role) PlayerEnterMap(msg *serverproto.CSGCrossPlayerEnterMapReq) {
  128. if this.roleCross != nil && this.GetState() == ROLE_STATE_ONLINE {
  129. this.roleCross.PlayerEnterMap(msg)
  130. }
  131. }
  132. func (this *Role) PlayerLeave(msg *serverproto.CSGCrossPlayerLeaveMapReq) {
  133. if this.roleCross != nil {
  134. this.roleCross.PlayerLeave(msg.Pos)
  135. }
  136. }
  137. func (this *Role) PlayerMoveSync(msg *serverproto.CSGCrossPlayerMapSyncPosReq) {
  138. if this.roleCross != nil {
  139. this.roleCross.PlayerMoveSync(msg)
  140. }
  141. }
  142. func (this *Role) PlayerSyncParam(msg *serverproto.CSGCrossPlayerMapSyncParamReq) {
  143. if this.roleCross != nil {
  144. this.roleCross.PlayerSyncParam(msg)
  145. }
  146. }
  147. func (this *Role) GetPlayerMapShowInfo() *serverproto.PlayerShowInfo {
  148. if this.roleCross != nil {
  149. return this.roleCross.getPlayerMapShowInfo()
  150. }
  151. return nil
  152. }
  153. const (
  154. CrossTopTowerMaxMatchNum = 10
  155. )
  156. type RoleCross struct {
  157. SaveObject
  158. roleCrossInfo *serverproto.RoleCross
  159. selfRank uint32
  160. selfScore uint64
  161. totalRank uint32
  162. //用来判断当前是否已经在地图场景中
  163. curLineNum int32
  164. curMapType int32
  165. curMapSID string
  166. }
  167. func newRoleCross(r *Role) *RoleCross {
  168. roleCross := &RoleCross{
  169. SaveObject: SaveObject{
  170. role: r,
  171. },
  172. roleCrossInfo: &serverproto.RoleCross{
  173. Yuanhangtrial: &serverproto.RoleYuanHangTrial{},
  174. Crosstoptower: &serverproto.RoleCrossTopTower{},
  175. },
  176. }
  177. return roleCross
  178. }
  179. func (this *RoleCross) CopyData(data *serverproto.RoleCross) {
  180. if this.roleCrossInfo.Yuanhangtrial != nil {
  181. //只拷贝远航试炼数据
  182. data.Yuanhangtrial = &serverproto.RoleYuanHangTrial{
  183. TrialData: this.roleCrossInfo.Yuanhangtrial.TrialData,
  184. ChallengeNum: this.roleCrossInfo.Yuanhangtrial.ChallengeNum,
  185. TrialNum: this.roleCrossInfo.Yuanhangtrial.TrialNum,
  186. RefreshTrialType: this.roleCrossInfo.Yuanhangtrial.RefreshTrialType,
  187. TrialScore: this.roleCrossInfo.Yuanhangtrial.TrialScore,
  188. }
  189. }
  190. }
  191. func (this *RoleCross) Load(msg interface{}) bool {
  192. //proRole := msg.(*serverproto.Role)
  193. //if proRole.RoleCross != nil {
  194. // this.roleCrossInfo = proRole.RoleCross
  195. // if this.roleCrossInfo.Yuanhangtrial == nil {
  196. // this.roleCrossInfo.Yuanhangtrial = &serverproto.RoleYuanHangTrial{}
  197. // }
  198. // if this.roleCrossInfo.Crosstoptower == nil {
  199. // this.roleCrossInfo.Crosstoptower = &serverproto.RoleCrossTopTower{}
  200. // }
  201. //
  202. // if this.roleCrossInfo.Yuanhangtrial.RefreshTrialType <= 0 {
  203. // this.roleCrossInfo.Yuanhangtrial.RefreshTrialType = 1
  204. // }
  205. //}
  206. return true
  207. }
  208. func (this *RoleCross) OnlineProcess() {
  209. }
  210. func (this *RoleCross) LoadOther(msg interface{}) bool {
  211. info := msg.(*serverproto.RoleCross)
  212. if this.roleCrossInfo == nil {
  213. this.roleCrossInfo = &serverproto.RoleCross{}
  214. }
  215. if info.Yuanhangtrial != nil {
  216. this.roleCrossInfo.Yuanhangtrial = info.Yuanhangtrial
  217. }
  218. if this.roleCrossInfo.Yuanhangtrial == nil {
  219. this.roleCrossInfo.Yuanhangtrial = &serverproto.RoleYuanHangTrial{}
  220. }
  221. if this.roleCrossInfo.Crosstoptower == nil {
  222. this.roleCrossInfo.Crosstoptower = &serverproto.RoleCrossTopTower{}
  223. }
  224. if info.Crosstoptower != nil {
  225. this.roleCrossInfo.Crosstoptower.ValidEndTime = info.Crosstoptower.ValidEndTime
  226. for idx := 0; idx < len(info.Crosstoptower.FightList); idx++ {
  227. this.roleCrossInfo.Crosstoptower.FightList = append(this.roleCrossInfo.Crosstoptower.FightList,
  228. info.Crosstoptower.FightList[idx])
  229. }
  230. }
  231. if this.roleCrossInfo.Yuanhangtrial.RefreshTrialType <= 0 {
  232. this.roleCrossInfo.Yuanhangtrial.RefreshTrialType = 1
  233. }
  234. return true
  235. }
  236. func (this *RoleCross) Save() {
  237. this.SetDirty(false)
  238. util.DebugF("uid=%v RoleCross save...", this.role.GetUUid())
  239. saveMsg := &serverproto.SSCrossDataSaveNtf{
  240. SaveData: this.roleCrossInfo,
  241. }
  242. this.role.SendDb(saveMsg)
  243. }
  244. func (this *RoleCross) DailyReset(notify bool) {
  245. this.getTrial().TrialNum = 0
  246. this.getTrial().ChallengeNum = 0
  247. this.getTopTower().ValidEndTime = 0
  248. this.getTopTower().FightList = this.getTopTower().FightList[:0]
  249. this.SetDirty(true)
  250. if notify {
  251. this.dataChangeNtf()
  252. }
  253. }
  254. func (this *RoleCross) getTrial() *serverproto.RoleYuanHangTrial {
  255. return this.roleCrossInfo.Yuanhangtrial
  256. }
  257. func (this *RoleCross) getTopTower() *serverproto.RoleCrossTopTower {
  258. return this.roleCrossInfo.Crosstoptower
  259. }
  260. func (this *RoleCross) dataChangeNtf() {
  261. ntfMsg := &serverproto.SCCrossYuanHangTrialDataNtf{
  262. YuanhangtrialData: &serverproto.RoleYuanHangTrial{
  263. ChallengeNum: this.roleCrossInfo.Yuanhangtrial.ChallengeNum,
  264. TrialNum: this.roleCrossInfo.Yuanhangtrial.TrialNum,
  265. RefreshTrialType: this.roleCrossInfo.Yuanhangtrial.RefreshTrialType,
  266. TrialData: this.roleCrossInfo.Yuanhangtrial.TrialData,
  267. TrialScore: this.roleCrossInfo.Yuanhangtrial.TrialScore,
  268. },
  269. }
  270. this.role.ReplayGate(ntfMsg, true)
  271. }
  272. func (this *RoleCross) CheckOpenTime() bool {
  273. nowTime := util.GetCurrentTimeNow()
  274. tmpStr := util.GetDayByTimeStr2(uint64(nowTime.UnixNano() / 1e6))
  275. tmpBeginTimeStr := tmpStr.Format(util.DATE_FORMAT1) + " " + model.GlobalCrossYuanHangTrialOpenTimeBeginTime
  276. beginTime := util.GetTimeByStr(tmpBeginTimeStr)
  277. if nowTime.Before(beginTime) {
  278. return false
  279. } else {
  280. tmpEndTimeStr := tmpStr.Format(util.DATE_FORMAT1) + " " + model.GlobalCrossYuanHangTrialOpenTimeEndTime
  281. endTime := util.GetTimeByStr(tmpEndTimeStr)
  282. if nowTime.After(endTime) {
  283. return false
  284. }
  285. }
  286. return true
  287. }
  288. func (this *RoleCross) YuanHangTrialViewList() {
  289. //每次打开界面重新获取自身信息
  290. if this.getTrial().TrialData != nil && this.getTrial().TrialData.Uid > 0 {
  291. if !this.getTrial().TrialData.RewardState {
  292. trial := this.getTrial().TrialData
  293. crossMsg := &serverproto.SSCrossYuanHangTrialSelfReq{
  294. SelfUid: this.role.GetUUid(),
  295. TrialType: trial.TrialType,
  296. EndTimeStamp: trial.EndTimeStamp,
  297. DurationTime: trial.DurationTime,
  298. SelfFightInfo: &serverproto.FightRoleInfo{},
  299. }
  300. this.role.GetRoleFightInfo(crossMsg.SelfFightInfo, false)
  301. this.role.SendSocial(crossMsg)
  302. //合服成功后如果之前正在远航中的直接入排行榜
  303. this.addRankScore(0)
  304. }
  305. }
  306. cacheViewList := GetYuanHangTrialViewList()
  307. if len(cacheViewList) <= 0 {
  308. crossMsg := &serverproto.SSCrossYuanHangTrialViewListReq{}
  309. this.role.SendSocial(crossMsg)
  310. } else {
  311. ackMsg := &serverproto.SCCrossYuanHangTrialViewListAck{
  312. TrialViewList: cacheViewList,
  313. }
  314. this.role.ReplayGate(ackMsg, true)
  315. }
  316. //添加到变更通知列表中
  317. AddNtfUid(this.role.GetUUid())
  318. }
  319. func (this *RoleCross) RefreshYuanHangTrialType(force bool) serverproto.ErrorCode {
  320. //if !this.CheckOpenTime() {
  321. // return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_OPEN
  322. //}
  323. shipType := this.getTrial().RefreshTrialType
  324. if shipType <= 0 {
  325. shipType = 1
  326. }
  327. convertData, ok := model.ConvertYuanHangTrail[shipType]
  328. if !ok {
  329. return serverproto.ErrorCode_ERROR_FAIL
  330. }
  331. if convertData.ShipRefreshSuccessRate <= 0 {
  332. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_TOP_SHIPLEVEL
  333. }
  334. //强制升级到顶级消耗
  335. if force {
  336. //根据资源列表优先级进行消耗
  337. retErr := serverproto.ErrorCode_ERROR_SHOP_RESOURCE_NOT_NEOUGH
  338. for idx := 0; idx < len(convertData.ShipRefreshTopLevelCost); idx++ {
  339. consumeItem := convertData.ShipRefreshTopLevelCost[idx]
  340. if this.role.GetRoleBag().CanDelItem(consumeItem.Key, consumeItem.Value) {
  341. this.role.DelItem(consumeItem.Key, consumeItem.Value, AddItemST{
  342. AddFrom: AddFrom_CrossYuanHangTrial,
  343. Notify: true,
  344. })
  345. retErr = serverproto.ErrorCode_ERROR_OK
  346. break
  347. }
  348. }
  349. if retErr != serverproto.ErrorCode_ERROR_OK {
  350. return retErr
  351. }
  352. } else {
  353. //消耗特殊道具
  354. if !this.role.GetRoleBag().CanDelItemList(convertData.ConsumeSpecialItemList) {
  355. //消耗金币
  356. if !this.role.GetRoleBag().CanDelItemList(convertData.ConsumeNormalList) {
  357. return serverproto.ErrorCode_ERROR_SHOP_RESOURCE_NOT_NEOUGH
  358. }
  359. this.role.DelItemList(convertData.ConsumeNormalList, AddItemST{
  360. AddFrom: AddFrom_CrossYuanHangTrial,
  361. Notify: true,
  362. })
  363. } else {
  364. this.role.DelItemList(convertData.ConsumeSpecialItemList, AddItemST{
  365. AddFrom: AddFrom_CrossYuanHangTrial,
  366. Notify: true,
  367. })
  368. }
  369. }
  370. oldShipType := this.getTrial().RefreshTrialType
  371. retShipType, err := convertData.RefreshShip(force)
  372. if err != serverproto.ErrorCode_ERROR_OK {
  373. return err
  374. }
  375. this.getTrial().RefreshTrialType = retShipType
  376. this.SetDirty(true)
  377. util.InfoF("uid=%v RefreshYuanHangTrialType oldTrialType=%v newTrialType=%v", this.role.GetUUid(), oldShipType, retShipType)
  378. this.dataChangeNtf()
  379. return serverproto.ErrorCode_ERROR_OK
  380. }
  381. func (this *RoleCross) YuanHangTrialProcess() serverproto.ErrorCode {
  382. if !this.CheckOpenTime() {
  383. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_OPEN
  384. }
  385. if this.getTrial().RefreshTrialType <= 0 {
  386. return serverproto.ErrorCode_ERROR_FAIL
  387. }
  388. if this.getTrial().TrialNum >= model.GlobalCrossYuanHangTrialMaxNum {
  389. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NUM_LIMIT
  390. }
  391. nowTime := util.GetTimeMilliseconds()
  392. if this.getTrial().TrialData == nil {
  393. this.getTrial().TrialData = &serverproto.YuanHangTrialData{}
  394. }
  395. trial := this.getTrial().TrialData
  396. if trial.Uid > 0 {
  397. if trial.EndTimeStamp <= nowTime && !trial.RewardState {
  398. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_CAN_REWARD
  399. }
  400. if !trial.RewardState {
  401. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_HAS_TRIAL
  402. }
  403. }
  404. convertData, ok := model.ConvertYuanHangTrail[this.getTrial().RefreshTrialType]
  405. if !ok {
  406. return serverproto.ErrorCode_ERROR_FAIL
  407. }
  408. durationTime := uint64(convertData.Duration * 1000)
  409. trial.Uid = this.role.GetUUid()
  410. trial.TrialType = this.getTrial().RefreshTrialType
  411. trial.EndTimeStamp = nowTime + durationTime
  412. trial.RewardState = false
  413. trial.BeChallengeNum = 0
  414. trial.DurationTime = convertData.Duration //s
  415. trial.LineNum = rand.Int31n(10) + 1
  416. this.getTrial().TrialNum++
  417. //reset refresh trial type
  418. this.getTrial().RefreshTrialType = 1
  419. this.SetDirty(true)
  420. util.InfoF("uid=%v YuanHangTrialProcess trialData=%v", this.role.GetUUid(), this.getTrial())
  421. this.dataChangeNtf()
  422. crossMsg := &serverproto.SSCrossYuanHangTrialReq{
  423. TrialType: trial.TrialType,
  424. EndTimeStamp: trial.EndTimeStamp,
  425. DurationTime: trial.DurationTime, //s
  426. SelfFightInfo: &serverproto.FightRoleInfo{},
  427. }
  428. this.role.GetRoleFightInfo(crossMsg.SelfFightInfo, false)
  429. this.role.SendSocial(crossMsg)
  430. //合服后添加(挑战过一次后自动入榜)
  431. this.addRankScore(0)
  432. return serverproto.ErrorCode_ERROR_OK
  433. }
  434. func (this *RoleCross) YuanHangTrialReward() serverproto.ErrorCode {
  435. if this.getTrial().TrialData == nil ||
  436. this.getTrial().TrialData.Uid <= 0 ||
  437. this.getTrial().TrialData.RewardState ||
  438. this.getTrial().TrialData.EndTimeStamp <= 0 {
  439. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_HAS_REWARD
  440. }
  441. nowTime := util.GetTimeMilliseconds()
  442. trial := this.getTrial().TrialData
  443. if trial.EndTimeStamp > nowTime {
  444. return serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_HAS_REWARD
  445. }
  446. convertData, ok := model.ConvertYuanHangTrail[this.getTrial().TrialData.TrialType]
  447. if !ok {
  448. util.InfoF("uid=%v YuanHangTrialReward not rewardData shipLevel=%v", this.role.GetUUid(), this.getTrial().TrialData.TrialType)
  449. return serverproto.ErrorCode_ERROR_FAIL
  450. }
  451. addItemList := map[int32]int32{}
  452. for k, v := range convertData.ShipRewardList {
  453. addItemList[k] += v
  454. }
  455. // 特权(飞艇被抢劫掉落减少至)
  456. vipTransportRobbery := this.role.GetRoleBase().GetVipData(model.Vip_System_TransportRobbery)
  457. for k, v := range convertData.BeAttackLoseItemList {
  458. tmpVal := float32(v*this.getTrial().TrialData.BeChallengeNum) * float32(vipTransportRobbery) / 10000.0
  459. addItemList[k] -= int32(tmpVal)
  460. if addItemList[k] <= 0 {
  461. addItemList[k] = 0
  462. delete(addItemList, k)
  463. }
  464. }
  465. ret := this.role.CanAddItemList(addItemList)
  466. if ret != serverproto.ErrorCode_ERROR_OK {
  467. return ret
  468. }
  469. this.role.AddItemList(addItemList, AddFrom_CrossYuanHangTrial, true)
  470. trial.RewardState = true
  471. this.SetDirty(true)
  472. this.dataChangeNtf()
  473. ackMsg := &serverproto.SCCrossYuanHangTrialRewardAck{}
  474. for k, v := range addItemList {
  475. if k <= 0 || v <= 0 {
  476. continue
  477. }
  478. ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{Key: k, Value: v})
  479. }
  480. this.role.ReplayGate(ackMsg, true)
  481. util.InfoF("uid=%v YuanHangTrialReward trialType=%v rewardList=%v", this.role.GetUUid(),
  482. trial.TrialType, ackMsg.RewardList)
  483. return serverproto.ErrorCode_ERROR_OK
  484. }
  485. func (this *RoleCross) OnYuanHangTrialChallengeResult(msg *serverproto.SSCrossYuanHangTrialChallengeResultAck) {
  486. ackMsg := &serverproto.SCCrossYuanHangTrialChallengeResultAck{
  487. Error: msg.Error,
  488. }
  489. if this.getTrial() == nil {
  490. util.FatalF("uid=%v OnYuanHangTrialChallengeResult", this.role.GetUUid())
  491. return
  492. }
  493. if msg.Error != int32(serverproto.ErrorCode_ERROR_OK) {
  494. this.role.ReplayGate(ackMsg, true)
  495. //合服后添加(挑战过一次后自动入榜)
  496. this.addRankScore(0)
  497. } else {
  498. convertData, ok := model.ConvertYuanHangTrail[msg.ShipTrialLevel]
  499. if !ok {
  500. util.InfoF("uid=%v OnYuanHangTrialChallengeResult not rewardData shipLevel=%v", this.role.GetUUid(), this.getTrial().TrialData.TrialType)
  501. } else {
  502. this.getTrial().ChallengeNum++
  503. this.SetDirty(true)
  504. //判断可获得奖励次数
  505. if this.getTrial().ChallengeNum <= model.GlobalCrossYuanHangTrialRewardNum {
  506. if ret := this.role.CanAddItemList(convertData.BeAttackRewardList); ret != serverproto.ErrorCode_ERROR_OK {
  507. //通过邮件发送
  508. } else {
  509. this.role.AddItemList(convertData.BeAttackRewardList, AddFrom_CrossYuanHangTrial, true)
  510. }
  511. ackMsg.RewardList = append(ackMsg.RewardList, convertData.BeAttackRewardListSlice...)
  512. } else {
  513. msg.LogData.Type = model2.TrialLogDataType_3
  514. }
  515. //添加排行榜积分
  516. ackMsg.OldScore = this.getTrial().TrialScore
  517. this.addRankScore(convertData.BeAttackScore)
  518. ackMsg.NewScore = this.getTrial().TrialScore
  519. this.dataChangeNtf()
  520. }
  521. }
  522. //添加挑战日志
  523. if msg.LogData != nil {
  524. if len(ackMsg.RewardList) > 0 {
  525. msg.LogData.ItemList = append(msg.LogData.ItemList, ackMsg.RewardList...)
  526. }
  527. this.getTrial().LogList = append(this.getTrial().LogList, msg.LogData)
  528. this.SetDirty(true)
  529. }
  530. util.InfoF("uid=%v SCCrossYuanHangTrialChallengeResultAck msg=%v", this.role.GetUUid(), ackMsg)
  531. this.role.ReplayGate(ackMsg, true)
  532. }
  533. func (this *RoleCross) addRankScore(addScore int32) {
  534. this.getTrial().TrialScore += addScore
  535. this.SetDirty(true)
  536. ntfMsg := &serverproto.SSCrossYuanHangTrialUpdateRankScoreNtf{
  537. Uid: this.role.GetUUid(),
  538. RankScore: uint64(this.getTrial().TrialScore),
  539. }
  540. this.role.SendSocial(ntfMsg)
  541. }
  542. func (this *RoleCross) YuanHangTrialRankList(startIdx int32) {
  543. rankList := GetYuanHangTrialRankList(startIdx)
  544. if len(rankList) <= 0 || this.selfRank <= 0 || this.selfScore <= 0 {
  545. ssMsg := &serverproto.SSCrossYuanHangTrialRankListReq{
  546. Uid: this.role.GetUUid(),
  547. StartIdx: startIdx,
  548. }
  549. this.role.SendSocial(ssMsg)
  550. } else {
  551. ackMsg := &serverproto.SCCrossYuanHangTrialRankListAck{
  552. SelfRank: this.selfRank,
  553. SelfScore: this.selfScore,
  554. TotalRank: this.totalRank,
  555. RankList: rankList,
  556. StartIdx: startIdx,
  557. }
  558. this.role.ReplayGate(ackMsg, true)
  559. }
  560. }
  561. func (this *RoleCross) UpdateRankListSelfInfoCache(ssAckMsg *serverproto.SSCrossYuanHangTrialRankListAck) uint64 {
  562. this.selfRank = ssAckMsg.SelfRank
  563. this.selfScore = ssAckMsg.SelfScore
  564. this.totalRank = ssAckMsg.TotalRank
  565. return this.selfScore
  566. }
  567. func (this *RoleCross) UpdateTrialInfo(beChangeNum int32) {
  568. if this.roleCrossInfo.Yuanhangtrial.TrialData == nil {
  569. return
  570. }
  571. if this.roleCrossInfo.Yuanhangtrial.TrialData.BeChallengeNum != beChangeNum {
  572. this.roleCrossInfo.Yuanhangtrial.TrialData.BeChallengeNum = beChangeNum
  573. this.dataChangeNtf()
  574. }
  575. }
  576. func (this *RoleCross) AddLog(logData *serverproto.YuanHangTrialLogData) {
  577. if this.getTrial() != nil {
  578. // 特权(飞艇被抢劫掉落减少至)
  579. vipTransportRobbery := this.role.GetRoleBase().GetVipData(model.Vip_System_TransportRobbery)
  580. for idx := 0; idx < len(logData.ItemList); idx++ {
  581. tmpVal := float32(logData.ItemList[idx].Value) / 10000.0 * float32(vipTransportRobbery)
  582. logData.ItemList[idx].Value = int32(tmpVal)
  583. }
  584. this.getTrial().LogList = append(this.getTrial().LogList, logData)
  585. this.SetDirty(true)
  586. if len(this.getTrial().LogList) > MaxUidLogCount+10 {
  587. tmpIdx := len(this.getTrial().LogList) - MaxUidLogCount
  588. this.getTrial().LogList = this.getTrial().LogList[tmpIdx:]
  589. this.SetDirty(true)
  590. }
  591. }
  592. }
  593. // 查询飞艇信息
  594. func (this *RoleCross) TrialInfoQuery(trialUid, trialEndTime uint64) {
  595. crossMsg := &serverproto.SSCrossYuanHangTrialInfoReq{
  596. TrialUid: trialUid,
  597. TrialEndTime: trialEndTime,
  598. }
  599. if !this.role.SendSocial(crossMsg) {
  600. ackMsg := &serverproto.SCCrossYuanHangTrialInfoAck{
  601. Error: int32(serverproto.ErrorCode_ERROR_CROSS_YUANHANGTRIAL_NOT_JOIN),
  602. }
  603. this.role.ReplayGate(ackMsg, true)
  604. }
  605. }
  606. const MaxUidLogCount = 50
  607. func (this *RoleCross) TrialLog(logTime uint64) {
  608. ackMsg := &serverproto.SCCrossYuanHangTrialLogAck{}
  609. if len(this.getTrial().LogList) > MaxUidLogCount {
  610. tmpIdx := len(this.getTrial().LogList) - MaxUidLogCount
  611. this.getTrial().LogList = this.getTrial().LogList[tmpIdx:]
  612. this.SetDirty(true)
  613. }
  614. //获取最新列表
  615. if logTime <= 0 {
  616. starIdx := len(this.getTrial().LogList)
  617. if starIdx > 0 {
  618. for idx := starIdx - 1; idx >= 0; idx-- {
  619. ackMsg.LogList = append(ackMsg.LogList, this.getTrial().LogList[idx])
  620. if len(ackMsg.LogList) >= 10 {
  621. break
  622. }
  623. }
  624. }
  625. } else {
  626. for idx := len(this.getTrial().LogList) - 1; idx >= 0; idx-- {
  627. if this.getTrial().LogList[idx].RecordTime < logTime {
  628. ackMsg.LogList = append(ackMsg.LogList, this.getTrial().LogList[idx])
  629. if len(ackMsg.LogList) >= 10 {
  630. break
  631. }
  632. }
  633. }
  634. }
  635. if len(ackMsg.LogList) < 10 {
  636. ackMsg.IsEnd = true
  637. }
  638. this.role.ReplayGate(ackMsg, true)
  639. }
  640. // //巅峰之塔
  641. // 当前数据是否合法
  642. func (this *RoleCross) topTowerTimeInvalid() bool {
  643. if this.roleCrossInfo.Crosstoptower == nil {
  644. return false
  645. }
  646. nowTime := util.GetTimeMilliseconds()
  647. diffDay := util.GetDurationDay2(this.roleCrossInfo.Crosstoptower.ValidEndTime, nowTime)
  648. if diffDay > 1 {
  649. return true
  650. }
  651. return false
  652. }
  653. func (this *RoleCross) checkTopTowerOpenTime() bool {
  654. nowTime := util.GetCurrentTimeNow()
  655. tmpStr := util.GetDayByTimeStr2(uint64(nowTime.UnixNano() / 1e6))
  656. tmpBeginTimeStr := tmpStr.Format(util.DATE_FORMAT1) + " " + model.GlobalCrossTopTowerOpenTimeBeginTime
  657. beginTime := util.GetTimeByStr(tmpBeginTimeStr)
  658. if nowTime.Before(beginTime) {
  659. return true
  660. } else {
  661. tmpEndTimeStr := tmpStr.Format(util.DATE_FORMAT1) + " " + model.GlobalCrossTopTowerOpenTimeEndTime
  662. endTime := util.GetTimeByStr(tmpEndTimeStr)
  663. if nowTime.After(endTime) {
  664. return true
  665. }
  666. }
  667. return false
  668. }
  669. func (this *RoleCross) getFightListList(towerData *serverproto.RoleCrossTopTower) {
  670. towerData.ValidEndTime = this.getTopTower().ValidEndTime
  671. for idx := 0; idx < len(this.getTopTower().FightList); idx++ {
  672. if this.getTopTower().FightList[idx].FightInfo == nil {
  673. this.getTopTower().FightList[idx].FightInfo = model.ConvertRobotCrossTopTower[0].FightInfo
  674. }
  675. tmpInfo := &serverproto.TopTowerFightRoleInfo{
  676. Idx: this.getTopTower().FightList[idx].Idx,
  677. RewardState: this.getTopTower().FightList[idx].RewardState,
  678. FightInfo: &serverproto.FightRoleInfo{
  679. IsRobot: this.getTopTower().FightList[idx].FightInfo.IsRobot,
  680. BriefInfo: this.getTopTower().FightList[idx].FightInfo.BriefInfo,
  681. JobLevel: this.getTopTower().FightList[idx].FightInfo.JobLevel,
  682. FashionData: this.getTopTower().FightList[idx].FightInfo.FashionData,
  683. },
  684. }
  685. towerData.FightList = append(towerData.FightList, tmpInfo)
  686. }
  687. }
  688. func (this *RoleCross) TopTowerFightListReq() {
  689. if this.topTowerTimeInvalid() || (this.getTopTower() != nil && len(this.getTopTower().FightList) <= 0) {
  690. //重新获取对阵玩家
  691. crossSSMsg := &serverproto.SSCrossTopTowerMatchFightReq{}
  692. this.role.SendSocial(crossSSMsg)
  693. } else {
  694. ackMsg := &serverproto.SCCrossTopTowerFightListAck{
  695. ToptowerData: &serverproto.RoleCrossTopTower{},
  696. }
  697. if this.getTopTower() == nil {
  698. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
  699. } else {
  700. this.getFightListList(ackMsg.ToptowerData)
  701. }
  702. this.role.ReplayGate(ackMsg, true)
  703. }
  704. }
  705. func (this *RoleCross) OnTopTowerFightMatchList(ssAckMsg *serverproto.SSCrossTopTowerMatchFightAck) {
  706. ackMsg := &serverproto.SCCrossTopTowerFightListAck{
  707. Error: ssAckMsg.Error,
  708. }
  709. if ssAckMsg.Error != int32(serverproto.ErrorCode_ERROR_OK) {
  710. this.role.ReplayGate(ackMsg, true)
  711. return
  712. }
  713. //对应层数上无数据需要填充对应的机器人,且填充的机器人不能重复
  714. this.getTopTower().FightList = ssAckMsg.FightInfoList
  715. this.getTopTower().ValidEndTime = util.GetTimeMilliseconds()
  716. this.fillMatchListWithRobot()
  717. this.SetDirty(true)
  718. ackMsg.ToptowerData = &serverproto.RoleCrossTopTower{}
  719. this.getFightListList(ackMsg.ToptowerData)
  720. this.role.ReplayGate(ackMsg, true)
  721. }
  722. func (this *RoleCross) topTowerGetFightInfoByIdx(fightIdx int32) *serverproto.TopTowerFightRoleInfo {
  723. for idx := 0; idx < len(this.getTopTower().FightList); idx++ {
  724. if this.getTopTower().FightList[idx].Idx == fightIdx {
  725. return this.getTopTower().FightList[idx]
  726. }
  727. }
  728. return nil
  729. }
  730. func (this *RoleCross) fillMatchListWithRobot() {
  731. if len(this.getTopTower().FightList) >= CrossTopTowerMaxMatchNum ||
  732. len(model.ConvertRobotCrossTopTower) <= 0 {
  733. return
  734. }
  735. randIdx := rand.Intn(len(model.ConvertRobotCrossTopTower))
  736. for idx := 1; idx <= CrossTopTowerMaxMatchNum; idx++ {
  737. fightInfo := this.topTowerGetFightInfoByIdx(int32(idx))
  738. if fightInfo != nil {
  739. continue
  740. }
  741. robotInfo := &serverproto.TopTowerFightRoleInfo{
  742. Idx: int32(idx),
  743. FightInfo: model.ConvertRobotCrossTopTower[randIdx].FightInfo,
  744. }
  745. this.getTopTower().FightList = append(this.getTopTower().FightList, robotInfo)
  746. randIdx++
  747. if randIdx >= len(model.ConvertRobotCrossTopTower) {
  748. randIdx = 0
  749. }
  750. }
  751. sort.Slice(this.getTopTower().FightList, func(i, j int) bool {
  752. return this.getTopTower().FightList[i].Idx < this.getTopTower().FightList[j].Idx
  753. })
  754. }
  755. func (this *RoleCross) TopTowerChallengeReq(fightIdx int32) (serverproto.ErrorCode, *serverproto.TopTowerFightRoleInfo) {
  756. if !this.checkTopTowerOpenTime() {
  757. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_NOT_OPEN, nil
  758. }
  759. if this.topTowerTimeInvalid() {
  760. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_INVALID, nil
  761. }
  762. fightInfo := this.topTowerGetFightInfoByIdx(fightIdx)
  763. if fightInfo == nil {
  764. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_NOT_FIND, nil
  765. }
  766. if fightInfo.RewardState {
  767. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_HAS_REWARD, nil
  768. }
  769. return serverproto.ErrorCode_ERROR_OK, fightInfo
  770. }
  771. func (this *RoleCross) TopTowerChallengeResultReq(bWin bool, fightIdx int32) serverproto.ErrorCode {
  772. if !bWin {
  773. return serverproto.ErrorCode_ERROR_FAIL
  774. }
  775. if !this.checkTopTowerOpenTime() {
  776. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_NOT_OPEN
  777. }
  778. if this.topTowerTimeInvalid() {
  779. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_INVALID
  780. }
  781. fightInfo := this.topTowerGetFightInfoByIdx(fightIdx)
  782. if fightInfo == nil {
  783. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_NOT_FIND
  784. }
  785. if fightInfo.RewardState {
  786. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_HAS_REWARD
  787. }
  788. //获取奖励
  789. ackMsg := &serverproto.SCCrossTopTowerChallengeResultAck{}
  790. for idx := 0; idx < len(model.ConvertTopTowerRewardList); idx++ {
  791. //找到对应奖励
  792. if model.ConvertTopTowerRewardList[idx].Idx == fightInfo.Idx {
  793. this.role.AddItemList(model.ConvertTopTowerRewardList[idx].WinRewardList, AddFrom_CrossTopTower, true)
  794. for k, v := range model.ConvertTopTowerRewardList[idx].WinRewardList {
  795. ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{Key: k, Value: v})
  796. }
  797. fightInfo.RewardState = true
  798. this.SetDirty(true)
  799. break
  800. }
  801. }
  802. if len(ackMsg.RewardList) <= 0 {
  803. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_NOT_FIND
  804. }
  805. ackMsg.FightInfo = fightInfo
  806. this.role.ReplayGate(ackMsg, true)
  807. return serverproto.ErrorCode_ERROR_OK
  808. }
  809. func (this *RoleCross) TopTowerForceWinReq(fightIdx int32) serverproto.ErrorCode {
  810. if !this.checkTopTowerOpenTime() {
  811. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_NOT_OPEN
  812. }
  813. if this.topTowerTimeInvalid() {
  814. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_INVALID
  815. }
  816. fightInfo := this.topTowerGetFightInfoByIdx(fightIdx)
  817. if fightInfo == nil {
  818. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_NOT_FIND
  819. }
  820. if fightInfo.RewardState {
  821. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_HAS_REWARD
  822. }
  823. //获取奖励
  824. ackMsg := &serverproto.SCCrossTopTowerForceWinAck{}
  825. for idx := 0; idx < len(model.ConvertTopTowerRewardList); idx++ {
  826. //找到对应奖励
  827. if model.ConvertTopTowerRewardList[idx].Idx == fightInfo.Idx {
  828. //消耗是否满足
  829. if !this.role.GetRoleBag().CanDelItemList(model.ConvertTopTowerRewardList[idx].ForceWinCostList) {
  830. return this.role.GetResNotice(int32(serverproto.ResType_Res_Rmb))
  831. }
  832. this.role.DelItemList(model.ConvertTopTowerRewardList[idx].ForceWinCostList, AddItemST{AddFrom: AddFrom_CrossTopTower})
  833. this.role.AddItemList(model.ConvertTopTowerRewardList[idx].WinRewardList, AddFrom_CrossTopTower, true)
  834. for k, v := range model.ConvertTopTowerRewardList[idx].WinRewardList {
  835. ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{Key: k, Value: v})
  836. }
  837. fightInfo.RewardState = true
  838. this.SetDirty(true)
  839. break
  840. }
  841. }
  842. if len(ackMsg.RewardList) <= 0 {
  843. return serverproto.ErrorCode_ERROR_CROSS_TOPTOWER_NOT_FIND
  844. }
  845. ackMsg.FightInfo = fightInfo
  846. this.role.ReplayGate(ackMsg, true)
  847. //更新被买路排行榜
  848. if !fightInfo.FightInfo.IsRobot {
  849. crossSSMsg := &serverproto.SSCrossTopTowerForceWinRankUpdateNtf{
  850. FightUid: fightInfo.FightInfo.BriefInfo.Uid,
  851. }
  852. this.role.SendSocial(crossSSMsg)
  853. }
  854. return serverproto.ErrorCode_ERROR_OK
  855. }
  856. ////全局跨服地图相关
  857. //PlayerEnterMap(msg *serverproto.CSGCrossPlayerEnterMapReq)
  858. //PlayerLeave(msg *serverproto.CSGCrossPlayerLeaveMapReq)
  859. //PlayerMoveSync(msg *serverproto.CSGCrossPlayerMapSyncPosReq)
  860. //
  861. ////获取玩家地图展示信息
  862. //GetPlayerMapShowInfo(info *serverproto.PlayerShowInfo)
  863. func (this *RoleCross) getPlayerMapShowInfo() *serverproto.PlayerShowInfo {
  864. info := &serverproto.PlayerShowInfo{
  865. Uid: this.role.GetUUid(),
  866. Level: this.role.GetRoleLevel(),
  867. VipLevel: this.role.GetRoleVipLevel(),
  868. Gender: this.role.GetRoleBase().GetRoleSex(),
  869. JobId: this.role.GetRoleBase().RoleData().HeroData.ConfigId,
  870. NickName: this.role.GetRoleBase().GetRoleName(),
  871. FashionData: this.role.GetRoleBase().roleBase.FashionData,
  872. HeadId: this.role.GetHeadId(),
  873. ImgId: this.role.GetImageId(),
  874. HeadFrameId: this.role.GetRoleBase().RoleData().GetHeadFrameId(),
  875. FightPower: int32(this.role.roleBattleAttr.curTotalFightPower),
  876. FromZone: this.role.GetSelectZone(),
  877. RealZone: int32(service.GetServiceConfig().Node.Zone),
  878. }
  879. return info
  880. }
  881. func (this *RoleCross) GetCrossCurSpaceId() int32 {
  882. return this.curLineNum
  883. }
  884. func (this *RoleCross) PlayerEnterMap(msg *serverproto.CSGCrossPlayerEnterMapReq) {
  885. //todo
  886. // 获取进入地图位置
  887. if this.curLineNum > 0 {
  888. ////玩家已经在当前地图
  889. //if this.curLineNum == msg.LineNum {
  890. // return
  891. //}
  892. this.PlayerLeave(nil)
  893. }
  894. //选择线路未满的房间(线路号从小达到)
  895. targetServiceNode := ""
  896. if msg.LineNum <= 0 {
  897. targetServiceNode, msg.LineNum = GetServerStateByType(msg.MapType)
  898. } else {
  899. targetServiceNode = GetServerStateByTypeAndLine(msg.MapType, msg.LineNum)
  900. }
  901. if targetServiceNode == "" {
  902. util.InfoF("uid=%v PlayerEnterMap targetServiceNode nil maptype=%v", this.role.GetUUid(), msg.MapType)
  903. ackMsg := &serverproto.SCGCrossPlayerEnterMapAck{
  904. Error: int32(serverproto.ErrorCode_ERROR_FAIL),
  905. }
  906. this.role.ReplayGate(ackMsg, true)
  907. return
  908. }
  909. //包括切换地图
  910. ssEnterMsg := &serverproto.SSGCrossMapEnterReq{
  911. AoiLine: msg.LineNum,
  912. MapType: msg.MapType,
  913. ShowInfo: this.getPlayerMapShowInfo(),
  914. Pos: msg.Pos,
  915. Dir: msg.Dir,
  916. SelfMapParam: &serverproto.SelfCrossMapParam{
  917. LoverUid: 1,
  918. },
  919. }
  920. this.role.SendSocialWithSID(ssEnterMsg, targetServiceNode)
  921. }
  922. func (this *RoleCross) OnPlayerEnterMapSuccess(msg *serverproto.SSGCrossMapEnterAck) {
  923. this.curLineNum = msg.LineNum
  924. this.curMapType = msg.MapType
  925. this.curMapSID = msg.MapSid
  926. }
  927. func (this *RoleCross) PlayerLeave(position *serverproto.Vector3) {
  928. if this.curLineNum > 0 && this.curMapType > 0 {
  929. ssLeaveMsg := &serverproto.SSGCrossMapLeaveReq{
  930. Pos: position,
  931. }
  932. this.role.SendSocial(ssLeaveMsg)
  933. //reset map aoi data
  934. this.curLineNum = 0
  935. this.curMapType = 0
  936. this.curMapSID = ""
  937. }
  938. }
  939. func (this *RoleCross) PlayerMoveSync(msg *serverproto.CSGCrossPlayerMapSyncPosReq) {
  940. if this.curLineNum > 0 && msg.Pos != nil {
  941. ssSyncMsg := &serverproto.SSGCrossMapSyncPosReq{
  942. Pos: msg.Pos,
  943. Dir: msg.Dir,
  944. CurSpaceId: this.curLineNum,
  945. }
  946. this.role.SendSocial(ssSyncMsg)
  947. }
  948. }
  949. func (this *RoleCross) PlayerSyncParam(msg *serverproto.CSGCrossPlayerMapSyncParamReq) {
  950. if this.curLineNum > 0 && msg.Pos != nil {
  951. ssSyncMsg := &serverproto.SSGCrossMapSyncParamReq{
  952. Pos: msg.Pos,
  953. ParamId: msg.ParamId,
  954. CurSpaceId: this.curLineNum,
  955. }
  956. this.role.SendSocial(ssSyncMsg)
  957. }
  958. }
  959. func (this *RoleCross) FashionShowChangeNtf() {
  960. if this.curLineNum > 0 {
  961. showInfo := &serverproto.PlayerShowInfo{
  962. Uid: this.role.GetUUid(),
  963. FashionData: this.role.GetRoleBase().roleBase.FashionData,
  964. }
  965. ssCrossMsg := &serverproto.SSGCrossMapUnitShowUpdateNtf{
  966. CurSpaceId: this.curLineNum,
  967. }
  968. ssCrossMsg.ShowInfoList = append(ssCrossMsg.ShowInfoList, showInfo)
  969. this.role.SendSocial(ssCrossMsg)
  970. }
  971. }