protected async override void Run(Session session, C2S_UserLogin message, Action <S2C_UserLogin> reply) { S2C_UserLogin response = new S2C_UserLogin(); //从local获取一个map地址 var ret = await Game.Scene.GetComponent <LocationProxyComponent>().GetMapAddress(1); if (ret.Tag != 0) { response.Tag = ret.Tag; reply(response); } Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(NetworkHelper.ToIPEndPoint(ret.Address)); M2G_CreateUnit createUnit = (M2G_CreateUnit)await mapSession.Call(new G2M_CreateUnit() { AccountId = message.AccountId, GateSessionId = session.InstanceId }); Player player = ComponentFactory.Create <Player, int>(message.AccountId); player.UnitId = createUnit.UnitId; Log.Debug("数据库结束:" + createUnit); Game.Scene.GetComponent <PlayerManagerComponent>().Add(player); session.AddComponent <SessionPlayerComponent>().Player = player; session.AddComponent <MailBoxComponent, string>(ActorType.GateSession); response.Tag = 0; response.UnitId = createUnit.UnitId; reply(response); Log.Debug("数据库结束"); count++; }
protected async ETVoid RunAsync(Session session, C2G_EnterMap message, Action <G2C_EnterMap> reply) { G2C_EnterMap response = new G2C_EnterMap(); try { ///20190716 加入心跳包 Game.Scene.GetComponent <BongComponent>().AddSession(session.InstanceId); Console.WriteLine(" session.InstanceId/Id: " + session.InstanceId + " / " + session.Id); Player player = session.GetComponent <SessionPlayerComponent>().Player; // 在map服务器上创建战斗Unit M2G_CreateUnit createResponse = (M2G_CreateUnit)await SessionHelper.MapSession().Call(new G2M_CreateUnit() { UnitType = (int)UnitType.Player, RolerId = player.Id, GateSessionId = session.InstanceId, UnitId = 0 }); player.UnitId = createResponse.UnitId; response.UnitId = player.UnitId; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected override async void Run(Session session, C2G_EnterMap message, Action <G2C_EnterMap> reply) { G2C_EnterMap response = new G2C_EnterMap(); try { Player player = session.GetComponent <SessionPlayerComponent>().Player; // 在map服务器上创建战斗Unit IPEndPoint mapAddress = StartConfigComponent.Instance.MapConfigs[0].GetComponent <InnerConfig>().IPEndPoint; Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress); M2G_CreateUnit createUnit = (M2G_CreateUnit)await mapSession.Call(new G2M_CreateUnit() { PlayerId = player.Id, GateSessionId = session.InstanceId }); player.UnitId = createUnit.UnitId; response.UnitId = createUnit.UnitId; response.Count = createUnit.Count; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected async ETVoid RunAsync(Session session, C2G_EnterMap message, Action <G2C_EnterMap> reply) { G2C_EnterMap response = new G2C_EnterMap(); try { Player player = session.GetComponent <SessionPlayerComponent>().Player; // 在map服务器上创建战斗Unit IPEndPoint mapAddress = StartConfigComponent.Instance.MapConfigs[0].GetComponent <InnerConfig>().IPEndPoint; Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress); // 此session是gate与client通信的session,将session的instanceId给map进程,map就能将消息给指定的gate的session,并实现转发 M2G_CreateUnit createUnit = (M2G_CreateUnit)await mapSession.Call(new G2M_CreateUnit() { PlayerId = player.Id, GateSessionId = session.InstanceId }); player.UnitId = createUnit.UnitId; response.UnitId = createUnit.UnitId; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected async ETVoid RunAsync(Session session, C2G_EnterMap message, Action <G2C_EnterMap> reply) { G2C_EnterMap response = new G2C_EnterMap(); try { Player player = session.GetComponent <SessionPlayerComponent>().Player; // 在map服务器上创建战斗Unit IPEndPoint mapAddress = StartConfigComponent.Instance.MapConfigs[0].GetComponent <InnerConfig>().IPEndPoint; Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress); M2G_CreateUnit createUnit = (M2G_CreateUnit)await mapSession.Call(new G2M_CreateUnit() { PlayerId = player.Id, GateSessionId = session.InstanceId, groupIndex = (int)GroupIndex.Player, layerMask = (int)UnitLayerMask.ALL, unitLayer = (int)UnitLayer.Character, unitTag = (int)UnitTag.Player }); player.UnitId = createUnit.UnitId; response.UnitId = createUnit.UnitId; response.Frame = Game.Scene.GetComponent <UnitStateMgrComponent>().currFrame; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply) { Player player = session.GetComponent <SessionPlayerComponent>().Player; // 在map服务器上创建战斗Unit long mapInstanceId = StartConfigComponent.Instance.GetByName("Map1").SceneInstanceId; M2G_CreateUnit createUnit = (M2G_CreateUnit)await ActorMessageSenderComponent.Instance.Call( mapInstanceId, new G2M_CreateUnit() { PlayerId = player.Id, GateSessionId = session.InstanceId }); player.UnitId = createUnit.UnitId; response.UnitId = createUnit.UnitId; reply(); }
protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply) { Player player = session.GetComponent <SessionPlayerComponent>().Player; // 在map服务器上创建战斗Unit IPEndPoint mapAddress = StartConfigComponent.Instance.MapConfigs[0].GetComponent <InnerConfig>().IPEndPoint; Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress); M2G_CreateUnit createUnit = (M2G_CreateUnit)await mapSession.Call(new G2M_CreateUnit() { PlayerId = player.Id, GateSessionId = session.InstanceId }); player.UnitId = createUnit.UnitId; response.UnitId = createUnit.UnitId; reply(); }
protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply) { Player player = session.GetComponent <SessionPlayerComponent>().Player; //获取到第一个地图服务器的内网地址 IPEndPoint mapAddress = StartConfigComponent.Instance.MapConfigs[0].GetComponent <InnerConfig>().IPEndPoint; //创建socket连接到地图服务器 Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress); //给地图服务器发送创建单位的协议 //GateSessionId=session.InstanceId 传递会话实体的实例ID,后面可以通过这个重新找回会话实体 M2G_CreateUnit createUnit = (M2G_CreateUnit)await mapSession.Call(new G2M_CreateUnit() { PlayerId = player.Id, GateSessionId = session.InstanceId }); //将地图服务器返回的数据 单位Id赋值缓存 并且响应给客户端 单位Id缓存到Session上 player.UnitId = createUnit.UnitId; response.UnitId = createUnit.UnitId; //虽然响应给客户端了 但是客户端没有处理M2G_CreateUnit协议 reply(); }
public virtual async ETTask G2M_CreateUnitHandler(Scene scene, G2M_CreateUnit request, M2G_CreateUnit response, Action reply) { }
public override async ETTask G2M_CreateUnitHandler(Scene scene, G2M_CreateUnit request, M2G_CreateUnit response, Action reply) { var copyMap = Game.Scene.Children.Values.ToList().Find((x) => { if (x is Scene s) { return(s.Name == "CopyMap1"); } return(false); }); if (copyMap == null) { var copyMapConfig = StartConfigComponent.Instance.GetByName("CopyMap1"); copyMap = await SceneFactory.Create(Game.Scene, copyMapConfig.GetComponent <SceneConfig>().Name, SceneType.Map); } Unit unit = null; if (request.UnitId != 0) { unit = await DBComponent.Instance.Query <Unit>(request.UnitId); unit.Domain = copyMap; } else { unit = EntityFactory.CreateWithId <Unit>(copyMap, IdGenerater.GenerateId()); unit.PlayerId = request.PlayerId; unit.Setup(); unit.Save().Coroutine(); } unit.AddComponent <MoveComponent>(); unit.AddComponent <Body2dComponent>().CreateBody(.5f, .5f); unit.AddComponent <MailBoxComponent>(); await unit.AddLocation(); unit.AddComponent <UnitGateComponent, long>(request.GateSessionId); copyMap.GetComponent <UnitComponent>().Add(unit); response.UnitId = unit.Id; // 广播创建的unit var inViewUnitsMsg = new M2C_InViewUnits(); var enterViewMsg = new M2C_OnEnterView(); Unit[] units = copyMap.GetComponent <UnitComponent>().GetAll(); foreach (Unit u in units) { var entityInfo = new EntiyInfo(); entityInfo.BsonBytes = new Google.Protobuf.ByteString(); entityInfo.BsonBytes.bytes = MongoHelper.ToBson(u); entityInfo.Type = EntityDefine.GetTypeId <Unit>(); if (u.Id == unit.Id) { enterViewMsg.EnterEntity = entityInfo; inViewUnitsMsg.SelfUnit = entityInfo.BsonBytes; continue; } inViewUnitsMsg.InViewEntitys.Add(entityInfo); } var monsters = copyMap.GetComponent <MonsterComponent>().GetAll(); foreach (var u in monsters) { var entityInfo = new EntiyInfo(); entityInfo.BsonBytes = new Google.Protobuf.ByteString(); entityInfo.BsonBytes.bytes = MongoHelper.ToBson(u); entityInfo.Type = EntityDefine.GetTypeId <Monster>(); inViewUnitsMsg.InViewEntitys.Add(entityInfo); } MessageHelper.BroadcastToOther(unit, enterViewMsg); MessageHelper.Send(unit, inViewUnitsMsg); reply(); }