DLL для Эры:
http://zalil.ru/30309177
Теперь у бехолдеров будут лучи всех цветов радуги (выбирается один из семи цветов случайно), а у магов вместо прямого луча будет молния.
Код:
Код
#define OPCODE_JUMP 0xE9
#define OPCODE_CALL 0xE8
#define OPCODE_NOP 0x90
#define HOOKTYPE_JUMP 0
#define HOOKTYPE_CALL 1
#define HOOK_SIZE 5
inline void WriteHook( void *pOriginal, void *pNew, char type )
{
*(byte*)pOriginal = (type==HOOKTYPE_JUMP)?OPCODE_JUMP:OPCODE_CALL;
*(void**)( (byte*)pOriginal + 1 ) = (void*)( (byte*)pNew - (byte*)pOriginal - HOOK_SIZE );
}
__fastcall void (*DrawBattleRay)(int ecx, int edx, int a2, signed int a3, signed int a4, signed int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, signed int a13, int a14, int a15, int a16, float a17, int a18) =
(__fastcall void (*)(int ecx, int edx, int a2, signed int a3, signed int a4, signed int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, signed int a13, int a14, int a15, int a16, float a17, int a18))(0x5A5F30);
void XRays_Ray(int unit, int ecx, int edx, int a2, signed int x1, signed int y1, signed int x2, signed int y2, int a6, int a7, int thickness_st, int thickness_end, int color16, int curv1, signed int curv2, int speed, int a14, int a15, float slowness, int a17)
{
int eyecolor[7]={63488,64512,65504,2016,2047,31,32784};
if (unit==35)
{curv1=50; curv2=-50; /*color16=0x77EE;*/}
if (unit==74 || unit==75)
{color16=eyecolor[rand()%7];}
if (unit==197)
{
color16= ((0xFF>>3)<<11) + (((rand()%0x7C)>>2)<<5) + (0x00>>3);
}
DrawBattleRay(ecx,edx,a2,x1,y1,x2,y2,a6,a7,thickness_st,thickness_end,color16,curv1,curv2,
speed,a14,a15,slowness,a17);
}
__fastcall void XRays_RayHook(int ecx, int edx, int a2, signed int x1, signed int y1, signed int x2, signed int y2, int a6, int a7, int thickness_st, int thickness_end, int color16, int curv1, signed int curv2, int speed, int a14, int a15, float slowness, int a17)
{
register void *ebx asm("ebx");
XRays_Ray((int)ebx,ecx,edx,a2,x1,y1,x2,y2,a6,a7,thickness_st,thickness_end,color16,curv1,cu
rv2,speed,a14,a15,slowness,a17);
}
extern "C" __stdcall BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
WriteHook((void*)0x43F2DE, (void*)(XRays_RayHook), HOOKTYPE_CALL);
break;
}
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
#define OPCODE_CALL 0xE8
#define OPCODE_NOP 0x90
#define HOOKTYPE_JUMP 0
#define HOOKTYPE_CALL 1
#define HOOK_SIZE 5
inline void WriteHook( void *pOriginal, void *pNew, char type )
{
*(byte*)pOriginal = (type==HOOKTYPE_JUMP)?OPCODE_JUMP:OPCODE_CALL;
*(void**)( (byte*)pOriginal + 1 ) = (void*)( (byte*)pNew - (byte*)pOriginal - HOOK_SIZE );
}
__fastcall void (*DrawBattleRay)(int ecx, int edx, int a2, signed int a3, signed int a4, signed int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, signed int a13, int a14, int a15, int a16, float a17, int a18) =
(__fastcall void (*)(int ecx, int edx, int a2, signed int a3, signed int a4, signed int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, signed int a13, int a14, int a15, int a16, float a17, int a18))(0x5A5F30);
void XRays_Ray(int unit, int ecx, int edx, int a2, signed int x1, signed int y1, signed int x2, signed int y2, int a6, int a7, int thickness_st, int thickness_end, int color16, int curv1, signed int curv2, int speed, int a14, int a15, float slowness, int a17)
{
int eyecolor[7]={63488,64512,65504,2016,2047,31,32784};
if (unit==35)
{curv1=50; curv2=-50; /*color16=0x77EE;*/}
if (unit==74 || unit==75)
{color16=eyecolor[rand()%7];}
if (unit==197)
{
color16= ((0xFF>>3)<<11) + (((rand()%0x7C)>>2)<<5) + (0x00>>3);
}
DrawBattleRay(ecx,edx,a2,x1,y1,x2,y2,a6,a7,thickness_st,thickness_end,color16,curv1,curv2,
speed,a14,a15,slowness,a17);
}
__fastcall void XRays_RayHook(int ecx, int edx, int a2, signed int x1, signed int y1, signed int x2, signed int y2, int a6, int a7, int thickness_st, int thickness_end, int color16, int curv1, signed int curv2, int speed, int a14, int a15, float slowness, int a17)
{
register void *ebx asm("ebx");
XRays_Ray((int)ebx,ecx,edx,a2,x1,y1,x2,y2,a6,a7,thickness_st,thickness_end,color16,curv1,cu
rv2,speed,a14,a15,slowness,a17);
}
extern "C" __stdcall BOOL DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
WriteHook((void*)0x43F2DE, (void*)(XRays_RayHook), HOOKTYPE_CALL);
break;
}
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}