/// <summary> /// 断开一颗玩家的链接,包括它在Map服中的实体 /// </summary> /// <param name="account"></param> public async ETVoid removeOnePlayerLink(int account) { if (AccountToPlayer.ContainsKey(account)) { AccountToPlayer.Remove(account); //获取内网发送组件 IPEndPoint mapAddress = StartConfigComponent.Instance.MapConfigs[0].GetComponent <InnerConfig>().IPEndPoint; Session mapSession = Game.Scene.GetComponent <NetInnerComponent>().Get(mapAddress); //给Map服发送移除unit的信息, 并收到需要广播的player的账号 M2G_RemoveUnitByMap m2GRemoveUnitByMap = (M2G_RemoveUnitByMap)await mapSession.Call(new G2M_RemoveUnitByMap() { Account = account }); if (m2GRemoveUnitByMap.Accounts.Count > 0) { for (int i = 0; i < m2GRemoveUnitByMap.Accounts.Count; i++) { if (AccountToPlayer.TryGetValue(m2GRemoveUnitByMap.Accounts[i], out Player player)) { player.session.Send(new G2C_PlayerDisCatenate() { Account = account }); } else { Log.Error("所有player找不到这个需要发送其它玩家的断线信息的玩家"); } } } } else { Log.Error("这个玩家本来就不存在: " + account); } }
public static async ETVoid OnLoginAsync(Entity domain, string account) { try { // 创建一个ETModel层的Session ETModel.Session session = ETModel.Game.Scene.GetComponent<NetOuterComponent>().Create(GlobalConfigComponent.Instance.GlobalProto.Address); // 创建一个ETHotfix层的Session, ETHotfix的Session会通过ETModel层的Session发送消息 Session realmSession = EntityFactory.Create<Session, ETModel.Session>(domain, session); R2C_Login r2CLogin = (R2C_Login) await realmSession.Call(new C2R_Login() { Account = account, Password = "******" }); realmSession.Dispose(); // 创建一个ETModel层的Session,并且保存到ETModel.SessionComponent中 ETModel.Session gateSession = ETModel.Game.Scene.GetComponent<NetOuterComponent>().Create(r2CLogin.Address); ETModel.Game.Scene.AddComponent<ETModel.SessionComponent>().Session = gateSession; // 创建一个ETHotfix层的Session, 并且保存到ETHotfix.SessionComponent中 Game.Scene.AddComponent<SessionComponent>().Session = EntityFactory.Create<Session, ETModel.Session>(Game.Scene, gateSession); G2C_LoginGate g2CLoginGate = (G2C_LoginGate)await SessionComponent.Instance.Session.Call( new C2G_LoginGate() { Key = r2CLogin.Key, GateId = r2CLogin.GateId}); Log.Info("登陆gate成功!"); // 创建Player Player player = ETModel.EntityFactory.CreateWithId<Player>(ETModel.Game.Scene, g2CLoginGate.PlayerId); PlayerComponent playerComponent = ETModel.Game.Scene.GetComponent<PlayerComponent>(); playerComponent.MyPlayer = player; Game.EventSystem.Run(EventIdType.LoginFinish); // 测试消息有成员是class类型 G2C_PlayerInfo g2CPlayerInfo = (G2C_PlayerInfo) await SessionComponent.Instance.Session.Call(new C2G_PlayerInfo()); } catch (Exception e) { Log.Error(e); } }
public static async ETVoid OnLoginAsync(string account) { try { // ===> 登录session Session session = Game.Scene.GetComponent <NetOuterComponent>().Create(GlobalConfigComponent.Instance.GlobalProto.Address); R2C_Login r2CLogin = (R2C_Login)await session.Call(new C2R_Login() { Account = account, Password = "******" }); // ===> 网关session Session gateSession = Game.Scene.GetComponent <NetOuterComponent>().Create(r2CLogin.Address); Game.Scene.AddComponent <SessionComponent>().Session = gateSession; G2C_LoginGate g2CLoginGate = (G2C_LoginGate)await SessionComponent.Instance.Session.Call(new C2G_LoginGate() { Key = r2CLogin.Key }); Log.Info("登陆gate成功!"); // 创建Player Player player = ComponentFactory.CreateWithId <Player>(g2CLoginGate.PlayerId); PlayerComponent playerComponent = Game.Scene.GetComponent <PlayerComponent>(); playerComponent.MyPlayer = player; Game.EventSystem.Run(EventIdType.LoginFinish); // 测试消息有成员是class类型 //G2C_PlayerInfo g2CPlayerInfo = (G2C_PlayerInfo) await SessionComponent.Instance.Session.Call(new C2G_PlayerInfo()); } catch (Exception e) { Log.Error(e); } }
public async Task Send(Session session, int j) { try { await session.Call(new C2R_Ping()); ++this.k; if (this.k % 100000 != 0) { return; } long time2 = TimeHelper.ClientNow(); long time = time2 - this.time1; this.time1 = time2; Log.Info($"Benchmark k: {this.k} 每10W次耗时: {time} ms"); } catch (Exception e) { Log.Error(e.ToString()); } }
private async void RequestLock() { try { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(this.address); string serverAddress = Game.Scene.GetComponent <StartConfigComponent>().StartConfig.ServerIP; G2G_LockRequest request = new G2G_LockRequest { Id = this.Entity.Id, Address = serverAddress }; await session.Call(request); this.status = LockStatus.Locked; foreach (TaskCompletionSource <bool> taskCompletionSource in this.queue) { taskCompletionSource.SetResult(true); } this.queue.Clear(); } catch (Exception e) { Log.Error($"获取锁失败: {this.address} {this.Entity.Id} {e}"); } }
private async Task RequestUpdateServer() { UINetLoadingComponent.showNetLoading(); IPEndPoint manager = UILoginComponent.ToIPEndPointWithYuMing(10000); ETModel.Session managerSession = ETModel.Game.Scene.GetComponent <NetOuterComponent>().Create(manager); M2C_Reload g2cUpdateServer = (M2C_Reload)await managerSession.Call(new C2M_Reload() { AppType = AppType.Map }); UINetLoadingComponent.closeNetLoading(); if (g2cUpdateServer.Error != ErrorCode.ERR_Success) { ToastScript.createToast(g2cUpdateServer.Message); return; } ToastScript.createToast("更新成功"); managerSession.Dispose(); }
//A0 01注册 02登录realm 03登录gate public static async ETVoid Login(string account, string password) { LandLoginComponent login = Game.Scene.GetComponent <UIComponent>().Get(LandUIType.LandLogin).GetComponent <LandLoginComponent>(); //创建Realm session Session sessionRealm = Game.Scene.GetComponent <NetOuterComponent>().Create(GlobalConfigComponent.Instance.GlobalProto.Address); A0002_Login_R2C messageRealm = (A0002_Login_R2C)await sessionRealm.Call(new A0002_Login_C2R() { Account = account, Password = password }); sessionRealm.Dispose(); login.prompt.text = "正在登录中..."; //判断Realm服务器返回结果 if (messageRealm.Error == ErrorCode.ERR_AccountOrPasswordError) { login.prompt.text = "登录失败,账号或密码错误"; login.account.text = ""; login.password.text = ""; login.isLogining = false; return; } //判断通过则登陆Realm成功 //创建网关 session Session sessionGate = Game.Scene.GetComponent <NetOuterComponent>().Create(messageRealm.GateAddress); if (SessionComponent.Instance == null) { Log.Debug("创建唯一Session"); Game.Scene.AddComponent <SessionComponent>().Session = sessionGate; } else { //存入SessionComponent方便我们随时使用 Log.Debug("存入SessionComponent方便我们随时使用"); SessionComponent.Instance.Session = sessionGate; //Game.EventSystem.Run(EventIdType.SetHotfixSession); } A0003_LoginGate_G2C messageGate = (A0003_LoginGate_G2C)await sessionGate.Call(new A0003_LoginGate_C2G() { GateLoginKey = messageRealm.GateLoginKey }); //判断登陆Gate服务器返回结果 if (messageGate.Error == ErrorCode.ERR_ConnectGateKeyError) { login.prompt.text = "连接网关服务器超时"; login.account.text = ""; login.password.text = ""; sessionGate.Dispose(); login.isLogining = false; return; } //判断通过则登陆Gate成功 login.prompt.text = ""; User user = ComponentFactory.Create <User, long>(messageGate.UserID); GamerComponent.Instance.MyUser = user; //Log.Debug("登陆成功"); //加载透明界面 退出当前界面 Game.EventSystem.Run(UIEventType.LandLoginFinish); // 加载大厅界面 Game.EventSystem.Run(UIEventType.LandInitLobby); }
public async void SaveLog(ComponentWithId component) { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(dbAddress); await session.Call(new DBSaveRequest { Component = component, NeedCache = false, CollectionName = "Log" }); }
public async Task Save(ComponentWithId component, bool needCache, CancellationToken cancellationToken) { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(dbAddress); await session.Call(new DBSaveRequest { Component = component, NeedCache = needCache }, cancellationToken); }
public async Task SaveBatch(List <ComponentWithId> components, bool needCache = true) { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(dbAddress); await session.Call(new DBSaveBatchRequest { Components = components, NeedCache = needCache }); }
public async Task Save(Component disposer, bool needCache = true) { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(dbAddress); await session.Call(new DBSaveRequest { Disposer = disposer, NeedCache = needCache }); }
public static async ETVoid Login(string account, string password) { SekiaLoginComponent login = Game.Scene.GetComponent <FUIComponent>().Get(FUIType.SekiaLogin).GetComponent <SekiaLoginComponent>(); Session sessionRealm = Game.Scene.GetComponent <NetOuterComponent>().Create(GlobalConfigComponent.Instance.GlobalProto.Address); A0002_Login_R2C messageRealm = (A0002_Login_R2C)await sessionRealm.Call(new A0002_Login_C2R() { Account = account, Password = password }); sessionRealm.Dispose(); login.Prompt.GObject.asTextField.text = "正在登录中..."; //判断Realm服务器返回结果 if (messageRealm.Error == ErrorCode.ERR_AccountOrPasswordError) { login.Prompt.GObject.asTextField.text = "登录失败,账号或密码错误"; login.AccountInput.Get("Input").GObject.asTextInput.text = ""; login.PasswordInput.Get("Input").GObject.asTextInput.text = ""; login.isLogining = false; return; } //判断通过则登陆Realm成功 //创建唯一Session Session sessionGate = Game.Scene.GetComponent <NetOuterComponent>().Create(messageRealm.GateAddress); if (SessionComponent.Instance == null) { //Log.Debug("创建唯一Session"); Game.Scene.AddComponent <SessionComponent>().Session = sessionGate; } else { SessionComponent.Instance.Session = sessionGate; } A0003_LoginGate_G2C messageGate = (A0003_LoginGate_G2C)await sessionGate.Call(new A0003_LoginGate_C2G() { GateLoginKey = messageRealm.GateLoginKey }); //判断登陆Gate服务器返回结果 if (messageGate.Error == ErrorCode.ERR_ConnectGateKeyError) { login.Prompt.GObject.asTextField.text = "连接网关服务器超时"; login.AccountInput.Get("Input").GObject.asTextInput.text = ""; login.PasswordInput.Get("Input").GObject.asTextInput.text = ""; sessionGate.Dispose(); login.isLogining = false; return; } //判断通过则登陆Gate成功 login.Prompt.GObject.asTextField.text = ""; User user = ComponentFactory.Create <User, long>(messageGate.UserID); GamerComponent.Instance.MyUser = user; //Log.Debug("登陆成功"); //获取角色信息判断应该进入哪个界面 A0008_GetUserInfo_G2C messageUser = (A0008_GetUserInfo_G2C)await sessionGate.Call(new A0008_GetUserInfo_C2G()); //消息中包含了3个CharacterInfo //正常的角色等级为正整数 if (messageUser.Characters.Count == 3 && messageUser.Characters[0].Level == 0 && messageUser.Characters[1].Level == 0 && messageUser.Characters[2].Level == 0) { //进入创建角色界面 CreateCharacterFactory.Create(messageUser); CreateCharacterComponent creater = Game.Scene.GetComponent <FUIComponent>().Get(FUIType.CreateCharacter).GetComponent <CreateCharacterComponent>(); creater.Seat = 1; //创建第一个空位的角色 } else if (messageUser.Characters.Count == 3 && (messageUser.Characters[0].Level > 0 || messageUser.Characters[1].Level > 0 || messageUser.Characters[2].Level > 0)) { //进入角色选择界面 SelectCharacterFactory.Create(messageUser); } Game.EventSystem.Run(EventIdType.SekiaLoginFinish); }
public static async ETTask Save(this DBProxyComponent self, ComponentWithId component) { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(self.dbAddress); await session.Call(new DBSaveRequest { Component = component }); }
public static async ETTask SaveBatch(this DBProxyComponent self, List <ComponentWithId> components) { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(self.dbAddress); await session.Call(new DBSaveBatchRequest { Components = components }); }
public static async ETVoid SaveLog(this DBProxyComponent self, ComponentWithId component) { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(self.dbAddress); await session.Call(new DBSaveRequest { Component = component, CollectionName = "Log" }); }
public static async Task Save(this DBProxyComponent self, ComponentWithId component, bool needCache = true) { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(self.dbAddress); await session.Call(new DBSaveRequest { Component = component, NeedCache = needCache }); }