/// <summary> /// Start and initialize Dalamud subsystems. /// </summary> public void Start() { try { this.Configuration = DalamudConfiguration.Load(this.StartInfo.ConfigurationPath); // Initialize the process information. this.TargetModule = Process.GetCurrentProcess().MainModule; this.SigScanner = new SigScanner(this.TargetModule, true); Log.Information("[START] Scanner OK!"); this.AntiDebug = new AntiDebug(this.SigScanner); #if DEBUG AntiDebug.Enable(); #endif Log.Information("[START] AntiDebug OK!"); // Initialize game subsystem this.Framework = new Framework(this.SigScanner, this); Log.Information("[START] Framework OK!"); this.WinSock2 = new WinSockHandlers(); Log.Information("[START] WinSock OK!"); this.NetworkHandlers = new NetworkHandlers(this, this.StartInfo.OptOutMbCollection); Log.Information("[START] NH OK!"); this.ClientState = new ClientState(this, this.StartInfo, this.SigScanner); Log.Information("[START] CS OK!"); this.LocalizationManager = new Localization(Path.Combine(this.AssetDirectory.FullName, "UIRes", "loc", "dalamud"), "dalamud_"); if (!string.IsNullOrEmpty(this.Configuration.LanguageOverride)) { this.LocalizationManager.SetupWithLangCode(this.Configuration.LanguageOverride); } else { this.LocalizationManager.SetupWithUiCulture(); } Log.Information("[START] LOC OK!"); this.PluginRepository = new PluginRepository(this, this.StartInfo.PluginDirectory, this.StartInfo.GameVersion); Log.Information("[START] PREPO OK!"); var isInterfaceLoaded = false; if (!bool.Parse(Environment.GetEnvironmentVariable("DALAMUD_NOT_HAVE_INTERFACE") ?? "false")) { try { this.InterfaceManager = new InterfaceManager(this, this.SigScanner); this.InterfaceManager.Enable(); isInterfaceLoaded = true; Log.Information("[START] IM OK!"); this.InterfaceManager.WaitForFontRebuild(); } catch (Exception e) { Log.Information(e, "Could not init interface."); } } this.Data = new DataManager(this.StartInfo.Language, this.InterfaceManager); try { this.Data.Initialize(this.AssetDirectory.FullName); } catch (Exception e) { Log.Error(e, "Could not initialize DataManager."); this.Unload(); return; } Log.Information("[START] Data OK!"); this.SeStringManager = new SeStringManager(this.Data); Log.Information("[START] SeString OK!"); // Initialize managers. Basically handlers for the logic this.CommandManager = new CommandManager(this, this.StartInfo.Language); this.DalamudCommands = new DalamudCommands(this); this.DalamudCommands.SetupCommands(); Log.Information("[START] CM OK!"); this.ChatHandlers = new ChatHandlers(this); Log.Information("[START] CH OK!"); if (!bool.Parse(Environment.GetEnvironmentVariable("DALAMUD_NOT_HAVE_PLUGINS") ?? "false")) { try { this.PluginRepository.CleanupPlugins(); Log.Information("[START] PRC OK!"); this.PluginManager = new PluginManager( this, this.StartInfo.PluginDirectory, this.StartInfo.DefaultPluginDirectory); this.PluginManager.LoadPlugins(); Log.Information("[START] PM OK!"); } catch (Exception ex) { Log.Error(ex, "Plugin load failed."); } } this.Framework.Enable(); Log.Information("[START] Framework ENABLE!"); this.ClientState.Enable(); Log.Information("[START] CS ENABLE!"); this.DalamudUi = new DalamudInterface(this); this.InterfaceManager.OnDraw += this.DalamudUi.Draw; Log.Information("[START] DUI OK!"); this.IsReady = true; Troubleshooting.LogTroubleshooting(this, isInterfaceLoaded); Log.Information("Dalamud is ready."); } catch (Exception ex) { Log.Error(ex, "Dalamud::Start() failed."); this.Unload(); } }
private void BuildDalamudUi() { if (!this.isImguiDrawDevMenu && !ClientState.Condition.Any()) { ImGui.PushStyleColor(ImGuiCol.Button, new Vector4(0, 0, 0, 0)); ImGui.PushStyleColor(ImGuiCol.ButtonActive, new Vector4(0, 0, 0, 0)); ImGui.PushStyleColor(ImGuiCol.ButtonHovered, new Vector4(0, 0, 0, 0)); ImGui.PushStyleColor(ImGuiCol.Text, new Vector4(0, 0, 0, 1)); ImGui.PushStyleColor(ImGuiCol.TextSelectedBg, new Vector4(0, 0, 0, 1)); ImGui.PushStyleColor(ImGuiCol.Border, new Vector4(0, 0, 0, 1)); ImGui.PushStyleColor(ImGuiCol.BorderShadow, new Vector4(0, 0, 0, 1)); ImGui.PushStyleColor(ImGuiCol.WindowBg, new Vector4(0, 0, 0, 1)); ImGui.SetNextWindowPos(new Vector2(0, 0), ImGuiCond.Always); ImGui.SetNextWindowBgAlpha(1); if (ImGui.Begin("DevMenu Opener", ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoBackground | ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoSavedSettings)) { if (ImGui.Button("###devMenuOpener", new Vector2(40, 25))) { this.isImguiDrawDevMenu = true; } ImGui.End(); } ImGui.PopStyleColor(8); } if (this.isImguiDrawDevMenu) { if (ImGui.BeginMainMenuBar()) { if (ImGui.BeginMenu("Dalamud")) { ImGui.MenuItem("Draw Dalamud dev menu", "", ref this.isImguiDrawDevMenu); ImGui.Separator(); if (ImGui.MenuItem("Open Log window")) { this.logWindow = new DalamudLogWindow(CommandManager); this.isImguiDrawLogWindow = true; } if (ImGui.BeginMenu("Set log level...")) { foreach (var logLevel in Enum.GetValues(typeof(LogEventLevel)).Cast <LogEventLevel>()) { if (ImGui.MenuItem(logLevel + "##logLevelSwitch", "", this.loggingLevelSwitch.MinimumLevel == logLevel)) { this.loggingLevelSwitch.MinimumLevel = logLevel; } } ImGui.EndMenu(); } if (AntiDebug == null && ImGui.MenuItem("Enable AntiDebug")) { AntiDebug = new AntiDebug(this.SigScanner); AntiDebug.Enable(); } ImGui.Separator(); if (ImGui.MenuItem("Open Data window")) { this.dataWindow = new DalamudDataWindow(this); this.isImguiDrawDataWindow = true; } if (ImGui.MenuItem("Open Credits window")) { OnOpenCreditsCommand(null, null); } if (ImGui.MenuItem("Open Settings window")) { OnOpenSettingsCommand(null, null); } if (ImGui.MenuItem("Open Changelog window")) { OpenChangelog(); } ImGui.MenuItem("Draw ImGui demo", "", ref this.isImguiDrawDemoWindow); if (ImGui.MenuItem("Dump ImGui info")) { OnDebugImInfoCommand(null, null); } ImGui.Separator(); if (ImGui.MenuItem("Unload Dalamud")) { Unload(); } if (ImGui.MenuItem("Kill game")) { Process.GetCurrentProcess().Kill(); } if (ImGui.MenuItem("Cause AccessViolation")) { var a = Marshal.ReadByte(IntPtr.Zero); } ImGui.Separator(); ImGui.MenuItem(Util.AssemblyVersion, false); ImGui.MenuItem(this.StartInfo.GameVersion, false); ImGui.EndMenu(); } if (ImGui.BeginMenu("Game")) { if (ImGui.MenuItem("Replace ExceptionHandler")) { ReplaceExceptionHandler(); } ImGui.EndMenu(); } if (ImGui.BeginMenu("Plugins")) { if (ImGui.MenuItem("Open Plugin installer")) { this.pluginWindow = new PluginInstallerWindow(this, this.StartInfo.GameVersion); this.isImguiDrawPluginWindow = true; } ImGui.Separator(); if (ImGui.MenuItem("Open Plugin Stats")) { if (!this.isImguiDrawPluginStatWindow) { this.pluginStatWindow = new DalamudPluginStatWindow(this.PluginManager); this.isImguiDrawPluginStatWindow = true; } } if (ImGui.MenuItem("Print plugin info")) { foreach (var plugin in this.PluginManager.Plugins) { // TODO: some more here, state maybe? Log.Information($"{plugin.Plugin.Name}"); } } if (ImGui.MenuItem("Reload plugins")) { OnPluginReloadCommand(string.Empty, string.Empty); } ImGui.Separator(); ImGui.MenuItem("API Level:" + PluginManager.DALAMUD_API_LEVEL, false); ImGui.MenuItem("Loaded plugins:" + PluginManager?.Plugins.Count, false); ImGui.EndMenu(); } if (ImGui.BeginMenu("Localization")) { if (ImGui.MenuItem("Export localizable")) { Loc.ExportLocalizable(); } if (ImGui.BeginMenu("Load language...")) { if (ImGui.MenuItem("From Fallbacks")) { Loc.SetupWithFallbacks(); } if (ImGui.MenuItem("From UICulture")) { this.LocalizationManager.SetupWithUiCulture(); } foreach (var applicableLangCode in Localization.ApplicableLangCodes) { if (ImGui.MenuItem($"Applicable: {applicableLangCode}")) { this.LocalizationManager.SetupWithLangCode(applicableLangCode); } } ImGui.EndMenu(); } ImGui.EndMenu(); } if (this.Framework.Gui.GameUiHidden) { ImGui.BeginMenu("UI is hidden...", false); } ImGui.EndMainMenuBar(); } } if (this.Framework.Gui.GameUiHidden) { return; } if (this.isImguiDrawLogWindow) { this.isImguiDrawLogWindow = this.logWindow != null && this.logWindow.Draw(); if (this.isImguiDrawLogWindow == false) { this.logWindow?.Dispose(); this.logWindow = null; } } if (this.isImguiDrawDataWindow) { this.isImguiDrawDataWindow = this.dataWindow != null && this.dataWindow.Draw(); } if (this.isImguiDrawPluginWindow) { this.isImguiDrawPluginWindow = this.pluginWindow != null && this.pluginWindow.Draw(); if (!this.isImguiDrawPluginWindow) { this.pluginWindow = null; } } if (this.isImguiDrawCreditsWindow) { this.isImguiDrawCreditsWindow = this.creditsWindow != null && this.creditsWindow.Draw(); if (this.isImguiDrawCreditsWindow == false) { this.creditsWindow?.Dispose(); this.creditsWindow = null; } } if (this.isImguiDrawSettingsWindow) { this.isImguiDrawSettingsWindow = this.settingsWindow != null && this.settingsWindow.Draw(); } if (this.isImguiDrawDemoWindow) { ImGui.ShowDemoWindow(); } if (this.isImguiDrawPluginStatWindow) { this.isImguiDrawPluginStatWindow = this.pluginStatWindow != null && this.pluginStatWindow.Draw(); if (!this.isImguiDrawPluginStatWindow) { this.pluginStatWindow?.Dispose(); this.pluginStatWindow = null; } } if (this.isImguiDrawChangelogWindow) { this.isImguiDrawChangelogWindow = this.changelogWindow != null && this.changelogWindow.Draw(); } }
public Dalamud(DalamudStartInfo info, LoggingLevelSwitch loggingLevelSwitch) { this.StartInfo = info; this.loggingLevelSwitch = loggingLevelSwitch; this.Configuration = DalamudConfiguration.Load(info.ConfigurationPath); this.baseDirectory = info.WorkingDirectory; this.unloadSignal = new ManualResetEvent(false); // Initialize the process information. this.targetModule = Process.GetCurrentProcess().MainModule; this.SigScanner = new SigScanner(this.targetModule, true); // Initialize game subsystem this.Framework = new Framework(this.SigScanner, this); this.WinSock2 = new WinSockHandlers(); NetworkHandlers = new NetworkHandlers(this, this.Configuration.OptOutMbCollection); this.ClientState = new ClientState(this, info, this.SigScanner); Task.Run(async() => { try { var res = await AssetManager.EnsureAssets(this.baseDirectory); if (!res) { Log.Error("One or more assets failed to download."); Unload(); return; } } catch (Exception e) { Log.Error(e, "Error in asset task."); Unload(); return; } this.LocalizationManager = new Localization(this.StartInfo.WorkingDirectory); if (!string.IsNullOrEmpty(this.Configuration.LanguageOverride)) { this.LocalizationManager.SetupWithLangCode(this.Configuration.LanguageOverride); } else { this.LocalizationManager.SetupWithUiCulture(); } PluginRepository = new PluginRepository(this, this.StartInfo.PluginDirectory, this.StartInfo.GameVersion); var isInterfaceLoaded = false; if (!bool.Parse(Environment.GetEnvironmentVariable("DALAMUD_NOT_HAVE_INTERFACE") ?? "false")) { try { InterfaceManager = new InterfaceManager(this, this.SigScanner); InterfaceManager.OnDraw += BuildDalamudUi; InterfaceManager.Enable(); isInterfaceLoaded = true; } catch (Exception e) { Log.Information(e, "Could not init interface."); } } Data = new DataManager(this.StartInfo.Language); try { await Data.Initialize(this.baseDirectory); } catch (Exception e) { Log.Error(e, "Could not initialize DataManager."); Unload(); return; } SeStringManager = new SeStringManager(Data); #if DEBUG AntiDebug = new AntiDebug(this.SigScanner); AntiDebug.Enable(); #endif // Initialize managers. Basically handlers for the logic CommandManager = new CommandManager(this, info.Language); SetupCommands(); ChatHandlers = new ChatHandlers(this); if (!bool.Parse(Environment.GetEnvironmentVariable("DALAMUD_NOT_HAVE_PLUGINS") ?? "false")) { try { PluginRepository.CleanupPlugins(); PluginManager = new PluginManager(this, this.StartInfo.PluginDirectory, this.StartInfo.DefaultPluginDirectory); PluginManager.LoadPlugins(); } catch (Exception ex) { Log.Error(ex, "Plugin load failed."); } } this.Framework.Enable(); this.ClientState.Enable(); IsReady = true; Troubleshooting.LogTroubleshooting(this, isInterfaceLoaded); }); }
public void Start() { Configuration = DalamudConfiguration.Load(StartInfo.ConfigurationPath); // Initialize the process information. TargetModule = Process.GetCurrentProcess().MainModule; SigScanner = new SigScanner(TargetModule, true); AntiDebug = new AntiDebug(SigScanner); #if DEBUG AntiDebug.Enable(); #endif // Initialize game subsystem Framework = new Framework(SigScanner, this); WinSock2 = new WinSockHandlers(); NetworkHandlers = new NetworkHandlers(this, StartInfo.OptOutMbCollection); ClientState = new ClientState(this, StartInfo, SigScanner); LocalizationManager = new Localization(AssetDirectory.FullName); if (!string.IsNullOrEmpty(Configuration.LanguageOverride)) { LocalizationManager.SetupWithLangCode(Configuration.LanguageOverride); } else { LocalizationManager.SetupWithUiCulture(); } PluginRepository = new PluginRepository(this, StartInfo.PluginDirectory, StartInfo.GameVersion); DalamudUi = new DalamudInterface(this); var isInterfaceLoaded = false; if (!bool.Parse(Environment.GetEnvironmentVariable("DALAMUD_NOT_HAVE_INTERFACE") ?? "false")) { try { InterfaceManager = new InterfaceManager(this, SigScanner); InterfaceManager.OnDraw += DalamudUi.Draw; InterfaceManager.Enable(); isInterfaceLoaded = true; } catch (Exception e) { Log.Information(e, "Could not init interface."); } } Data = new DataManager(StartInfo.Language); try { Data.Initialize(AssetDirectory.FullName); } catch (Exception e) { Log.Error(e, "Could not initialize DataManager."); Unload(); return; } SeStringManager = new SeStringManager(Data); // Initialize managers. Basically handlers for the logic CommandManager = new CommandManager(this, StartInfo.Language); DalamudCommands = new DalamudCommands(this); DalamudCommands.SetupCommands(); ChatHandlers = new ChatHandlers(this); if (!bool.Parse(Environment.GetEnvironmentVariable("DALAMUD_NOT_HAVE_PLUGINS") ?? "false")) { try { PluginRepository.CleanupPlugins(); PluginManager = new PluginManager(this, StartInfo.PluginDirectory, StartInfo.DefaultPluginDirectory); PluginManager.LoadPlugins(); } catch (Exception ex) { Log.Error(ex, "Plugin load failed."); } } Framework.Enable(); ClientState.Enable(); IsReady = true; Troubleshooting.LogTroubleshooting(this, isInterfaceLoaded); Log.Information("Dalamud is ready."); }