Что нового?

Любая версия Умножители опыта (книги)

  • Автор темы Автор темы LeviGenrix
  • Дата начала Дата начала

LeviGenrix

Проверенный
Пользователь
У меня был как-то вопрос : "Как увеличить множитель у умножителя опыта? (страница 116 в элике)"

Собственно само решение.
Нам потребуется программа IDA Pro 9.1 и файл ядра GS который мы будем редактировать (находится на сервере в папке gamed).
Открываем файл GS в программе IDA Pro 9.1
Ищем в ней следующую функцию:
gplayer_imp::ReceiveExp(int,int)
Нажимаем F5 для декомпиляции с ассемблера и видим следующий код:
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);
}
}
Нас интересует строка
double_exp_sp_factor = 1.5;
Где 1,5 это и есть наш множитель.
Выделяем его и переходим обратно в ассемблер и видим что данное число типа float, а именно
3FC00000h
К примеру заменим его на коэффициент 2.0 в формате float это будет
40000000h
Для этого выделяем число, переходим Edit -> Patch Program -> Assemble
Видим следующее вырожение
mov eax, 3FC00000h
Заменим его на наш множитель 2.0
mov eax, 40000000h
Жмём ОК, программа немного думает, проверяем декомпилированный код, если значение не изменилось, то в декомпилированном коде нажимаем F5.
Если число изменилось, на то которое нам надо, то мы сделали всё правильно и можем сохранять наш результат.
Для того что бы сохранить наш прогресс, переходим Edit -> Patch Program -> Apply patches to input file
Не забываем поставить галочку напротив Create backup и нажимаем ОК.
Заливаем на сервер и радуемся проделанной работе.

P.S. Все манипуляции с серверными файлами проводятся с выключенным игровым сервером.
 
Последнее редактирование:

Дополнение к руководству​

Работа на сервере​


1. Поиск функции​

gplayer_imp::ActiveDoubleExpTime

В дисассемблере встречается условие:

if (this->_double_exp_mode && time + this->_double_exp_timeout > cur_t + 14400)

Здесь значение 14400—это лимит длительности двойного опыта, равный 4 часам (4×60×60 секунд). В шестнадцатеричном представлении оно соответствует 3840h.

2. Изменение лимита в ассемблерном коде.​

Чтобы увеличить длительность до 10 часов (36000 секунд), замените 3840h на 8CA0h в следующем фрагменте:
.text:080A520B mov eax, [ebp+cur_t]
.text:080A520E add eax, 3840h ; ← заменить на 8CA0h
.text:080A5213 cmp edx, eax

Вторая функция:
gplayer_imp::EnterDoubleExpMode(int, int)

В этой функции значение 14400 (то есть 3840h) встречается дважды—его нужно скорректировать в обоих местах:
if (this->_double_exp_timeout - t > 14400)
this->_double_exp_timeout = t + 14400;
Соответствующие ассемблерные строки:
.text:080A5162 cmp eax, 3840h ; ← заменить на 8CA0h (первое вхождение)
.text:080A5167 jle short loc_80A5197
.text:080A5169 mov edx, [ebp+this]
.text:080A516C mov eax, [ebp+t]
.text:080A516F add eax, 3840h ; ← заменить на 8CA0h (второе вхождение)

Изменения в клиенте:​

В клиентской части присутствует одно вхождение константы:​

cmp eax, 3840h
Замените 3840h на 8CA0h—после этого требуемая длительность двойного опыта будет установлена.
В архиве \interfaces ищем файл \ingame.stf
и в строке 1249 меняем значение
С
828 "Нельзя использовать учебник дольше 4 часов. Пожалуйста, попробуйте позже."
На нужное нам
828 "Нельзя использовать учебник дольше 10 часов. Пожалуйста, попробуйте позже."
Сохраняем и радуемся!
1782493579219.png
 
Последнее редактирование:
Кстати, нам игра врала всё время
Пишется типа дабл-эксп, а по факту пиздит и даёт другое)

На оффе не играл и я даже хз, как дабл книга дружит с гиперами и серверным множителем (гм ВКЛ).
 
Кстати, нам игра врала всё время
Пишется типа дабл-эксп, а по факту пиздит и даёт другое)

На оффе не играл и я даже хз, как дабл книга дружит с гиперами и серверным множителем (гм ВКЛ).
50% , это x0.5 , там в описании так и написано)
 
с гипами дружит не очень
формула выходит такая
получаемый опыт = опыт с моба + (опыт с моба*на коэффициент книги) + (опыт с моба * на коэффициент гиперов)
на пример
моб 155 опыта
гиперы х12
книга х2
итог:
под книгой выходит 310
под гипами 1860
под книгой с гипами 2015, 155 дефолтного опыта 1705 от гипов + 155 от книги

а серверные множители увеличивают дефолт опыт с моба)
 
с гипами дружит не очень
формула выходит такая
получаемый опыт = опыт с моба + (опыт с моба*на коэффициент книги) + (опыт с моба * на коэффициент гиперов)
на пример
моб 155 опыта
гиперы х12
книга х2
итог:
под книгой выходит 310
под гипами 1860
под книгой с гипами 2015, 155 дефолтного опыта 1705 от гипов + 155 от книги

а серверные множители увеличивают дефолт опыт с моба)
Да я уже подружил с гиперами
Множитель приплюсовывается.
 
Сверху