protected override async void Run(Session session, JoinMatch_RT message, Action <JoinMatch_RE> reply) { JoinMatch_RE response = new JoinMatch_RE(); try { MatchComponent matchComponent = Game.Scene.GetComponent <MatchComponent>(); if (matchComponent.Playing.ContainsKey(message.UserID)) { //重连房间 long roomId = matchComponent.Playing[message.UserID]; RoomManagerComponent roomManager = Game.Scene.GetComponent <RoomManagerComponent>(); Room room = roomManager.Get(roomId); foreach (var gamer in room.GetAll()) { if (gamer.UserID == message.UserID) { long pastId = gamer.Id; gamer.Id = message.PlayerID; room.Replace(pastId, gamer); break; } } ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(roomId); actorProxy.Send(new PlayerReconnect() { PlayerID = message.PlayerID, UserID = message.UserID, GateSessionID = message.GateSessionID }); response.ActorID = roomId; reply(response); return; } //创建匹配玩家 Matcher matcher = EntityFactory.Create <Matcher, long>(message.PlayerID); matcher.UserID = message.UserID; matcher.GateSessionID = message.GateSessionID; matcher.GateAppID = message.GateAppID; await matcher.AddComponent <ActorComponent>().AddLocation(); //加入匹配队列 Game.Scene.GetComponent <MatcherComponent>().Add(matcher); Log.Info($"玩家{message.PlayerID}加入匹配队列"); response.ActorID = matcher.Id; reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected override void Run(Session session, GamerQuitRoom message) { //同步房间玩家 RoomManagerComponent roomManager = Game.Scene.GetComponent <RoomManagerComponent>(); Room room = roomManager.Get(message.RoomID); Gamer gamer = room.Get(message.PlayerID); room.Remove(message.PlayerID); Game.Scene.GetComponent <MatchComponent>().Playing.Remove(gamer.UserID); Log.Info($"匹配服务器同步:玩家{message.PlayerID}离开房间{room.Id}"); if (room.Count == 0) { roomManager.Recycle(room.Id); Log.Info($"回收房间{room.Id}"); } }
protected override void Run(Session session, SyncRoomState message) { RoomManagerComponent roomManager = Game.Scene.GetComponent <RoomManagerComponent>(); Room room = roomManager.Get(message.RoomID); //同步房间状态 switch (message.State) { case RoomState.Game: roomManager.RoomStartGame(room.Id); Log.Info($"房间{room.Id}切换为游戏状态"); break; case RoomState.Ready: Log.Info($"房间{room.Id}切换为准备状态"); roomManager.RoomEndGame(room.Id); break; } }