У меня был как-то вопрос : "Как увеличить множитель у умножителя опыта? (страница 116 в элике)"
Собственно само решение.
Нам потребуется программа IDA Pro 9.1 и файл ядра GS который мы будем редактировать (находится на сервере в папке gamed).
Открываем файл GS в программе IDA Pro 9.1
Ищем в ней следующую функцию:
Нажимаем F5 для декомпиляции с ассемблера и видим следующий код:
Нас интересует строка
Где 1,5 это и есть наш множитель.
Выделяем его и переходим обратно в ассемблер и видим что данное число типа float, а именно
К примеру заменим его на коэффициент 2.0 в формате float это будет
Для этого выделяем число, переходим Edit -> Patch Program -> Assemble
Видим следующее вырожение
Заменим его на наш множитель 2.0
Жмём ОК, программа немного думает, проверяем декомпилированный код, если значение не изменилось, то в декомпилированном коде нажимаем F5.
Если число изменилось, на то которое нам надо, то мы сделали всё правильно и можем сохранять наш результат.
Для того что бы сохранить наш прогресс, переходим Edit -> Patch Program -> Apply patches to input file
Не забываем поставить галочку напротив Create backup и нажимаем ОК.
Заливаем на сервер и радуемся проделанной работе.
P.S. Все манипуляции с серверными файлами проводятся с выключенным игровым сервером.
Собственно само решение.
Нам потребуется программа IDA Pro 9.1 и файл ядра GS который мы будем редактировать (находится на сервере в папке gamed).
Открываем файл GS в программе IDA Pro 9.1
Ищем в ней следующую функцию:
gplayer_imp::ReceiveExp(int,int)
void __cdecl gplayer_imp::ReceiveExp(gplayer_imp *const this, int exp, int sp_0)
{
world_param *WorldParam; // eax
float double_exp_sp_factor; // [esp+14h] [ebp-4h]
float double_exp_sp_factorb; // [esp+14h] [ebp-4h]
float double_exp_sp_factorc; // [esp+14h] [ebp-4h]
float double_exp_sp_factora; // [esp+14h] [ebp-4h]
if ( exp >= 0 && sp_0 >= 0 )
{
exp += (int)((long double)(this->_exp_addon * exp) * 0.0099999998 + 0.1);
double_exp_sp_factor = 1.0;
if ( world_manager::GetWorldParam()->double_exp )
{
double_exp_sp_factor = world_manager::GetDoubleExpFactor();
}
else if ( this->_double_exp_mode )
{
double_exp_sp_factor = 1.5;
}
double_exp_sp_factorb = multi_exp_ctrl::GetExpFactor(&this->_multi_exp_ctrl) + double_exp_sp_factor;
double_exp_sp_factorc = player_reincarnation::GetExpBonus(&this->_player_reincarnation) + double_exp_sp_factorb;
double_exp_sp_factora = double_exp_sp_factorc + this->_exp_sp_factor;
if ( double_exp_sp_factora > 0.0 )
{
WorldParam = world_manager::GetWorldParam();
gplayer_imp::IncExp(this, &exp, &sp_0, double_exp_sp_factora, WorldParam->double_sp);
(*((void (__cdecl **)(dispatcher *, int, int))this->_runner->gactive_imp::gobject_imp::_vptr_substance + 44))(
this->_runner,
exp,
sp_0);
if ( exp / 10 > 0 )
gplayer_imp::ElfReceiveExp(this, exp / 10);
}
}
else
{
ASSERT_FAIL("exp >=0 && sp >=0", "player.cpp", 2896);
}
}
{
world_param *WorldParam; // eax
float double_exp_sp_factor; // [esp+14h] [ebp-4h]
float double_exp_sp_factorb; // [esp+14h] [ebp-4h]
float double_exp_sp_factorc; // [esp+14h] [ebp-4h]
float double_exp_sp_factora; // [esp+14h] [ebp-4h]
if ( exp >= 0 && sp_0 >= 0 )
{
exp += (int)((long double)(this->_exp_addon * exp) * 0.0099999998 + 0.1);
double_exp_sp_factor = 1.0;
if ( world_manager::GetWorldParam()->double_exp )
{
double_exp_sp_factor = world_manager::GetDoubleExpFactor();
}
else if ( this->_double_exp_mode )
{
double_exp_sp_factor = 1.5;
}
double_exp_sp_factorb = multi_exp_ctrl::GetExpFactor(&this->_multi_exp_ctrl) + double_exp_sp_factor;
double_exp_sp_factorc = player_reincarnation::GetExpBonus(&this->_player_reincarnation) + double_exp_sp_factorb;
double_exp_sp_factora = double_exp_sp_factorc + this->_exp_sp_factor;
if ( double_exp_sp_factora > 0.0 )
{
WorldParam = world_manager::GetWorldParam();
gplayer_imp::IncExp(this, &exp, &sp_0, double_exp_sp_factora, WorldParam->double_sp);
(*((void (__cdecl **)(dispatcher *, int, int))this->_runner->gactive_imp::gobject_imp::_vptr_substance + 44))(
this->_runner,
exp,
sp_0);
if ( exp / 10 > 0 )
gplayer_imp::ElfReceiveExp(this, exp / 10);
}
}
else
{
ASSERT_FAIL("exp >=0 && sp >=0", "player.cpp", 2896);
}
}
double_exp_sp_factor = 1.5;
Выделяем его и переходим обратно в ассемблер и видим что данное число типа float, а именно
3FC00000h
40000000h
Видим следующее вырожение
mov eax, 3FC00000h
mov eax, 40000000h
Если число изменилось, на то которое нам надо, то мы сделали всё правильно и можем сохранять наш результат.
Для того что бы сохранить наш прогресс, переходим Edit -> Patch Program -> Apply patches to input file
Не забываем поставить галочку напротив Create backup и нажимаем ОК.
Заливаем на сервер и радуемся проделанной работе.
P.S. Все манипуляции с серверными файлами проводятся с выключенным игровым сервером.
Последнее редактирование:
