Гайд: Меняем Excellent опции на определенные вещи

Автор DarkSim, 2012 Дек. 22, 18:13

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] mu onlinemu разработкиопции на вещи

DarkSim

Когда добавлял свои крылья в клиент было важно сделать свои опции на них, в сервере это не проблема, а вот в клиенте это было темное пятно, вот подумал кому нибудь да пригодиться.

Сами опции на вещи подобные крыльям, кольцам, оружию и т.д. устанавливаются вызовом функции, в которую выставляется тип опции и ее количество (%, + и т.д.), перехватив которую можно изменять значения как угодно:

enum eItemOption
{
Damage            = 80,        //-> Additional Damage +<N>
WizardryDamage    = 81,
CurseSpell        = 82,
Defense            = 84,        //-> Additional Defense +<N>
Luck            = 85,        //-> Default: 0
HPRecovery        = 86,
IncreaseDamage    = 95,        //-> Increase Damage +<N>%
IncreaseSpeed    = 98,        //-> Increase Attacking(Wizardry)speed +<N>
IgnorOpDefense    = 103,
ReturnAttack    = 106,        //-> Return's the enemy's attack power in <N>%
CompleteLife    = 107,        //-> Complete recovery of life in <N>% rate
CompleteMana    = 108,        //-> Complete recovery of Mana in <N>% rate
};
//---------------------------------------------------------------------------

#define SetItemSpecialStat        ((int(*)(short ItemID, int Arg2, BYTE SpecialOption, BYTE SpecialValue, int Arg5)) 0x5C0DC0)
#define oSetItemSpecialStat        0x005CA0B0
//---------------------------------------------------------------------------

int __cdecl gSetItemSpecialStat(short ItemID, int Arg2, BYTE SpecialOption, BYTE SpecialValue, int Arg5)
{
switch(ItemID)
{
case ITEM(12, 180):
case ITEM(12, 181):
case ITEM(12, 182):
case ITEM(12, 183):
case ITEM(12, 184):
case ITEM(12, 185):
{
switch(SpecialOption)
{
case eItemOption::IgnorOpDefense:
{
SpecialValue = 8;
}
break;
// --
case eItemOption::ReturnAttack:
{
SpecialValue = 10;
}
break;
// --
case eItemOption::CompleteLife:
{
SpecialValue = 5;
}
break;
// --
case eItemOption::CompleteMana:
{
SpecialValue = 5;
}
break;
}
}
break;
}
// ----
return SetItemSpecialStat(ItemID, Arg2, SpecialOption, SpecialValue, Arg5);
}
//---------------------------------------------------------------------------

SetHook((LPVOID)gSetItemSpecialStat, (LPVOID)oSetItemSpecialStat, ASM::CALL);

BYTE SpecialOption - Это номер опции, я составил enum для нее, ибо как оказалось в сервере и клиенте они разные
BYTE SpecialValue - Это значение опции (например Return's the enemy's attack power in 5%)

Сама функция делает следующее:
- Перехватывает оригинальный вызов (в 1.03.28 GMO их 2-3, один на вещи, другой на петов и т.д.), получает аргументы и делает свитч по нужным нам вещам, например если поинтер ItemID = 14:185, то мы делаем свитч по нужной нам опции из enum'a eItemOption, например "eItemOption::IgnorOpDefense", после этого устанавливаем нужное нам значение SpecialValue для данной опции и возвращаем это в оригинальную функцию, которая в свою очередь отображает все это.

Скриншот:
## здесь был скриншот ##

Приложив фантазию можно изменить и заменить любые опции на вещах, добавить свои новые и т.д., все оффсеты от 1.03.28 GMO

P.S.: Аргументы функции могут быть разные в разных версиях, например в 1.03.25 JPN short SpecialValue а не BYTE SpecialValue

Похожие темы (5)