mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 18:27:23 +01:00
commit
33489bff2b
16 changed files with 147 additions and 59 deletions
|
|
@ -19,7 +19,7 @@ namespace Dalamud.Injector {
|
||||||
Process.GetCurrentProcess().Kill();
|
Process.GetCurrentProcess().Kill();
|
||||||
};
|
};
|
||||||
|
|
||||||
int pid = int.Parse(args[0]);
|
var pid = int.Parse(args[0]);
|
||||||
|
|
||||||
Process process = null;
|
Process process = null;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -158,8 +158,8 @@ namespace Dalamud {
|
||||||
HelpMessage = "Unmute a word or sentence. Usage: /fatewatchremove <word or sentence>"
|
HelpMessage = "Unmute a word or sentence. Usage: /fatewatchremove <word or sentence>"
|
||||||
});
|
});
|
||||||
|
|
||||||
CommandManager.AddHandler("/xldactortable", new CommandInfo(OnDebugActorTable) {
|
CommandManager.AddHandler("/xldstate", new CommandInfo(OnDebugPrintGameState) {
|
||||||
HelpMessage = "Actor table operations",
|
HelpMessage = "Print parsed game state",
|
||||||
ShowInHelp = false
|
ShowInHelp = false
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -318,11 +318,13 @@ namespace Dalamud {
|
||||||
Process.Start(ChatHandlers.LastLink);
|
Process.Start(ChatHandlers.LastLink);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDebugActorTable(string command, string arguments) {
|
private void OnDebugPrintGameState(string command, string arguments) {
|
||||||
Framework.Gui.Chat.Print(this.ClientState.Actors.Length + " entries");
|
Framework.Gui.Chat.Print(this.ClientState.Actors.Length + " entries");
|
||||||
Framework.Gui.Chat.Print(this.ClientState.LocalPlayer.Name);
|
Framework.Gui.Chat.Print(this.ClientState.LocalPlayer.Name);
|
||||||
Framework.Gui.Chat.Print(this.ClientState.LocalPlayer.CurrentWorld.Name);
|
Framework.Gui.Chat.Print(this.ClientState.LocalPlayer.CurrentWorld.Name);
|
||||||
|
Framework.Gui.Chat.Print(this.ClientState.LocalPlayer.HomeWorld.Name);
|
||||||
Framework.Gui.Chat.Print(this.ClientState.LocalContentId.ToString("X"));
|
Framework.Gui.Chat.Print(this.ClientState.LocalContentId.ToString("X"));
|
||||||
|
Framework.Gui.Chat.Print(Framework.Gui.Chat.LastLinkedItemId.ToString());
|
||||||
|
|
||||||
for (var i = 0; i < this.ClientState.Actors.Length; i++) {
|
for (var i = 0; i < this.ClientState.Actors.Length; i++) {
|
||||||
var actor = this.ClientState.Actors[i];
|
var actor = this.ClientState.Actors[i];
|
||||||
|
|
@ -344,6 +346,7 @@ namespace Dalamud {
|
||||||
var argumentsParts = arguments.Split();
|
var argumentsParts = arguments.Split();
|
||||||
|
|
||||||
switch (argumentsParts[0]) {
|
switch (argumentsParts[0]) {
|
||||||
|
/* Sorry!
|
||||||
case "setall": {
|
case "setall": {
|
||||||
foreach (var value in Enum.GetValues(typeof(CustomComboPreset)).Cast<CustomComboPreset>()) {
|
foreach (var value in Enum.GetValues(typeof(CustomComboPreset)).Cast<CustomComboPreset>()) {
|
||||||
if (value == CustomComboPreset.None)
|
if (value == CustomComboPreset.None)
|
||||||
|
|
@ -369,7 +372,6 @@ namespace Dalamud {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
this.Configuration.ComboPresets |= value;
|
this.Configuration.ComboPresets |= value;
|
||||||
Framework.Gui.Chat.Print(argumentsParts[1] + " SET");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -379,7 +381,6 @@ namespace Dalamud {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
this.Configuration.ComboPresets ^= value;
|
this.Configuration.ComboPresets ^= value;
|
||||||
Framework.Gui.Chat.Print(argumentsParts[1] + " TOGGLE");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -390,10 +391,10 @@ namespace Dalamud {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
this.Configuration.ComboPresets &= ~value;
|
this.Configuration.ComboPresets &= ~value;
|
||||||
Framework.Gui.Chat.Print(argumentsParts[1] + " UNSET");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
*/
|
||||||
case "list": {
|
case "list": {
|
||||||
foreach (var value in Enum.GetValues(typeof(CustomComboPreset)).Cast<CustomComboPreset>()) {
|
foreach (var value in Enum.GetValues(typeof(CustomComboPreset)).Cast<CustomComboPreset>()) {
|
||||||
if (this.Configuration.ComboPresets.HasFlag(value))
|
if (this.Configuration.ComboPresets.HasFlag(value))
|
||||||
|
|
|
||||||
|
|
@ -7,27 +7,28 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Label="Build">
|
<PropertyGroup Label="Build">
|
||||||
<OutputType>Library</OutputType>
|
<OutputType>Library</OutputType>
|
||||||
<OutputPath>$(SolutionDir)/bin</OutputPath>
|
<OutputPath>D:\Sapphire\recorder\FFXIV.Recorder\/bin</OutputPath>
|
||||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<DebugType>Portable</DebugType>
|
<DebugType>Portable</DebugType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Label="Feature">
|
<PropertyGroup Label="Feature">
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<AssemblyVersion>2.1.0.0</AssemblyVersion>
|
<AssemblyVersion>2.2.0.0</AssemblyVersion>
|
||||||
<Version>2.1.0</Version>
|
<Version>2.2.0</Version>
|
||||||
|
<FileVersion>2.2.0.0</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup Label="Resources">
|
<ItemGroup Label="Resources">
|
||||||
<None Include="$(SolutionDir)/Resources/**/*" CopyToOutputDirectory="PreserveNewest" Visible="false" />
|
<None Include="$(SolutionDir)/Resources/**/*" CopyToOutputDirectory="PreserveNewest" Visible="false" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
<DocumentationFile>E:\Sapphire\recorder\FFXIV.Recorder\/bin\Dalamud.xml</DocumentationFile>
|
<DocumentationFile></DocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<DocumentationFile>E:\Sapphire\recorder\FFXIV.Recorder\/bin\Dalamud.xml</DocumentationFile>
|
<DocumentationFile>E:\Sapphire\recorder\FFXIV.Recorder\/bin\Dalamud.xml</DocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
<DocumentationFile>E:\Sapphire\recorder\FFXIV.Recorder\/bin\Dalamud.xml</DocumentationFile>
|
<DocumentationFile>D:\Sapphire\recorder\FFXIV.Recorder\/bin\Dalamud.xml</DocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<DocumentationFile>E:\Sapphire\recorder\FFXIV.Recorder\/bin\Dalamud.xml</DocumentationFile>
|
<DocumentationFile>E:\Sapphire\recorder\FFXIV.Recorder\/bin\Dalamud.xml</DocumentationFile>
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,11 @@ namespace Dalamud.Game.Chat {
|
||||||
[XivChatTypeInfo("Novice Network", "nn", 0xFF8B4513)]
|
[XivChatTypeInfo("Novice Network", "nn", 0xFF8B4513)]
|
||||||
NoviceNetwork = 27,
|
NoviceNetwork = 27,
|
||||||
|
|
||||||
|
[XivChatTypeInfo("Custom Emotes", "nn", 0xFF8B4513)]
|
||||||
|
CustomEmote = 28,
|
||||||
|
[XivChatTypeInfo("Standard Emotes", null, 0xFF8B4513)]
|
||||||
|
StandardEmote = 29,
|
||||||
|
|
||||||
[XivChatTypeInfo("Yell", "y", 0xFFFFFF00)]
|
[XivChatTypeInfo("Yell", "y", 0xFFFFFF00)]
|
||||||
Yell = 30,
|
Yell = 30,
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,8 +92,8 @@ namespace Dalamud.Game {
|
||||||
.GetResult());
|
.GetResult());
|
||||||
|
|
||||||
|
|
||||||
if (this.HandledChatTypeColors.ContainsKey(type) || type == XivChatType.Say || type == XivChatType.Shout ||
|
if ((this.HandledChatTypeColors.ContainsKey(type) || type == XivChatType.Say || type == XivChatType.Shout ||
|
||||||
type == XivChatType.Alliance || type == XivChatType.TellOutgoing || type == XivChatType.Yell) {
|
type == XivChatType.Alliance || type == XivChatType.TellOutgoing || type == XivChatType.Yell) && !message.Contains((char)0x02)) {
|
||||||
var italicsStart = message.IndexOf("*");
|
var italicsStart = message.IndexOf("*");
|
||||||
var italicsEnd = message.IndexOf("*", italicsStart + 1);
|
var italicsEnd = message.IndexOf("*", italicsStart + 1);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ namespace Dalamud.Game.ClientState.Actors {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This collection represents the currently spawned FFXIV actors.
|
/// This collection represents the currently spawned FFXIV actors.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public unsafe class ActorTable : ICollection {
|
public class ActorTable : ICollection {
|
||||||
private ClientStateAddressResolver Address { get; }
|
private ClientStateAddressResolver Address { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -29,8 +29,15 @@ namespace Dalamud.Game.ClientState.Actors {
|
||||||
/// <returns><see cref="Actor" /> at the specified spawn index.</returns>
|
/// <returns><see cref="Actor" /> at the specified spawn index.</returns>
|
||||||
public Actor this[int index] {
|
public Actor this[int index] {
|
||||||
get {
|
get {
|
||||||
|
if (index > Length)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Log.Information("Trying to get actor at {0}", index);
|
||||||
var tblIndex = Address.ActorTable + 8 + index * 8;
|
var tblIndex = Address.ActorTable + 8 + index * 8;
|
||||||
var offset = *(IntPtr*) tblIndex;
|
|
||||||
|
var offset = Marshal.ReadIntPtr(tblIndex);
|
||||||
|
|
||||||
|
Log.Information("Actor at {0}", offset.ToString());
|
||||||
|
|
||||||
if (offset == IntPtr.Zero)
|
if (offset == IntPtr.Zero)
|
||||||
throw new Exception($"Actor slot at index {index} is invalid");
|
throw new Exception($"Actor slot at index {index} is invalid");
|
||||||
|
|
@ -76,7 +83,7 @@ namespace Dalamud.Game.ClientState.Actors {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The amount of currently spawned actors.
|
/// The amount of currently spawned actors.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int Length => *(int*) Address.ActorTable;
|
public int Length => Marshal.ReadInt32(Address.ActorTable);
|
||||||
|
|
||||||
int ICollection.Count => Length;
|
int ICollection.Count => Length;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ namespace Dalamud.Game.ClientState
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The local player character, if one is present.
|
/// The local player character, if one is present.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public PlayerCharacter LocalPlayer => (PlayerCharacter) this.Actors[0];
|
public PlayerCharacter LocalPlayer { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The content ID of the local character.
|
/// The content ID of the local character.
|
||||||
|
|
@ -62,6 +62,13 @@ namespace Dalamud.Game.ClientState
|
||||||
this.Actors = new ActorTable(Address);
|
this.Actors = new ActorTable(Address);
|
||||||
|
|
||||||
this.JobGauges = new JobGauges(Address);
|
this.JobGauges = new JobGauges(Address);
|
||||||
|
|
||||||
|
dalamud.Framework.OnUpdateEvent += FrameworkOnOnUpdateEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FrameworkOnOnUpdateEvent(Framework framework) {
|
||||||
|
LocalPlayer = (PlayerCharacter) this.Actors[0];
|
||||||
|
Log.Verbose("FRAMEWORK UPDATE");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ namespace Dalamud.Game.ClientState
|
||||||
public IntPtr JobGaugeData { get; set; }
|
public IntPtr JobGaugeData { get; set; }
|
||||||
|
|
||||||
protected override void Setup64Bit(SigScanner sig) {
|
protected override void Setup64Bit(SigScanner sig) {
|
||||||
ActorTable = sig.Module.BaseAddress + 0x1B29B40;
|
ActorTable = sig.Module.BaseAddress + 0x1C01D90;
|
||||||
LocalContentId = sig.Module.BaseAddress + 0x1B58B60;
|
LocalContentId = sig.Module.BaseAddress + 0x1C2E000;
|
||||||
JobGaugeData = sig.Module.BaseAddress + 0x1BFD110;
|
JobGaugeData = sig.Module.BaseAddress + 0x1BFD110;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,13 +20,13 @@ namespace Dalamud.Game.ClientState.Structs
|
||||||
[FieldOffset(140)] public ObjectKind ObjectKind;
|
[FieldOffset(140)] public ObjectKind ObjectKind;
|
||||||
[FieldOffset(141)] public byte SubKind;
|
[FieldOffset(141)] public byte SubKind;
|
||||||
[FieldOffset(160)] public Position3 Position;
|
[FieldOffset(160)] public Position3 Position;
|
||||||
[FieldOffset(6296)] public byte CurrentWorld;
|
[FieldOffset(6308)] public byte CurrentWorld;
|
||||||
[FieldOffset(6298)] public byte HomeWorld;
|
[FieldOffset(6310)] public byte HomeWorld;
|
||||||
[FieldOffset(6308)] public int CurrentHp;
|
[FieldOffset(6328)] public int CurrentHp;
|
||||||
[FieldOffset(6312)] public int MaxHp;
|
[FieldOffset(6332)] public int MaxHp;
|
||||||
[FieldOffset(6316)] public int CurrentMp;
|
[FieldOffset(6336)] public int CurrentMp;
|
||||||
[FieldOffset(6320)] public int MaxMp;
|
[FieldOffset(6340)] public int MaxMp;
|
||||||
[FieldOffset(6364)] public byte ClassJob;
|
[FieldOffset(6388)] public byte ClassJob;
|
||||||
[FieldOffset(6366)] public byte Level;
|
[FieldOffset(6390)] public byte Level;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -76,13 +76,18 @@ namespace Dalamud.Game.Internal.Gui {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
protected override void Setup64Bit(SigScanner sig) {
|
protected override void Setup64Bit(SigScanner sig) {
|
||||||
PrintMessage = sig.ScanText("4055 57 41 ?? 41 ?? 488DAC24D8FEFFFF 4881EC28020000 488B05???????? 4833C4 488985F0000000 4532D2 48894C2448");
|
//PrintMessage = sig.ScanText("4055 57 41 ?? 41 ?? 488DAC24D8FEFFFF 4881EC28020000 488B05???????? 4833C4 488985F0000000 4532D2 48894C2448"); LAST PART FOR 5.1???
|
||||||
|
PrintMessage =
|
||||||
|
sig.ScanText(
|
||||||
|
"4055 57 41 ?? 41 ?? 4157488DAC24E0FE FFFF4881EC2002 0000488B05???? ????48 33C4488985F000 000045 32D248894C2448");
|
||||||
//PrintMessage = sig.ScanText("4055 57 41 ?? 41 ?? 488DAC24E8FEFFFF 4881EC18020000 488B05???????? 4833C4 488985E0000000 4532D2 48894C2438"); old
|
//PrintMessage = sig.ScanText("4055 57 41 ?? 41 ?? 488DAC24E8FEFFFF 4881EC18020000 488B05???????? 4833C4 488985E0000000 4532D2 48894C2438"); old
|
||||||
|
|
||||||
//PrintMessage = sig.ScanText("40 55 57 41 56 41 57 48 8D AC 24 D8 FE FF FF 48 81 EC 28 02 00 00 48 8B 05 63 47 4A 01 48 33 C4 48 89 85 F0 00 00 00 45 32 D2 48 89 4C 24 48 33");
|
//PrintMessage = sig.ScanText("40 55 57 41 56 41 57 48 8D AC 24 D8 FE FF FF 48 81 EC 28 02 00 00 48 8B 05 63 47 4A 01 48 33 C4 48 89 85 F0 00 00 00 45 32 D2 48 89 4C 24 48 33");
|
||||||
|
|
||||||
//PopulateItemLinkObject = sig.ScanText("48 89 5C 24 08 57 48 83 EC 20 80 7A 06 00 48 8B DA 48 8B F9 74 14 48 8B CA E8 32 03 00 00 48 8B C8 E8 FA F2 B0 FF 8B C8 EB 1D 0F B6 42 14 8B 4A");
|
//PopulateItemLinkObject = sig.ScanText("48 89 5C 24 08 57 48 83 EC 20 80 7A 06 00 48 8B DA 48 8B F9 74 14 48 8B CA E8 32 03 00 00 48 8B C8 E8 FA F2 B0 FF 8B C8 EB 1D 0F B6 42 14 8B 4A");
|
||||||
PopulateItemLinkObject = sig.ScanText("48 89 5C 24 08 57 48 83 EC 20 80 7A 06 00 48 8B DA 48 8B F9 74 14 48 8B CA E8 32 03 00 00 48 8B C8 E8 ?? ?? B0 FF 8B C8 EB 1D 0F B6 42 14 8B 4A");
|
|
||||||
|
//PopulateItemLinkObject = sig.ScanText("48 89 5C 24 08 57 48 83 EC 20 80 7A 06 00 48 8B DA 48 8B F9 74 14 48 8B CA E8 32 03 00 00 48 8B C8 E8 ?? ?? B0 FF 8B C8 EB 1D 0F B6 42 14 8B 4A"); 5.0
|
||||||
|
PopulateItemLinkObject = sig.ScanText("48 89 5C 24 08 57 48 83 EC 20 80 7A 06 00 48 8B DA 48 8B F9 74 14 48 8B CA E8 32 03 00 00 48 8B C8 E8 7A 12 AF FF 8B C8 EB 1D 0F B6 42 14 8B 4A");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@ namespace Dalamud.Game.Internal.Gui {
|
||||||
private IntPtr jobInfo;
|
private IntPtr jobInfo;
|
||||||
private IntPtr byteBase;
|
private IntPtr byteBase;
|
||||||
private Dalamud dalamud;
|
private Dalamud dalamud;
|
||||||
private PlayerCharacter localCharacter = null;
|
|
||||||
|
|
||||||
public unsafe IconReplacer(Dalamud dalamud, SigScanner scanner) {
|
public unsafe IconReplacer(Dalamud dalamud, SigScanner scanner) {
|
||||||
this.dalamud = dalamud;
|
this.dalamud = dalamud;
|
||||||
|
|
@ -68,12 +67,13 @@ namespace Dalamud.Game.Internal.Gui {
|
||||||
/// For example, Souleater combo on DRK happens by dragging Souleater
|
/// For example, Souleater combo on DRK happens by dragging Souleater
|
||||||
/// onto your bar and mashing it.
|
/// onto your bar and mashing it.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private unsafe ulong GetIconDetour(byte self, uint actionID) {
|
private ulong GetIconDetour(byte self, uint actionID) {
|
||||||
|
|
||||||
// TODO: More jobs, level checking for everything.
|
// TODO: More jobs, level checking for everything.
|
||||||
|
|
||||||
// Check if player is loaded in by trying to get their buffs.
|
// Check if player is loaded in by trying to get their buffs.
|
||||||
// If not, skip everything until we are (game will crash cause I'm lazy).
|
// If not, skip everything until we are (game will crash cause I'm lazy).
|
||||||
|
/*
|
||||||
if (activeBuffArray == IntPtr.Zero) {
|
if (activeBuffArray == IntPtr.Zero) {
|
||||||
try {
|
try {
|
||||||
activeBuffArray = FindBuffAddress();
|
activeBuffArray = FindBuffAddress();
|
||||||
|
|
@ -84,27 +84,16 @@ namespace Dalamud.Game.Internal.Gui {
|
||||||
return this.iconHook.Original(self, actionID);
|
return this.iconHook.Original(self, actionID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// TODO: this is currently broken
|
// TODO: this is currently broken
|
||||||
// As it stands, don't rely on localCharacter.level for anything.
|
// As it stands, don't rely on localCharacter.level for anything.
|
||||||
/*
|
var localPlayer = this.dalamud.ClientState.LocalPlayer;
|
||||||
if (localCharacter == null) {
|
|
||||||
try {
|
|
||||||
localCharacter = dalamud.ClientState.LocalPlayer;
|
|
||||||
}
|
|
||||||
catch(Exception e) {
|
|
||||||
localCharacter = null;
|
|
||||||
return this.iconHook.Original(self, actionID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Don't clutter the spaghetti any worse than it already is.
|
// Don't clutter the spaghetti any worse than it already is.
|
||||||
int lastMove = Marshal.ReadInt32(lastComboMove);
|
var lastMove = Marshal.ReadInt32(this.lastComboMove);
|
||||||
float comboTime = (float)Marshal.ReadInt32(comboTimer);
|
var comboTime = Marshal.ReadInt32(this.comboTimer);
|
||||||
//localCharacter = dalamud.ClientState.LocalPlayer;
|
var level = 80;
|
||||||
//byte level = localCharacter.Level;
|
|
||||||
byte level = 80;
|
|
||||||
|
|
||||||
// DRAGOON
|
// DRAGOON
|
||||||
// TODO: Jump/High Jump into Mirage Dive
|
// TODO: Jump/High Jump into Mirage Dive
|
||||||
|
|
@ -841,10 +830,11 @@ namespace Dalamud.Game.Internal.Gui {
|
||||||
return this.iconHook.Original(self, actionID);
|
return this.iconHook.Original(self, actionID);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool SearchBuffArray(short needle) {
|
private bool SearchBuffArray(short needle) {/*
|
||||||
for (int i = 0; i < 60; i++) {
|
for (int i = 0; i < 60; i++) {
|
||||||
if (Marshal.ReadInt16(activeBuffArray + 4 * i) == needle) return true;
|
if (Marshal.ReadInt16(activeBuffArray + 4 * i) == needle) return true;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
55
Dalamud/Game/Internal/Gui/TargetManager.cs
Normal file
55
Dalamud/Game/Internal/Gui/TargetManager.cs
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
using Dalamud.Game.ClientState;
|
||||||
|
using Dalamud.Game.ClientState.Actors.Types;
|
||||||
|
using Dalamud.Game.ClientState.Structs.JobGauge;
|
||||||
|
using Dalamud.Hooking;
|
||||||
|
using Serilog;
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using XIVLauncher.Dalamud;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Internal.Gui {
|
||||||
|
public class TargetManager {
|
||||||
|
public delegate IntPtr GetTargetDelegate(IntPtr manager);
|
||||||
|
|
||||||
|
private Hook<GetTargetDelegate> getTargetHook;
|
||||||
|
|
||||||
|
private TargetManagerAddressResolver Address;
|
||||||
|
|
||||||
|
public unsafe TargetManager(Dalamud dalamud, SigScanner scanner) {
|
||||||
|
this.Address = new TargetManagerAddressResolver();
|
||||||
|
this.Address.Setup(scanner);
|
||||||
|
|
||||||
|
Log.Verbose("===== T A R G E T M A N A G E R =====");
|
||||||
|
Log.Verbose("GetTarget address {GetTarget}", Address.GetTarget);
|
||||||
|
|
||||||
|
this.getTargetHook = new Hook<GetTargetDelegate>(this.Address.GetTarget, new GetTargetDelegate(GetTargetDetour), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Enable() {
|
||||||
|
this.getTargetHook.Enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose() {
|
||||||
|
this.getTargetHook.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IntPtr GetTargetDetour(IntPtr manager)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
var res = this.getTargetHook.Original(manager);
|
||||||
|
|
||||||
|
var test = Marshal.ReadInt32(res);
|
||||||
|
|
||||||
|
Log.Debug($"GetTargetDetour {manager.ToInt64():X} -> RET: {res:X}");
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Error(ex, "Exception GetTargetDetour hook.");
|
||||||
|
return this.getTargetHook.Original(manager);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
15
Dalamud/Game/Internal/Gui/TargetManagerAddressResolver.cs
Normal file
15
Dalamud/Game/Internal/Gui/TargetManagerAddressResolver.cs
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Internal.Gui {
|
||||||
|
class TargetManagerAddressResolver : BaseAddressResolver {
|
||||||
|
public IntPtr GetTarget { get; private set; }
|
||||||
|
|
||||||
|
protected override void Setup64Bit(SigScanner sig) {
|
||||||
|
this.GetTarget = sig.ScanText("40 57 48 83 EC 40 48 8B F9 48 8B 49 08 48 8B 01 FF 50 40 66 83 B8 CA 81 00 00 00 74 33 48 8B 4F 08 48 8B 01 FF 50 40 66 83 B8 CA 81 00 00 04 74");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,8 @@ namespace Dalamud.Game.Internal.Network {
|
||||||
public IntPtr ProcessZonePacket { get; private set; }
|
public IntPtr ProcessZonePacket { get; private set; }
|
||||||
|
|
||||||
protected override void Setup64Bit(SigScanner sig) {
|
protected override void Setup64Bit(SigScanner sig) {
|
||||||
ProcessZonePacket = sig.ScanText("48 89 74 24 18 57 48 83 EC 50 8B F2 49 8B F8 41 0F B7 50 02 8B CE E8 ?? ?? 7A FF 0F B7 57 02 8D 42 89 3D 5F 02 00 00 0F 87 60 01 00 00 4C 8D 05");
|
//ProcessZonePacket = sig.ScanText("48 89 74 24 18 57 48 83 EC 50 8B F2 49 8B F8 41 0F B7 50 02 8B CE E8 ?? ?? 7A FF 0F B7 57 02 8D 42 89 3D 5F 02 00 00 0F 87 60 01 00 00 4C 8D 05");
|
||||||
|
ProcessZonePacket = sig.ScanText("48 89 74 24 18 57 48 83 EC 50 8B F2 49 8B F8 41 0F B7 50 02 8B CE E8 ?? ?? 73 FF 0F B7 57 02 8D 42 ?? 3D ?? ?? 00 00 0F 87 60 01 00 00 4C 8D 05");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -64,18 +64,16 @@ namespace Dalamud.Game.Network {
|
||||||
Marshal.Copy(dataPtr, data, 0, 64);
|
Marshal.Copy(dataPtr, data, 0, 64);
|
||||||
|
|
||||||
var notifyType = data[16];
|
var notifyType = data[16];
|
||||||
var contentFinderConditionId = BitConverter.ToInt16(data, 38);
|
var contentFinderConditionId = BitConverter.ToInt16(data, 28);
|
||||||
|
|
||||||
|
|
||||||
Task.Run(async () => {
|
Task.Run(async () => {
|
||||||
if (notifyType != 4)
|
if (notifyType != 2 || contentFinderConditionId == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var contentFinderCondition =
|
var contentFinderCondition =
|
||||||
await XivApi.GetContentFinderCondition(contentFinderConditionId);
|
await XivApi.GetContentFinderCondition(contentFinderConditionId);
|
||||||
|
|
||||||
this.dalamud.Framework.Gui.Chat.Print("Duty Finder pop: " + contentFinderCondition["Name"]);
|
|
||||||
|
|
||||||
if (this.dalamud.BotManager.IsConnected)
|
if (this.dalamud.BotManager.IsConnected)
|
||||||
await this.dalamud.BotManager.ProcessCfPop(contentFinderCondition);
|
await this.dalamud.BotManager.ProcessCfPop(contentFinderCondition);
|
||||||
});
|
});
|
||||||
|
|
@ -179,13 +177,13 @@ namespace Dalamud.Game.Network {
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum ZoneOpCode {
|
private enum ZoneOpCode {
|
||||||
CfNotify = 0x78,
|
CfNotify = 0x8F,
|
||||||
RetainerSaleItemId = 0x13F, // TODO these are probably not accurate
|
RetainerSaleItemId = 0x13F, // TODO these are probably not accurate
|
||||||
RetainerSaleFinish = 0x138,
|
RetainerSaleFinish = 0x138,
|
||||||
FateSpawn = 0x226,
|
FateSpawn = 0x226,
|
||||||
MarketBoardItemRequestStart = 0x13B,
|
MarketBoardItemRequestStart = 0x39D,
|
||||||
MarketBoardOfferings = 0x13C,
|
MarketBoardOfferings = 0x36A,
|
||||||
MarketBoardHistory = 0x140
|
MarketBoardHistory = 0x194
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ using System.Threading.Tasks;
|
||||||
using Microsoft.CSharp.RuntimeBinder;
|
using Microsoft.CSharp.RuntimeBinder;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
|
using Serilog;
|
||||||
|
|
||||||
namespace Dalamud
|
namespace Dalamud
|
||||||
{
|
{
|
||||||
|
|
@ -68,6 +69,8 @@ namespace Dalamud
|
||||||
|
|
||||||
public static async Task<dynamic> Get(string endpoint, bool noCache = false)
|
public static async Task<dynamic> Get(string endpoint, bool noCache = false)
|
||||||
{
|
{
|
||||||
|
Log.Verbose("XIVAPI FETCH: {0}", endpoint);
|
||||||
|
|
||||||
if (cachedResponses.ContainsKey(endpoint) && !noCache)
|
if (cachedResponses.ContainsKey(endpoint) && !noCache)
|
||||||
return cachedResponses[endpoint];
|
return cachedResponses[endpoint];
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue