public void Handle(INetworkStateContext <TWorld> gameStateContext, NetworkCommandConnection networkCommandConnectionToHandle)
        {
            var typeToProofAgainst = typeof(UserData).FullName;

            //Now we look what the roles are and deliver answers
            if (networkCommandConnectionToHandle.CommandArgument != typeToProofAgainst)
            {
                ThrowError(gameStateContext, networkCommandConnectionToHandle);
            }

            var convertedInstance = NetworkCommandDataConverterService.ConvertToObject(networkCommandConnectionToHandle);

            if (convertedInstance as UserData == null)
            {
                ThrowError(gameStateContext, networkCommandConnectionToHandle);
            }

            //Actual router. Only one state will fire. See that the order of the entries in Router also provides the priority.
            //TODO: this should be a feature/library in the future
            var userRoles        = UserDataRoleService.GetRoles(convertedInstance as UserData);
            var userRolesHandler = gameStateContext.GameStateRegistrar.GetNeworkLayerState((byte)Routes.FirstOrDefault(kv => userRoles.HasFlag(kv.Key)).Value);

            gameStateContext.ChangeHandlerEasier(userRolesHandler, networkCommandConnectionToHandle);
            userRolesHandler.Handle(gameStateContext, networkCommandConnectionToHandle);
        }
        public void Handle(INetworkStateContext <TWorld> gameStateContext, NetworkCommandConnection networkCommandConnectionToHandle)
        {
            //If login command is here. it means that this state is fired first
            if (networkCommandConnectionToHandle.CommandName == NetworkCommandConstants.LoginCommand)
            {
                //send an "ACK" for the worker
                gameStateContext
                .CurrentNetOutgoingMessageBusService
                .SendToClient(NetworkCommandConstants.ReceiveWorkCommand,
                              true,
                              networkCommandConnectionToHandle.Connection);
                return;
            }

            //If receive command
            if (networkCommandConnectionToHandle.CommandName == NetworkCommandConstants.ReceiveWorkCommand)
            {
                var sectorKey = NetworkCommandDataConverterService.ConvertToObject(networkCommandConnectionToHandle) as string;
                if (string.IsNullOrWhiteSpace(sectorKey))
                {
                    return;
                }
                var sectorLayerService = gameStateContext.GameStateRegistrar.WorldGameStateDataLayer.GetSector(sectorKey);
                gameStateContext
                .CurrentNetOutgoingMessageBusService
                .SendToClient(NetworkCommandConstants.ReceiveWorkCommand,
                              sectorLayerService.DataLayer as GameStateDataLayer,
                              networkCommandConnectionToHandle.Connection);
                return;
            }
        }
        public void ProcessIncomingMessages()
        {
            var dataInputs = Input.FetchMessageChunk()
                             .Where(msg => msg.MessageType == NetIncomingMessageType.Data);

            var inputs = dataInputs
                         .Select(msg =>
            {
                try
                {
                    return(NetIncomingMessageNetworkCommand.Translate(msg));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
                return(null);
            })
                         .Where(msg => msg != null)    // why do I receive gamestate data?? => because a player needs to be physically bound to a game .else other mechanics depending on getting the players game state for every registered player will fail.
                         .Where(msg => msg.CommandName == NetworkCommandConstants.ReceiveWorkCommand)
                         .Select(msg =>
            {
                try
                {
                    var ret = NetworkCommandDataConverterService.ConvertToObject(msg);
                    Console.WriteLine(ret);
                    return(ret);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
                return(null);
            })
                         .ToList();


            //happens when data layer worker receives an "ACK" from server

            if (inputs.Any(msg => (msg is bool) && (bool)msg == true))
            {
                Output.SendToClient <string>(NetworkCommandConstants.ReceiveWorkCommand, "hub", Client.ServerConnection);
                Console.WriteLine("sent package");
                return;
            }

            foreach (var obj in inputs)
            {
                //Console.WriteLine(dataLayer.Enemies.Select(enemy => enemy));
                Console.WriteLine((obj as GameStateDataLayer).Enemies.FirstOrDefault().DisplayName);
                Output.SendToClient <string>(NetworkCommandConstants.ReceiveWorkCommand, "hub", Client.ServerConnection);
            }
        }