public static Room Get(this RoomManagerComponent self, long id) { Room room; self.Rooms.TryGetValue(id, out room); return(room); }
public static void RoomEndGame(this RoomManagerComponent self, long id) { Room room = self.GameRooms[id]; self.GameRooms.Remove(id); self.ReadyRooms.Add(room.Id, room); }
public static void Recycle(this RoomManagerComponent self, long id) { Room room = self.ReadyRooms[id]; self.ReadyRooms.Remove(room.Id); self.IdleRooms.Enqueue(room); }
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); } }
public static Room GetIdleRoom(this RoomManagerComponent self) { if (self.IdleRoomCount > 0) { Room room = self.IdleRooms.Dequeue(); self.ReadyRooms.Add(room.Id, room); return(room); } else { return(null); } }
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}"); } }
public static void Update(this MatchComponent self) { while (true) { MatcherComponent matcherComponent = Game.Scene.GetComponent <MatcherComponent>(); Queue <Matcher> matchers = new Queue <Matcher>(matcherComponent.GetAll()); RoomManagerComponent roomManager = Game.Scene.GetComponent <RoomManagerComponent>(); Room room = roomManager.GetReadyRoom(); if (matchers.Count == 0) { //当没有匹配玩家时直接结束 break; } if (room == null && matchers.Count >= 3) { //当还有一桌匹配玩家且没有可加入房间时使用空房间 room = roomManager.GetIdleRoom(); } if (room != null) { //当有房间时匹配玩家直接加入 while (matchers.Count > 0 && room.Count < 3) { JoinRoom(self, room, matchers.Dequeue()); } } else if (matchers.Count >= 3) { //当还有一桌匹配玩家且没有空房间时创建新房间 CreateRoom(self); break; } else { break; } //移除匹配成功玩家 while (self.MatchSuccessQueue.Count > 0) { matcherComponent.Remove(self.MatchSuccessQueue.Dequeue().PlayerID); } } }
protected override async Task Run(Model.Fishs.Entitys.Unit unit, C2M_EnterRoom message, Action <M2C_EnterRoom> reply) { await Task.CompletedTask; Log.Debug("EnterRoom"); RoomManagerComponent roomManager = Game.Scene.GetComponent <RoomManagerComponent>(); Room room = roomManager.GetBestRoom((RoomType)message.RoomType); var response = new M2C_EnterRoom(); if (room == null) { response.Tag = ErrorCode.ERR_RoomNOExist; reply(response); } response.Tag = room.EnterRoom(unit); reply(response); room.BroadcastNewUnit(unit); }
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; } }
public static Room GetBestRoom(this RoomManagerComponent self, RoomType roomType) { var rooms = self.GetAll(); // foreach (var item in rooms) { if (item.RoomType == roomType) { if (item.UnitCount < CFG.RoomMaxNum) { return(item); } } } //创建一个新的房间 var room = ComponentFactory.Create <Room, RoomType>(roomType); self.Add(room); return(room); }
public static void Add(this RoomManagerComponent self, Room room) { self.Rooms.Add(room.Id, room); self.IdleRooms.Enqueue(room); }
public static Room GetReadyRoom(this RoomManagerComponent self) { return(self.ReadyRooms.Where(p => p.Value.Count < 3).FirstOrDefault().Value); }