#include "MultiSend.h" #pragma comment(lib, "psapi.lib") #include #include 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(); MODULEINFO mod = { 0 }; if (!::GetModuleInformation(::GetCurrentProcess(), ::GetModuleHandle("FFXiMain.dll"), &mod, sizeof(MODULEINFO))) return false; unsigned char* Pointer = (unsigned char*)Ashita::Memory::FindPattern((uintptr_t)mod.lpBaseOfDll, (uintptr_t)mod.SizeOfImage, "8BCFE8????FFFF8B0D????????E8????????8BE885ED750CB9", 0, 0); if (Pointer == NULL) return false; Pointer += 25; StructPointer = (sFollow*)(*((DWORD*)Pointer)); //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) "FFXI_MultiSend"); bool made = (GetLastError() == 0); if (hMapFile == NULL) { throw exception("Could not open or create MMF."); } MMF_Pointer = (MMF_Global*)MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, sizeof(MMF_Global)); if (MMF_Pointer == NULL) { CloseHandle(hMapFile); throw exception("Could not map MMF."); } if (made) { memset(MMF_Pointer, 0, sizeof(MMF_Global)); } Position = MMF_Pointer->Command.Position; FollowEnabled = true; ZoneExtra = false; IgnoreSelf = false; CurrentName = ""; 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))); } _Debug = false; //SafeMode enabled by Default (to avoid accidental chatlog spam): //Allows for prepend of "/echo " to commands that are missing a leading "/". _SafeMode = false; this->Start(); return true; } void MultiSend::Release(void) { this->Stop(); if (MMF_Pointer) { UnmapViewOfFile((LPCVOID)MMF_Pointer); } 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.04f; g_PluginInfo->Priority = 0; } __declspec(dllexport) IPlugin* __stdcall CreatePlugin(void) { return (IPlugin*)new MultiSend(); }