This commit is contained in:
goat 2021-04-29 12:43:18 +02:00
commit 05347e65b1
No known key found for this signature in database
GPG key ID: F18F057873895461
3 changed files with 34 additions and 31 deletions

View file

@ -1,9 +1,7 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Threading.Tasks;
using CheapLoc; using CheapLoc;
using Dalamud.Hooking; using Dalamud.Hooking;
using FFXIVClientStructs.FFXIV.Component.GUI; using FFXIVClientStructs.FFXIV.Component.GUI;
@ -16,9 +14,9 @@ namespace Dalamud.Game.Addon
{ {
private readonly Dalamud dalamud; private readonly Dalamud dalamud;
private delegate void AgentHudOpenSystemMenuProtoype(void* thisPtr, AtkValue* atkValueArgs, uint menuSize); private delegate void AgentHudOpenSystemMenuPrototype(void* thisPtr, AtkValue* atkValueArgs, uint menuSize);
private Hook<AgentHudOpenSystemMenuProtoype> hookAgentHudOpenSystemMenu; private Hook<AgentHudOpenSystemMenuPrototype> hookAgentHudOpenSystemMenu;
private delegate void AtkValueChangeType(AtkValue* thisPtr, ValueType type); private delegate void AtkValueChangeType(AtkValue* thisPtr, ValueType type);
@ -43,9 +41,9 @@ namespace Dalamud.Game.Addon
var openSystemMenuAddress = this.dalamud.SigScanner.ScanText("E8 ?? ?? ?? ?? 32 C0 4C 8B AC 24 ?? ?? ?? ?? 48 8B 8D ?? ?? ?? ??"); var openSystemMenuAddress = this.dalamud.SigScanner.ScanText("E8 ?? ?? ?? ?? 32 C0 4C 8B AC 24 ?? ?? ?? ?? 48 8B 8D ?? ?? ?? ??");
this.hookAgentHudOpenSystemMenu = new Hook<AgentHudOpenSystemMenuProtoype>( this.hookAgentHudOpenSystemMenu = new Hook<AgentHudOpenSystemMenuPrototype>(
openSystemMenuAddress, openSystemMenuAddress,
new AgentHudOpenSystemMenuProtoype(this.AgentHudOpenSystemMenuDetour), new AgentHudOpenSystemMenuPrototype(this.AgentHudOpenSystemMenuDetour),
this); this);
var atkValueChangeTypeAddress = var atkValueChangeTypeAddress =
@ -57,10 +55,10 @@ namespace Dalamud.Game.Addon
this.dalamud.SigScanner.ScanText("E8 ?? ?? ?? ?? 41 03 ED"); this.dalamud.SigScanner.ScanText("E8 ?? ?? ?? ?? 41 03 ED");
this.atkValueSetString = Marshal.GetDelegateForFunctionPointer<AtkValueSetString>(atkValueSetStringAddress); this.atkValueSetString = Marshal.GetDelegateForFunctionPointer<AtkValueSetString>(atkValueSetStringAddress);
var uiModuleRequestMainCommmandAddress = this.dalamud.SigScanner.ScanText( var uiModuleRequestMainCommandAddress = this.dalamud.SigScanner.ScanText(
"40 53 56 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 84 24 ?? ?? ?? ?? 48 8B 01 8B DA 48 8B F1 FF 90 ?? ?? ?? ??"); "40 53 56 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 84 24 ?? ?? ?? ?? 48 8B 01 8B DA 48 8B F1 FF 90 ?? ?? ?? ??");
this.hookUiModuleRequestMainCommand = new Hook<UiModuleRequestMainCommand>( this.hookUiModuleRequestMainCommand = new Hook<UiModuleRequestMainCommand>(
uiModuleRequestMainCommmandAddress, uiModuleRequestMainCommandAddress,
new UiModuleRequestMainCommand(this.UiModuleRequestMainCommandDetour), new UiModuleRequestMainCommand(this.UiModuleRequestMainCommandDetour),
this); this);
} }
@ -78,7 +76,7 @@ namespace Dalamud.Game.Addon
// see if we can add 2 entries // see if we can add 2 entries
if (menuSize >= 0xD) if (menuSize >= 0xD)
{ {
hookAgentHudOpenSystemMenu.Original(thisPtr, atkValueArgs, menuSize); this.hookAgentHudOpenSystemMenu.Original(thisPtr, atkValueArgs, menuSize);
return; return;
} }
@ -88,10 +86,10 @@ namespace Dalamud.Game.Addon
// reference the original function for more details :) // reference the original function for more details :)
// step 1) move all the current menu items down so we can put Dalamud at the top like it deserves // step 1) move all the current menu items down so we can put Dalamud at the top like it deserves
atkValueChangeType(&atkValueArgs[menuSize + 5], ValueType.Int); // currently this value has no type, set it to int this.atkValueChangeType(&atkValueArgs[menuSize + 5], ValueType.Int); // currently this value has no type, set it to int
atkValueChangeType(&atkValueArgs[menuSize + 5 + 1], ValueType.Int); this.atkValueChangeType(&atkValueArgs[menuSize + 5 + 1], ValueType.Int);
for (uint i = menuSize+2; i > 1; i--) for (uint i = menuSize + 2; i > 1; i--)
{ {
var curEntry = &atkValueArgs[i + 5 - 2]; var curEntry = &atkValueArgs[i + 5 - 2];
var nextEntry = &atkValueArgs[i + 5]; var nextEntry = &atkValueArgs[i + 5];
@ -109,9 +107,9 @@ namespace Dalamud.Game.Addon
// since the game first checks for strings in the AtkValue argument before pulling them from the exd, if we create strings we dont have to worry // since the game first checks for strings in the AtkValue argument before pulling them from the exd, if we create strings we dont have to worry
// about hooking the exd reader, thank god // about hooking the exd reader, thank god
var firstStringEntry = &atkValueArgs[5 + 15]; var firstStringEntry = &atkValueArgs[5 + 15];
atkValueChangeType(firstStringEntry, ValueType.String); this.atkValueChangeType(firstStringEntry, ValueType.String);
var secondStringEntry = &atkValueArgs[6 + 15]; var secondStringEntry = &atkValueArgs[6 + 15];
atkValueChangeType(secondStringEntry, ValueType.String); this.atkValueChangeType(secondStringEntry, ValueType.String);
var strPlugins = Encoding.UTF8.GetBytes(Loc.Localize("SystemMenuPlugins", "Dalamud Plugins")); var strPlugins = Encoding.UTF8.GetBytes(Loc.Localize("SystemMenuPlugins", "Dalamud Plugins"));
var strSettings = Encoding.UTF8.GetBytes(Loc.Localize("SystemMenuSettings", "Dalamud Settings")); var strSettings = Encoding.UTF8.GetBytes(Loc.Localize("SystemMenuSettings", "Dalamud Settings"));
@ -121,13 +119,13 @@ namespace Dalamud.Game.Addon
Marshal.Copy(strPlugins, 0, new IntPtr(bytes), strPlugins.Length); Marshal.Copy(strPlugins, 0, new IntPtr(bytes), strPlugins.Length);
bytes[strPlugins.Length] = 0x0; bytes[strPlugins.Length] = 0x0;
atkValueSetString(firstStringEntry, bytes); // this allocs the string properly using the game's allocators and copies it, so we dont have to worry about memory fuckups this.atkValueSetString(firstStringEntry, bytes); // this allocs the string properly using the game's allocators and copies it, so we dont have to worry about memory fuckups
var bytes2 = stackalloc byte[strSettings.Length + 1]; var bytes2 = stackalloc byte[strSettings.Length + 1];
Marshal.Copy(strSettings, 0, new IntPtr(bytes2), strSettings.Length); Marshal.Copy(strSettings, 0, new IntPtr(bytes2), strSettings.Length);
bytes2[strSettings.Length] = 0x0; bytes2[strSettings.Length] = 0x0;
atkValueSetString(secondStringEntry, bytes2); this.atkValueSetString(secondStringEntry, bytes2);
// open menu with new size // open menu with new size
var sizeEntry = &atkValueArgs[4]; var sizeEntry = &atkValueArgs[4];
@ -138,17 +136,17 @@ namespace Dalamud.Game.Addon
private void UiModuleRequestMainCommandDetour(void* thisPtr, int commandId) private void UiModuleRequestMainCommandDetour(void* thisPtr, int commandId)
{ {
if (commandId == 69420) switch (commandId)
{ {
this.dalamud.DalamudUi.OpenPluginInstaller(); case 69420:
} this.dalamud.DalamudUi.TogglePluginInstaller();
else if (commandId == 69421) break;
{ case 69421:
this.dalamud.DalamudUi.OpenSettings(); this.dalamud.DalamudUi.ToggleSettings();
} break;
else default:
{ this.hookUiModuleRequestMainCommand.Original(thisPtr, commandId);
this.hookUiModuleRequestMainCommand.Original(thisPtr, commandId); break;
} }
} }

View file

@ -192,7 +192,8 @@ namespace Dalamud.Plugin
} }
else else
{ {
if (ImGui.Button(Loc.Localize("InstallerUpdatePlugins", "Update plugins"))) if (ImGui.Button(Loc.Localize("InstallerUpdatePlugins", "Update plugins")) &&
this.dalamud.PluginRepository.State == PluginRepository.InitializationState.Success)
{ {
this.installStatus = PluginInstallStatus.InProgress; this.installStatus = PluginInstallStatus.InProgress;
@ -217,7 +218,8 @@ namespace Dalamud.Plugin
this.errorModalDrawing = this.installStatus == PluginInstallStatus.Fail; this.errorModalDrawing = this.installStatus == PluginInstallStatus.Fail;
this.errorModalOnNextFrame = this.installStatus == PluginInstallStatus.Fail; this.errorModalOnNextFrame = this.installStatus == PluginInstallStatus.Fail;
this.dalamud.PluginRepository.PrintUpdatedPlugins(this.updatedPlugins, Loc.Localize("DalamudPluginUpdates", "Updates:")); this.dalamud.PluginRepository.PrintUpdatedPlugins(
this.updatedPlugins, Loc.Localize("DalamudPluginUpdates", "Updates:"));
this.RefetchPlugins(); this.RefetchPlugins();
}); });
@ -305,8 +307,11 @@ namespace Dalamud.Plugin
private void ResortPlugins() private void ResortPlugins()
{ {
if (this.dalamud.PluginRepository.State != PluginRepository.InitializationState.Success)
return;
var availableDefs = this.dalamud.PluginRepository.PluginMaster.Where( var availableDefs = this.dalamud.PluginRepository.PluginMaster.Where(
x => this.pluginListInstalled.All(y => x.InternalName != y.InternalName)) x => this.pluginListInstalled.All(y => x.InternalName != y.InternalName))
.GroupBy(x => new { x.InternalName, x.AssemblyVersion }) .GroupBy(x => new { x.InternalName, x.AssemblyVersion })
.Select(y => y.First()).ToList(); .Select(y => y.First()).ToList();

View file

@ -149,7 +149,7 @@ namespace Dalamud.Plugin
return prio2.CompareTo(prio1); return prio2.CompareTo(prio1);
}); });
this.deferredPlugins = pluginDefs.Where(x => x.definition?.LoadPriority <= 0); this.deferredPlugins = pluginDefs.Where(x => x.definition == null || x.definition.LoadPriority <= 0);
// Pass preloaded definitions for "synchronous load" plugins to LoadPluginFromAssembly, because we already loaded them anyways // Pass preloaded definitions for "synchronous load" plugins to LoadPluginFromAssembly, because we already loaded them anyways
foreach (var (dllFile, definition, isRaw) in pluginDefs.Where(x => x.definition?.LoadPriority > 0)) foreach (var (dllFile, definition, isRaw) in pluginDefs.Where(x => x.definition?.LoadPriority > 0))