public void Start() { var conn = ConnectionPicker.GetGameConnections(ProcessWorking); var filters = FilterBuilder.BuildDefaultFilter(conn); var nic = NetworkInterfaceInfo.GetDefaultInterface(); Start(nic.IPAddress, filters); }
/// <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); }
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); }
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; } }