public async Task Disconnect() { if (_user != null) { await _user.UnbindPacketObserver(); await _user.UnsubscribeRoom(); await _globalWorld.PlayerLeaveGlobalWorld(_user); if (_curRoom != null) { //通知离线 var message = new MOMsg() { ActionId = 100, Content = new S2C100() { UserId = _user.GetPrimaryKeyLong(), IsOnline = false }.ToByteString() }; await _curRoom.RoomNotify(message); } } }
public Task RoomNotify(MOMsg msg) { if (_players.Count == 0) { return(Task.CompletedTask); } return(_stream.OnNextAsync(msg)); }
public async void Close(MOMsg packet = null) { if (packet != null) { await session.DispatchOutcomingPacket(packet); } await session.Close(); }
public static MOMsg ParseResult(this MOMsg packet, MOErrorType errorType = MOErrorType.Success, string errorInfo = "") { packet.Token = string.Empty; packet.Content = ByteString.Empty; packet.ErrorCode = (int)errorType; packet.ErrorInfo = errorInfo; return(packet); }
public async Task PlayerSendMsg(IUserGrain user, string msg) { S2C100008 content = new S2C100008(); content.UserId = user.GetPrimaryKeyLong(); content.Content = msg; MOMsg notify = new MOMsg(); notify.ActionId = 100008; notify.Content = content.ToByteString(); await RoomNotify(notify); }
public async Task PlayerEnterRoom(IUserGrain user) { if (!_players.ContainsKey(user.GetPrimaryKeyLong())) { _players[user.GetPrimaryKeyLong()] = new PlayerData(user); } await user.SubscribeRoom(_stream.Guid); { S2C100001 content = new S2C100001(); content.RoomId = (int)this.GetPrimaryKeyLong(); foreach (var item in _players) { PlayerData player = null; if (_players.TryGetValue(item.Key, out player)) { var userPoint = new UserTransform(); userPoint.UserId = item.Key; userPoint.UserName = await player.User.GetNickName(); userPoint.Position = new MsgVector3(); userPoint.Position.X = player.Position.X; userPoint.Position.Y = player.Position.Y; userPoint.Position.Z = player.Position.Z; userPoint.Rotation = new MsgVector3(); userPoint.Rotation.X = player.Rotate.X; userPoint.Rotation.Y = player.Rotate.Y; userPoint.Rotation.Z = player.Rotate.Z; content.UserTransforms.Add(userPoint); } } MOMsg msg = new MOMsg(); msg.ActionId = 100001; msg.Content = content.ToByteString(); await user.Notify(msg); } { S2C100002 content = new S2C100002(); content.UserId = user.GetPrimaryKeyLong(); content.RoomId = (int)this.GetPrimaryKeyLong(); content.UserName = await user.GetNickName(); MOMsg msg = new MOMsg(); msg.ActionId = 100002; msg.Content = content.ToByteString(); await RoomNotify(msg); } }
public async Task PlayerLeaveRoom(IUserGrain user) { S2C100006 content = new S2C100006(); content.UserId = user.GetPrimaryKeyLong(); content.RoomId = (int)this.GetPrimaryKeyLong(); MOMsg msg = new MOMsg(); msg.ActionId = 100006; msg.Content = content.ToByteString(); await RoomNotify(msg); _players.Remove(user.GetPrimaryKeyLong()); await user.UnsubscribeRoom(); }
public Packet DeserializePacket(IPacketHeader packetHeader, Stream source, out object customErrorData) { customErrorData = null; MOMsg msg = null; try { var buffer = new byte[packetHeader.PacketLength]; source.Read(buffer, 0, buffer.Length); msg = MOMsg.Parser.ParseFrom(ByteString.CopyFrom(buffer)); } catch (Exception ex) { customErrorData = ex.Message; } return(new MOPacket(msg)); }
public static MOPacket BuildPacket(this IMessage content) { var actionId = Int32.Parse(content.GetType().Name.Substring(3)); MOMsg msg = new MOMsg(); msg.ActionId = actionId; msg.UserId = GameUser.Instance.UserId; msg.Token = GameUser.Instance.Token; msg.MsgId = GameUser.Instance.MsgId; if (content != null) { msg.Content = content.ToByteString(); } var data = msg.ToByteString(); msg.Sign = CryptoHelper.MD5_Encrypt(string.Format("{0}{1}", data, GlobalGame.Md5Key)).ToLower(); return(new MOPacket(msg)); }
public async Task DispatchOutcomingPacket(MOMsg packet) { try { if (_context.Channel.Active) { var bytes = packet.ToByteArray(); IByteBuffer buffer = Unpooled.WrappedBuffer(bytes); await _context.WriteAndFlushAsync(buffer); } } catch (Exception ex) { _logger.LogError( $"DispatchOutcomingPacket异常:\n" + $"{ex.Message}\n" + $"{ex.StackTrace}\n" + $"{JsonConvert.SerializeObject(packet)}"); } }
public MOPacket(MOMsg msg) { Packet = msg; }
public async void SendPacket(MOMsg packet) { await session.DispatchOutcomingPacket(packet); }
public Task Notify(MOMsg msg) { return(_stream.OnNextAsync(msg)); }
public async Task SendPacket(MOMsg packet) { if (packet.ActionId == 100000) { //登录绑定 _user = GrainFactory.GetGrain <IUserGrain>(packet.UserId); await _globalWorld.PlayerEnterGlobalWorld(_user); if (_curRoom != null) { await _curRoom.Reconnect(_user); //通知上线 var message = new MOMsg() { ActionId = 100, Content = new S2C100() { UserId = _user.GetPrimaryKeyLong(), IsOnline = true }.ToByteString() }; await _curRoom.RoomNotify(message); } await _user.Notify(packet.ParseResult()); } else { if (_user == null) { await _user.Notify(packet.ParseResult(MOErrorType.Hidden, "用户未登录")); return; } if (packet.ActionId == 100001) { var req = C2S100001.Parser.ParseFrom(packet.Content); if (_curRoom == null) { _curRoom = GrainFactory.GetGrain <IRoomGrain>(req.RoomId); } await _curRoom.PlayerEnterRoom(_user); } else { if (_curRoom == null) { await _user.Notify(packet.ParseResult(MOErrorType.Hidden, "房间信息不存在")); return; } switch (packet.ActionId) { case 100005: { await _curRoom.PlayerLeaveRoom(_user); _curRoom = null; } break; case 100007: { var req = C2S100007.Parser.ParseFrom(packet.Content); await _curRoom.PlayerSendMsg(_user, req.Content); } break; case 100009: { var req = C2S100009.Parser.ParseFrom(packet.Content); await _curRoom.PlayerCommand(_user, req.Commands.ToList()); } break; } } } }
public async Task DispatchIncomingPacket(MOMsg packet) { try { //System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); //watch.Restart(); //md5签名验证 var sign = packet.Sign; packet.Sign = string.Empty; var data = packet.ToByteString(); if (CryptoHelper.MD5_Encrypt($"{data}{_md5Key}").ToLower() != sign.ToLower()) { await DispatchOutcomingPacket(packet.ParseResult(MOErrorType.Hidden, "签名验证失败")); await Close(); return; } //同步初始化 if (!_IsInit) { _tokenGrain = _client.GetGrain <ITokenGrain>(packet.UserId); var tokenInfo = _tokenGrain.GetToken().Result; if (tokenInfo.Token != packet.Token || tokenInfo.LastTime.AddSeconds(GameConstants.TOKENEXPIRE) < DateTime.Now) { await DispatchOutcomingPacket(packet.ParseResult(MOErrorType.Hidden, "Token验证失败")); await Close(); return; } _userId = packet.UserId; //_token = tokenInfo.Token; _packetObserver = new OutcomingPacketObserver(this); _router = _client.GetGrain <IPacketRouterGrain>(_userId); _user = _client.GetGrain <IUserGrain>(_userId); _packetObserverRef = _client.CreateObjectReference <IPacketObserver>(_packetObserver).Result; _user.BindPacketObserver(_packetObserverRef).Wait(); _IsInit = true; } else { //if (_userId != packet.UserId || _token != packet.Token) //{ // await DispatchOutcomingPacket(packet.ParseResult(MOErrorType.Hidden, "Token验证失败")); // await Close(); // return; //} var tokenInfo = _tokenGrain.GetToken().Result; if (tokenInfo.Token != packet.Token || tokenInfo.LastTime.AddSeconds(GameConstants.TOKENEXPIRE) < DateTime.Now) { await DispatchOutcomingPacket(packet.ParseResult(MOErrorType.Hidden, "Token验证失败")); await Close(); return; } } //心跳包 if (packet.ActionId == 1) { await _tokenGrain.RefreshTokenTime(); await DispatchOutcomingPacket(packet.ParseResult()); return; } await _router.SendPacket(packet); //watch.Stop(); //Console.WriteLine($"{packet.UserId} {watch.ElapsedMilliseconds}ms"); } catch (Exception ex) { _logger.LogError( $"DispatchIncomingPacket异常:\n" + $"{ex.Message}\n" + $"{ex.StackTrace}\n" + $"{JsonConvert.SerializeObject(packet)}"); } }
public Task Update() { _frameCount++; MOMsg notify = new MOMsg(); notify.ActionId = 100010; S2C100010 content = new S2C100010(); content.FrameCount = _frameCount; if (_commands.Count != 0) { List <CommandInfo> commands = new List <CommandInfo>(); while (_commands.Count != 0) { var command = _commands.Dequeue(); if (DoCommand(command)) { if (command.CommandId == (int)CommandType.Transform) { continue; } commands.Add(command); } } content.Commands.AddRange(commands); } StateInfoList stateList = new StateInfoList(); foreach (var player in _players) { var transform = new TransformInfo(); transform.Position = new MsgVector3() { X = player.Value.Position.X, Y = player.Value.Position.Y, Z = player.Value.Position.Z }; transform.Rotation = new MsgVector3() { X = player.Value.Rotate.X, Y = player.Value.Rotate.Y, Z = player.Value.Rotate.Z }; stateList.StateInfos.Add(new StateInfo() { UserId = player.Key, BloodValue = player.Value.CurBlood, KillCount = player.Value.KillCount, DeadCount = player.Value.DeadCount, Transform = transform }); } content.CommandResult = stateList.ToByteString(); notify.Content = content.ToByteString(); foreach (var player in _players) { if (player.Value.CurBlood == 0) { player.Value.Reset(); } } RoomNotify(notify); return(Task.CompletedTask); }
public override void Clear() { Packet = null; }