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

wl.illusion

Проверенные
  • Постов

    122
  • Зарегистрирован

  • Посещение

  • Победитель дней

    11

Весь контент wl.illusion

  1. Нет, не катит, т.к. 11 тип не принимает callfunc и прочие полезные плюшечки, которые можно размещать в скриптах с данным фиксом. upd хотя нет, если брать чистый callfunc и больше ничего внутрь не писать, то работет, однако полезности данного фикса это неубавляет.
  2. [src] Usable-предмет не исчезает после использования Описание Всё просто, очень полезно для создания custom-предметов (в моём случае карманного PDA с выводом полезной инфы), Usable|Healing|Cash-предмет не исчезает после использования. Установка Правим только один файл src/map/pc.c, находим: if( sd->status.inventory[n].expire_time == 0 ) { Заменяем на: if( sd->status.inventory[n].expire_time == 0 && sd->inventory_data[n]->atk != -1 /* NeoTemple Extra */ ) { Теперь если в описание Usable|Healing|Cash-предмета в item_db.txt в ячейке ATK указать значение -1 — предмет после использования не будет убираться из инвентаря. Пример: 17000,Kafra_PDA,Kafra PDA,2,20,,0,-1,,,,0xFFFFFFFF,7,2,,,,,,{ callfunc "nt__kafraqinfo"; },{},{}
  3. Если у вас купленный хостинг, то там скорее всего уже есть php, тогда просто копируйте файл и mob_db.txt на сервер. Если у вас там уже крутится какой-то сайт, то просто поместите в корень папки с сайтом и выполните <url сайта>/conv_mobtosql.php (не забудьте потом удалить файлы), если у вас есть SSH доступ и вы знаете что это такое и как им примерно пользоваться, то можно выполнить консольную команду: php conv_mobtosql.php Нужно находиться в директории с файлом, разумеется. В остальном установка зависит от того, каким хостингом вы обладает, что за ПО там стоит.
  4. [script][src][custom] Квас — один глоток сделает вас монстром Встречал на ЛюмиРо, очень понравилась идея. Описание Отличный мод для внесения кое-какого разнообразия в игру — из мобов выпадает особый предмет, который позволяет игроку принимать облик этого моба. Работает до перезахода в игру. Можно создавать интересные ивенты и квесты. Необходимо скачать PHP-скрипт для конвертации: conv_mobtosql.php (2.00) (после сохранения удалите расширение файла .txt) eA-скрипт для выпадения предметов: drop_kvass.txt Установка Правим только один файл src/map/pc.c, находим: sd->itemindex = n; Добавляем после: /* NeoTemple Extra - Kvass */ if( sd->status.inventory[n].card[0] == 254 || sd->status.inventory[n].card[0] == 255 ) { pc_setglobalreg(sd, "useditemsign", ((sd->status.inventory[n].card[3]<<16)+sd->status.inventory[n].card[2]) ); } /* end of NeoTemple Extra */ Готово, теперь нам нужно немного изменить базу предметов, открываем db/re/item_db.txt находим строку: 12233,Kvass,Kvass,0,20,,200,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 100,100; },{},{} И заменяем её на: 12233,Kvass,Kvass,0,200,,50,,,,,0xFFFFFFFF,7,2,,,,,,{ disguise useditemsign-140000; },{},{} (настройки веса и стоимости продажи можете сами поменять на нужные вам) Шаманим с базой монстров Теперь нам понадобится скаченный ранее файлик .php, запускать его нужно на сервере, но для начала необходимо сделать настройки. В самом файле есть такие строчки: // Измените эти данные в соответствие с вашими настройками сервера MySQL $mysql_host = "localhost"; $mysql_name = "ragnarok"; $mysql_pass = "ragnarok"; $mysql_db = "ragnarok"; $chardb_start_id = 140000; // С какого ID будет стартовать список мобов $mob_account_id = 1999999; // ID аккаунта, которое выставляется для мобов Основные настройки — это данные для подключения к базе MySQL, внестите необходимые изменения в переменные: $mysql_host — сервер для подлючения к MySQL $mysql_name — имя пользователя MySQL $mysql_pass — пароль $mysql_db — название базы данных Следующие две переменных можно не изменять, но всё равно расскажу о них: $chardb_start_id — каждый персонаж имеет уникальный ID, чтобы подпись к предмету работала, нам нужно создать псевдо-персонажей с именами монстров, с данного ID они будут начинаться (если не знаете, что это, то настоятельно рекомендую ничего не менять) $mob_account_id — у персонажей должен быть уникальный аккаунт, это идентификатор (тоже самое предупреждение, что и в предыдущем пункте) Так же необходимо поместить вместе с файлом и файл базы монстров — mob_db.txt. Если создание пройдёт успешно, то мы увидим на экране заветное: All Done Остаётся только подгрузить скрипт выпадения предметов: - script kvassDrop -1,{ OnNPCKillEvent: if (rand(10000) <= 40) { set .@itemdrop, killedrid+140000; getitem2 12233,1,1,4,0,254,0,.@itemdrop&0xffff,(.@itemdrop>>16)&0xffff; } end; } И всё будет готово, в скрипте выставлен шанс выпадения предмета 0.40 (<= 40), вы можете поменять его на любое удобное для вас. Как это работает Небольшой сорц-мод создаёт глобальную переменную персонажа: useditemsign — это сделано потому, что разработчики eA не сильно заботились мыслью о том, что кому-то могут понадобиться данные об используемом предмете внутри скрипта предмета. Более того, если предмет последний в инвентаре, то до вызова скрипта будут удалены его данные и даже зная его порядковый номер в инвентаре уже ничего нельзя получить. Поэтому, данная переменная сразу делает то, что нам нужно — вычисляет ID подписанного персонажа (в нашем случае — это псевдо-персонаж с ID монстра). Но данный фикс был бы неполный, если бы не скрипт выпадения предмета, который создаёт данную подпись персонажа. Впринципе, можно немного дописать скрипт и сделать, чтобы изменение сохранялось (допустим) на продолжительный срок даже после перезахода. Перспективы тут достаточно интересные.
  5. [src] Шанс выпадение предметов не зависящий от рейтов Традиционное примечание, незабывайте о такой полезной функции Афины, как работа с db/mob_item_ratio.txt, что он умеет и для чего нужен вы можете почитать прямо внутри. От себя добавлю, что данный мод и работа этого файла отличаются. Описание Данный мод позволяет игнорировать рейты на шанс выпадение предметов, такое иногда бывает нужно, когда хочется сделать, чтобы определённые предметы из мобов падали с шансом без рейтов. Благодаря этому моду, подобное можно будет делать без перекомпиляции сервера, а только перезагрузив базу предметов. Установка Правим только один файл src/map/mob.c, находим: if (battle_config.logarithmic_drops && rate_adjust > 0 && rate_adjust != 100 && baserate > 0) //Logarithmic drops equation by Ishizu-Chan Добавляем перед: if( baserate < 0 ) { return (unsigned int)cap_value(abs(baserate),rate_min,rate_max); } Теперь, если в mob_db.txt указать шанс выпадения отрицательным числом (например -1), то рейты на шанс выпадения будут игнорироваться. Ещё раз говорю (если кто не прочитал), данный мод не одно и то же, что и работа с db/mob_item_ratio.txt.
  6. Я уже говорил, что можно сделать маленький сорц-фикс, к примеру, если в mob_db.txt выставлять значения дропа отрицательные (например: 7227,-10), то такой шанс дропа не будет изменяться под рейты. upd Доберусь до домашнего компа кину примерный сорц-фикс. upd2 Тырк сюда для нужного фикса.
  7. Я бы всё-таки рекомендовал именно через лёгкий фикс сорцов и правку 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;
  8. [script] Склонение числительных Описание Популярная функция склонение числительных (для тех кто пишет скрипты на русском языке). Переписана из другого языка программирования в общем ничего особенного, но очень полезно. Скачать Скачать библиотеку содержащую данный скрипт (версия 1.00.1): скачать Скрипт // Склонение числительных // getarg(0) - число // getarg(1)-getarg(3) - числительные function script nt__declOfNum { setarray .@cases[0], 2, 0, 1, 1, 1, 2; set .@number, getarg(0); set .@view, 1+((.@number%100 > 4 && .@number%100 < 20) ? 2 : .@cases[ (.@number%10 < 5) ? .@number%10 : 5 ]); return .@number+" "+ getarg(.@view); } Пример использования Простенький пример для понимания: callfunc("nt__declOfNum", .@price_cash, "купон", "купона", "купонов") Небольшой пример использования: prontera,147,188,4 script Проверка скрипта 74,{ L_MainLoop: mes "[Скрипт-Тест]"; mes "Введите любое число, 0 - выход из проверки."; next; input .@number; if ( !.@number ) close; mes "[Скрипт-Тест]"; mes "Вы ввели ^FF5500"+(callfunc("nt__declOfNum", .@number, "купон", "купона", "купонов"))+"^000000"; next; goto L_MainLoop; } Подобная функция будет полезна только писателям русскоязычных скриптов.
  9. [src] Запоминаем значение @autoloot Хотелось бы дать пояснение для всех, кто начнёт разводить холивар, что мод не мой. Своё авторство доказывать даже не думаю, т.к. не смогу, мод писался несколько лет назад (3 года назад, если быть точным), но из-за смерти eA все мои моды на форуме были потёрты, но мод после оживления форума начал появляться в английской ветке форума без указания авторства (да и нужно ли оно? Пользуйтесь!). Описание Элементарное и изящное решение для запоминания значения указанного при использовании команды autoloot. Установка Править нужно два файла. Первым правим src/map/atcommand.с, находим функцию команды: ACMD_FUNC(autoloot) В конце функции после: clif_displaymessage(fd, msg_txt(1188)); // Autoloot is now off. Добавляем: pc_setglobalreg(sd, add_str("char_autoloot"), sd->state.autoloot); Теперь правим второй файл src/map/pc.с, находим: void pc_reg_received(struct map_session_data *sd) { uint8 i; sd->vars_ok = true; Добавляем после: sd->state.autoloot = pc_readglobalreg(sd, add_str("char_autoloot")); Всё, пользуемся на здоровье. Принцип работы Принцип работы очень прост, при использовании команды autoloot значение заносится в глобальные переменные персонажа (текстовый файл или база SQL — как у вас настроен сервер). Для этого используется переменная char_autoloot, впринципе, вы можете получить к ней доступ из ваших скриптов: mes "Значение команды @autoloot персонажа: ^3355FF"+char_autoloot+"^000000"; Практической пользы в скриптах в этом нет, но если интересно, то можно запрещать использование команды игрокам и создавать NPC с обработкой установки значения команды (но зачем?).
  10. [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); }
  11. Сколько лет назад писал этот мод, а у кого-то сохранился после стольки смертей eA. Жаль, что руки так и не дошли доделать всё задуманное
×
×
  • Создать...
Яндекс.Метрика