I forgot to reply but I fixed it.
Somehow on our server the detour is called for keyboard only when you use you keyboard. So pulse() was called only when you pressed a key and we have our strange behaviour.
I really don t understand why it does not work the same way than the us version since it the same code ( only compile time change ) ...
My fix is a fast ugly fix. Kbd event don t work (any idea ? ) but mouse and macro does.
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;
}