public static async void Start(this TrusteeshipComponent self) { //玩家所在房间 Room room = Game.Scene.GetComponent <RoomComponent>().Get(self.GetParent <Gamer>().RoomID); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); Gamer gamer = self.GetParent <Gamer>(); bool isStartPlayCard = false; while (true) { await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000); if (self.IsDisposed) { return; } if (gamer.UserID != orderController?.CurrentAuthority) { continue; } //自动出牌开关,用于托管延迟出牌 isStartPlayCard = !isStartPlayCard; if (isStartPlayCard) { continue; } ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(gamer.Id); //当还没抢地主时随机抢地主 if (gamer.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None) { int randomSelect = RandomHelper.RandomNumber(0, 2); actorProxy.Send(new Actor_GamerGrabLandlordSelect_Ntt() { IsGrab = randomSelect == 0 }); self.Playing = false; continue; } //自动提示出牌 Actor_GamerPrompt_Ack response = await actorProxy.Call(new Actor_GamerPrompt_Req()) as Actor_GamerPrompt_Ack; if (response.Error > 0 || response.Cards == null) { actorProxy.Send(new Actor_GamerDontPlay_Ntt()); } else { await actorProxy.Call(new Actor_GamerPlayCard_Req() { Cards = response.Cards }); } } }
public async void Dispatch(Session session, PacketInfo packetInfo) { Type messageType = Game.Scene.GetComponent <OpcodeTypeComponent>().GetType(packetInfo.Header.Opcode); IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(messageType, packetInfo.Bytes, packetInfo.Index, packetInfo.Length); // gate session收到actor消息直接转发给actor自己去处理 if (message is IActorMessage) { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId); actorProxy.Send(message); return; } // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端 if (message is IActorRequest aActorRequest) { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId); IResponse response = await actorProxy.Call(aActorRequest); session.Reply(packetInfo.Header.RpcId, response); return; } if (message != null) { Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, packetInfo.Header.RpcId, message); return; } throw new Exception($"message type error: {message.GetType().FullName}"); }
public async void Dispatch(Session session, Opcode opcode, int offset, byte[] messageBytes, AMessage message) { // gate session收到actor消息直接转发给actor自己去处理 if (message is AActorMessage) { long unitId = session.GetComponent <SessionPlayerComponent>().Player.mBaseInfo.roleId; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId); actorProxy.Send(message); return; } // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端 if (message is AActorRequest aActorRequest) { long unitId = session.GetComponent <SessionPlayerComponent>().Player.mBaseInfo.roleId; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId); uint rpcId = aActorRequest.RpcId; AResponse response = await actorProxy.Call <AResponse>(aActorRequest); response.RpcId = rpcId; session.Reply(response); return; } if (message != null) { Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, message); return; } throw new Exception($"message type error: {message.GetType().FullName}"); }
/// <summary> /// 加入房间 /// </summary> /// <param name="self"></param> /// <param name="room"></param> /// <param name="matcher"></param> public static async void JoinRoom(this MatchComponent self, Room room, Matcher matcher) { //玩家加入房间,移除匹配队列 self.Playing[matcher.UserID] = room.Id; self.MatchSuccessQueue.Enqueue(matcher); //向房间服务器发送玩家进入请求 ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(room.Id); Actor_PlayerEnterRoom_Ack actor_PlayerEnterRoom_Ack = await actorProxy.Call(new Actor_PlayerEnterRoom_Req() { PlayerID = matcher.PlayerID, UserID = matcher.UserID, SessionID = matcher.GateSessionID }) as Actor_PlayerEnterRoom_Ack; Gamer gamer = GamerFactory.Create(matcher.PlayerID, matcher.UserID, actor_PlayerEnterRoom_Ack.GamerID); room.Add(gamer); //向玩家发送匹配成功消息 ActorProxyComponent actorProxyComponent = Game.Scene.GetComponent <ActorProxyComponent>(); ActorProxy gamerActorProxy = actorProxyComponent.Get(gamer.PlayerID); gamerActorProxy.Send(new Actor_MatchSucess_Ntt() { GamerID = gamer.Id }); }
/// <summary> /// 加入房间 /// </summary> /// <param name="self"></param> /// <param name="room"></param> /// <param name="matcher"></param> public static async void JoinRoom(this MatchComponent self, Room room, Matcher matcher) { //玩家加入房间,移除匹配队列 self.Playing.Add(matcher.UserID, room.Id); self.MatchSuccessQueue.Enqueue(matcher); room.Add(EntityFactory.CreateWithId <Gamer, long>(matcher.PlayerID, matcher.UserID)); //发送获取加入房间密匙消息 ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(room.Id); GetJoinRoomKey_RE playerJoinRoomRE = await actorProxy.Call <GetJoinRoomKey_RE>(new GetJoinRoomKey_RT() { PlayerID = matcher.PlayerID, UserID = matcher.UserID, GateSeesionID = matcher.GateSessionID }); //发送匹配成功消息 string gateAddress = Game.Scene.GetComponent <StartConfigComponent>().Get(matcher.GateAppID).GetComponent <InnerConfig>().Address; Session gateSession = Game.Scene.GetComponent <NetInnerComponent>().Get(gateAddress); gateSession.Send(new MatchSuccess() { PlayerID = matcher.PlayerID, RoomID = room.Id, Key = playerJoinRoomRE.Key }); }
public static async void Update(this AutoPlayCardsComponent self) { if (!self.Playing) { OrderControllerComponent orderController = self.GamerRoom.GetComponent <OrderControllerComponent>(); if (self.Entity.Id == orderController.CurrentAuthority) { self.Playing = true; await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000); ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(self.GamerRoom.Id); //当还没抢地主时随机抢地主 if (self.Entity.GetComponent <HandCardsComponent>().AccessIdentity == Identity.None) { int randomSelect = RandomHelper.RandomNumber(0, 2); actorProxy.Send(new GrabLordSelect() { PlayerId = self.Entity.Id, IsGrab = randomSelect == 0 }); self.Playing = false; return; } PromptRe promptRE = await actorProxy.Call <PromptRe>(new PromptRt() { PlayerId = self.Entity.Id }); if (promptRE.Error > 0 || promptRE.Cards == null) { actorProxy.Send(new Discard() { PlayerId = self.Entity.Id }); } else { await actorProxy.Call <PlayCardsRe>(new PlayCardsRt() { PlayerId = self.Entity.Id, Cards = promptRE.Cards }); } self.Playing = false; } } }
public async void Dispatch(Session session, Packet packet) { ushort opcode = packet.Opcode(); Type messageType = session.Network.Entity.GetComponent <OpcodeTypeComponent>().GetType(opcode); object message = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index); //Log.Debug($"recv: {JsonHelper.ToJson(message)}"); switch (message) { case IFrameMessage iFrameMessage: // 如果是帧消息,构造成OneFrameMessage发给对应的unit { long actorId = session.GetComponent <SessionUserComponent>().User.ActorID; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(actorId); // 这里设置了帧消息的id,防止客户端伪造 iFrameMessage.Id = actorId; OneFrameMessage oneFrameMessage = new OneFrameMessage { Op = opcode, AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage) }; actorProxy.Send(oneFrameMessage); return; } case IActorRequest iActorRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端 { long actorId = session.GetComponent <SessionUserComponent>().User.ActorID; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(actorId); int rpcId = iActorRequest.RpcId; // 这里要保存客户端的rpcId IResponse response = await actorProxy.Call(iActorRequest); response.RpcId = rpcId; session.Reply(response); return; } case IActorMessage iActorMessage: // gate session收到actor消息直接转发给actor自己去处理 { long actorId = session.GetComponent <SessionUserComponent>().User.ActorID; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(actorId); actorProxy.Send(iActorMessage); return; } } if (message != null) { Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message)); return; } throw new Exception($"message type error: {message.GetType().FullName}"); }
/// <summary> /// 游戏结束 /// </summary> /// <param name="self"></param> public static async void GameOver(this GameControllerComponent self, Dictionary <long, long> gamersScore, Identity winnerIdentity) { Room room = self.GetParent <Room>(); Gamer[] gamers = room.GetAll(); //清理所有卡牌 self.BackToDeck(); room.GetComponent <DeskCardsCacheComponent>().Clear(); //同步匹配服务器结束游戏 room.State = RoomState.Ready; MapHelper.SendMessage(new MP2MH_SyncRoomState() { RoomID = room.Id, State = room.State }); Dictionary <long, long> gamersMoney = new Dictionary <long, long>(); foreach (Gamer gamer in gamers) { //结算玩家余额 long gamerMoney = await self.StatisticalIntegral(gamer, gamersScore[gamer.UserID]); gamersMoney[gamer.UserID] = gamerMoney; } //广播游戏结束消息 room.Broadcast(new M2C_Gameover() { Winner = (int)winnerIdentity, BasePointPerMatch = self.BasePointPerMatch, Multiples = self.Multiples, GamersScore = gamersScore }); //清理玩家 foreach (var _gamer in gamers) { //踢出离线玩家 if (_gamer.isOffline) { ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(_gamer.Id); await actorProxy.Call(new G2M_PlayerExitRoom()); } //踢出余额不足玩家 else if (gamersMoney[_gamer.UserID] < self.MinThreshold) { ActorProxy actorProxy = _gamer.GetComponent <UnitGateComponent>().GetActorProxy(); actorProxy.Send(new M2C_GamerMoneyLess() { UserID = _gamer.UserID }); } } }
public async void Dispatch(Session session, Packet packet) { ushort opcode = packet.Opcode(); Type messageType = Game.Scene.GetComponent <OpcodeTypeComponent>().GetType(opcode); object message = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index); // 如果是帧指令消息,构造成OneFrameMessage发给对应的unit if (message is IFrameMessage) { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId); // 这里设置了帧消息的id,防止客户端伪造 IFrameMessage iFrameMessage = (IFrameMessage)message; iFrameMessage.Id = unitId; OneFrameMessage oneFrameMessage = new OneFrameMessage(); oneFrameMessage.Op = opcode; oneFrameMessage.AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage); actorProxy.Send(oneFrameMessage); return; } // gate session收到actor消息直接转发给actor自己去处理 if (message is IActorMessage) { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId); actorProxy.Send((IMessage)message); return; } // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端 if (message is IActorRequest aActorRequest) { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId); IResponse response = await actorProxy.Call(aActorRequest); session.Reply(response); return; } if (message != null) { Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message)); return; } throw new Exception($"message type error: {message.GetType().FullName}"); }
protected override async void Run(Session session, G2M_PlayerEnterMatch message, Action <M2G_PlayerEnterMatch> reply) { M2G_PlayerEnterMatch response = new M2G_PlayerEnterMatch(); try { MatchComponent matchComponent = Game.Scene.GetComponent <MatchComponent>(); ActorProxyComponent actorProxyComponent = Game.Scene.GetComponent <ActorProxyComponent>(); if (matchComponent.Playing.ContainsKey(message.UserID)) { //todo 重连逻辑 MatchRoomComponent matchRoomComponent = Game.Scene.GetComponent <MatchRoomComponent>(); long roomId = matchComponent.Playing[message.UserID]; Room room = matchRoomComponent.Get(roomId); Gamer gamer = room.Get(message.UserID); //重置GateActorID gamer.PlayerID = message.PlayerID; //重连房间 ActorProxy actorProxy = actorProxyComponent.Get(roomId); await actorProxy.Call(new MH2MP_PlayerEnterRoom() { PlayerID = message.PlayerID, UserID = message.UserID, SessionID = message.SessionID }); //向玩家发送匹配成功消息 ActorProxy gamerActorProxy = actorProxyComponent.Get(gamer.PlayerID); gamerActorProxy.Send(new M2G_MatchSucess() { GamerID = gamer.Id }); } else { //创建匹配玩家 Matcher matcher = MatcherFactory.Create(message.PlayerID, message.UserID, message.SessionID); } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
public override async void Destroy(SessionUserComponent self) { try { //释放User对象时将User对象从管理组件中移除 Game.Scene.GetComponent <UserComponent>()?.Remove(self.User.UserID); StartConfigComponent config = Game.Scene.GetComponent <StartConfigComponent>(); ActorProxyComponent actorProxyComponent = Game.Scene.GetComponent <ActorProxyComponent>(); //正在匹配中发送玩家退出匹配请求 if (self.User.IsMatching) { IPEndPoint matchIPEndPoint = config.MatchConfig.GetComponent <InnerConfig>().IPEndPoint; Session matchSession = Game.Scene.GetComponent <NetInnerComponent>().Get(matchIPEndPoint); await matchSession.Call(new G2M_PlayerExitMatch_Req() { UserID = self.User.UserID }); } //正在游戏中发送玩家退出房间请求 if (self.User.ActorID != 0) { ActorProxy actorProxy = actorProxyComponent.Get(self.User.ActorID); await actorProxy.Call(new Actor_PlayerExitRoom_Req() { UserID = self.User.UserID }); } //向登录服务器发送玩家下线消息 IPEndPoint realmIPEndPoint = config.RealmConfig.GetComponent <InnerConfig>().IPEndPoint; Session realmSession = Game.Scene.GetComponent <NetInnerComponent>().Get(realmIPEndPoint); await realmSession.Call(new G2R_PlayerOffline_Req() { UserID = self.User.UserID }); self.User.Dispose(); self.User = null; } catch (System.Exception e) { Log.Trace(e.ToString()); } }
protected override async void Run(Session session, C2G_ReturnLobby_Ntt message) { //验证Session if (!GateHelper.SignSession(session)) { return; } User user = session.GetComponent <SessionUserComponent>().User; StartConfigComponent config = Game.Scene.GetComponent <StartConfigComponent>(); ActorProxyComponent actorProxyComponent = Game.Scene.GetComponent <ActorProxyComponent>(); //正在匹配中发送玩家退出匹配请求 if (user.IsMatching) { IPEndPoint matchIPEndPoint = config.MatchConfig.GetComponent <InnerConfig>().IPEndPoint; Session matchSession = Game.Scene.GetComponent <NetInnerComponent>().Get(matchIPEndPoint); await matchSession.Call(new G2M_PlayerExitMatch_Req() { UserID = user.UserID }); user.IsMatching = false; } //正在游戏中发送玩家退出房间请求 if (user.ActorID != 0) { ActorProxy actorProxy = actorProxyComponent.Get(user.ActorID); await actorProxy.Call(new Actor_PlayerExitRoom_Req() { UserID = user.UserID }); user.ActorID = 0; } }