wl.illusion Опубликовано 17 января, 2013 Жалоба Поделиться Опубликовано 17 января, 2013 (изменено) [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); } Изменено 31 января, 2013 пользователем wl.illusion 4 Ссылка на комментарий Поделиться на другие сайты Поделиться
Kubix! Опубликовано 17 января, 2013 Жалоба Поделиться Опубликовано 17 января, 2013 Отличная работа Ссылка на комментарий Поделиться на другие сайты Поделиться
Gans Опубликовано 17 января, 2013 Жалоба Поделиться Опубликовано 17 января, 2013 Хороший скрипт!!! У меня возник вопрос, а можно ли как нить править % дропа. Допустим у меня на сервере самый мелкий % дропа = 1%. Можно ли как нить его уменьшить до 0.1% на определенную шмотку-item не трогая drop.conf и mob_db.txt Ссылка на комментарий Поделиться на другие сайты Поделиться
wl.illusion Опубликовано 17 января, 2013 Автор Жалоба Поделиться Опубликовано 17 января, 2013 (изменено) Хороший скрипт!!! У меня возник вопрос, а можно ли как нить править % дропа. Допустим у меня на сервере самый мелкий % дропа = 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; Изменено 17 января, 2013 пользователем wl.illusion 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Gans Опубликовано 17 января, 2013 Жалоба Поделиться Опубликовано 17 января, 2013 (изменено) Спасибо Большое учту. Дело в том что у меня в mob_db у моба стоит 7227,1. Ниже уже не поставишь. А Если понизить дроп в drops.conf то понизитсья все вещи а их не мало. Вот и ищу другие способы как понизить дроп. Изменено 17 января, 2013 пользователем Gans Ссылка на комментарий Поделиться на другие сайты Поделиться
wl.illusion Опубликовано 17 января, 2013 Автор Жалоба Поделиться Опубликовано 17 января, 2013 (изменено) Спасибо Большое учту. Дело в том что у меня в mob_db у моба стоит 7227,1. Ниже уже не поставишь. А Если понизить дроп в drops.conf то понизитсья все вещи а их не мало. Вот и ищу другие способы как понизить дроп.Я уже говорил, что можно сделать маленький сорц-фикс, к примеру, если в mob_db.txt выставлять значения дропа отрицательные (например: 7227,-10), то такой шанс дропа не будет изменяться под рейты.updДоберусь до домашнего компа кину примерный сорц-фикс.upd2Тырк сюда для нужного фикса. Изменено 17 января, 2013 пользователем wl.illusion Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения