Ejemplo n.º 1
0
        public void Start()
        {
            var conn    = ConnectionPicker.GetGameConnections(ProcessWorking);
            var filters = FilterBuilder.BuildDefaultFilter(conn);
            var nic     = NetworkInterfaceInfo.GetDefaultInterface();

            Start(nic.IPAddress, filters);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Prompts the user for a currently open connection
        /// </summary>
        /// <returns>The selected FDO connection. Returns null if user cancelled or did not make a selection</returns>
        public static FdoConnection PickConnection()
        {
            string name = ConnectionPicker.GetConnectionName();

            if (!string.IsNullOrEmpty(name))
            {
                return(ConnectionManager.GetConnection(name));
            }

            return(null);
        }
Ejemplo n.º 3
0
        public void WaitForProcess()
        {
            while (_gamePid < 0)
            {
                Thread.Sleep(500);
                if (Stopping)
                {
                    throw new OperationCanceledException("Parent exited while hunting");
                }
            }

            var gp = Process.GetProcessById(_gamePid);

            if (!Helper.IsChineseVersion(gp))
            {
                Log.Error("Game process not Chinese version");
                IpcClient.SendSignal(Signal.ClientProcessDown, new[] { _gamePid.ToString() });
                IpcClient.SendSignal(Signal.MilvanethComponentExit, new[] { "GameStatusManager", ".ctor" });
                throw new InvalidOperationException("Target process is not a FFXIV DX11 process");
            }

            if (!SystemInformation.IsAdmin())
            {
                Log.Error("Insufficient Privilege");
                IpcClient.SendSignal(Signal.ClientInsuffcientPrivilege, new[] { _gamePid.ToString() });
                IpcClient.SendSignal(Signal.MilvanethComponentExit, new[] { "GameStatusManager", ".ctor" });
                throw new InvalidOperationException("Insufficient Privilege");
            }

            GameProcess     = gp;
            GameConnection  = new List <Connection>();
            LobbyConnection = new List <Connection>();
            _connEqCp       = new ConnectionEqualityComparer();
            _connSetEqCp    = new MultiSetComparer <Connection>(_connEqCp);
            _lobbyEndPoint  = ConnectionPicker.GetLobbyEndPoint(GameProcess);
        }
Ejemplo n.º 4
0
        private void NetworkStateMachine()
        {
            const int gameConnectionCount = 2;

            switch (_networkState)
            {
            case NetworkState.Lobby:
                _packetCycle     = 0;
                _noPackCycle     = 0;
                _requireSoftStop = false;
                Interlocked.Exchange(ref _softStopCycle, 0);

                var l_conn = ConnectionPicker.GetConnections(GameProcess);
                if (!l_conn.Any())
                {
                    _networkState = NetworkState.Unconnected;
                    LobbyConnection.Clear();
                    Log.Information($"Network State: NoConnection");
                    break;
                }

                LobbyConnection = ExtractConnections(l_conn, null);
                OnLobbyUpdate?.Invoke();

                var l_game = ExtractConnections(l_conn, LobbyConnection);
                if (l_game.Count == gameConnectionCount)
                {
                    GameConnection = l_game;
                    _networkState  = NetworkState.GameUninitialized;
                    Log.Information($"Network State: GameConnDetected");
                }

                break;

            case NetworkState.Unconnected:
                _networkState = NetworkState.Fail;

                if (!NetworkInterface.GetIsNetworkAvailable())
                {
                    break;
                }
                if (!PingHost(ConnectionPicker.GetLobbyEndPoint(GameProcess)))
                {
                    break;
                }

                _networkState = NetworkState.Pending;
                Log.Information($"Network State: WaitingLogin");

                break;

            case NetworkState.Fail:
                Log.Information($"Network State: FailNetworkCheck");
                IpcClient.SendSignal(Signal.ClientNetworkFail, new[] { GameProcess.Id.ToString() });
                Stopping = true;

                break;

            case NetworkState.Pending:
                if (ConnectionPicker.GetConnections(GameProcess).Any())
                {
                    _networkState = NetworkState.Lobby;
                    Log.Information($"Network State: ConnectedToLobby");
                }

                break;

            case NetworkState.GameUninitialized:
                OnWorldStart?.Invoke();
                _networkState = NetworkState.GameInitialized;
                Log.Information($"Network State: InitializeInvoked");

                break;

            case NetworkState.GameInitialized:
                if (_requireSoftStop)
                {
                    Interlocked.Increment(ref _softStopCycle);
                    _networkState = NetworkState.GameNoPacket;
                    Log.Information($"Network State: ConnectivityCheck");
                    break;
                }

                if (GetPacketAmount != null && _previousGamePacketCount != GetPacketAmount?.Invoke())
                {
                    _noPackCycle             = 0;
                    _previousGamePacketCount = GetPacketAmount.Invoke();
                    break;
                }

                _packetCycle++;
                _noPackCycle++;

                if (_packetCycle > 240)     // 2min, Quality assurance
                {
                    _networkState = NetworkState.GameNoPacket;
                    Log.Information($"Network State: ScheduledQA");
                }

                if (_noPackCycle > 10)    // 5s, Suspected disconnected
                {
                    _networkState = NetworkState.GameNoPacket;
                    Log.Information($"Network State: NoPackNetworkCheck");
                }

                break;

            case NetworkState.GameNoPacket:
                var gnp_conn = ConnectionPicker.GetConnections(GameProcess);

                if (!_connSetEqCp.Equals(gnp_conn, GameConnection))
                {
                    OnWorldStop?.Invoke();
                    _networkState = NetworkState.Lobby;
                    Log.Information($"Network State: ConnectionLost");
                    break;
                }

                if (_softStopCycle > 20)     // 10s, Kept monitoring
                {
                    _requireSoftStop = false;
                    Interlocked.Exchange(ref _softStopCycle, 0);
                }

                _packetCycle  = 0;
                _noPackCycle  = 0;
                _networkState = NetworkState.GameInitialized;
                Log.Information($"Network State: Normal");

                break;

            default:
                _networkState = NetworkState.Lobby;
                Log.Information($"Network State: UnrecognizedToLobby");

                break;
            }
        }