Некоторое время назад я открыл для себя увлекательный процесс ковыряния сервера RF Online. Очень благодарен ресурсу RF-cheats за большое количество материалов и гайдов без хайда, которые помогли мне многое понять в устройстве данных сервера RF:O.
Однако, прочитав все крупные темы в разделе гайдов rf-cheats, я не нашел ни одного гайда по редактированию квестов, поэтому решил разобраться в этом вопросе самостоятельно. На основе "разборок" выкладываю этот материал :) Сразу оговариваю, этот гайд далеко не полный, однако я постараюсь составить его таким образом, чтобы новичку, такому как я, было просто с ним разобраться.
Итак, начнем. Что нам понадобится? Хотелось бы прежде всего отметить, что все эти файлы - не мои и я никоим образом не претендую на их авторство.
1. Сервер и клиент RF:O 2.2.3 (BSB)
2. DATeditor (structorian), умение им немножко пользоваться, а так же утилиты для работы с *.edf файлами. Они есть в гайдах из прикрепленной темы и их не составит труда найти.
3. от Emka , за что ей отдельная благодарность.
4. Серверные и клиентские структурки Quest.strs. Увы, клиентские качественные структуры, насколько я понял, раритет, и стоят много рублей, что для домашнего пользования неприемлемо. Лично я брал структуру отсюда: https://www.rf-cheats.ru/forum/showp...07&postcount=6
Первый этап. Редактирование квеста на сервере.
Первым делом сделаем бэкапы серверного и клиентского файлов на случай, если что-нибудь сломаем.
Откроем DATedit-ом серверный файл Quest.dat. К примеру, возьмем квест 4ого уровня Беллато на убийство 20 Рапторов (Ямороев) и получение вещмешка. Его номер в таблице - 270. Чтобы найти тот квест, который вы хотите изменить, обычно достаточно поискать в серверном Quest.dat по уровню и наградам, благо в серверной структуре большинство столбцов подписаны.
Обратим внимание на столбцы ObjectType, QuestObject и Quantity. Они отвечают за задачи нашего квеста. ObjectType - это тип объекта, например при убийстве монстров это 3, у квестов на сбор лута или разговоры с НПС там другие значения, но я думаю при необходимости несложно будет найти один из стандартных квестов и подсмотреть значение. Гораздо интереснее для нас QuestObject - это собственно сам моб, которого нам надлежит убивать. Открываем нашу таблицу с ID мобов и видим, что это бедняга Раптор. Колонка Quantity говорит нам, что их надо убить 20 штук. Колонки Drop Chance и Quest Item следует заполнить отличными от значений по умолчанию в случае, если вы хотите сделать квест, где засчитывают не каждого моба, однако в данном примере оставим их как есть. У одного квеста может быть до трех задач.
Допустим, мне жалко бедных Рапторов, и я хотел бы, чтобы Беллато убивали на 4-ом уровне куда более мерзких Жаб. В таблице с ID мобов находим монстров "Жаба", они в самом начале, но нам нужен ID того из них, который стоит в генштабе Беллато. Можно подсмотреть на rf-info.info , но я думаю, многие и так знают, что за "расовую принадлежность" подобных монстров отвечает последняя цифра в их ID, для Беллато это 1.
Кроме того, я хочу сделать квест чуть менее нудным и поэтому снижаю количество монстров, необходимое для выполнения, до 15.
Теперь прокрутим нашу таблицу вправо, где увидим следующую картину:
Вполне понятно, что здесь задаются награды за квест.
MaxLevelChange не трогаем, эта графа используется только для распечаток. Колонки Bonus говорят сами за себя - опыт, очки статуса и расовая валюта. Дальше идет блок наградных предметов. RewardQuantity отвечает за количество наград, которые может взять игрок, если в квесте прописано несколько наградных предметов. Если вы хотите позволить игроку забрать все предметы (или если предметов нет или он всего один), оставьте ее равной нулю. В колонке BonusItem прописывается серверный ID предмета, в данном квесте это Вещмешок Новичка Беллато. Колонка Count отвечает за количество выдаваемых предметов. Однако, насколько я понял, несмотря на -1 в ней, квест по-прежнему работал, вероятно, она нужна для стекающихся предметов и патронов. В любом случае логичнее поставить там единицу, это никак не скажется на работспособности квеста.
Итак, теперь отредактируем награды за наш квест. Жабы - мобы более низкого уровня, чем Рапторы, поэтому игрок получит меньше опыта за их убийство. Чтобы на почве этого не возникало отставание в скорости развития от других рас, повысим количество получаемого за квест опыта. Так как квест легче, снизим денежную награду за него. Ну и наконец добавим в награду интовый щит на 4 уровень (подсмотрев его ID в таблицах Эмки), например, для кача пт, и заставим игрока выбрать только одну награду из двух.
Сохраняем Quest.dat. ГОТОВО! Не готово. Теперь нам надо, чтобы наш квест нормально отображался в клиенте.
Второй этап. Редактирование квеста в клиенте.
Перетаскиваем клиентский Quest.edf из DataTable/ru-ru на EdfDeCrypt. Открываем полученный датник DAT-editом, с клиентской структурой. Ужасаемся. Большинство числовых данных в клиенте хранятся в шестнадцатеричном виде. Да еще и структура из интернета не слишком удобна.
Чтобы найти таблицу, в которой редактируются квесты наподобие серверной, нам нужно слева раскрыть Quest Block 8.
Я расшифровал лишь значения основных необходимых мне колонок, однако кропотливым исследованием встроенных в игру квестов можно рано или поздно установить смысл каждой из них. Приготовьте бумажку или "блокнот" и записывайте номера колонок и их значение. "3.Квесты блок 8" или просто "3." (в дальнейшем буду писать цифру, не путайте с номером колонки, колонка "3.Квесты блок 8" - пятая по счету). Отвечает за тип цели квеста (равна трем - это монстр). 4. Это ID моба, сейчас там прописан Раптор. Однако здесь у нас доступно только 4 цифры, поэтому мы отбрасываем самый первый "ноль". Большинство мобов начинаются с ноля, но некоторые имеют ID с единицы. Что будет, если такого добавить в квест - я пока не проверял :) 7. Это количество мобов. До редактирования там стоит $0014 - не удивляйтесь, это всего лишь 20 в шестнадцатеричной системе. Если не умеете переводить, воспользуйтесь любым более-менее продвинутым калькулятором, в т.ч. калькулятором в Windows.
Изменим эту информацию о нашем квесте на правильную.
Проматываем таблицу дальше вправо. 28. Эта колонка содержит в себе получаемый за квест опыт, однако при попытке перевести значения в лоб в шестнадцатеричную систему мы получим мало соотносящиеся с реальностью цифры. Дело в том, что опыт здесь записан в весьма интересном формате IEEE-754, 64-битной его версии. Для пересчета из серверного опыта можно воспользоваться
Это на самом деле просто. Пишем желаемое количество опыта в верхнее левое поле формы (Decimal floating-point).
Нажимаем любую из двух кнопок (rounded или not rounded), разница лишь в том, что одна из них округлит число, если вы введете дробь.
Далее смотрим в нижний левый угол формы, нам нужно значение в Double Precision (64 bit): Hexadecimal.
Из полученных шестнадцатеричных цифр берем первые восемь и вставляем в колонку 28 нашего клиентского Quest.dat. Вы восхитительны! 29. Количество получаемой расовой валюты, в хвала богам, обычном шестнадцатеричном виде. 31. Количество получаемых очков опыта. Опять же, в HEX. 33. 34. 35. (и далее, всего шесть повторов) Это блоки, отвечающие за награду. Важно помнить, что колонки награды в клиентской таблице несколько другие. 33. Здесь хранится номер типа предмета. В сервере тип предмета хранится прямо в ID, т.к. там он текстовый, а не шестнадцатеричный. В клиенте же для этого используется отдельная колонка в таблице. Самый простой способ узнать тип вещи - подсмотреть в таблицах Эмки. У меня они в *.txt формате и там это - номер файла. Как в Экселе - не знаю, но думаю, что очень похоже. Также можно узнать тип вещи, открыв клиентский Item.edf и отсчитав его порядковый номер. 34. Клиентский ID предмета. В таблицах написан прямо рядом с серверным, не упустите :) 35. Количество предметов. Шестнадцатеричная СС.
Используя полученные знания, поправим клиентский файл так, чтобы он соответствовал нашему квесту на сервере: ГОТОВО! И снова не готово. Теперь нам следует проверить правильную работу квеста в игре.
Третий этап. Проверяем работоспособность.
Первым делом следует убедиться, что DAT-edit не поломал нам файлы, добавив лишних байтов в конец. Если вдруг так случилось, надо их аккуратно отрезать любым HEX-редактором.
Заворачиваем клиентский Quest.dat обратно в *.edf и заменяем им файл в DataTable/ru-ru. Запускаем наш сервер и игру. Создаем персонажа, докачиваемся до четвертого уровня и смотрим наш квест.
Награды корректно добавились - это значит, что мы не напутали ID-шники или типы предметов в клиенте.
Кроме того, нам корректно предлагают выбор награды. Но... ОЙ, ЧТО ЭТО! Описание по-прежнему предлагает нам уничтожить Рапторов. Это никуда не годится. Записываем первые несколько слов описания (и реплики Командующего-Администратора-СэраКвестодателя-ктотамувас) в блокнот или на бумажку. Выходим из игры. Сервер можно не останавливать, т.к. описания хранятся только в клиенте.
Четвертый этап. Правим описания.
Описания живут - правильно - в клиентском Quest.dat. Однако на сей раз нам нужен его 10ый блок, содержащий огромное количество строковых данных по всем квестам игры. Наверняка, обладая нормальной структурой или пользуясь мозгом, можно найти удобный способ навигации по 10-ому блоку, однако нам на помощь придет волшебная сила сочетания клавиш Ctrl+F. Помните, я говорил вам записать пару первых слов из реплик? Жамкаем на любую текстовую запись и открываем поиск, куда и пишем наши записи. Найдя нужные нам описания, исправляем их так, как нам нужно.
Если ничего нигде не трогать, DATedit не даст записать строку длиннее, чем была записана оригинально, т.к. под нее выделено определенное место в *.dat. Наверняка это можно изменить, но для наших задач выделенного места вполне хватает. Мы же не хотим, чтобы игрок состарился, читая вашу историю про Жаб.
Сохраняемся, пакуем датник обратно в *.edf-ку и запускаем игру.
Что тут у нас? УРА, квест изменился так как нам нужно. Всем спасибо за прочтение, и надеюсь, что этот небольшой гайд помог вам.
Спасибо за гайд.
а если я хочу сделать , допустим вот такой квест :
Он берётся у координатора перемещений ( Нижнее тп гш)
он берётся с 57 лвл
После его прохождения даётся ещё один квест
данный квест можно брать раз в сутки...
Перед опубликованием гайда, не плохо было бы тебе подкорректировать структуру, а то подобные действия с "28 ой Колонкой" вводят новичков в заблуждение. А всего то нужно было в структуру записать корректный тип данных, в данном случае это double
Спасибо за гайд.
а если я хочу сделать , допустим вот такой квест :
Он берётся у координатора перемещений ( Нижнее тп гш)
он берётся с 57 лвл
После его прохождения даётся ещё один квест
данный квест можно брать раз в сутки...
не знаешь , как можно так сделать?
Макс бирем и смотрим на квет роспичатки . И там мы видем что надо поговорить с Командующим и под конец структуры вы увидите что есть ище 1 кв после прохождения даётся !
Мой блог там вы найдете больше всего
http://rf-lim.blogspot.com
Перед опубликованием гайда, не плохо было бы тебе подкорректировать структуру, а то подобные действия с "28 ой Колонкой" вводят новичков в заблуждение. А всего то нужно было в структуру записать корректный тип данных, в данном случае это double
Никогда раньше структурки не писал просто, но поглядел это вроде просто, прямо как на парах по проге
Сделал структуру с нормальными значениями, описанными в гайде. Во вложении. Остальные поля пока не смотрел, потом думаю расшифрую постепенно. Еще бы теперь сам гайд поправить, колонки-то теперь нормально называются :)
Цитата:
Сообщение от [Maks]
Спасибо за гайд.
а если я хочу сделать , допустим вот такой квест :
Он берётся у координатора перемещений ( Нижнее тп гш)
он берётся с 57 лвл
После его прохождения даётся ещё один квест
данный квест можно брать раз в сутки...
не знаешь , как можно так сделать?
Сам честно говоря пока не смотрел квесты, которые берутся у НПС.
Насколько я знаю, за момент получения квеста в сервере отвечает QuestBlahBlahBlahEVENT.dat , думаю тебе нужно покурить QuestNPCEvent.dat и сделать по аналогии событие. Касаемо получения второго квеста после сдачи первого - в серверном Quest.dat есть колонка "Next Quest", думаю достаточно вписать туда ID второго квеста и все заработает. Хотя сам не пробовал еще. Ну а сами квесты (цели, задачи, награды) лежат там же, где и стандартные все. На днях как-нибудь займусь этим, если будут результаты - отпишусь в этой теме :)
Последний раз редактировалось MistaBasta; 10.04.2015 в 17:47.