RankProxy.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. using System;
  2. using System.Collections.Generic;
  3. /// <summary>
  4. /// 排行榜模块
  5. /// </summary>
  6. public class RankProxy : ProxyBase<RankProxy>
  7. {
  8. public RankProxy() => this.opeCode = OpeCode.ope_rank;
  9. #region 战斗力榜
  10. /// <summary>
  11. /// [6601] 战力榜主界面
  12. /// </summary>
  13. /// <returns></returns>
  14. /// <param name="pageId">页码id,每页10条数据</param>
  15. /// <param name="callback"></param>
  16. public void GetFightPowerRank(int pageId, Action<PowerRankMainInfo> callback)
  17. {
  18. Post(CmdCode.rank_fpower_getRank, new object[] { pageId }, resp =>
  19. {
  20. var ret = new PowerRankMainInfo();
  21. ret.RankInfo = resp.result["rankInfo"].ToObject<List<UserRankInfo>>();
  22. GetRankingOfFightPower((i, p) =>
  23. { // 再查一下个人的排名
  24. ret.RankingOfPlayer = i;
  25. ret.PowerOfPlayer = p;
  26. callback?.Invoke(ret);
  27. });
  28. });
  29. }
  30. /// <summary>
  31. /// [6602] 领取战力榜全服奖励
  32. /// </summary>
  33. /// <param name="rewardCondition">领取的战斗力档次</param>
  34. /// <param name="callback"></param>
  35. public void DrawFightPowerRankReward(int rewardCondition, Action callback)
  36. {
  37. Post(CmdCode.rank_fpower_drawReward, new object[] { rewardCondition }, resp =>
  38. {
  39. // 同步发放奖励数据
  40. UserProxy.Instance.player.putItemToStore(GameConfigData.Ins.Getrankreward_fpowerMo(rewardCondition).reward);
  41. UserProxy.Instance.player.PrivateState.RankFpowerRewardRec.Add(rewardCondition);
  42. callback?.Invoke();
  43. });
  44. }
  45. /// <summary>
  46. /// [6603] 查询玩家的战斗力全服排名.
  47. /// </summary>
  48. /// <param name="callbakc">排名、战斗力,返回值凡是大于100的按照未上榜处理</param>
  49. public void GetRankingOfFightPower(Action<int, int> callbakc)
  50. {
  51. Post(CmdCode.rank_fpower_getRanking, new object[] { }, resp =>
  52. {
  53. callbakc?.Invoke(resp.result["ranking"].ToObject<int>(), // 排名
  54. resp.result["power"].ToObject<int>()); // 战斗力
  55. });
  56. }
  57. /// <summary>
  58. /// [6604] 查询三榜榜一信息
  59. /// </summary>
  60. /// <param name="callback">int值</param>
  61. public void RankGetAllTop1(Action<ThreeTop1Info> callback)
  62. {
  63. Post(CmdCode.rank_T_getTop1, new object[] { }, resp => callback?.Invoke(resp.result.ToObject<ThreeTop1Info>()));
  64. }
  65. /// <summary>
  66. /// [6605] 通关榜主界面---玩家等级排行榜玩家信息
  67. /// </summary>
  68. /// <returns></returns>
  69. /// <param name="pageId">页码id,每页10条数据</param>
  70. /// <param name="callback"></param>
  71. public void GetPassGateRank(int pageId, Action<PassgateRankMainInfo> callback)
  72. {
  73. Post(CmdCode.rank_passgate_getRank, new object[] { pageId }, resp =>
  74. {
  75. var ret = new PassgateRankMainInfo();
  76. ret.RankInfo = resp.result["rankInfo"].ToObject<List<UserRankInfo>>();
  77. ret.RankingOfPlayer = resp.result["ranking"].ToObject<int>();
  78. ret.Score = resp.result["score"].ToObject<long>();
  79. callback?.Invoke(ret);
  80. });
  81. }
  82. /// <summary>
  83. /// [6606] 领取通关榜全服奖励
  84. /// </summary>
  85. /// <param name="rewardCondition">领取的关卡ID</param>
  86. /// <param name="callback"></param>
  87. public void DrawPassGateRankReward(int rewardCondition, Action callback)
  88. {
  89. Post(CmdCode.rank_passgate_drawReward, new object[] { rewardCondition }, resp =>
  90. {
  91. // 同步发放奖励数据
  92. //UserProxy.Instance.player.putItemToStore(GameConfigData.Ins.Getrankreward_passgateMo(rewardCondition).reward);
  93. UserProxy.Instance.player.putItemToStore(GameConfigData.Ins.Getrank_playerlevel_rewardMo(rewardCondition).reward);
  94. UserProxy.Instance.player.PrivateState.RankPassGateRewardRec.Add(rewardCondition);
  95. callback?.Invoke();
  96. });
  97. }
  98. /// <summary>
  99. /// 6607 查询战力榜突破记录
  100. /// </summary>
  101. /// <param name="callback"></param>
  102. public void GetFpowerBreakLog(Action<Dictionary<int, UserRankInfo>> callback)
  103. {
  104. Post(CmdCode.rank_fpower_breaklog, new object[] { }, resp => callback?.Invoke(resp.result.ToObject<Dictionary<int, UserRankInfo>>()));
  105. }
  106. /// <summary>
  107. /// 6608 查询通关榜突破记录
  108. /// </summary>
  109. /// <param name="callback"></param>
  110. public void GetPassgateBreakLog(Action<Dictionary<int, UserRankInfo>> callback)
  111. {
  112. Post(CmdCode.rank_passgate_breaklog, new object[] { }, resp => callback?.Invoke(resp.result.ToObject<Dictionary<int, UserRankInfo>>()));
  113. }
  114. #endregion
  115. #region 数据结构内嵌类
  116. /// <summary>
  117. /// 战斗力榜主界面信息
  118. /// </summary>
  119. public class PowerRankMainInfo
  120. {
  121. /// <summary>
  122. /// 榜单
  123. /// </summary>
  124. public List<UserRankInfo> RankInfo;
  125. /// <summary>
  126. /// 玩家排行(>100) 请一律按未上榜处理
  127. /// </summary>
  128. public int RankingOfPlayer;
  129. /// <summary>
  130. /// 玩家战力
  131. /// </summary>
  132. public int PowerOfPlayer;
  133. }
  134. /// <summary>
  135. /// 排行榜玩家信息
  136. /// </summary>
  137. public class UserRankInfo
  138. {
  139. /// <summary>
  140. /// 玩家uid
  141. /// </summary>
  142. public string uid;
  143. /// <summary>
  144. /// 等级
  145. /// </summary>
  146. public int level;
  147. /// <summary>
  148. /// 积分
  149. /// </summary>
  150. public long score;
  151. /// <summary>
  152. /// 昵称
  153. /// </summary>
  154. public string name;
  155. /// <summary>
  156. /// 头像
  157. /// </summary>
  158. public string headImg;
  159. /// <summary>
  160. /// 战斗力----等级
  161. /// </summary>
  162. /// <returns></returns>
  163. public int Power() => (int)score;
  164. /// <summary>
  165. /// 最大通关id
  166. /// </summary>
  167. /// <returns></returns>
  168. public int maxGateId() => (int)(score / MaxUserCount);
  169. /// <summary>
  170. /// 关卡名称
  171. /// </summary>
  172. /// <returns></returns>
  173. public string GateName() => sm_gate.GetMoById(maxGateId())?.name() ?? "未挑战";
  174. }
  175. /// <summary>
  176. /// 战斗力全服突破奖励界面
  177. /// </summary>
  178. public class UI_PowerReward
  179. {
  180. /// <summary>
  181. /// 关闭创建实例功能
  182. /// </summary>
  183. private UI_PowerReward()
  184. {
  185. }
  186. static public void GetInst(Action<UI_PowerReward> callback)
  187. {
  188. var inst = new UI_PowerReward();
  189. Instance.GetFpowerBreakLog(dic =>
  190. {
  191. foreach (var kv in GameConfigData.Ins.rankreward_fpower)
  192. {
  193. if (dic.ContainsKey(kv.Key))
  194. {
  195. inst.li.Add(new FpowerRewardInfoItem(kv.Key, dic[kv.Key]));
  196. }
  197. else
  198. {
  199. inst.li.Add(new FpowerRewardInfoItem(kv.Key, null));
  200. }
  201. }
  202. callback?.Invoke(inst);
  203. });
  204. }
  205. /// <summary>
  206. /// 奖励信息列表
  207. /// </summary>
  208. public readonly List<FpowerRewardInfoItem> li = new List<FpowerRewardInfoItem>();
  209. }
  210. /// <summary>
  211. /// 通关榜全服突破奖励界面
  212. /// </summary>
  213. public class UI_PassgageReward
  214. {
  215. /// <summary>
  216. /// 关闭创建实例功能
  217. /// </summary>
  218. private UI_PassgageReward()
  219. {
  220. }
  221. static public void GetInst(Action<UI_PassgageReward> callback)
  222. {
  223. var inst = new UI_PassgageReward();
  224. Instance.GetPassgateBreakLog(dic =>
  225. {
  226. //foreach (var kv in GameConfigData.Ins.rankreward_passgate)
  227. //{
  228. // if (dic.ContainsKey(kv.Key))
  229. // {
  230. // inst.li.Add(new PassGateRewardInfoItem(kv.Key, dic[kv.Key]));
  231. // }
  232. // else
  233. // {
  234. // inst.li.Add(new PassGateRewardInfoItem(kv.Key, null));
  235. // }
  236. //}
  237. foreach (var kv in GameConfigData.Ins.rank_playerlevel_reward)
  238. {
  239. if (dic.ContainsKey(kv.Key))
  240. {
  241. inst.li.Add(new PassGateRewardInfoItem(kv.Key, dic[kv.Key]));
  242. }
  243. else
  244. {
  245. inst.li.Add(new PassGateRewardInfoItem(kv.Key, null));
  246. }
  247. }
  248. callback?.Invoke(inst);
  249. });
  250. }
  251. /// <summary>
  252. /// 奖励信息列表
  253. /// </summary>
  254. public readonly List<PassGateRewardInfoItem> li = new List<PassGateRewardInfoItem>();
  255. }
  256. /// <summary>
  257. /// 战斗力奖励信息
  258. /// </summary>
  259. public class FpowerRewardInfoItem : RewardInfoItem
  260. {
  261. public FpowerRewardInfoItem(int _condition, UserRankInfo player) : base(_condition, player)
  262. {
  263. }
  264. /// <summary>
  265. /// 奖励状态 -1: 未达成, 0 可领取, 1 已领取
  266. /// </summary>
  267. public override int RewardState
  268. {
  269. get
  270. {
  271. if (UserProxy.Instance.player.PrivateState.RankFpowerRewardRec.Contains(condition))
  272. {
  273. return 1;
  274. }
  275. if (null != FirstBreachPlayer)
  276. {
  277. return 0;
  278. }
  279. return -1;
  280. }
  281. }
  282. /// <summary>
  283. /// 配置数据
  284. /// </summary>
  285. public override IRankReward Mo { get { return sm_rankreward_fpower.GetMoById(condition); } }
  286. }
  287. /// <summary>
  288. /// PassGate奖励信息
  289. /// </summary>
  290. public class PassGateRewardInfoItem : RewardInfoItem
  291. {
  292. public PassGateRewardInfoItem(int _condition, UserRankInfo player) : base(_condition, player)
  293. {
  294. }
  295. /// <summary>
  296. /// 奖励状态 -1: 未达成, 0 可领取, 1 已领取
  297. /// </summary>
  298. public override int RewardState
  299. {
  300. get
  301. {
  302. if (UserProxy.Instance.player.PrivateState.RankPassGateRewardRec.Contains(condition))
  303. {
  304. return 1;
  305. }
  306. if (null != FirstBreachPlayer)
  307. {
  308. return 0;
  309. }
  310. return -1;
  311. }
  312. }
  313. /// <summary>
  314. /// 配置数据
  315. /// </summary>
  316. //public override IRankReward Mo { get { return sm_rankreward_passgate.GetMoById(condition); } }
  317. public override IRankReward Mo { get { return GameConfigData.Ins.Getrank_playerlevel_rewardMo(condition); } }
  318. }
  319. /// <summary>
  320. /// 奖励信息
  321. /// </summary>
  322. public class RewardInfoItem
  323. {
  324. public RewardInfoItem(int _condition, UserRankInfo player)
  325. {
  326. this.condition = _condition;
  327. this.FirstBreachPlayer = player;
  328. }
  329. /// <summary>
  330. /// 达成条件(数值)
  331. /// </summary>
  332. public readonly int condition;
  333. /// <summary>
  334. /// 首位达成玩家
  335. /// </summary>
  336. public readonly UserRankInfo FirstBreachPlayer;
  337. /// <summary>
  338. /// 奖励状态 -1: 未达成, 0 可领取, 1 已领取
  339. /// </summary>
  340. public virtual int RewardState
  341. {
  342. get;
  343. }
  344. /// <summary>
  345. /// 文本描述
  346. /// </summary>
  347. public string Description => Mo.desc;
  348. /// <summary>
  349. /// 奖励字符串
  350. /// </summary>
  351. public string rewardStr => Mo.reward;
  352. /// <summary>
  353. /// 配置数据
  354. /// </summary>
  355. public virtual IRankReward Mo { get; }
  356. }
  357. /// <summary>
  358. /// 三榜榜一信息
  359. /// </summary>
  360. public class ThreeTop1Info
  361. {
  362. /// <summary>
  363. /// 战力榜
  364. /// </summary>
  365. public UserRankInfo FightPower;
  366. /// <summary>
  367. /// 通关榜
  368. /// </summary>
  369. public UserRankInfo PassGate;
  370. /// <summary>
  371. /// 言灵积分榜
  372. /// </summary>
  373. public UserRankInfo Yanling;
  374. }
  375. /// <summary>
  376. /// 通关榜主界面信息
  377. /// </summary>
  378. public class PassgateRankMainInfo
  379. {
  380. /// <summary>
  381. /// 榜单
  382. /// </summary>
  383. public List<UserRankInfo> RankInfo;
  384. /// <summary>
  385. /// 玩家排行(>100) 请一律按未上榜处理
  386. /// </summary>
  387. public int RankingOfPlayer;
  388. /// <summary>
  389. /// 玩家通关记录 (gateid+999999)
  390. /// </summary>
  391. public long Score;
  392. /// <summary>
  393. /// 玩家的通过的最大关卡id
  394. /// </summary>
  395. /// <returns></returns>
  396. public int MaxGateId() => (int)(Score / MaxUserCount);
  397. /// <summary>
  398. /// 关卡名称
  399. /// </summary>
  400. /// <returns></returns>
  401. public string GateName() => sm_gate.GetMoById(MaxGateId())?.name() ?? "未挑战";
  402. }
  403. /// <summary>
  404. /// 假定最大玩家数量不超过100W(前后台硬编码的此值) (gwang)
  405. /// </summary>
  406. public const long MaxUserCount = 1000000;
  407. #endregion
  408. }