Moderator: MacroQuest Developers
class CChatHook
{
public:
VOID Trampoline(PCHAR szMsg, DWORD dwColor, DWORD dwUnknown);
VOID Detour(PCHAR szMsg, DWORD dwColor, DWORD dwUnknown)
{
DebugSpew("CChatHook::Detour(%s)",szMsg);
gbInChat = TRUE;
if ((!strncmp(szMsg,"You have entered ",17)) || (strstr(szMsg," saved."))) {
if (gZoning) {
gDelayZoning += gZoneDelay;
gZoning=FALSE;
}
"you have entered" , '17' & " saved" needed to be changed into the correct server language for MQ1 macros to work as MQ1 seemed to have waited for the correct chat trigger even though it loaded itself up.
if ((!strncmp(szMsg,"You have entered ",17)) || (strstr(szMsg," saved."))) {
Code: Select all
HRESULT (__stdcall *DInputDataTrampoline)(IDirectInputDevice8A* This, DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags);
HRESULT __stdcall DInputDataDetour(IDirectInputDevice8A* This, DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags)
{
gbInDInput = TRUE;
HRESULT hResult = 0;
PKEYPRESS pNext = NULL;
DWORD didAdd = 0;
BOOL bLoop;
BOOL bRemoveItem = FALSE;
DWORD dwInOutSave = *pdwInOut;
static DWORD dwTimeStamp = 0;
static DWORD dwSequence = 0;
static DWORD LastGetTick = 0;
if (!gbUnload)
{
if (!gKeyStack)
{
//DebugSpewAlways("DInputDataDetour::GetTickCount");
DWORD Tick = GetTickCount();
if (Tick<LastGetTick) LastGetTick=Tick;
while (Tick>LastGetTick+100) {
LastGetTick+=100;
if (gDelay>0) gDelay--;
if (gDelayZoning>0) gDelayZoning--;
DropTimers();
}
bRunNextCommand = TRUE;
DWORD CurTurbo=0;
while ((!gKeyStack) && (bRunNextCommand)) {
//DebugSpewAlways("DInputDataDetour::Pulse");
bRunNextCommand = FALSE;
Pulse();
if (!gTurbo) bRunNextCommand = FALSE;
if (++CurTurbo>gMaxTurbo) bRunNextCommand = FALSE;
}
}
if (EQADDR_DIKEYBOARD && (This == *EQADDR_DIKEYBOARD))
{
DebugSpewAlways("DInputDataDetour::Keyboard pdwInOut = %lu", *pdwInOut);
if (*pdwInOut > 0)
{
if (gKeyStack)
{
DebugSpewAlways("DInputDataDetour::KeyStack");
pNext = gKeyStack->pNext;
//DebugSpew("Faking '%s' as %s...",gDiKeyID[gKeyStack->KeyId].szName,(gKeyStack->Pressed)?"down":"up");
rgdod[didAdd].dwOfs = gDiKeyID[gKeyStack->KeyId].Id;
rgdod[didAdd].dwData = (gKeyStack->Pressed)?0x80:0;
rgdod[didAdd].dwSequence = dwSequence;
rgdod[didAdd].dwTimeStamp = dwTimeStamp;
rgdod[didAdd].uAppData = 0;
(*pdwInOut)--;
free(gKeyStack);
gKeyStack = pNext;
didAdd++;
(*pdwInOut) = didAdd;
gbInDInput = FALSE;
return (HRESULT)DI_OK;
}
}
}else if (EQADDR_DIMOUSE && (This == *EQADDR_DIMOUSE))
{
if (*pdwInOut > 0)
{
if (gKeyStack)
{
DebugSpewAlways("DInputDataDetour::KeyStack");
pNext = gKeyStack->pNext;
//DebugSpew("Faking '%s' as %s...",gDiKeyID[gKeyStack->KeyId].szName,(gKeyStack->Pressed)?"down":"up");
rgdod[didAdd].dwOfs = gDiKeyID[gKeyStack->KeyId].Id;
rgdod[didAdd].dwData = (gKeyStack->Pressed)?0x80:0;
rgdod[didAdd].dwSequence = dwSequence;
rgdod[didAdd].dwTimeStamp = dwTimeStamp;
rgdod[didAdd].uAppData = 0;
(*pdwInOut)--;
free(gKeyStack);
gKeyStack = pNext;
didAdd++;
(*pdwInOut) = didAdd;
gbInDInput = FALSE;
return (HRESULT)DI_OK;
}
}
//DebugSpewAlways("DInputDataDetour::Mouse pdwInOut = %lu", *pdwInOut);
// If we are waiting for a click-event to be confirmed by EQ, don't
// pull any data, just return DI_OK and set the pdwInOut value to 0
if (IsMouseWaitingForButton())
{
hResult = DI_OK;
*pdwInOut = 0;
gbInDInput = FALSE;
return hResult;
}
if (EQADDR_MOUSE && gMouseData) {
*pdwInOut = 0;
// PMOUSEINFO MouseInfo = EQADDR_MOUSE;
bLoop = TRUE;
while ((bLoop == TRUE) && (gMouseData)) {
bRemoveItem = TRUE;
if (*pdwInOut < dwInOutSave) {
rgdod[*pdwInOut].dwSequence = dwSequence;
rgdod[*pdwInOut].dwTimeStamp = dwTimeStamp;
rgdod[0].uAppData = 0;
switch (gMouseData->mdType) {
case MD_Button0Click:
DebugSpew("Trying to click left button.");
rgdod[*pdwInOut].dwData = 0x80;
rgdod[*pdwInOut].dwOfs = DIMOFS_BUTTON0;
gMouseData->mdType = MD_Button0;
gMouseData->dwData = 0x00;
bRemoveItem = FALSE;
bLoop = FALSE;
(*pdwInOut)++;
break;
case MD_Button1Click:
DebugSpew("Trying to click right button.");
rgdod[*pdwInOut].dwData = 0x80;
rgdod[*pdwInOut].dwOfs = DIMOFS_BUTTON1;
gMouseData->mdType = MD_Button1;
gMouseData->dwData = 0x00;
bRemoveItem = FALSE;
bLoop = FALSE;
(*pdwInOut)++;
break;
case MD_Button0:
rgdod[*pdwInOut].dwData = gMouseData->dwData;
rgdod[*pdwInOut].dwOfs = DIMOFS_BUTTON0;
(*pdwInOut)++;
break;
case MD_Button1:
rgdod[*pdwInOut].dwData = gMouseData->dwData;
rgdod[*pdwInOut].dwOfs = DIMOFS_BUTTON1;
(*pdwInOut)++;
break;
case MD_Unknown:
break;
}
if (bRemoveItem==TRUE) {
PMOUSESPOOF pTemp = gMouseData;
gMouseData = gMouseData->pNext;
free(pTemp);
}
} else {
bLoop = FALSE;
}
}
gbInDInput = FALSE;
return (HRESULT)DI_OK;
}
}
}
//DebugSpewAlways("DInputDataDetour::None pdwInOut = %lu", *pdwInOut);
// If we didn't add any keyboard data, and we aren't waiting for a click,
// and we didn't add any mouse data
hResult = DInputDataTrampoline(This, cbObjectData, rgdod, pdwInOut, dwFlags);
if (gbUnload) {
gbInDInput = FALSE;
return hResult;
}
if (EQADDR_DIKEYBOARD && (This == *EQADDR_DIKEYBOARD) && EQADDR_NOTINCHATMODE && *EQADDR_NOTINCHATMODE && pHotkey) TestHotkeys(&(rgdod[didAdd]),*pdwInOut);
gbInDInput = FALSE;
return hResult;
}
Code: Select all
#define stricmp stricoll
Code: Select all
DWORD WINAPI MQ2Start(LPVOID lpParameter)
{
[color=red]setlocale(LC_COLLATE,"French");[/color]
PCHAR lpINIPath = (PCHAR)lpParameter;
strcpy(gszINIPath, lpINIPath);
CHAR szBuffer[MAX_STRING] = {0};
Code: Select all
EQLIB_API VOID ZapVars (PSPAWNINFO,PCHAR);
// OTHER SHIT
#define LIGHT_COUNT 13
#define MAX_COMBINES 52
#define MAX_ITEMTYPES 53
#define GAMESTATE_CHARSELECT 1
#define GAMESTATE_SOMETHING 4
#define GAMESTATE_INGAME 5
#define GAMESTATE_PRECHARSELECT 6
#define GAMESTATE_LOGGINGIN 253
#define GAMESTATE_UNLOADING 255
#define XWM_LCLICK 1
#define XWM_RCLICK 3
#define XWM_NEWVALUE 14
#define MAX_ITEM4xx 416
#define stricmp stricoll
#include "MQ2Auth2.h"