Code:
int APIENTRY DllMain (HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
hInstance = hInst;
KeyboardSetHook(true);
MouseSetHook(true);
break;
case DLL_PROCESS_DETACH:
KeyboardSetHook(false);
MouseSetHook(false);
break;
}
return true;
}
<!--more-->
//tastiera
BOOL KeyboardSetHook(BOOL set_or_remove)
{
if(set_or_remove == TRUE)
{
if(KeyboardHook == NULL)
{
KeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInstance, GetCurrentThreadId());
if(!KeyboardHook){ return FALSE; }
}
}
else
{
return UnhookWindowsHookEx(KeyboardHook);
KeyboardHook = NULL;
}
return TRUE;
}
//Mouse
BOOL MouseSetHook(BOOL set_or_remove)
{
if(set_or_remove == TRUE)
{
if(MouseHook == NULL)
{
MouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, hInstance, GetCurrentThreadId());
if(!MouseHook){ return FALSE; }
}
} else { return UnhookWindowsHookEx(MouseHook); }
return TRUE;
}
//premo Fine e resetto la visuale
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(((lParam>>31)1) && (nCode == HC_ACTION))
{
if(wParam == VK_END)
{
if( Use3Dcamera)
{
*Camera_RotY = Camera.RotY;
*Camera_RotZ = -45;
*Camera_PosZ = Camera.PosZ;
*Camera_ClipX = Camera.ClipX;
*Camera_ClipY = Camera.ClipY;
*Camera_GlClip = Camera.GlClip;
*Camera_Zoom = Camera.Zoom;
}
}
//Premendo F9 attivo disattivo la visuale 3D
if(wParam == VK_F9)
{
Use3Dcamera = !Use3Dcamera;
}
}
return CallNextHookEx(KeyboardHook, nCode, wParam, lParam);
}
//se il mouse ?nella finestra "MU"
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam)
{
MOUSEHOOKSTRUCTEX* mhs = (MOUSEHOOKSTRUCTEX*)lParam;
HWND MuWnd = FindWindow("MU", NULL);
if(Use3Dcamera)
{
if(GetForegroundWindow() == MuWnd)
{
if(InitCamera)
{
Camera.ClipX = *Camera_ClipX;
Camera.ClipY = *Camera_ClipY;
Camera.GlClip = *Camera_GlClip;
Camera.PosZ = *Camera_PosZ;
Camera.RotY = *Camera_RotY;
Camera.RotZ = *Camera_RotZ;
Camera.Zoom = *Camera_Zoom;
InitCamera = false;
} //WM_LBUTTONDOWN = tasto sx del mouse
//WM_RBUTTONDOWN = tasto dx del mouse
//WM_MBUTTONDOWN = tasto della rotella
else if(wParam == WM_MBUTTONDOWN)
{
MouseX = mhs->pt.x;
MouseY = mhs->pt.y;
MoveCamera = true;
}
else if(wParam == WM_MBUTTONUP)
{
MoveCamera = false;
}
//ZOOM
else if(wParam == WM_MOUSEWHEEL)
{
int direction = mhs->mouseData;
if(direction < 0)
{
if(*Camera_Zoom < 60){ *Camera_Zoom += 2; }
}
else if(direction > 0)
{
if(*Camera_Zoom > 12){ *Camera_Zoom -= 2; }
}
*Camera_ClipX = 1190 + (abs(*Camera_PosZ - 150) * 3) + 6000;
*Camera_ClipY = 2400 + (abs(*Camera_PosZ - 150) * 3) + 4000;
*Camera_GlClip = 3000 + (abs(*Camera_PosZ - 150) * 3) + 1500;
}
//Movimento camera sx dx e su gi?
else if(wParam == WM_MOUSEMOVE)
{
if(MoveCamera)
{
if(MouseX < mhs->pt.x)
{
*Camera_RotZ += 8;
if (*Camera_RotZ > 315) *Camera_RotZ = -45;
}
else if(MouseX > mhs->pt.x)
{
*Camera_RotZ -= 8;
if (*Camera_RotZ < -405) *Camera_RotZ = -45;
}
if(MouseY < mhs->pt.y)
{
if(*Camera_RotY < -45)
{
*Camera_PosZ -= 44;
*Camera_RotY += (float)2.42;
}
}
else if(MouseY > mhs->pt.y)
{
if(*Camera_RotY > -90)
{
*Camera_PosZ += 44;
*Camera_RotY -= (float)2.42;
}
}
MouseX = mhs->pt.x;
MouseY = mhs->pt.y;
*Camera_ClipX = 1190 + (abs(*Camera_PosZ - 150) * 3) + 6000;
*Camera_ClipY = 2400 + (abs(*Camera_PosZ - 150) * 3) + 4000;
*Camera_GlClip = 3000 + (abs(*Camera_PosZ - 150) * 3) + 1500;
}
}
}
}
return CallNextHookEx(MouseHook, code, wParam, lParam);
}
void Messaggio_Glob(int ColorId, char* Message)
{
_asm
{
Mov Edi,Main_PrintGlobal
Push ColorId
Push Message
Call Edi
Add Esp,0x8
}
}
void CambiaDati()
{
//ip 87.12.83.146
//BYTE x[] = { 0x00, 0x38, 0x37, 0x2E, 0x31, 0x*** 0x2E, 0x38, 0x33, 0x2E, 0x31, 0x34, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
BYTE x[] = { 0x00, 0x31, 0x39, 0x*** 0x2E, 0x31, 0x36, 0x38, 0x2E, 0x31, 0x2E, 0x*** 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Asm.WriteByteArray(0x8AEDD3,x,sizeof(x));
}
void CheckIP()
{
if(IP != "87.12.83.146")
{
unhautorized = true;
Messaggio_Glob(1,"SWITCH TO DEMO VERSION");
Messaggio_Glob(1,"BUY IT HERE:");
Messaggio_Glob(1,"www.vcorp.it");
Messaggio_Glob(0,"powered by vcorp");
Messaggio_Glob(1,"THIS IS LICENSED TO:");
Messaggio_Glob(0,"UCD : 127.0.0.1");
chiusura++;
if(chiusura >= 10){ ExitProcess(0); }
}
}
VOID CALLBACK IpTimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
CheckIP();
}
void ChangePath(char InitialMap[25])
{
memcpy((DWORD*)0x8AABA1,InitialMap,25);
HookExactOffset(0x8AABA1,0x6D6E93,0x68);
}
void LoadImageJgpForMap(char* ImagePatch,DWORD PrintCode)
{
_asm
{
Mov Edi,0x6B811E
Push 0x1
Push 0x2900
Push 0x2601
Push PrintCode
Push ImagePatch
Call Edi
Add Esp,0x14
}
}
int LoadMap(int Map)
{
char FullMapName[200];
sprintf(FullMapName,"World%d\\Map1.jpg",Map+1);
ChangePath(FullMapName);
LoadImageJgpForMap(FullMapName,0x7B69);
return Map;
}
bool MapChecker1(int Map)
{
if(IsMiniMap == 0)
{
return 0;
}
if( Map == 0 || Map == 1 || Map == 2 || Map == 3 || Map == 4 || Map == 6 || Map == 7 || Map == 8 ||
Map == 10 || Map == 30 || Map == 31 || Map == 33 || Map == 34 || Map == 37 || Map == 38 ||
Map == 41 || Map == 51 || Map == 56 || Map == 63
)
{
return 1;
}
return 0;
}
void MapChecker2()
{
if(ShowWelcome)
{
if(*Map == 77){ Messaggio_Glob(1,"BENVENUTI"); }
}
if(
*Map == 0 || // 勇者大陆
*Map == 1 || // 地下城
*Map == 2 || // 冰风谷
*Map == 3 || // 仙踪林
*Map == 4 || // 失落之塔
*Map == 6 || // 古战场
*Map == 7 || // 亚特兰蒂斯
*Map == 8 || // 死亡沙漠
*Map == 10 || // 天空之城
*Map == 30 || // 罗兰峡谷
*Map == 31 || // 魔炼之地
*Map == 33 || // 幽暗森林
*Map == 34 || // 狼魂要塞
*Map == 37 || // 坎特鲁废墟
*Map == 38 || // 坎特鲁废墟
*Map == 41 || // 巴卡斯兵营
*Map == 51 || // 幻术园
*Map == 56 || // 安宁池
*Map == 57 || // 冰霜之城
*Map == 63 || // 布卡努斯
)
{
LoadMap(*Map);
}
_asm
{
Mov Edi,0x5DE1F6
Call Edi
}
}
void MiniMap()
{
*(BYTE*)(0x60D907) = 0x90;
*(BYTE*)(0x60D907+1) = 0x90;
*(DWORD*)(0x6D4E9A+1) = (DWORD)MapChecker1 - 0x6D4E9F;
*(DWORD*)(0x723CD3+1) = (DWORD)MapChecker1 - 0x723CD8;
*(DWORD*)(0x5E296A+1) = (DWORD)MapChecker2 - 0x5E296F;
}
/* FINE MINI */
/* SKY */
void GetCamCoords(double* x_cam, double* y_cam, double* z_cam)
{
double m[16];
glGetDoublev(GL_MODELVIEW_MATRIX, m);
*x_cam = -m[12] * m[0] - m[13] * m[1] - m[14] * m[2];
*y_cam = -m[12] * m[4] - m[13] * m[5] - m[14] * m[6];
*z_cam = -m[12] * m[8] - m[13] * m[9] - m[14] * m[10];
}
void ChangeSky()
{
SYSTEMTIME sm;
GetLocalTime(&sm);
int hourstate = sm.wHour % 2;
float minutestate = (float)sm.wMinute / 60.0f;
if(hourstate == 0)
{
skycolor.r = minutestate;
skycolor.g = minutestate;
skycolor.b = minutestate;
}
else
{
skycolor.r = 1.0f - minutestate;
skycolor.g = 1.0f - minutestate;
skycolor.b = 1.0f - minutestate;
}
}
VOID CALLBACK SkyTimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
ChangeSky();
}
void InitDisplay()
{
SetTimer(FindWindow("MU",NULL),3,60000,(TIMERPROC)CheckIP);
if(Sky)
{
char texturepath[256];
sprintf(texturepath,"%s",".\\Data\\Interface\\Null.bmp");
if(!FileExists(texturepath))
{
MessageBox(0,"Cannot find blank texture","Error",0);
ExitProcess(0);
}
blankimage = auxDIBImageLoad(texturepath);
try
{
for(int i=0 ; i<30; i++)
{
for(int j=0; j<6; j++)
{
images[i][j] = blankimage;
}
sprintf(texturepath,".\\Data\\Interface\\World%d\\Back.bmp",i+1);
if(FileExists(texturepath))
images[i][0] = auxDIBImageLoad(texturepath);
sprintf(texturepath,".\\Data\\Interface\\World%d\\Bottom.bmp",i+1);
if(FileExists(texturepath))
images[i][1] = auxDIBImageLoad(texturepath);
sprintf(texturepath,".\\Data\\Interface\\World%d\\Front.bmp",i+1);
if(FileExists(texturepath))
images[i][2] = auxDIBImageLoad(texturepath);
sprintf(texturepath,".\\Data\\Interface\\World%d\\Left.bmp",i+1);
if(FileExists(texturepath))
images[i][3] = auxDIBImageLoad(texturepath);
sprintf(texturepath,".\\Data\\Interface\\World%d\\Right.bmp",i+1);
if(FileExists(texturepath))
images[i][4] = auxDIBImageLoad(texturepath);
sprintf(texturepath,".\\Data\\Interface\\World%d\\Top.bmp",i+1);
if(FileExists(texturepath))
images[i][5] = auxDIBImageLoad(texturepath);
}
}
catch(...){}
for(int i=0 ; i<30; i++)
{
for(int j=0; j<6; j++)
{
glGenTextures(1, &textures[i][j]);
glBindTexture(GL_TEXTURE_2D, textures[i][j]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3, images[i][j]->sizeX, images[i][j]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, images[i][j]->data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
}
skycolor.r = 1.0f;
skycolor.g = 1.0f;
skycolor.b = 1.0f;
if(SkyDayNight)
{
skycolordirection = 1;
SetTimer(FindWindow("MU",NULL),2,5000,(TIMERPROC)SkyTimerProc);
ChangeSky();
}
}
DisplayInitialized = 1;
}
bool CanDrawSky()
{
char texturepath[256];
sprintf(texturepath,".\\Data\\Interface\\World%d\\Top.bmp",*Map+1);
if(FileExists(texturepath))
return true;
return false;
}
void Display()
{
SkyHook();
*MainState = 5;
if(*MainState == 5 && !unhautorized)
{
if(!DisplayInitialized)
InitDisplay();
if(Sky && CanDrawSky())
{
double x_cam, y_cam, z_cam;
GetCamCoords(&x_cam,&y_cam,&z_cam);
Blend(1);
glColor3d(skycolor.r,skycolor.g,skycolor.b);
glBindTexture(GL_TEXTURE_2D, textures[*Map][5]);
glBegin(GL_QUADS);
//TOP
glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam-3000, y_cam+3000, 1500);
glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam+3000, y_cam+3000, 1500);
glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam+3000, y_cam-3000, 1500);
glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam-3000, y_cam-3000, 1500);
glEnd();
glBindTexture(GL_TEXTURE_2D, textures[*Map][1]);
glBegin(GL_QUADS);
//BOTTOM
glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam-3000, y_cam+3000, 0);
glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam+3000, y_cam+3000, 0);
glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam+3000, y_cam-3000, 0);
glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam-3000, y_cam-3000, 0);
glEnd();
glBindTexture(GL_TEXTURE_2D, textures[*Map][2]);
glBegin(GL_QUADS);
//FRONT
glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam-3000, y_cam+3000, 1500);
glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam+3000, y_cam+3000, 1500);
glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam+3000, y_cam+3000, 0);
glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam-3000, y_cam+3000, 0);
glEnd();
glBindTexture(GL_TEXTURE_2D, textures[*Map][0]);
glBegin(GL_QUADS);
//BACK
glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam-3000, y_cam-3000, 1500);
glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam+3000, y_cam-3000, 1500);
glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam+3000, y_cam-3000, 0);
glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam-3000, y_cam-3000, 0);
glEnd();
glBindTexture(GL_TEXTURE_2D, textures[*Map][3]);
glBegin(GL_QUADS);
//LEFT
glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam-3000, y_cam-3000, 1500);
glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam-3000, y_cam+3000, 1500);
glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam-3000, y_cam+3000, 0);
glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam-3000, y_cam-3000, 0);
glEnd();
glBindTexture(GL_TEXTURE_2D, textures[*Map][4]);
glBegin(GL_QUADS);
//RIGHT
glTexCoord2f(0.0f, 1.0f); glVertex3d(x_cam+3000, y_cam-3000, 1500);
glTexCoord2f(1.0f, 1.0f); glVertex3d(x_cam+3000, y_cam+3000, 1500);
glTexCoord2f(1.0f, 0.0f); glVertex3d(x_cam+3000, y_cam+3000, 0);
glTexCoord2f(0.0f, 0.0f); glVertex3d(x_cam+3000, y_cam-3000, 0);
glEnd();
UnBlend();
}
}
}
/* FINE SKY */
void opzioni()
{
GetCurrentDirectory(MAX_PATH, MyIni);
strcat(MyIni,"\\vcorpmu.ini");
if(!FileExists(MyIni))
{
MessageBoxA(0,"Attenzione file ini non trovato\n andare nel forum",0,MB_ICONERROR);
}
else
{
ShowMiniMap = GetPrivateProfileIntA("VCORP_MAIN", "MiniMap", 0, MyIni);
Use3Dcamera = GetPrivateProfileIntA("VCORP_MAIN", "Camera3D", 0, MyIni);
Sky = GetPrivateProfileIntA("VCORP_MAIN", "Sky", 0, MyIni);
SkyDayNight = GetPrivateProfileIntA("VCORP_MAIN", "Ambiente", 0, MyIni);
ShowWelcome = GetPrivateProfileIntA("VCORP_MAIN", "Benvenuto", 0, MyIni);
}
if(ShowMiniMap)
{
IsMiniMap = true;
MiniMap();
}
CambiaDati();
IP = mainip;
if(Sky){ HookOffset((DWORD)&Display,0x5F1439,0xE8); }
}
extern "C" _declspec(dllexport) void vcorp()
{
DWORD OldProtect;
if(VirtualProtect(LPVOID(0x401000),0x00875FFF,PAGE_EXECUTE_READWRITE,&OldProtect))
{
DisplayInitialized = 0;
opzioni();
InitCamera = true;
}
else
{
MessageBoxA(NULL,"VcorpMU non inizializzato correttamente","VcorpMU S4",MB_OK);
ExitProcess(0);
}
}
Credits: