Browse Source

增加游戏服ICE接口实现Demo: createZoneRequest, playerEnterRequest

大爷 2 years ago
parent
commit
73559bf270
1 changed files with 117 additions and 26 deletions
  1. 117 26
      DotNet/Hotfix/Demo/Scenes/Gate/Handler/C2G_EnterMapHandler.cs

+ 117 - 26
DotNet/Hotfix/Demo/Scenes/Gate/Handler/C2G_EnterMapHandler.cs

@@ -1,31 +1,122 @@
 using System;
+using System.Security.AccessControl;
 
 
 namespace ET.Server
 {
-	[MessageHandler(SceneType.Gate)]
-	public class C2G_EnterMapHandler : AMRpcHandler<C2G_EnterMap, G2C_EnterMap>
-	{
-		protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply)
-		{
-			Player player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
-
-			// 在Gate上动态创建一个Map Scene,把Unit从DB中加载放进来,然后传送到真正的Map中,这样登陆跟传送的逻辑就完全一样了
-			GateMapComponent gateMapComponent = player.AddComponent<GateMapComponent>();
-			gateMapComponent.Scene = await SceneFactory.CreateServerScene(gateMapComponent, player.Id, IdGenerater.Instance.GenerateInstanceId(), gateMapComponent.DomainZone(), "GateMap", SceneType.Map);
-
-			Scene scene = gateMapComponent.Scene;
-			
-			// 这里可以从DB中加载Unit
-			Unit unit = Server.UnitFactory.Create(scene, player.Id, UnitType.Player);
-			unit.AddComponent<UnitGateComponent, long>(session.InstanceId);
-			
-			StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(session.DomainZone(), "Map1");
-			response.MyId = player.Id;
-			reply();
-			
-			// 开始传送
-			await TransferHelper.Transfer(unit, startSceneConfig.InstanceId, startSceneConfig.Name);
-		}
-	}
-}
+    [MessageHandler(SceneType.Gate)]
+    [FriendOfAttribute(typeof(ET.Server.BattleIceAgentComponent))]
+    public class C2G_EnterMapHandler : AMRpcHandler<C2G_EnterMap, G2C_EnterMap>
+    {
+        protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply)
+        {
+            if(BattleIceAgentComponent.Instance == null)
+            {
+                response.Error = (int)ErrorCode.EnterMap.BattleSvrErr;
+                reply();
+                return;
+            }
+
+            StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(session.DomainZone(), request.MapName);
+            if (startSceneConfig == null)
+            {
+                response.Error = (int)ErrorCode.EnterMap.MapNotExist;
+                reply();
+                return;
+            }
+
+            Player player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
+
+            // 在Gate上动态创建一个Map Scene,把Unit从DB中加载放进来,然后传送到真正的Map中,这样登陆跟传送的逻辑就完全一样了
+            GateMapComponent gateMapComponent = player.AddComponent<GateMapComponent>();
+            gateMapComponent.Scene = await SceneFactory.CreateServerScene(gateMapComponent, player.Id, IdGenerater.Instance.GenerateInstanceId(), gateMapComponent.DomainZone(), "GateMap", SceneType.Map);
+            Scene scene = gateMapComponent.Scene;
+
+            // 这里可以从DB中加载Unit
+            Unit unit = Server.UnitFactory.Create(scene, player.Id, UnitType.Player);
+            unit.AddComponent<UnitGateComponent, long>(session.InstanceId);
+
+            var scnInstance = scene.InstanceId.ToString();
+            //战斗服===================
+            //通知战斗服创建副本
+            var IceZone = BattleIceAgentComponent.Instance.IceZoneManager;
+            var ret = IceZone.createZoneRequest("", Global.GameServerId.ToString(), startSceneConfig.TemplateId, scnInstance, false, toJSON4CreateZone());
+            Log.Info($"Battle ice createZoneRequest ret: {ret}");
+
+            //player进入副本,把player基本信息上报给战斗服
+            if (BattleIceAgentComponent.Instance == null)
+            {
+                Log.Error("Battle ice is null");
+                return;
+            }
+            IceZone.begin_playerEnterRequest(player.Id.ToString(), scnInstance, toJSON4EnterScene(ref player)).whenCompleted((Ice.Exception ex) => {
+                Log.Error(ex.Message);
+            });
+
+            response.MyId = player.Id;
+            reply();
+
+            // 开始传送
+            await TransferHelper.Transfer(unit, startSceneConfig.InstanceId, startSceneConfig.Name);
+        }
+
+        //TODO:按照hotfix--model框架,这段逻辑应该放到modelComponet对应的ComponetSystem中
+        private string toJSON4CreateZone()
+        {
+            //TODO:从配置中读取副本数据
+            var json = new
+            {
+                monsterHard = "",
+                calPKValue = false,
+                allowAutoGuard = 1,
+                usespaceDiv = false,
+                sceneType = 1,
+                areaType = 0,
+                canRiding = false,
+                killInterval = 5000,
+                killFullNum = 0,
+                killFullCollSec = 0,
+                averageLevel = 0,
+            };
+            return System.Text.Json.JsonSerializer.Serialize(json);
+        }
+
+        //TODO:按照hotfix--model框架,这段逻辑应该放到modelComponet对应的ComponetSystem中
+        //对应WNPlayer.java/toJSON4EnterScene
+        private string toJSON4EnterScene(ref Player info)
+        {
+            var json = new
+            {
+                effects = "",
+                effectsExt = "",
+                skills = "",
+                basic = new
+                {
+                    name = "nickname",
+                    alliesForce = 0,
+                    force = 0,
+                    pro = 1,
+                    serverId = 0,
+                    level = 1,
+                    vip = 0,
+                    upLevel = 1,
+                    sex = 0,
+                    uuid = info.Id.ToString(),
+                },
+                connectServerId = "bs-" + Global.GameServerId.ToString(),
+                avatars = "",
+                uid = info.Id.ToString(),
+                unitTemplateID = 1,
+                //x,y,direction
+                hp = 1000,
+                mp = 0,
+                //pkInfo, petBase,
+                sceneData = new
+                {
+                    allowAutoGuard = 1,
+                },
+            };
+            return System.Text.Json.JsonSerializer.Serialize(json);
+        }
+    }
+}