Перейти к содержанию

[Src] Динамические Рейты


Рекомендуемые сообщения

[src] Динамические рейты

Описание

Динамические рейты позволяют настроить рейты по своему усмотрению, к примеру, сделать рейты для тех или иных классов больше или меньше (самый распостранённый вариант использования).

Установка

Нам нужно будет поправить всего два файлика (diff'ы не делаю, кому нужно — создайте сами, тут только ручная правка по привычке).

Первым правим src/map/pc.h, находим:

int pc_gainexp(struct map_session_data*,struct block_list*,unsigned int,unsigned int, bool);

Добавляем после:

unsigned int pc_ntexprate (struct map_session_data *sd);

Теперь приступаем к правке src/map/pc.c, находим:

 if(!battle_config.pvp_exp && map[sd->bl.m].flag.pvp) // [MouseJstr]
return 0; // no exp on pvp maps

Добавляем после:

 if( !quest ) {
unsigned int nt_rateexp = pc_ntexprate(sd);
if( base_exp ) {
base_exp = (unsigned int) cap_value(base_exp * (nt_rateexp/100.), 0, UINT_MAX);
}
if( job_exp ) {
job_exp = (unsigned int) cap_value(job_exp * (nt_rateexp/100.), 0, UINT_MAX);
}
}

Дальше находим:

unsigned int pc_maxbaselv(struct map_session_data *sd)

Добавляем перед:

/*==========================================
* NeoTemple Extra: Returns Base/Job Exp Rate using Dynamic Base/Job Exp Rate System
*------------------------------------------*/
unsigned int pc_ntexprate (struct map_session_data *sd)
{
unsigned int exprate = 100;

if (sd->status.base_level > 70) {
exprate += 50;
} else if (sd->status.base_level > 50) {
exprate += 25;
} else if (sd->status.base_level > 30) {
exprate += 10;
}

switch ( sd->class_ ) {
case MAPID_MERCHANT:
case MAPID_MERCHANT_HIGH:
case MAPID_ALCHEMIST:
case MAPID_CREATOR:
case MAPID_BLACKSMITH:
case MAPID_WHITESMITH:
exprate += 200;
break;

case MAPID_ACOLYTE:
case MAPID_ACOLYTE_HIGH:
case MAPID_PRIEST:
case MAPID_HIGH_PRIEST:
case MAPID_BABY_ACOLYTE:
case MAPID_BABY_PRIEST:
exprate += 100;
break;
case MAPID_NOVICE:
case MAPID_NOVICE_HIGH:
exprate += 50;
break;

}

return exprate;
}

Готово, мы добавили основную функцию, в данном исходном коде находится готовый пример, вам нужно обладать кое-какими познаниями в программирование, чтобы дописать свой, но общая концепция будет понятна сразу.

Описание примера

Итак, вы всё это сделали, но ничего не понимаете. Разумно, ведь это исходник. Сейчас я поясню пример.

Все изменения под свой сервер вам нужно делать в функции pc_ntexprate, но для начала объясню, что в примере происходит.

Каждый раз, когда вы получаете какой-либо опыт, дополнительно вызывается функция pc_ntexprate, это не касается только квестового получения опыта (из скриптов). Первым делом внутри функции устанавливается 1 рейты на получения опыта:

 unsigned int exprate = 100;

затем, проверяется уровень персонажа, который должен получить опыт:

 if (sd->status.base_level > 70) {

Логика такая: если игрок ниже 31ого уровня, то он не получает дополнительных бонусов к рейтам, если выше 30ого, то его бонус составляет ещё 10%, если выше 50ого, то 25%, если 70ого, то 50%.

Затем функция делает проверку на класс персонажа и в зависимости от этого решает какой ещё бонус даётся.

Учтите, что эти бонусы идут после уже установленных в конфиге, то есть, рейты не складываются с рейтами в конфиге, а вычисляются после. Так, допустим, если у вас рейты на сервер по опыту 2х, то при добавление 50% они составят уже 3х.

Это самый простой пример использования таких рейтов, к примеру, можно добавлять/убавлять получение опыта по более сложным принципам (вычислять статы и предполагать билды чара, учитывать какие статусы на персонаже, какие предметы и прочее).

Если вы хотите, чтобы опыт начислялся только для Базового или Профессионального уровня, то удалите одну из строчек указанную тут:

 if( !quest ) {
unsigned int nt_rateexp = pc_ntexprate(sd);
if( base_exp ) {
base_exp = (unsigned int) cap_value(base_exp * (nt_rateexp/100.), 0, UINT_MAX);
}
if( job_exp ) {
job_exp = (unsigned int) cap_value(job_exp * (nt_rateexp/100.), 0, UINT_MAX);
}
}

Соответственно строчка с base_exp — базовый опыт, строчка с job_exp — профессиональным.

Если желаете, чтобы квестовый опыт так же учитывался, то удалите проверку, должно получиться так (без if):

    if( base_exp ) {
base_exp = (unsigned int) cap_value(base_exp * (nt_rateexp/100.), 0, UINT_MAX);
}
if( job_exp ) {
job_exp = (unsigned int) cap_value(job_exp * (nt_rateexp/100.), 0, UINT_MAX);
}

Изменено пользователем wl.illusion
  • Upvote 4
Ссылка на комментарий
Поделиться на другие сайты

Хороший скрипт!!! У меня возник вопрос, а можно ли как нить править % дропа. Допустим у меня на сервере самый мелкий % дропа = 1%. Можно ли как нить его уменьшить до 0.1% на определенную шмотку-item не трогая drop.conf и mob_db.txt

Ссылка на комментарий
Поделиться на другие сайты

Хороший скрипт!!! У меня возник вопрос, а можно ли как нить править % дропа. Допустим у меня на сервере самый мелкий % дропа = 1%. Можно ли как нить его уменьшить до 0.1% на определенную шмотку-item не трогая drop.conf и mob_db.txt

Я бы всё-таки рекомендовал именно через лёгкий фикс сорцов и правку mob_db.txt, но можно и просто через фикс сорцов, если таких вещей несколько.

Можно править файл src/map/mob.c, находим:

            // attempt to drop the item
if (rnd() % 10000 >= drop_rate)
continue;

Перед добавляем что-нибудь вроде этого (криво, но сойдёт для десятка предметов):

            switch (md->db->dropitem[i].nameid) {
case 909:
case 4001:
case 4002:
drop_rate = 10000;
break;
}

Данный кусок кода ставит на 100% шанс выпадения такие предметы, как — Jellopy (909), Poring Card (4001) и Fabre Card (4002).

Но сразу скажу, это очень неправильно так делать, это будет работать и даже не будет сказываться на скорости сервера (проверка минимальна), но делать так не стоит.

upd

Соответственно drop_rate — это шанс выпадения, если вам надо 0.1, то нужно ставить drop_rate = 10;

Изменено пользователем wl.illusion
  • Upvote 2
Ссылка на комментарий
Поделиться на другие сайты

Спасибо Большое учту. Дело в том что у меня в mob_db у моба стоит 7227,1. Ниже уже не поставишь. А Если понизить дроп в drops.conf то понизитсья все вещи а их не мало. Вот и ищу другие способы как понизить дроп.

Изменено пользователем Gans
Ссылка на комментарий
Поделиться на другие сайты

Спасибо Большое учту. Дело в том что у меня в mob_db у моба стоит 7227,1. Ниже уже не поставишь. А Если понизить дроп в drops.conf то понизитсья все вещи а их не мало. Вот и ищу другие способы как понизить дроп.

Я уже говорил, что можно сделать маленький сорц-фикс, к примеру, если в mob_db.txt выставлять значения дропа отрицательные (например: 7227,-10), то такой шанс дропа не будет изменяться под рейты.

upd

Доберусь до домашнего компа кину примерный сорц-фикс.

upd2

Тырк сюда для нужного фикса.

Изменено пользователем wl.illusion
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...
Яндекс.Метрика