MapHelper.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using System;
  2. using Newtonsoft.Json;
  3. using Newtonsoft.Json.Linq;
  4. namespace ET.Server
  5. {
  6. /// <summary>
  7. /// 地图工具类
  8. /// </summary>
  9. public static class MapHelper
  10. {
  11. /// <summary>
  12. /// 实际切换地图
  13. /// </summary>
  14. /// <param name="player"></param>
  15. /// <param name="areaData"></param>
  16. /// <param name="forceChange"></param>
  17. /// <returns></returns>
  18. public static Map ChangeArea(WNPlayer player, AreaData areaData, bool forceChange)
  19. {
  20. Map map = player.Map;
  21. if (map != null)
  22. {
  23. if (map.Id == areaData.instanceId)
  24. {
  25. Log.Info($"changeArea1已在场景:{map.Prop.Name}, playerId={player.GetId()}, playerName={player.GetName()}");
  26. return map;
  27. }
  28. map.SyncPlayerHistoryData(player);
  29. }
  30. Map targetMap = player.DomainScene().GetComponent<GameMapComponent>().Get(areaData.instanceId);
  31. if (targetMap == null)
  32. {
  33. Log.Debug($"目标场景为空");
  34. return null;
  35. }
  36. // 非强制切图,检测一下pk模式,是否允许切图
  37. if (!forceChange)
  38. {
  39. int resCode = player.GetXmdsManager().refreshPlayerPKMode(player.GetId().ToString().Trim(), true, (int)PkModel.Peace);
  40. if (resCode != 0)
  41. {
  42. // 战斗状态下无法传送
  43. Log.Warning($"refreshPlayerPKMode resCode={resCode}, playerId={player.GetId()}, 当前场景={player.GetComponent<PlayerTempDataComponent>().MapData.mapId}, 传送场景={areaData.areaId}");
  44. return null;
  45. }
  46. }
  47. player.GetComponent<PlayerTempDataComponent>().SyncBornData(areaData.targetX, areaData.targetY, areaData.areaId);
  48. player.BornType = (int) BORN_TYPE.BORN;
  49. player.EnterState = (int) ENTER_STATE.changeArea;
  50. // 进入新的地图
  51. map = PlayerEnterAreaServer(player, areaData.instanceId);
  52. return map;
  53. }
  54. /// <summary>
  55. /// 进入map
  56. /// </summary>
  57. /// <param name="player"></param>
  58. /// <param name="instanceId"></param>
  59. public static Map PlayerEnterAreaServer(WNPlayer player, long instanceId)
  60. {
  61. Map map = player.DomainScene().GetComponent<GameMapComponent>().Get(instanceId);
  62. if (map != null)
  63. {
  64. Map oldMap = player.Map;
  65. if (oldMap != null)
  66. {
  67. oldMap.RemovePlayer(player, false);
  68. }
  69. // 初始化角色出生坐标数据
  70. player.InitBornData();
  71. map.AddPlayer(player);
  72. }
  73. else
  74. {
  75. Log.Warning($"playerEnterAreaServer场景不存在: playerId={player.GetId()}, instanceId={instanceId}");
  76. }
  77. return map;
  78. }
  79. /// <summary>
  80. /// 角色bind的时候分配场景
  81. /// </summary>
  82. /// <param name="player"></param>
  83. /// <returns></returns>
  84. public static Map BindPlayerDispatch(WNPlayer player)
  85. {
  86. Map map = null;
  87. GameMapComponent component = player.DomainScene().GetComponent<GameMapComponent>();
  88. map = component.GetMapByRoomId(player.GetRoomId());
  89. // 老场景
  90. if (map != null)
  91. {
  92. // 下一局
  93. if (map.IsGameOver())
  94. {
  95. map.Init();
  96. player.GetComponent<PlayerTempDataComponent>().MapData.ready = false;
  97. }
  98. return map;
  99. }
  100. // 创建一个场景
  101. JObject jsonObject = new JObject();
  102. jsonObject.Add("id", player.GetId());
  103. jsonObject.Add("logicServerId", player.GetLogicServerId());
  104. jsonObject.Add("areaId", 10098);
  105. map = CreateMap(player, jsonObject, false);
  106. if (map != null)
  107. {
  108. map = ChangeArea(player, new AreaData(10098, map.Id), false);
  109. }
  110. return map;
  111. }
  112. /// <summary>
  113. /// 创建战斗服场景需求数据
  114. /// </summary>
  115. /// <param name="player"></param>
  116. /// <param name="jObject"></param>
  117. /// <param name="forceCreate"></param>
  118. /// <returns></returns>
  119. public static Map CreateMap(WNPlayer player, JObject jObject, bool forceCreate)
  120. {
  121. Log.Debug($"createArea areaData:{JsonConvert.SerializeObject(jObject, Formatting.Indented)}");
  122. int mapId = Convert.ToInt32(jObject.SelectToken("areaId"));
  123. MapConfig prop = MapConfigCategory.Instance.Get(mapId);
  124. if (prop == null)
  125. {
  126. return null;
  127. }
  128. long instanceId = IdGenerater.Instance.GenerateInstanceId();
  129. bool usespaceDiv = prop.Type == (int) MapType.NORMAL;
  130. JObject jsonObject = new ();
  131. jsonObject.Add("monsterHard", prop.MonsterHard);
  132. jsonObject.Add("calPKValue", prop.ignorePkRule == 0);
  133. jsonObject.Add("allowAutoGuard", prop.AutoFight);
  134. jsonObject.Add("usespaceDiv", usespaceDiv);
  135. jsonObject.Add("sceneType", prop.Type);
  136. jsonObject.Add("areaType", prop.AreaType);
  137. jsonObject.Add("canRiding", prop.RideMount == 1);
  138. jsonObject.Add("killInterval", prop.killInterval);
  139. jsonObject.Add("killFullNum", prop.killFullNum);
  140. jsonObject.Add("killFullCollSec", prop.killFullCollSec);
  141. jsonObject.Add("averageLevel", 0);
  142. string enterData = JsonConvert.SerializeObject(jsonObject, Formatting.Indented);
  143. Log.Info($"createArea instanceId:{instanceId}, templateId:{prop.TemplateID}, bs:{player.GetZoneManager()}");
  144. int resCode = player.GetZoneManager().createZoneRequest(player.GetId().ToString(),
  145. "bs-" + ConstGame.GameServerId, prop.TemplateID, instanceId.ToString(), forceCreate, enterData);
  146. if (resCode == 0)
  147. {
  148. jsonObject.Add("instanceId", instanceId);
  149. jsonObject.Add("areaId", mapId);
  150. return CreaLocalMap(player, prop, jsonObject, instanceId, mapId, "bs-" + ConstGame.GameServerId);
  151. }
  152. Log.Warning($"createZoneRequest resCode={resCode}, mapID={prop.Id}, playerId={player.GetId()}");
  153. return null;
  154. }
  155. /// <summary>
  156. /// 创建本地场景
  157. /// </summary>
  158. /// <param name="player"></param>
  159. /// <param name="prop"></param>
  160. /// <param name="data"></param>
  161. /// <param name="instanceId"></param>
  162. /// <param name="mapId"></param>
  163. /// <param name="bsServerId"></param>
  164. /// <returns></returns>
  165. public static Map CreaLocalMap(WNPlayer player, MapConfig prop, JObject data, long instanceId, int mapId, string bsServerId)
  166. {
  167. Scene scene = player.DomainScene();
  168. Map map = scene.GetComponent<GameMapComponent>().AddChildWithId<Map, JObject, WNPlayer>(instanceId, data, player);
  169. if (map != null)
  170. {
  171. Log.Info($"创建Area场景:{map.MapId}, instanceId:{instanceId}, srvId:" + map.LogicServerId);
  172. map.BindBattleServer(player, bsServerId);
  173. scene.GetComponent<GameMapComponent>().Add(map.RoomId, map);
  174. }
  175. else
  176. {
  177. Log.Error($"createZone:{mapId} fail! there is no area type of this,type:{prop.Type}");
  178. }
  179. return map;
  180. }
  181. }
  182. }