MapProxy.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using UnityEngine;
  7. public class MapProxy : ProxyBase<MapProxy>
  8. {
  9. #region ` constructor `
  10. public MapProxy() => this.opeCode = OpeCode.map;
  11. #endregion
  12. /// <summary>
  13. /// 7504 解锁据点
  14. /// </summary>
  15. /// <param name="mapId">据点的mapid</param>
  16. /// <param name="callback">回掉</param>
  17. public void UnlockMap(int mapId, Action callback)
  18. {
  19. Post<Info_NewMap>(CmdCode.map_UnlockMap, new object[] { mapId }, ret =>
  20. {
  21. UserProxy.Instance.player.newMap = ret; // 更新下地图数据
  22. callback?.Invoke();
  23. });
  24. }
  25. /// <summary>
  26. /// 7501 进入据点
  27. /// </summary>
  28. /// <param name="mapId">据点id</param>
  29. /// <param name="callback">回调</param>
  30. public void EntryMap(int mapId, Action callback)
  31. {
  32. Post<Ret_EntryMap>(CmdCode.map_EnterFootHold, new object[] { mapId }, ret =>
  33. {
  34. var p = UserProxy.Instance.player;
  35. p.newMap = ret.newMap;
  36. p.baseInfo.tili = ret.tili;
  37. p.PrivateState.TiliTime = ret.time;
  38. p.newMap.curMapId = mapId;
  39. callback?.Invoke();
  40. });
  41. }
  42. /// <summary>
  43. /// 7502 开启传送阵
  44. /// </summary>
  45. public void FixUpTransmision()
  46. {
  47. // todo: 待完善
  48. }
  49. /// <summary>
  50. /// 7503 更新探索度
  51. /// </summary>
  52. public void UpdateExplorationProgress()
  53. {
  54. // todo: 待完善
  55. }
  56. /// <summary>
  57. /// 【7505】 保存mapid下已经解锁的区域、npc等等
  58. /// </summary>
  59. /// <param name="unlockStr"></param>
  60. /// <param name="callback"></param>
  61. public void UnlockInfoSva(string unlockStr, Action<int> callback)
  62. {
  63. Post<Ret_unlockSav>(CmdCode.map_unlockInfoSva, new object[] { unlockStr }, ret =>
  64. {
  65. var p = UserProxy.Instance.player; // 更新下地图数据;
  66. p.newMap = ret.newMap;
  67. p.baseInfo.xp = ret.exp;
  68. p.baseInfo.level = ret.level;
  69. callback?.Invoke(ret.num);
  70. });
  71. }
  72. /// <summary>
  73. /// 获取mapid下已经解锁的列表
  74. /// </summary>
  75. /// <param name="mapid"></param>
  76. /// <returns></returns>
  77. public List<string> getMapUnlockInfoList(int mapid)
  78. {
  79. List<string> list = new List<string>();
  80. Dictionary<int, List<string>> typeList = UserProxy.Instance.player.newMap.unlockMapTypeList;
  81. if (typeList.ContainsKey(mapid))
  82. {
  83. return typeList[mapid];
  84. }
  85. return list;
  86. }
  87. /// <summary>
  88. /// 【7506】领取探索奖励
  89. /// </summary>
  90. /// <param name="mapid"></param>
  91. /// <param name="callback"></param>
  92. public void reviceExplorerReward(int mapid, Action callback)
  93. {
  94. Post<Ret_ExploreRwd>(CmdCode.map_reviceExplorerReward, new object[] { mapid }, ret =>
  95. {
  96. var p = UserProxy.Instance.player; // 更新下地图数据;
  97. p.newMap = ret.newMap;
  98. string[] list = ret.cost.Split(',');
  99. if (int.Parse(list[0]) == (int)EItemSubType.Gold)
  100. {
  101. p.baseInfo.gold += int.Parse(list[1]);
  102. }
  103. else if (int.Parse(list[0]) == (int)EItemSubType.Gem)
  104. {
  105. p.baseInfo.cash += int.Parse(list[1]);
  106. }
  107. callback?.Invoke();
  108. });
  109. }
  110. /// <summary>
  111. /// 7507 回城券使用
  112. /// </summary>
  113. /// <param name="itemId"></param>
  114. /// <param name="callback"></param>
  115. public void huichengQuanUse(int mapId, float x, float y, float z, Action callback)
  116. {
  117. Post<Ret_NewMap>(CmdCode.map_huichengQuanUse, new object[] { mapId, x, y, z }, ret =>
  118. {
  119. UserProxy.Instance.player.newMap = ret.newMap; // 更新下地图数据;
  120. callback?.Invoke();
  121. });
  122. }
  123. /// <summary>
  124. /// 7508
  125. /// </summary>
  126. /// <param name="unlockStr"></param>
  127. /// <param name="callback"></param>
  128. public void huichengQuanEnd(Action callback)
  129. {
  130. Post<Ret_NewMap>(CmdCode.map_huichengQuanEnd, new object[] { }, ret =>
  131. {
  132. UserProxy.Instance.player.newMap = ret.newMap; // 更新下地图数据;
  133. callback?.Invoke();
  134. });
  135. }
  136. #region ret vo
  137. class Ret_NewMap
  138. {
  139. public Info_NewMap newMap;
  140. }
  141. class Ret_ExploreRwd : Ret_NewMap
  142. {
  143. public string cost;
  144. }
  145. class Ret_EntryMap : Ret_NewMap {
  146. public int tili;
  147. public long time;
  148. }
  149. class Ret_unlockSav : Ret_NewMap
  150. {
  151. public int num;
  152. public int exp;
  153. public int level;
  154. }
  155. #endregion
  156. #region UI VO
  157. /// <summary>
  158. /// 大地图UI所需数据接口
  159. /// </summary>
  160. public class UI_BigMap
  161. {
  162. /// <summary>
  163. /// 快速访问 玩家数据
  164. /// </summary>
  165. private Player player;
  166. /// <summary>
  167. /// 构造函数
  168. /// </summary>
  169. /// <param name="user">需要传入玩家数据</param>
  170. public UI_BigMap(Player user) => this.player = user;
  171. /// <summary>
  172. /// 当前所在据点mapId
  173. /// </summary>
  174. int CurMapId => player.newMap.curMapId;
  175. /// <summary>
  176. /// 当前所在据点数据
  177. /// </summary>
  178. public Ins_FootHold CurMap => player.newMap.unlockedFootholds[CurMapId];
  179. /// <summary>
  180. /// 当前据点所属的区域数据(区域相关内容待细化)
  181. /// </summary>
  182. public int ZoneId
  183. {
  184. get
  185. {
  186. int zoneid = 501007;
  187. Dictionary<int, sm_gate_zone> gate_zone = GameConfigData.Ins.gate_zone;
  188. foreach (KeyValuePair<int, sm_gate_zone> kv in gate_zone)
  189. {
  190. string[] slist = kv.Value.contains.Split(',');
  191. if (slist.Contains(this.CurMapId.ToString()))
  192. {
  193. zoneid = this.CurMapId;
  194. break;
  195. }
  196. }
  197. return zoneid;
  198. }
  199. }
  200. /// <summary>
  201. /// 当前大地图所有据点数据信息(含有常量数据和实例数据)
  202. /// </summary>
  203. //public Dictionary<int, UIVO_FootHoldInfo> FootHoldList => GameConfigData.Ins.map_scene.Where(kv => kv.Value.zoneId == ZoneId)
  204. // .ToList().ConvertAll(kv => new KeyValuePair<int, UIVO_FootHoldInfo>(kv.Key, new UIVO_FootHoldInfo(player, kv.Value))).ToDictionary(kv => kv.Key, kv => kv.Value);
  205. public Dictionary<int, UIVO_FootHoldInfo> FootHoldList
  206. {
  207. get
  208. {
  209. Dictionary<int, UIVO_FootHoldInfo> FootHoldList = new Dictionary<int, UIVO_FootHoldInfo>();
  210. int zoneid = 501007;
  211. Dictionary<int, sm_gate_zone> gate_zone = GameConfigData.Ins.gate_zone;
  212. foreach (KeyValuePair<int, sm_gate_zone> kv in gate_zone)
  213. {
  214. string[] slist = kv.Value.contains.Split(',');
  215. if (slist.Contains(this.CurMapId.ToString()))
  216. {
  217. zoneid = kv.Key;
  218. break;
  219. }
  220. }
  221. string[] list = GameConfigData.Ins.Getgate_zoneMo(zoneid).contains.Split(',');
  222. foreach (string id in list)
  223. {
  224. sm_gate mo = sm_gate.GetMoById(int.Parse(id));
  225. UIVO_FootHoldInfo vo = new UIVO_FootHoldInfo(this.player, mo);
  226. FootHoldList[int.Parse(id)] = vo;
  227. }
  228. return FootHoldList;
  229. }
  230. }
  231. /// <summary>
  232. /// map所有的区id集合
  233. /// </summary>
  234. public List<int> mapZoneList
  235. {
  236. get
  237. {
  238. List<int> mapZoneList = new List<int>();
  239. mapZoneList.Add(501007);
  240. mapZoneList.Add(501008);
  241. return mapZoneList;
  242. }
  243. }
  244. /// <summary>
  245. /// 新手村和言灵学院的所有小地图信息
  246. /// </summary>
  247. public Dictionary<int,Dictionary<int,UIVO_FootHoldInfo>> AllFootHoldList
  248. {
  249. get
  250. {
  251. Dictionary<int, Dictionary<int, UIVO_FootHoldInfo>> allFootHoldList = new Dictionary<int, Dictionary<int, UIVO_FootHoldInfo>>();
  252. List<int> mapZoneList = this.mapZoneList;
  253. foreach (int zid in mapZoneList)
  254. {
  255. sm_gate_zone zoneMo = sm_gate_zone.GetMoById(zid);
  256. string[] sList = zoneMo.contains.Split(',');
  257. Dictionary<int, UIVO_FootHoldInfo> dic = new Dictionary<int, UIVO_FootHoldInfo>();
  258. foreach (string mapid in sList)
  259. {
  260. sm_gate mo = sm_gate.GetMoById(int.Parse(mapid));
  261. UIVO_FootHoldInfo vo = new UIVO_FootHoldInfo(this.player, mo);
  262. dic[int.Parse(mapid)] = vo;
  263. }
  264. allFootHoldList.Add(zid,dic);
  265. }
  266. return allFootHoldList;
  267. }
  268. }
  269. /// <summary>
  270. /// 据点信息
  271. /// </summary>
  272. public class UIVO_FootHoldInfo
  273. {
  274. private Player player { get; }
  275. /// <summary>
  276. /// 构造函数
  277. /// </summary>
  278. /// <param name="user">玩家信息</param>
  279. /// <param name="mo">常量</param>
  280. public UIVO_FootHoldInfo(Player user, sm_gate mo)
  281. {
  282. player = user;
  283. Mo = mo;
  284. }
  285. /// <summary>
  286. /// 配置数据
  287. /// </summary>
  288. public sm_gate Mo { get; }
  289. /// <summary>
  290. /// 此据点是否已经解锁
  291. /// </summary>
  292. public bool IsUnLocked => player.newMap.unlockedFootholds.ContainsKey(Mo.gateId);
  293. /// <summary>
  294. /// 显示有主线任务图标
  295. /// </summary>
  296. public bool HasMainTaskIcon
  297. {
  298. get
  299. {
  300. var flag = false;
  301. player.collectTaskCard.GetActivingCards().ForEach(tk =>
  302. {
  303. if ((int)Enum_TaskCardType.Main == tk.mo.type // 是主线任务
  304. && Enum_TaskCardStateType.finish == tk.state // 且, 可领奖
  305. && tk.FinialSteps().Exists(stp => stp.IsInMap(Mo.gateId)) // 且, 最终步骤处于当前地图
  306. )
  307. {
  308. flag = true;
  309. }
  310. });
  311. return flag;
  312. }
  313. }
  314. /// <summary>
  315. /// 显示可能接取到主线任务图标
  316. /// </summary>
  317. public bool MayGetMainTask
  318. {
  319. get
  320. {
  321. var flag = false;
  322. player.collectTaskCard.GetAllCards().ForEach(tk => // 遍历背包看有没有能开展的任务卡
  323. {
  324. if ((int)Enum_TaskCardType.Main == tk.mo.type // 是主线任务
  325. && tk.mo.tasksteps.Split(',').ToList().ConvertAll(s => sm_task_step.GetMoByID(int.Parse(s))).Exists(mo => mo.IsInMap(Mo.gateId))) // 且, 初始步骤处于当前据点
  326. {
  327. flag = true;
  328. }
  329. });
  330. return flag;
  331. }
  332. }
  333. /// <summary>
  334. /// 显示支线任务图标
  335. /// </summary>
  336. public bool HasBranchTaskIcon
  337. {
  338. get
  339. {
  340. #warning 支线任务类型还未细化细节(以前的分类有主线、日常、学院、悬赏). 2022.3.15
  341. return false;
  342. }
  343. }
  344. /// <summary>
  345. /// 显示可能接取到支线任务图标
  346. /// </summary>
  347. public bool MayGetBranchTaskIcon
  348. {
  349. get
  350. {
  351. #warning 支线任务类型还未细化细节(以前的分类有主线、日常、学院、悬赏). 2022.3.15
  352. return false;
  353. }
  354. }
  355. /// <summary>
  356. /// 显示我的位置指示图标
  357. /// </summary>
  358. public bool HasMyLocationIcon => player.newMap.curMapId == Mo.gateId;
  359. /// <summary>
  360. /// 显示其他队员位置指示图标
  361. /// </summary>
  362. public bool HasOthersLocationIcon
  363. {
  364. get
  365. {
  366. #warning 这里其他队员位置设定尚未细化,2022.3.15
  367. return false;
  368. }
  369. }
  370. /// <summary>
  371. /// 运行时实例数据, 任何编码均需注意防范 null 值, 可在逻辑前先判断IsUnlocked值
  372. /// </summary>
  373. public Ins_FootHold Ins => IsUnLocked ? player.newMap.unlockedFootholds[Mo.gateId] : null;
  374. }
  375. }
  376. #endregion
  377. }