C2G_EnterMapHandler.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using IceInternal;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text.Json;
  5. using Unity.Mathematics;
  6. namespace ET.Server
  7. {
  8. [MessageHandler(SceneType.Gate)]
  9. [FriendOfAttribute(typeof(ET.Server.BattleIceAgentComponent))]
  10. public class C2G_EnterMapHandler : AMRpcHandler<C2G_EnterMap, G2C_EnterMap>
  11. {
  12. protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply)
  13. {
  14. if(BattleIceAgentComponent.Instance == null)
  15. {
  16. Log.Error("Battle ice is null");
  17. response.Error = (int)ErrorCode.EnterMap.BattleSvrErr;
  18. reply();
  19. return;
  20. }
  21. StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(session.DomainZone(), request.MapName);
  22. if (startSceneConfig == null)
  23. {
  24. response.Error = (int)ErrorCode.EnterMap.MapNotExist;
  25. reply();
  26. return;
  27. }
  28. Player player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
  29. var gatemap = player.GetComponent<GateMapComponent>();
  30. if (gatemap != null)
  31. {
  32. player.RemoveComponent<GateMapComponent>();
  33. }
  34. GateMapComponent gateMapComponent = player.AddComponent<GateMapComponent>();
  35. //TODO: 先从所有map scene中查找是不是已经存在
  36. //TODO: 判断找到的scene人数是否已满等限制,如果人数超过限制,则需要传送到不同的战斗服
  37. // 在Gate上动态创建一个Map Scene,把Unit从DB中加载放进来,然后传送到真正的Map中,这样登陆跟传送的逻辑就完全一样了
  38. var scene = await SceneFactory.CreateServerScene(gateMapComponent, player.Id, IdGenerater.Instance.GenerateInstanceId(), gateMapComponent.DomainZone(), "GateMap", SceneType.Map);
  39. var scnInstance = scene.InstanceId.ToString();
  40. gateMapComponent.Scene = scene;
  41. //TODO: DELETE
  42. UnitComponent unitComponent = scene.GetComponent<UnitComponent>();
  43. Unit unit = unitComponent.AddChildWithId<Unit, int>(player.Id, 1001);
  44. unit.AddComponent<MoveComponent>();
  45. unit.Position = new float3(-10, 0, -10);
  46. NumericComponent numericComponent = unit.AddComponent<NumericComponent>();
  47. numericComponent.Set(NumericType.Speed, 6f); // 速度是6米每秒
  48. numericComponent.Set(NumericType.AOI, 15000); // 视野15米
  49. //unit.AddComponent<AOIEntity, int, float3>(9 * 1000, unit.Position);
  50. unit.AddComponent<UnitGateComponent, long>(session.InstanceId);
  51. //TODO: m2m transfer unit之后,此unit会dispose,就有bug了
  52. //战斗服===================
  53. //通知战斗服创建副本
  54. var IceZone = BattleIceAgentComponent.Instance.IceZoneManager;
  55. var ret = IceZone.createZoneRequest("", Global.GameServerId.ToString(), startSceneConfig.TemplateId, scnInstance, false, toJSON4CreateZone());
  56. Log.Info($"Battle ice createZoneRequest ret: {ret}");
  57. //player进入副本,把player基本信息上报给战斗服
  58. IceZone.begin_playerEnterRequest(unit.Id.ToString(), scnInstance, toJSON4EnterScene(ref unit)).whenCompleted(() =>
  59. {
  60. response.SceneId = scene.InstanceId;
  61. reply();
  62. WaitPlayerReady(session.DomainScene(), player.Id).Coroutine();
  63. //TODO:DELETE, 只是将player置入到游戏服的场景管理数据中,并无实际transfer动作。
  64. //TODO:删除Map服,战斗服取代了map服地位
  65. //TransferHelper.Transfer(unit, startSceneConfig.InstanceId, startSceneConfig.Name).Coroutine();
  66. },
  67. (Ice.Exception ex) => {
  68. if (ex != null)
  69. {
  70. Log.Error(ex.Message);
  71. //TODO:进入场景失败ErrCode
  72. response.Error = -1;
  73. response.Message = ex.Message;
  74. reply();
  75. return;
  76. }
  77. });
  78. }
  79. private async ETTask WaitPlayerReady(Scene scn, long playerid)
  80. {
  81. //等待client ready消息
  82. await scn.GetComponent<ObjectWait>().Wait<Wait_PlayerReady>();
  83. //告诉战斗服 i am ready
  84. //设置ice战斗服中player状态为ready
  85. var IceXmds = BattleIceAgentComponent.Instance.IceXmdsManager;
  86. IceXmds.playerReady(playerid.ToString());
  87. }
  88. //TODO:按照hotfix--model框架,这段逻辑应该放到modelComponet对应的ComponetSystem中
  89. private string toJSON4CreateZone()
  90. {
  91. //TODO:从配置中读取副本数据
  92. var json = new
  93. {
  94. monsterHard = "",
  95. calPKValue = false,
  96. allowAutoGuard = 1,
  97. usespaceDiv = false,
  98. sceneType = 1,
  99. areaType = 0,
  100. canRiding = false,
  101. killInterval = 5000,
  102. killFullNum = 0,
  103. killFullCollSec = 0,
  104. averageLevel = 0,
  105. };
  106. return System.Text.Json.JsonSerializer.Serialize(json);
  107. }
  108. //TODO:按照hotfix--model框架,这段逻辑应该放到modelComponet对应的ComponetSystem中
  109. //对应WNPlayer.java/toJSON4EnterScene
  110. private string toJSON4EnterScene(ref Unit info)
  111. {
  112. var json = new
  113. {
  114. effects = new {
  115. MaxHP = 666,
  116. HPPer = 1,
  117. HP = 233,
  118. Attack = 5,
  119. AttackPer = 1,
  120. },
  121. effectsExt = new { },
  122. skills = new List<SkillInfo>(){
  123. new SkillInfo {id = 110000, level = 1, type = 1, skillTime = 10000, cdTime = 5000, flag = 0 },
  124. new SkillInfo { id = 310000, level = 1, type = 1, skillTime = 10000, cdTime = 5000, flag = 0},
  125. },
  126. tasks = new { },
  127. flags = new { },
  128. playerEntered = false,
  129. avatars = new
  130. {
  131. },
  132. basic = new
  133. {
  134. name = "nickname",
  135. alliesForce = 0,
  136. force = 0,
  137. pro = 1,
  138. serverId = 101,
  139. titleId = 0,
  140. level = 1,
  141. vip = 0,
  142. upLevel = 1,
  143. beReward = 0,
  144. logicServerId = Global.GameServerId,
  145. sex = 0,
  146. uuid = info.Id.ToString(),
  147. potionAddition = 0
  148. },
  149. connectServerId = "bs-" + Global.GameServerId.ToString(),
  150. uid = info.Id.ToString(),
  151. unitTemplateID = 1,
  152. robot = false,
  153. tempData = new
  154. {
  155. //x = this.getPlayerAreaData().bornX,
  156. //y = this.getPlayerAreaData().bornY,
  157. x = 3,
  158. y = 4,
  159. direction = 0.1,
  160. hp = 1000,
  161. mp = 0,
  162. },
  163. pkInfo = new
  164. {
  165. mode = 0,
  166. value = 0,
  167. level = 1,
  168. },
  169. //petBase,
  170. addTestPetData = 0,
  171. sceneData = new
  172. {
  173. allowAutoGuard = 1,
  174. },
  175. };
  176. var retjson = System.Text.Json.JsonSerializer.Serialize(json, new JsonSerializerOptions { IncludeFields = true });
  177. Log.Debug("===================================");
  178. Log.Debug(retjson.ToString());
  179. Log.Debug("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
  180. return retjson;
  181. }
  182. }
  183. }