Exemplo n.º 1
0
        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;
                    }
                }
            }
        }
Exemplo n.º 2
0
        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)}");
            }
        }