help-me Smoke effect 1.05 D MuEmu not work
.cpp
.hCode:
#include "StdAfx.h"
#include "ToolKit.h"
DWORD pItemType = 0;
float R = 0.0f;
float G = 0.0f;
float B = 0.0f;
int g_iItemCount = 0;
cSmokeEffect::sEffect eColor[256];
cSmokeEffect gSmokeEffect;
cSmokeEffect::cSmokeEffect()
{
/**/
}
cSmokeEffect::~cSmokeEffect()
{
/**/
}
INT cSmokeEffect::GetLineId(DWORD ItemType)
{
for(int i = 0;i < g_iItemCount;i++)
{
if(pItemType == OBJ_ID(11,eColor[i].Id)) // Boots type (11)
{
return i;
}
}
return -1;
}
__declspec(naked) void SetItemEffect()
{
_asm
{
MOV pItemType, ECX
}
if(gSmokeEffect.GetLineId(pItemType) > -1)
{
_asm
{
MOV ESI, HDK_ITEM_EFFECT_ALLOW
JMP ESI
}
}
_asm
{
MOV ESI, HDK_ITEM_EFFECT_NOT_ALLOW
JMP ESI
}
}
__declspec(naked) void SetColorEffect()
{
_asm
{
MOV pItemType, ECX
}
int i;
i = gSmokeEffect.GetLineId(pItemType);
for(int i = 0; i < g_iItemCount; i++)
{
if(pItemType == OBJ_ID(11,eColor[i].Id))
{
R = eColor[i].R;
G = eColor[i].G;
B = eColor[i].B;
_asm
{
// R
MOV ECX,DWORD PTR SS:[EBP+0xC] // struct RGB
MOV EDX, R
MOV DWORD PTR DS:[ECX+0x9C],EDX // float =D
// G
MOV EDX,DWORD PTR SS:[EBP+0xC] // struct RGB
MOV EAX, G
MOV DWORD PTR DS:[EDX+0xA0],EAX // float =D
// B
MOV EAX,DWORD PTR SS:[EBP+0xC] // struct RGB
MOV ECX, B
MOV DWORD PTR DS:[EAX+0xA4],ECX
}
}
}
_asm
{
MOV ESI, HDK_NEXT_ITEM_COLOR
JMP ESI
}
}
void cSmokeEffect::Load()
{
if(!SmokeEffectIni) return;
fopen_s(&SMDFile,SmokeEffectIni,"r");
if(SMDFile != NULL)
{
SMDToken Token;
Token = GetToken();
if((Token == END) || (TokenNumber != 0))
{
MessageBox(NULL,"Invalid file, the Section 0 should be the first Section.",SmokeEffectIni,MB_OK|MB_ICONERROR);
::ExitProcess(0);
}
g_iItemCount = 0;
memset(eColor,-1,sizeof(eColor));
while(true)
{
Token = GetToken();
if((Token == END) || (lstrcmpi(TokenString,"end") == 0)) break;
eColor[g_iItemCount].Id = (int)TokenNumber; Token = GetToken();
eColor[g_iItemCount].R = TokenNumber; Token = GetToken();
eColor[g_iItemCount].G = TokenNumber; Token = GetToken();
eColor[g_iItemCount].B = TokenNumber;
g_iItemCount++;
}
if(g_iItemCount > 0)
{
ToolKit.SetNop(HDK_SET_ITEM_EFFECT,12);
ToolKit.WriteJmp(HDK_SET_ITEM_EFFECT, (DWORD)&SetItemEffect);
ToolKit.SetNop(HDK_SET_COLOR_EFFECT,46);
ToolKit.WriteJmp(HDK_SET_COLOR_EFFECT,(DWORD)&SetColorEffect);
}
}
else
{
MessageBox(NULL,"Unable to open file",SmokeEffectIni,MB_OK|MB_ICONERROR);
::ExitProcess(0);
}
fclose(SMDFile);
}
Code:
#ifndef _SmokeEffect_H_
#define _SmokeEffect_H_
#define MAX_ITEM_TYPE 512
#define ITEM_ID 819 // 0x333 / 819
#define GET_ITEM(x, y) ((x * MAX_ITEM_TYPE) + y)
#define OBJ_ID(x, y) (x * MAX_ITEM_TYPE + y) + ITEM_ID
// - Smoke Effect
#define HDK_SET_ITEM_EFFECT
#define HDK_SET_COLOR_EFFECT
#define HDK_ITEM_EFFECT_ALLOW
#define HDK_ITEM_EFFECT_NOT_ALLOW
#define HDK_NEXT_ITEM_COLOR
class cSmokeEffect
{
public:
cSmokeEffect();
virtual ~cSmokeEffect();
void Load();
INT GetLineId(DWORD ItemType);
struct sEffect
{
int Id;
float R;
float G;
float B;
};
};
extern cSmokeEffect gSmokeEffect;
extern cSmokeEffect::sEffect eColor[256];
#endif
