Merge pull request #6 from attickdoor/icon-dev

5.11 update
This commit is contained in:
goaaats 2019-11-16 22:04:47 +09:00 committed by GitHub
commit 8a91b784e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 399 additions and 62 deletions

View file

@ -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;

View file

@ -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))

View file

@ -7,27 +7,28 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Build"> <PropertyGroup Label="Build">
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<OutputPath>$(SolutionDir)/bin</OutputPath> <OutputPath></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>

View file

@ -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,

View file

@ -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);

View file

@ -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;

View file

@ -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");
} }
} }
} }

View file

@ -13,9 +13,9 @@ 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 + 0x1BF8110;
} }
} }
} }

View file

@ -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;
} }
} }

View file

@ -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");
} }
} }
} }

View file

@ -4,6 +4,7 @@ using Dalamud.Game.ClientState.Structs.JobGauge;
using Dalamud.Hooking; using Dalamud.Hooking;
using Serilog; using Serilog;
using System; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using XIVLauncher.Dalamud; using XIVLauncher.Dalamud;
@ -24,7 +25,9 @@ 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;
private HashSet<uint> CustomIDs;
private HashSet<uint> VanillaIDs;
public unsafe IconReplacer(Dalamud dalamud, SigScanner scanner) { public unsafe IconReplacer(Dalamud dalamud, SigScanner scanner) {
this.dalamud = dalamud; this.dalamud = dalamud;
@ -32,8 +35,13 @@ namespace Dalamud.Game.Internal.Gui {
this.Address.Setup(scanner); this.Address.Setup(scanner);
this.byteBase = scanner.Module.BaseAddress; this.byteBase = scanner.Module.BaseAddress;
this.comboTimer = byteBase + 0x1BB5B50; this.comboTimer = byteBase + 0x1BB0B50;
this.lastComboMove = byteBase + 0x1BB5B54; this.lastComboMove = byteBase + 0x1BB0B54;
CustomIDs = new HashSet<uint>();
VanillaIDs = new HashSet<uint>();
PopulateDict();
Log.Verbose("===== H O T B A R S ====="); Log.Verbose("===== H O T B A R S =====");
Log.Verbose("IsIconReplaceable address {IsIconReplaceable}", Address.IsIconReplaceable); Log.Verbose("IsIconReplaceable address {IsIconReplaceable}", Address.IsIconReplaceable);
@ -68,12 +76,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 +93,18 @@ namespace Dalamud.Game.Internal.Gui {
return this.iconHook.Original(self, actionID); return this.iconHook.Original(self, actionID);
} }
} }
*/
if (this.VanillaIDs.Contains(actionID)) return this.iconHook.Original(self, actionID);
if (!this.CustomIDs.Contains(actionID)) return 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 +841,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;
} }
@ -858,5 +859,243 @@ namespace Dalamud.Game.Internal.Gui {
var callback = Marshal.GetDelegateForFunctionPointer<getArray>(step3); var callback = Marshal.GetDelegateForFunctionPointer<getArray>(step3);
return (IntPtr)callback((long*)num); return (IntPtr)callback((long*)num);
} }
private void PopulateDict() {
CustomIDs.Add(16477);
CustomIDs.Add(88);
CustomIDs.Add(84);
CustomIDs.Add(3632);
CustomIDs.Add(16468);
CustomIDs.Add(3538);
CustomIDs.Add(3539);
CustomIDs.Add(16457);
CustomIDs.Add(42);
CustomIDs.Add(45);
CustomIDs.Add(16462);
CustomIDs.Add(7480);
CustomIDs.Add(7481);
CustomIDs.Add(7482);
CustomIDs.Add(7484);
CustomIDs.Add(7485);
CustomIDs.Add(3563);
CustomIDs.Add(2255);
CustomIDs.Add(16488);
CustomIDs.Add(16145);
CustomIDs.Add(16146);
CustomIDs.Add(16149);
CustomIDs.Add(7413);
CustomIDs.Add(2870);
CustomIDs.Add(3575);
CustomIDs.Add(149);
CustomIDs.Add(17055);
CustomIDs.Add(3582);
CustomIDs.Add(3581);
CustomIDs.Add(163);
CustomIDs.Add(16508);
CustomIDs.Add(16510);
CustomIDs.Add(16543);
CustomIDs.Add(167);
CustomIDs.Add(15994);
CustomIDs.Add(15993);
CustomIDs.Add(16007);
CustomIDs.Add(16008);
CustomIDs.Add(16531);
CustomIDs.Add(16534);
CustomIDs.Add(3559);
CustomIDs.Add(97);
CustomIDs.Add(16525);
CustomIDs.Add(16524);
CustomIDs.Add(7516);
VanillaIDs.Add(0x3e75);
VanillaIDs.Add(0x3e76);
VanillaIDs.Add(0x3e77);
VanillaIDs.Add(0x3e78);
VanillaIDs.Add(0x3e7d);
VanillaIDs.Add(0x3e7e);
VanillaIDs.Add(0x3e86);
VanillaIDs.Add(0x3f10);
VanillaIDs.Add(0x3f25);
VanillaIDs.Add(0x3f1b);
VanillaIDs.Add(0x3f1c);
VanillaIDs.Add(0x3f1d);
VanillaIDs.Add(0x3f1e);
VanillaIDs.Add(0x451f);
VanillaIDs.Add(0x42ff);
VanillaIDs.Add(0x4300);
VanillaIDs.Add(0x49d4);
VanillaIDs.Add(0x49d5);
VanillaIDs.Add(0x49e9);
VanillaIDs.Add(0x49ea);
VanillaIDs.Add(0x49f4);
VanillaIDs.Add(0x49f7);
VanillaIDs.Add(0x49f9);
VanillaIDs.Add(0x4a06);
VanillaIDs.Add(0x4a31);
VanillaIDs.Add(0x4a32);
VanillaIDs.Add(0x4a35);
VanillaIDs.Add(0x4792);
VanillaIDs.Add(0x452f);
VanillaIDs.Add(0x453f);
VanillaIDs.Add(0x454c);
VanillaIDs.Add(0x455c);
VanillaIDs.Add(0x455d);
VanillaIDs.Add(0x4561);
VanillaIDs.Add(0x4565);
VanillaIDs.Add(0x4566);
VanillaIDs.Add(0x45a0);
VanillaIDs.Add(0x45c8);
VanillaIDs.Add(0x45c9);
VanillaIDs.Add(0x45cd);
VanillaIDs.Add(0x4197);
VanillaIDs.Add(0x4199);
VanillaIDs.Add(0x419b);
VanillaIDs.Add(0x419d);
VanillaIDs.Add(0x419f);
VanillaIDs.Add(0x4198);
VanillaIDs.Add(0x419a);
VanillaIDs.Add(0x419c);
VanillaIDs.Add(0x419e);
VanillaIDs.Add(0x41a0);
VanillaIDs.Add(0x41a1);
VanillaIDs.Add(0x41a2);
VanillaIDs.Add(0x41a3);
VanillaIDs.Add(0x417e);
VanillaIDs.Add(0x404f);
VanillaIDs.Add(0x4051);
VanillaIDs.Add(0x4052);
VanillaIDs.Add(0x4055);
VanillaIDs.Add(0x4053);
VanillaIDs.Add(0x4056);
VanillaIDs.Add(0x405e);
VanillaIDs.Add(0x405f);
VanillaIDs.Add(0x4063);
VanillaIDs.Add(0x406f);
VanillaIDs.Add(0x4074);
VanillaIDs.Add(0x4075);
VanillaIDs.Add(0x4076);
VanillaIDs.Add(0x407d);
VanillaIDs.Add(0x407f);
VanillaIDs.Add(0x4083);
VanillaIDs.Add(0x4080);
VanillaIDs.Add(0x4081);
VanillaIDs.Add(0x4082);
VanillaIDs.Add(0x4084);
VanillaIDs.Add(0x408e);
VanillaIDs.Add(0x4091);
VanillaIDs.Add(0x4092);
VanillaIDs.Add(0x4094);
VanillaIDs.Add(0x4095);
VanillaIDs.Add(0x409c);
VanillaIDs.Add(0x409d);
VanillaIDs.Add(0x40aa);
VanillaIDs.Add(0x40ab);
VanillaIDs.Add(0x40ad);
VanillaIDs.Add(0x40ae);
VanillaIDs.Add(0x272b);
VanillaIDs.Add(0x222a);
VanillaIDs.Add(0x222d);
VanillaIDs.Add(0x222e);
VanillaIDs.Add(0x223b);
VanillaIDs.Add(0x2265);
VanillaIDs.Add(0x2267);
VanillaIDs.Add(0x2268);
VanillaIDs.Add(0x2269);
VanillaIDs.Add(0x2274);
VanillaIDs.Add(0x2290);
VanillaIDs.Add(0x2291);
VanillaIDs.Add(0x2292);
VanillaIDs.Add(0x229c);
VanillaIDs.Add(0x229e);
VanillaIDs.Add(0x22a8);
VanillaIDs.Add(0x22b3);
VanillaIDs.Add(0x22b5);
VanillaIDs.Add(0x22b7);
VanillaIDs.Add(0x22d1);
VanillaIDs.Add(0x4575);
VanillaIDs.Add(0x2335);
VanillaIDs.Add(0x1ebb);
VanillaIDs.Add(0x1cdd);
VanillaIDs.Add(0x1cee);
VanillaIDs.Add(0x1cef);
VanillaIDs.Add(0x1cf1);
VanillaIDs.Add(0x1cf3);
VanillaIDs.Add(0x1cf4);
VanillaIDs.Add(0x1cf7);
VanillaIDs.Add(0x1cfc);
VanillaIDs.Add(0x1d17);
VanillaIDs.Add(0x1d00);
VanillaIDs.Add(0x1d01);
VanillaIDs.Add(0x1d05);
VanillaIDs.Add(0x1d07);
VanillaIDs.Add(0x1d0b);
VanillaIDs.Add(0x1d0d);
VanillaIDs.Add(0x1d0f);
VanillaIDs.Add(0x1d12);
VanillaIDs.Add(0x1d13);
VanillaIDs.Add(0x1d4f);
VanillaIDs.Add(0x1d64);
VanillaIDs.Add(0x1d50);
VanillaIDs.Add(0x1d58);
VanillaIDs.Add(0x1d59);
VanillaIDs.Add(0x1d51);
VanillaIDs.Add(0x1d53);
VanillaIDs.Add(0x1d66);
VanillaIDs.Add(0x1d55);
VanillaIDs.Add(0xdda);
VanillaIDs.Add(0xddd);
VanillaIDs.Add(0xdde);
VanillaIDs.Add(0xde3);
VanillaIDs.Add(0xdf0);
VanillaIDs.Add(0xdfb);
VanillaIDs.Add(0xe00);
VanillaIDs.Add(0xe0b);
VanillaIDs.Add(0xe0c);
VanillaIDs.Add(0xe0e);
VanillaIDs.Add(0xe0f);
VanillaIDs.Add(0xe11);
VanillaIDs.Add(0xfed);
VanillaIDs.Add(0xff7);
VanillaIDs.Add(0xffb);
VanillaIDs.Add(0xfe9);
VanillaIDs.Add(0xb30);
VanillaIDs.Add(0x12e);
VanillaIDs.Add(0x8d3);
VanillaIDs.Add(0x8d4);
VanillaIDs.Add(0x8d5);
VanillaIDs.Add(0x8d7);
VanillaIDs.Add(0xb32);
VanillaIDs.Add(0xb34);
VanillaIDs.Add(0xb38);
VanillaIDs.Add(0xb39);
VanillaIDs.Add(0xb3e);
VanillaIDs.Add(0x12d);
VanillaIDs.Add(0x15);
VanillaIDs.Add(0x26);
VanillaIDs.Add(0x31);
VanillaIDs.Add(0x33);
VanillaIDs.Add(0x4b);
VanillaIDs.Add(0x5c);
VanillaIDs.Add(0x62);
VanillaIDs.Add(0x64);
VanillaIDs.Add(0x71);
VanillaIDs.Add(0x77);
VanillaIDs.Add(0x7f);
VanillaIDs.Add(0x79);
VanillaIDs.Add(0x84);
VanillaIDs.Add(0x90);
VanillaIDs.Add(0x99);
VanillaIDs.Add(0xa4);
VanillaIDs.Add(0xb2);
VanillaIDs.Add(0xa8);
VanillaIDs.Add(0xac);
VanillaIDs.Add(0xb8);
VanillaIDs.Add(0xe2);
VanillaIDs.Add(0x10f);
VanillaIDs.Add(0xf3);
VanillaIDs.Add(0x10e);
VanillaIDs.Add(0x110);
VanillaIDs.Add(0x111);
}
} }
} }

View 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);
}
}
}
}

View 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");
}
}
}

View file

@ -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");
} }
} }
} }

View file

@ -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
} }
} }
} }

View file

@ -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];