Commit 78157f17 authored by Red Bot's avatar Red Bot

updated & ready for test. plugins: autologin, camera, fps, melee & moveutils updated

parent 1a7ad5d1
No preview for this file type
......@@ -256,6 +256,8 @@ char szPassword[64] = { 0 };
char szHotkey[64] = { 0 };
char szServerName[32] = { 0 };
char szCharacterName[64] = { 0 };
char szCharClass[64] = { 0 };
char szCharLevel[64] = { 0 };
char szSelectCharacterName[64] = { 0 };
char szNewChar[0x40] = { 0 };
char szUserName[64] = { 0 };
......@@ -324,7 +326,7 @@ char xwmMask[] = "x????xx????";
//eqmain.dll
//Feb 16 2018 Test
//8B 35 ? ? ? ? 8a 86
#ifdef EMU
PBYTE swmPattern = (PBYTE)"\xA1\x00\x00\x00\x00\x80\xB8\x00\x00\x00\x00\x00\x0F\x84\x00\x00\x00\x00\x8D\x88\x00\x00\x00\x00\x8B\x01\x3B\xC3\x74\x00\x89\x45\x00\x33\xDB\x8B\x45\x00\xF0\xFF\x00\x0F\x94\xC3\x89\x5D\x00";
char swmMask[] = "x????xx?????xx????xx????xxxxx?xx?xxxx?xxxxxxxx?";
......@@ -423,6 +425,82 @@ int StrToBlobA(LPCSTR szIn,DATA_BLOB *BlobOut)
delete[] szArg;
return BlobOut->cbData;
}
char *gettok(char *_String, int _Delimiter)
{
static char theString[MAX_STRING] = { 0 };
static char *szString = theString;
char *szToken;
char *szRet;
if (_String != NULL) {
strcpy_s(theString, _String);
szString = theString;
}
if (szString) {
if (szToken = strchr(szString, _Delimiter)) {
szToken[0] = '\0';
szRet = szString;
szString = ++szToken;
}
else {
szRet = szString;
szString = NULL;
}
return szRet;
}
else {
return NULL;
}
}
template <unsigned int _BSize, unsigned int _SNSize, unsigned int _CNSize, unsigned int _PSize, unsigned int _HKSize, unsigned int _CCSize, unsigned int _CLSize>
bool ParseBlob(CHAR(&szBlob)[_BSize], CHAR(&szStationName)[_SNSize], CHAR(&szCharacterName)[_CNSize], CHAR(&szPassword)[_PSize], CHAR(&szHotkey)[_HKSize], CHAR(&szCharClass)[_CCSize], CHAR(&szCharLevel)[_CLSize])
{
DATA_BLOB db = { 0 };
DATA_BLOB dbout = { 0 };
if (szBlob[0]) {
if (StrToBlobA(szBlob, &db)) {
if (DecryptData(&db, &dbout)) {
if (PCHAR thestring = (PCHAR)dbout.pbData) {
CHAR szTemp[MAX_STRING] = { 0 };
strcpy_s(szTemp, thestring);
LocalFree(db.pbData);//always remember to free this (MSDN)
LocalFree(dbout.pbData);//always remember to free this (MSDN)
INT token = 0;
CHAR *pToken = gettok(szTemp, ':');
while (pToken)
{
token++;
switch (token)
{
case 1:
strcpy_s(szStationName, pToken);
break;
case 2:
strcpy_s(szCharacterName, pToken);
break;
case 3:
strcpy_s(szPassword, pToken);
break;
case 4:
strcpy_s(szHotkey, pToken);
break;
case 5:
strcpy_s(szCharClass, pToken);
break;
case 6:
strcpy_s(szCharLevel, pToken);
break;
}
pToken = gettok(NULL, ':');
}
return true;
}
}
}
}
return false;
}
class CXMLDataManager2
{
public:
......@@ -1578,48 +1656,11 @@ void HandleWindows()
pDest[0] = '\0';
}
AutoLoginDebug("HandleWindows() szBlob(%s)", szBlob);
DATA_BLOB db = { 0 };
DATA_BLOB dbout = { 0 };
if (StrToBlobA(szBlob, &db)) {
if (DecryptData(&db, &dbout)) {
if (PCHAR thestring = (PCHAR)dbout.pbData) {
AutoLoginDebug("HandleWindows() thestring(%s)", thestring);
//we should parse out Login, CharName, Pass, hotkey
CHAR szTemp[MAX_STRING] = { 0 };
strcpy_s(szTemp, thestring);
LocalFree(db.pbData);//always remember to free this (MSDN)
LocalFree(dbout.pbData);//always remember to free this (MSDN)
if (PCHAR pDest = strchr(szTemp, ':')) {
pDest[0] = '\0';
strcpy_s(szStationName, szTemp);
AutoLoginDebug("HandleWindows() szStationName(%s)", szStationName);
pDest++;
if (pDest[0]) {
strcpy_s(szTemp, pDest);
if (pDest = strchr(szTemp, ':')) {
pDest[0] = '\0';
strcpy_s(szCharacterName, szTemp);
AutoLoginDebug("HandleWindows() szCharacterName(%s)", szCharacterName);
pDest++;
strcpy_s(szPassword, pDest);
if (pDest[0]) {
strcpy_s(szTemp, pDest);
if (pDest = strchr(szTemp, ':')) {
pDest[0] = '\0';
strcpy_s(szPassword, szTemp);
pDest++;
strcpy_s(szHotkey, pDest);
}
}
AutoLoginDebug("HandleWindows() szProfile(%s), szStationName(%s), szServerName(%s), szCharacterName(%s)", szProfile, szStationName, szServerName, szCharacterName);
IC_LoaderSetLoaded(szProfile, szStationName, szServerName, szCharacterName, GetCurrentProcessId());
}
}
}
}
}
if (ParseBlob(szBlob, szStationName, szCharacterName, szPassword, szHotkey, szCharClass, szCharLevel)) {
IC_LoaderSetLoaded(szProfile, szStationName, szServerName, szCharacterName, GetCurrentProcessId());
}
}
DWORD oldscreenmode = ScreenMode;
ScreenMode = 3;
SetCXStr(&((CEditWnd*)pWnd)->InputText, "");
......@@ -1651,42 +1692,8 @@ void HandleWindows()
if (pDest = strrchr(szBlob, '=')) {
pDest[0] = '\0';
}
DATA_BLOB db = { 0 };
DATA_BLOB dbout = { 0 };
if (StrToBlobA(szBlob, &db)) {
if (DecryptData(&db, &dbout)) {
if (PCHAR thestring = (PCHAR)dbout.pbData) {
//we should parse out Login, CharName, Pass, Hotkey
CHAR szTemp[MAX_STRING] = { 0 };
strcpy_s(szTemp, thestring);
LocalFree(db.pbData);//always remember to free this (MSDN)
LocalFree(dbout.pbData);//always remember to free this (MSDN)
if (PCHAR pDest = strchr(szTemp, ':')) {
pDest[0] = '\0';
strcpy_s(szStationName, szTemp);
pDest++;
if (pDest[0]) {
strcpy_s(szTemp, pDest);
if (pDest = strchr(szTemp, ':')) {
pDest[0] = '\0';
strcpy_s(szCharacterName, szTemp);
pDest++;
strcpy_s(szPassword, pDest);
if (pDest[0]) {
strcpy_s(szTemp, pDest);
if (pDest = strchr(szTemp, ':')) {
pDest[0] = '\0';
strcpy_s(szPassword, szTemp);
pDest++;
strcpy_s(szHotkey, pDest);
}
}
IC_LoaderSetLoaded(szProfile, szStationName, szServerName, szCharacterName, GetCurrentProcessId());
}
}
}
}
}
if (ParseBlob(szBlob, szStationName, szCharacterName, szPassword, szHotkey, szCharClass, szCharLevel)) {
IC_LoaderSetLoaded(szProfile, szStationName, szServerName, szCharacterName, GetCurrentProcessId());
}
}
DWORD oldscreenmode = ScreenMode;
......
......@@ -3,16 +3,25 @@
// written by brainiac
// https://github.com/brainiac/MQ2Camera
//
// version information
//Version 1.10 Updated patterns - SwiftyMUSE Feb 21 2018
//Version 2.00 Removed patterns - SwiftyMUSE Apr 23 2018
#include "../MQ2Plugin.h"
#define PLUGIN_NAME "MQ2Camera" // Plugin Name
#define PLUGIN_DATE 20180423 // Plugin Date
#define PLUGIN_VERS 2.00 // Plugin Version
PreSetup("MQ2Camera");
#ifndef PLUGIN_API
#include "../MQ2Plugin.h"
PreSetup(PLUGIN_NAME);
PLUGIN_VERSION(PLUGIN_VERS);
#endif PLUGIN_API
#define PLUGIN_MSG "\ag[MQ2Camera]\ax "
#include <algorithm>
using namespace std;
namespace
{
float s_origZoomCameraMaxDistance = 0.0;
......@@ -20,130 +29,14 @@ namespace
bool s_initialized = false;
//.text:006646B1 loc_6646B1: ; CODE XREF: CEverQuest::MouseWheelScrolled(int)+4D?j
//.text:006646B1 mov eax, dword_F32A3C
//.text:006646B6 fld dword ptr [eax+34h]
//.text:006646B9 fstp [esp+20h+var_1C]
//.text:006646BD fld ds:flt_ABEFC4
//.text:006646C3 fstp [esp+20h+var_18]
//.text:006646C7 fld ds:float const g_fMaxZoomCameraDistance <--
//.text:006646CD fstp [esp+20h+var_14]
//.text:006646D1 call sub_6F7F50
//.text:006646D6 push dword ptr [eax+868h]
//.text:006646DC call sub_986DD0
//.text:006646E1 add esp, 4
//.text:006646E4 test al, al
//.text:006646E6 jz short loc_6646F2
//.text:006646E8 fld ds:flt_AD1D1C
//.text:006646EE fstp [esp+20h+var_14]
// 0x6646b1 02-21-2018
const char* ZoomCameraMaxDistance_Mask = "x????xxxxxxxxx????xxxxxx????xxxxx????";
const unsigned char* ZoomCameraMaxDistance_Pattern = (const unsigned char*)"\xA1\x00\x00\x00\x00\xD9\x40\x34\xD9\x5C\x24\x04\xD9\x05\x00\x00\x00\x00\xD9\x5C\x24\x08\xD9\x05\x00\x00\x00\x00\xD9\x5C\x24\x0C\xE8\x00\x00\x00\x00";
const int ZoomCameraMaxDistance_Offset = (0x6646C7 + 2) - 0x6646B1;
float* ZoomCameraMaxDistance = 0;
//.text:008E8CB0 public: virtual void __thiscall EQChaseCamera::UpdateCamera(class PlayerClient *) proc near
//.text:008E8CB0 mov eax, CEverQuest * EverQuestObject
//.text:008E8CB5 sub esp, 2Ch
//.text:008E8CB8 cmp dword ptr [eax+5C8h], 5
//.text:008E8CBF push esi
//.text:008E8CC0 push edi
//.text:008E8CC1 mov edi, [esp+34h+arg_0]
//.text:008E8CC5 mov esi, ecx
//.text:008E8CC7 jnz short loc_8E8D0E
//.text:008E8CC9 fld ds:float const g_fMaxCameraDistance <--
//.text:008E8CCF fcom dword ptr [esi+34h]
//.text:008E8CD2 fnstsw ax
//.text:008E8CD4 test ah, 5
//.text:008E8CD7 jp short loc_8E8CDE
//.text:008E8CD9 fstp dword ptr [esi+34h]
//.text:008E8CDC jmp short loc_8E8CE0
// 0x8e8cb0 02-21-2018
const char* UserCameraMaxDistance_Mask = "x????xxxxx?????xxxxxxxxxxxx????xxx";
const unsigned char* UserCameraMaxDistance_Pattern = (const unsigned char*)"\xA1\x00\x00\x00\x00\x83\xEC\x2C\x83\xB8\x00\x00\x00\x00\x00\x56\x57\x8B\x7C\x24\x38\x8B\xF1\x75\x45\xD9\x05\x00\x00\x00\x00\xD8\x56\x34";
const int UserCameraMaxDistance_Offset = (0x8E8CC9 + 2) - 0x8E8CB0;
float* UserCameraMaxDistance = 0;
//.text:005C5B20 public: void __thiscall CDisplay::SetViewActor(class CActorInterface *) proc near
//.text:005C5B20 sub esp, 18h
//.text:005C5B23 push esi
//.text:005C5B24 mov esi, ecx
//.text:005C5B26 mov ecx, CActorInterface * ViewActor
//.text:005C5B2C test ecx, ecx
//.text:005C5B2E jz short loc_5C5B37
//.text:005C5B30 mov eax, [ecx]
//.text:005C5B32 push 0
//.text:005C5B34 call dword ptr [eax+34h]
//.text:005C5B37
//.text:005C5B37 loc_5C5B37: ; CODE XREF: CDisplay::SetViewActor(CActorInterface *)+E?j
//.text:005C5B37 mov ecx, [esp+1Ch+arg_0]
//.text:005C5B3B mov CActorInterface * ViewActor, ecx
//.text:005C5B41 test ecx, ecx
//.text:005C5B43 jz short loc_5C5BB2
//.text:005C5B45 mov eax, [ecx]
//.text:005C5B47 lea edx, [esp+1Ch+var_18]
//.text:005C5B4B push edx
//.text:005C5B4C call dword ptr [eax+80h]
// 0x5c5b20 02-21-2018
const char* SetViewActor_Mask = "xxxxxxxx????xxxxxxxxxxxxxxxxx????xxxxxxxxxx";
const unsigned char* SetViewActor_Pattern = (const unsigned char*)"\x83\xEC\x18\x56\x8B\xF1\x8B\x0D\x00\x00\x00\x00\x85\xC9\x74\x07\x8B\x01\x6A\x00\xFF\x50\x34\x8B\x4C\x24\x20\x89\x0D\x00\x00\x00\x00\x85\xC9\x74\x6D\x8B\x01\x8D\x54\x24\x04";
DWORD CDisplay__SetViewActor_Offset = 0;
}
class CActorInterface;
class CDisplay_MQ2Camera_Extension : public CDisplay
{
public:
void SetViewActor(CActorInterface* viewActor);
};
FUNCTION_AT_ADDRESS(void CDisplay_MQ2Camera_Extension::SetViewActor(CActorInterface*), CDisplay__SetViewActor_Offset);
template <typename T>
T* GetDataPtrAtOffset(DWORD address, int offset)
{
if (address)
{
__try {
address += offset;
return reinterpret_cast<T*>(*(DWORD*)address);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
}
}
return 0;
}
bool InitValues()
{
DWORD address = FindPattern(FixOffset(0x600000), 0x100000,
ZoomCameraMaxDistance_Pattern, ZoomCameraMaxDistance_Mask);
ZoomCameraMaxDistance = GetDataPtrAtOffset<float>(address, ZoomCameraMaxDistance_Offset);
if (!ZoomCameraMaxDistance) {
WriteChatf(PLUGIN_MSG "\arFailed to find [ZoomCameraMaxDistance]\ax");
return false;
}
address = FindPattern(FixOffset(0x800000), 0x100000,
UserCameraMaxDistance_Pattern, UserCameraMaxDistance_Mask);
UserCameraMaxDistance = GetDataPtrAtOffset<float>(address, UserCameraMaxDistance_Offset);
if (!UserCameraMaxDistance) {
WriteChatf(PLUGIN_MSG "\arFailed to find [UserCameraMaxDistance]\ax");
return false;
}
if ((CDisplay__SetViewActor_Offset = FindPattern(FixOffset(0x500000), 0x100000,
SetViewActor_Pattern, SetViewActor_Mask)) == 0) {
WriteChatf(PLUGIN_MSG "\arFailed to find [SetViewActor]\ax");
return false;
}
UserCameraMaxDistance = (float *)FixOffset(__gfMaxCameraDistance_x);
ZoomCameraMaxDistance = (float *)FixOffset(__gfMaxZoomCameraDistance_x);
s_origUserCameraMaxDistance = *UserCameraMaxDistance;
s_origZoomCameraMaxDistance = *ZoomCameraMaxDistance;
......@@ -172,6 +65,9 @@ void SetCameraDistance(float distance)
{
if (s_initialized)
{
#ifdef max
#undef max
#endif
float zoomValue = std::max(distance, s_origZoomCameraMaxDistance);
SetCameraValue(ZoomCameraMaxDistance, zoomValue);
......@@ -204,14 +100,14 @@ float LoadCameraDistance()
bool s_attachedCamera = false;
void AttachCameraToSpawn(PSPAWNINFO pSpawn)
void AttachCameraToSpawn(PSPAWNINFO pSpawn = NULL)
{
bool attaching = true;
if (pSpawn == nullptr)
if (!pSpawn)
{
// if no spawn is provided, reset to the current player
pSpawn = GetCharInfo() ? GetCharInfo()->pSpawn : nullptr;
pSpawn = GetCharInfo() ? GetCharInfo()->pSpawn : NULL;
attaching = false;
}
......@@ -220,19 +116,17 @@ void AttachCameraToSpawn(PSPAWNINFO pSpawn)
// we need to get the actorinterface for the spawn. This is the pactorex
// field of ActorClient
CActorInterface* actor = (CActorInterface*)pSpawn->mActorClient.pcactorex;
struct T3D_tagACTORINSTANCE * actor = (struct T3D_tagACTORINSTANCE *)pSpawn->mActorClient.pcactorex;
if (actor != nullptr)
if (actor)
{
CDisplay_MQ2Camera_Extension* pDisplayEx =
(CDisplay_MQ2Camera_Extension*)pDisplay;
pDisplayEx->SetViewActor(actor);
pDisplay->SetViewActor(actor);
s_attachedCamera = attaching;
if (attaching)
{
WriteChatf(PLUGIN_MSG "Attaching camera to \ay%s", pSpawn->Name);
WriteChatf(PLUGIN_MSG "Attaching camera to \ay%s", pSpawn->DisplayedName);
}
}
}
......@@ -310,14 +204,14 @@ VOID Cmd_Camera(PSPAWNINFO pChar, PCHAR szLine)
else
{
WriteChatf(PLUGIN_MSG "Resetting camera");
AttachCameraToSpawn(nullptr);
AttachCameraToSpawn();
}
}
else if (!_stricmp(Command, "detach") || !_stricmp(Command, "reset"))
{
// reset the camera
WriteChatf(PLUGIN_MSG "Resetting camera");
AttachCameraToSpawn(nullptr);
AttachCameraToSpawn();
}
else
{
......@@ -331,13 +225,16 @@ VOID Cmd_Camera(PSPAWNINFO pChar, PCHAR szLine)
PLUGIN_API VOID InitializePlugin(VOID)
{
WriteChatf(PLUGIN_MSG "v1.0 by brainiac (\aohttps://github.com/brainiac/MQ2Camera\ax)");
WriteChatf(PLUGIN_MSG "v2.00 by brainiac (\aohttps://github.com/brainiac/MQ2Camera\ax) updated by SwiftyMUSE");
if (!InitValues()) {
WriteChatf(PLUGIN_MSG "\arFailed to initialize offsets. Plugin will not function.");
EzCommand("/timed 1 /plugin mq2camera unload");
}
else {
DebugSpewAlways("%s::gfZoomCameraMaxDistance = 0x%x, 0x%x", PLUGIN_NAME, ZoomCameraMaxDistance, FixOffset(__gfMaxZoomCameraDistance_x));
DebugSpewAlways("%s::gfUserCameraMaxDistance = 0x%x, 0x%x", PLUGIN_NAME, UserCameraMaxDistance, FixOffset(__gfMaxCameraDistance_x));
AddCommand("/camera", Cmd_Camera);
AddDetour((DWORD)ZoomCameraMaxDistance);
AddDetour((DWORD)UserCameraMaxDistance);
......
......@@ -11,8 +11,9 @@
// 2.1 by Eqmule 2015-12-11 added support for eqgame.exe dated Dec 08 2015
// 2.2 by rswiders 2016-05-05 added support to set the FPS indicator color (/fpscolor)
// 2.3 - Eqmule 07-22-2016 - Added string safety.
// 2.4 - Eqmule 04-20-2018 - Fixed a ctd in pulse when pWndMgr was NULL
#define PLUGIN_VERS 2.3 // Plugin Version
#define PLUGIN_VERS 2.4 // Plugin Version
#pragma warning(disable:4786)
//#define DEBUG_TRY 1
#include "../MQ2Plugin.h"
......@@ -364,7 +365,7 @@ PLUGIN_API VOID OnPulse(VOID)
}
else
{
if (InForeground)
if (InForeground && pWndMgr)
{
// just switched to background, release ctrl/alt/shift
((PCXWNDMGR)pWndMgr)->KeyboardFlags[0]=0;
......
......@@ -4,7 +4,7 @@
// Updated Sep 09 2017 by eqmule to take undeclared macro variables into account
#include "../MQ2Plugin.h"
HANDLE hHudLock = 0;
bool bEQHasFocus=true;
HMODULE EQWhMod=0; // Module handle used to check for eqw
typedef HWND (__stdcall *fEQW_GetDisplayWindow)(VOID);
......@@ -55,6 +55,7 @@ BOOL Stat(PCHAR Filename, struct _stat &Dest)
VOID ClearElements()
{
lockit lk(hHudLock,"HudLock");
while(pHud)
{
PHUDELEMENT pNext=pHud->pNext;
......@@ -65,6 +66,7 @@ VOID ClearElements()
VOID AddElement(PCHAR IniString)
{
lockit lk(hHudLock,"HudLock");
LONG X;
LONG Y;
DWORD Type;
......@@ -154,6 +156,7 @@ VOID AddElement(PCHAR IniString)
VOID LoadElements()
{
ClearElements();
lockit lk(hHudLock,"HudLock");
CHAR ElementList[MAX_STRING*10] = {0};
CHAR szBuffer[MAX_STRING], CurrentHUD[MAX_STRING] = {0};
CHAR ClassDesc[MAX_STRING], ZoneName[MAX_STRING] = {0};
......@@ -213,6 +216,7 @@ template <unsigned int _Size>LPSTR SafeItoa(int _Value,char(&_Buffer)[_Size], in
}
VOID HandleINI()
{
lockit lk(hHudLock,"HudLock");
CHAR szBuffer[MAX_STRING] = {0};
WritePrivateProfileString(HUDSection,"Last",HUDNames,INIFileName);
SkipParse = GetPrivateProfileInt(HUDSection,"SkipParse",1,INIFileName);
......@@ -358,6 +362,8 @@ BOOL dataHUD(PCHAR szIndex, MQ2TYPEVAR &Ret)
// Called once, when the plugin is to initialize
PLUGIN_API VOID InitializePlugin(VOID)
{
hHudLock = CreateMutex(NULL, FALSE, NULL);
CHAR szBuffer[MAX_STRING] = {0};
// check for eqw running, and steal its function to check the foreground window if available
if (EQWhMod=GetModuleHandle("eqw.dll"))
......@@ -383,13 +389,19 @@ PLUGIN_API VOID ShutdownPlugin(VOID)
{
DebugSpewAlways("Shutting down MQ2HUD");
ClearElements();
RemoveCommand("/loadhud");
lockit lk(hHudLock,"HudLock");
RemoveCommand("/loadhud");
RemoveCommand("/unloadhud");
RemoveCommand("/defaulthud");
RemoveCommand("/backgroundhud");
RemoveCommand("/classhud");
RemoveCommand("/zonehud");
RemoveMQ2Data("HUD");
if (hHudLock) {
ReleaseMutex(hHudLock);
CloseHandle(hHudLock);
hHudLock = 0;
}
}
PLUGIN_API VOID SetGameState(DWORD GameState)
......@@ -511,6 +523,9 @@ BOOL ParseMacroLine(PCHAR szOriginal, SIZE_T BufferSize,std::list<std::string>&o
// Called every frame that the "HUD" is drawn -- e.g. net status / packet loss bar
PLUGIN_API VOID OnDrawHUD(VOID)
{
if (hHudLock == 0)
return;
lockit lk(hHudLock,"HudLock");
static bool bOkToCheck = true;
static int N=0;
CHAR szBuffer[MAX_STRING]={0};
......
......@@ -421,7 +421,12 @@ public:
m_length--;
}
}
void SetLength(int size)
{
AssureExact(size);
if (this->m_array)
this->m_length = size;
}
private:
// this function will ensure that there is enough space allocated for the
// requested size. the underlying array is one contiguous block of memory.
......
......@@ -84,6 +84,7 @@ DATATYPE(MQ2ZoneType, pZoneType, nullptr, 0);
DATATYPE(MQ2KeyRingType, pKeyRingType, nullptr, 0);
DATATYPE(MQ2CharSelectListType, pCharSelectListType, nullptr, 0);
DATATYPE(MQ2WorldLocationType, pWorldLocationType, nullptr, 0);
DATATYPE(MQ2SolventType, pSolventType, nullptr, 0);
DATATYPE(MQ2AugType, pAugType, nullptr, 0);
DATATYPE(MQ2RangeType, pRangeType, nullptr, 0);
DATATYPE(MQ2AuraType, pAuraType, nullptr, 0);
......
......@@ -1268,8 +1268,12 @@ FUNCTION_AT_ADDRESS(bool CCursorAttachment::IsOkToActivate(int),CCursorAttachme
FUNCTION_AT_ADDRESS(bool CCursorAttachment::RemoveAttachment(void),CCursorAttachment__RemoveAttachment);
#endif
#ifdef CCursorAttachment__AttachToCursor_x
#ifndef EMU
FUNCTION_AT_ADDRESS(void CCursorAttachment::AttachToCursor(class CTextureAnimation *overlay, class CTextureAnimation *bg, int type, int index, EqItemGuid &itemGuid, int itemID, char const *assigned_name, char const *name, int qty, int IconID),CCursorAttachment__AttachToCursor);
#else
FUNCTION_AT_ADDRESS(void CCursorAttachment::AttachToCursor(class CTextureAnimation *overlay, class CTextureAnimation *bg, int type, int index, EqItemGuid &itemGuid, int itemID, char const *name, int qty),CCursorAttachment__AttachToCursor);
#endif
#endif
#ifdef CCursorAttachment__Deactivate_x
FUNCTION_AT_ADDRESS(void CCursorAttachment::Deactivate(void),CCursorAttachment__Deactivate);
#endif
......@@ -4088,7 +4092,11 @@ FUNCTION_AT_ADDRESS( EQ_Character::~EQ_Character(void),EQ_Character__dEQ_Charact
FUNCTION_AT_ADDRESS(void EQ_Character::EQ_CharacterResetAllMembers(void),EQ_Character__EQ_CharacterResetAllMembers);
#endif
#ifdef EQ_Character__ModifyCurHP_x
FUNCTION_AT_ADDRESS(void EQ_Character::ModifyCurHP(int,class EQPlayer *),EQ_Character__ModifyCurHP);
#ifdef EMU
FUNCTION_AT_ADDRESS(void EQ_Character::ModifyCurHP(__int modification, class PlayerZoneClient *resposibleplayer,int skilltype),EQ_Character__ModifyCurHP);
#else
FUNCTION_AT_ADDRESS(void EQ_Character::ModifyCurHP(__int64 modification, class PlayerZoneClient *resposibleplayer,int skilltype),EQ_Character__ModifyCurHP);
#endif
#endif
#ifdef EQ_Character__normal_to_special_x
FUNCTION_AT_ADDRESS(int __cdecl EQ_Character::normal_to_special(int),EQ_Character__normal_to_special);
......@@ -6490,6 +6498,12 @@ FUNCTION_AT_ADDRESS(void __cdecl CResolutionHandler::ChangeToResolution(int,int,
#ifdef CResolutionHandler__UpdateWindowPosition_x
FUNCTION_AT_ADDRESS(void __cdecl CResolutionHandler::UpdateWindowPosition(void),CResolutionHandler__UpdateWindowPosition);
#endif