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);
                }
            }
        }
示例#2
0
 public Task RoomNotify(MOMsg msg)
 {
     if (_players.Count == 0)
     {
         return(Task.CompletedTask);
     }
     return(_stream.OnNextAsync(msg));
 }
示例#3
0
 public async void Close(MOMsg packet = null)
 {
     if (packet != null)
     {
         await session.DispatchOutcomingPacket(packet);
     }
     await session.Close();
 }
示例#4
0
 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);
 }
示例#5
0
        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);
        }
示例#6
0
        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);
            }
        }
示例#7
0
        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));
        }
示例#9
0
        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));
        }
示例#10
0
 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)}");
     }
 }
示例#11
0
 public MOPacket(MOMsg msg)
 {
     Packet = msg;
 }
示例#12
0
 public async void SendPacket(MOMsg packet)
 {
     await session.DispatchOutcomingPacket(packet);
 }
示例#13
0
 public Task Notify(MOMsg msg)
 {
     return(_stream.OnNextAsync(msg));
 }
示例#14
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;
                    }
                }
            }
        }
示例#15
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)}");
            }
        }
示例#16
0
        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);
        }
示例#17
0
 public override void Clear()
 {
     Packet = null;
 }