That fix don't work, don't use it ( to Viet Nam cái mã nguồn trên up là bị thiếu và lỗi tùm lum anh em sài cách fix sau đây dễ và ngon hơn )
in source main of EMU
STEP 1: in file Protocol.cpp go to void GCCharacterInfoRecv(PMSG_CHARACTER_INFO_RECV* lpMsg) // OK
we see
switch(((*(BYTE*)(*(DWORD*)(MAIN_CHARACTER_STRUCT)+0x0B)) & 7))
{
case 0:
SetByte(0x00556C38,((gProtect.m_MainInfo.DWMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 1:
SetByte(0x00556C38,((gProtect.m_MainInfo.DKMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
break;
case 2:
SetByte(0x00556C38,((gProtect.m_MainInfo.FEMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 3:// Neu day la MG da duoc Fix lai trong ham void User::Refresh() User.cpp
break;
case 4:
SetByte(0x00556C38,((gProtect.m_MainInfo.DLMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 5:
SetByte(0x00556C38,((gProtect.m_MainInfo.SUMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 6:
SetByte(0x00556C38,((gProtect.m_MainInfo.RFMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
break;
}
we delete it or change to
/*switch(((*(BYTE*)(*(DWORD*)(MAIN_CHARACTER_STRUCT)+0x0B)) & 7))
{
case 0:
SetByte(0x00556C38,((gProtect.m_MainInfo.DWMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 1:
SetByte(0x00556C38,((gProtect.m_MainInfo.DKMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
break;
case 2:
SetByte(0x00556C38,((gProtect.m_MainInfo.FEMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 3:// Neu day la MG da duoc Fix lai trong ham void User::Refresh() User.cpp
break;
case 4:
SetByte(0x00556C38,((gProtect.m_MainInfo.DLMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 5:
SetByte(0x00556C38,((gProtect.m_MainInfo.SUMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 6:
SetByte(0x00556C38,((gProtect.m_MainInfo.RFMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
break;
}*/
STEP 2: go to User.cpp we see void User::Refresh()
we see
if (gObjUser.GetActiveSkill() == 261 || gObjUser.GetActiveSkill() == 552 || gObjUser.GetActiveSkill() == 555)
{
//lpPlayer->AttackSpeed = (WORD)10;
//lpPlayer->MagicSpeed = (WORD)10;
//SetOp((LPVOID)0x007801AC, (LPVOID)lpPlayer->AttackSpeed, ASM::CALL);
SetDouble(&pFrameSpeed1, 0.0004000);
SetDouble(&pFrameSpeed2, 0.0002000);
}
else
{
SetDouble(&pFrameSpeed1, 0.0040000);
SetDouble(&pFrameSpeed2, 0.0020000);
}
///////// we add code herre ////////////
and we add
switch(((*(BYTE*)(*(DWORD*)(MAIN_CHARACTER_STRUCT)+0x0B)) & 7))
{
case 0:
SetByte(0x00556C38,((gProtect.m_MainInfo.DWMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 1:
SetByte(0x00556C38,((gProtect.m_MainInfo.DKMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
break;
case 2:
SetByte(0x00556C38,((gProtect.m_MainInfo.FEMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 3:
if (gObjUser.GetActiveSkill() == 55)// 55 chem lua 56 la vay kiem run
{
SetByte(0x00556C38,((gProtect.m_MainInfo.MGMaxAttackSpeed>=0xFFFF)?0x11:0x0F));
}
else
{
SetByte(0x00556C38,((gProtect.m_MainInfo.MGMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
}
break;
case 4:
SetByte(0x00556C38,((gProtect.m_MainInfo.DLMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 5:
SetByte(0x00556C38,((gProtect.m_MainInfo.SUMaxAttackSpeed>=0xFFFF)?0x02:0x0F));
break;
case 6:
SetByte(0x00556C38,((gProtect.m_MainInfo.RFMaxAttackSpeed>=0xFFFF)?0x0F:0x0F));
break;
}