{"record":{"id":"fc51ddf197fdcfa7","repo":"JosefNemec/Playnite","slug":"eac-launcher-settings-not-found-settingspath","errorCode":null,"errorMessage":"EAC launcher settings not found: {settingsPath}","messagePattern":"EAC launcher settings not found: (.+?)","errorType":"exception","errorClass":"FileNotFoundException","httpStatus":null,"severity":"error","filePath":"source/Playnite/EasyAntiCheat.cs","lineNumber":49,"sourceCode":"\r\n        [JsonProperty(PropertyName = \"wait_for_game_process_exit\")]\r\n        public string WaitForGameProcessExit { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"hide_splash_screen\")]\r\n        public string HideSplashScreen { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"ide_ui_controls\")]\r\n        public string IdeUiControls { get; set; }\r\n    }\r\n\r\n    public class EasyAntiCheat\r\n    {\r\n        public static EasyAntiCheatLauncherSettings GetLauncherSettings(string gameDirectory)\r\n        {\r\n            var settingsPath = Path.Combine(gameDirectory, \"EasyAntiCheat\", \"Launcher\", \"Settings.json\");\r\n            if (!File.Exists(settingsPath))\r\n            {\r\n                throw new FileNotFoundException($\"EAC launcher settings not found: {settingsPath}\");\r\n            }\r\n\r\n            return Serialization.FromJson<EasyAntiCheatLauncherSettings>(File.ReadAllText(settingsPath));\r\n        }\r\n    }\r\n}\r\n","sourceCodeStart":31,"sourceCodeEnd":56,"githubUrl":"https://github.com/JosefNemec/Playnite/blob/5911f4e964e628aa7a69c2030ab35101afa63067/source/Playnite/EasyAntiCheat.cs#L31-L56","documentation":"Thrown as FileNotFoundException by EasyAntiCheat.GetLauncherSettings when the file {gameDirectory}/EasyAntiCheat/Launcher/Settings.json does not exist. This method reads the EasyAntiCheat launcher configuration to determine the real game executable, working directory, and parameters for EAC-protected games. If the game directory does not contain an EAC launcher configuration, the method cannot proceed.","triggerScenarios":"Calling GetLauncherSettings(gameDirectory) for a game that either does not use EasyAntiCheat, or whose EAC files are in a non-standard location. The expected path is a hardcoded relative path: EasyAntiCheat/Launcher/Settings.json under the game directory.","commonSituations":"The game was installed via a launcher (Steam, Epic) that placed EAC files in a different subdirectory. The game does not actually use EAC but the calling code assumes it does. The EAC launcher settings were deleted or not installed as part of the game. The gameDirectory parameter points to the wrong folder (e.g., the root install dir instead of the game-specific subdir). Game files were verified/repaired and EAC was not reinstalled.","solutions":["Verify the game actually uses EasyAntiCheat by checking for the EasyAntiCheat folder in the game directory.","Search for Settings.json under the game directory tree: the EAC folder may be nested deeper than expected.","Point gameDirectory to the correct folder containing the EasyAntiCheat/Launcher structure.","Reinstall or repair EasyAntiCheat via the game's EAC setup tool (EasyAntiCheat_Setup.exe).","If the game doesn't use EAC, remove the EAC detection from the game's play action configuration."],"exampleFix":"// before — assuming EAC settings exist at a fixed path\nvar settings = EasyAntiCheat.GetLauncherSettings(gameDir); // throws if not found\n\n// after — check existence and locate the file dynamically\nvar settingsPath = Path.Combine(gameDir, \"EasyAntiCheat\", \"Launcher\", \"Settings.json\");\nif (!File.Exists(settingsPath))\n{\n    // search common alternative locations\n    settingsPath = Directory.GetFiles(gameDir, \"Settings.json\", SearchOption.AllDirectories)\n        .FirstOrDefault(p => p.Contains(\"EasyAntiCheat\"));\n    if (settingsPath == null)\n    {\n        logger.Warn($\"No EAC settings found for {gameDir}; game may not use EAC.\");\n        return null;\n    }\n}\nvar settings = Serialization.FromJson<EasyAntiCheatLauncherSettings>(File.ReadAllText(settingsPath));","handlingStrategy":"validation","validationCode":"var settingsPath = Path.Combine(gameDirectory, \"EasyAntiCheat\", \"Launcher\", \"Settings.json\");\nif (!File.Exists(settingsPath))\n{\n    logger.Warn($\"EAC settings not found at {settingsPath}. Game may not use EAC.\");\n    return null;\n}","typeGuard":"static bool HasEasyAntiCheat(string gameDirectory)\n{\n    return File.Exists(Path.Combine(gameDirectory, \"EasyAntiCheat\", \"Launcher\", \"Settings.json\"));\n}","tryCatchPattern":"try\n{\n    var settings = EasyAntiCheat.GetLauncherSettings(gameDir);\n}\ncatch (FileNotFoundException ex) when (ex.Message.Contains(\"EAC\"))\n{\n    logger.Warn($\"No EAC configuration in {gameDir}; falling back to standard launch.\");\n    settings = null;\n}","preventionTips":["Check for the EAC folder before assuming a game uses EasyAntiCheat.","After verifying game files, reinstall EAC separately if the game requires it.","Use HasEasyAntiCheat guard before calling GetLauncherSettings."],"tags":["easy-anticheat","file-not-found","game-launcher","configuration","anti-cheat"],"backgroundTag":null,"analyzedSha":"5911f4e964e628aa7a69c2030ab35101afa63067","analyzedAt":"2026-08-13T17:38:25.713Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}