[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public static void Repair()
{
// Ideally this will contain databases for each zone including all repairing NPCs (their names, and locations)
// and will be able to navigate to the closest one, repair, then go back to the inital location
Vector3 InitialLocation;
InitialLocation = Core.Player.Location;
const uint WM_KEYDOWN = 0x100;
const uint WM_KEYUP = 0x0101;
// Add code to target NPC and then
// move player to the NPC as well
// From here on the code should be fine
// to complete the repair
Core.Player.CurrentTarget.Interact();
Thread.Sleep(1000); // Wait for the window to open
IntPtr hWnd;
string processName = "ffxiv";
Process[] processList = Process.GetProcesses();
foreach (Process P in processList)
{
if (P.ProcessName.Equals(processName))
{
// The following code navigates the window and completes the repair, and then closes the window
IntPtr edit = P.MainWindowHandle;
if (Core.Target.Name == "Merchant & Mender")
{
// Merchant & Menders have an additional window before the repair window to navigate
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
Thread.Sleep(500);
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad8), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad8), IntPtr.Zero);
Thread.Sleep(500);
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad8), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad8), IntPtr.Zero);
Thread.Sleep(500);
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
Thread.Sleep(1000);
}
else
{
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
Thread.Sleep(500);
}
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad6), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad6), IntPtr.Zero);
Thread.Sleep(500);
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
Thread.Sleep(500);
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad4), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad4), IntPtr.Zero);
Thread.Sleep(500);
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.NumPad0), IntPtr.Zero);
Thread.Sleep(500);
PostMessage(edit, WM_KEYDOWN, (IntPtr)(Keys.Escape), IntPtr.Zero);
PostMessage(edit, WM_KEYUP, (IntPtr)(Keys.Escape), IntPtr.Zero);
}
}
Logging.Write("[Magitek] Repaired!");
// Add logic to get back to the initial location
}