You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.3 KiB
135 lines
3.3 KiB
#include "MultiSend.h" |
|
#pragma comment(lib, "psapi.lib") |
|
#include <psapi.h> |
|
#include <stdint.h> |
|
|
|
MultiSend::MultiSend(void) |
|
: m_AshitaCore(NULL) |
|
, m_PluginId(0) |
|
, m_Direct3DDevice(NULL) |
|
{ } |
|
MultiSend::~MultiSend(void) |
|
{ } |
|
|
|
plugininfo_t* g_PluginInfo = NULL; |
|
|
|
plugininfo_t MultiSend::GetPluginInfo(void) |
|
{ |
|
return (*g_PluginInfo); |
|
} |
|
|
|
bool MultiSend::Initialize(IAshitaCore* core, ILogManager* log, uint32_t id) |
|
{ |
|
this->m_AshitaCore = core; |
|
this->m_PluginId = id; |
|
this->m_LogManager = log; |
|
|
|
LoadGroups(); |
|
|
|
DWORD Pointer = NULL; |
|
MODULEINFO mod = { 0 }; |
|
if (!::GetModuleInformation(::GetCurrentProcess(), ::GetModuleHandle("FFXiMain.dll"), &mod, sizeof(MODULEINFO))) |
|
return false; |
|
|
|
Pointer = Ashita::Memory::FindPattern((uintptr_t)mod.lpBaseOfDll, (uintptr_t)mod.SizeOfImage, |
|
"8BCFE8????FFFF8B0D????????E8????????8BE885ED750CB9", |
|
0, 0); |
|
if (Pointer == NULL) return false; |
|
Pointer += 25; |
|
p_Follow = (sFollow*)(*((DWORD*)Pointer)); |
|
|
|
char buffer[256]; |
|
strcpy_s(buffer, 256, "FFXI_Multisend_Compatibility"); |
|
/* |
|
Create name for memory mapped file using plugin version, to guarantee mismatched multisends don't collide if user loads two. |
|
sprintf_s(buffer, 256, "FFXI_Multisend_Compatibility", this->GetPluginInfo().PluginVersion); */ |
|
|
|
//create a handle to the MMF, size matches the struct we're using for it |
|
HANDLE hMapFile = CreateFileMapping( |
|
INVALID_HANDLE_VALUE, |
|
NULL, |
|
PAGE_READWRITE, |
|
0, // maximum object size (high-order DWORD) |
|
sizeof(MMF_Global), // maximum object size (low-order DWORD) |
|
buffer); |
|
|
|
bool made = (GetLastError() == 0); |
|
|
|
if (hMapFile == NULL) |
|
{ |
|
throw exception("Could not open or create MMF."); |
|
} |
|
|
|
|
|
p_MMF = (MMF_Global*)MapViewOfFile(hMapFile, // handle to map object |
|
FILE_MAP_ALL_ACCESS, // read/write permission |
|
0, |
|
0, |
|
sizeof(MMF_Global)); |
|
if (p_MMF == NULL) |
|
{ |
|
CloseHandle(hMapFile); |
|
throw exception("Could not map MMF."); |
|
} |
|
|
|
if (made) |
|
{ |
|
memset(p_MMF, 0, sizeof(MMF_Global)); |
|
} |
|
|
|
s_last_run_state = false; |
|
s_position = p_MMF->Command.Position; |
|
s_name = ""; |
|
if (m_AshitaCore->GetDataManager()->GetParty()->GetMemberActive(0)) |
|
{ |
|
uint16_t myindex = m_AshitaCore->GetDataManager()->GetParty()->GetMemberTargetIndex(0); |
|
UpdateName(std::string(m_AshitaCore->GetDataManager()->GetEntity()->GetName(myindex))); |
|
} |
|
|
|
//Default settings. |
|
c_follow = true; |
|
c_ignoreself = false; |
|
c_attemptzone = false; |
|
c_debug = false; |
|
c_safemode = false; |
|
c_maxdist = 5000.0f; |
|
|
|
this->Start(); |
|
|
|
return true; |
|
} |
|
|
|
void MultiSend::Release(void) |
|
{ |
|
this->Stop(); |
|
if (p_MMF) |
|
{ |
|
UnmapViewOfFile((LPCVOID)p_MMF); |
|
} |
|
if (hMapFile) |
|
{ |
|
CloseHandle(hMapFile); |
|
} |
|
} |
|
|
|
__declspec(dllexport) double __stdcall GetInterfaceVersion(void) |
|
{ |
|
return ASHITA_INTERFACE_VERSION; |
|
} |
|
|
|
__declspec(dllexport) void __stdcall CreatePluginInfo(plugininfo_t* lpBuffer) |
|
{ |
|
g_PluginInfo = lpBuffer; |
|
|
|
strcpy_s(g_PluginInfo->Name, sizeof(g_PluginInfo->Name), "MultiSend"); |
|
strcpy_s(g_PluginInfo->Author, sizeof(g_PluginInfo->Author), "Thorny"); |
|
|
|
g_PluginInfo->InterfaceVersion = ASHITA_INTERFACE_VERSION; |
|
g_PluginInfo->PluginVersion = 1.18f; |
|
g_PluginInfo->Priority = 0; |
|
} |
|
|
|
__declspec(dllexport) IPlugin* __stdcall CreatePlugin(void) |
|
{ |
|
return (IPlugin*)new MultiSend(); |
|
}
|
|
|