role_cross.go 33 KB

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