Написание квестов - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Тех-документация

Тех-документация Статьи по редактированию, компиляции и настройки ява серверов Lineage 2

Ответ
Опции темы
Непрочитано 08.06.2008, 16:48   #1
Пользователь

Автор темы (Топик Стартер) Написание квестов

Первое что нужно сделать, это добавить необходимые Java классы в квест. (net.sf.l2j.gameserver.model.quest).

Код:
import sys
from net.sf.l2j.gameserver.model.quest import State
from net.sf.l2j.gameserver.model.quest import QuestState
from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Класс QuestJython (импортирован под названием JQuest) содержит информацию о квестах.
Класс State используется для того, что бы описать информацию о состоянии квеста.
Класс QuestState применяется непосредственно для отслеживания состояния игрока, о ходе выполнения квеста или части квеста.

Затем необходимо добавить несколько констант, что сделает квест удобочитаемым. Если этого не сделать, то могут возникнуть сложности с редактированием квеста в будущем.
Константы нашего квеста – это ID NCP и итемов.

Код:
KELTIR_NPC_ID = 12082
FANGS_ITEM_ID = 1859
DROP_RATE     = 500000
WORLD_MAP_ITEM_ID = 1665
Затем объявите несколько вспомогательных функций.

Функция для получения количества квестовых предметов (keltir fangs) у игрока. (st должна быть в QuestState):

Код:
def getCount(st) :
  return st.getQuestItemsCount(FANGS_ITEM_ID)
Функция для завершения квеста (st должна быть в QuestState):

Код:
def completed(st) :
  st.setState(COMPLETED)
  st.clearQuestDrops()
  st.takeItems(FANGS_ITEM_ID,-1)
  st.giveItems(WORLD_MAP_ITEM_ID,1)
  st.exitQuest(False)
  return
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))

И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):

Код:
def check(st) :
  if getCount(st) >= 4 :
    completed(st)
  return
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJyth on. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.

Код:
class Quest (JQuest):

  def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)

  def onEvent (self,event,st):
    id = st.getState()
    if   id == CREATED  : st.setState(STARTED)
    elif id == COMPLETED: pass
    elif id == STARTED  : check(st)
    return

Метод init – это конструктор Jython класса, который вызывает конструктор Java класса. Конструктор имеет параметры:
• self – ссылка на себя.
• id – численный идентификатор квеста для клиента.
• name – имя квеста, которое будет опубликовано непосредственно с самом сервере.
• descr – имя описания квеста, показываемое игроку, когда берет квест у NCP, у которого можно взять, кроме этого квеста, еще и другой.

Метод onEvent вызывается от Явы. Осуществляет начало квеста. Имеет параметры:
• self – ссылка непосредственно на Tutorial Quest
• event – строка для идентификации эвента для Явы.
• st – ссылка на QuestState, для отслеживания текущего состояния игрока.

В первой строке идет проверка на текущее состояние квеста непосредственно для игрока и состояние запивается в переменную ‘id’.
Если квест только взят, то объявляем начало квеста (if id == CREATED : st.setState(STARTED)).
Если квест уже выполнен, то ничего не делаем elif id == COMPLETED: pass)
Если квест уже начат (STARTED), то вызывается функция проверки (check(), определенная выше) количества клыков у персонажа для завершения квеста. Мы не проверяем переменную ‘event’, т.к. в нашем примере (Tutorial quest) все события происходят от разговоров с NCP. Метод onEvent вызывается, если поговорить с NCP.

И наконец, когда скелет квеста определен, мы создаем сам квест (и определяем его в самом сервере) и объявляем его.

Код:
QUEST     = Quest(201,"Tutorial", "Tutorial quest")
CREATED   = State('Start',     QUEST)
STARTED   = State('Started',   QUEST)
COMPLETED = State('Completed', QUEST)
Квест будет иметь id клиента – 201, идентификатор «Tutorial» и описание «Tutorial quest». Так же будет иметь 3 состояния: CREATED, STARTED, COMPLETED. Имена состояний могут использоваться для автоматического поиска необходимых .htm. Например для CREATED будет соответствовать 'Start.htm', для STARTED – ‘Started.htm’ и для COMPLETED будет показана 'Completed.htm'. Имена состояний используются так же для хранения состояния выполнения квеста в БД, когда игрок выходит из игры, так что имена не должны повторятся в пределах одного квеста.

Так же мы должны определить начальное состояние квеста, когда игрок его только взял, и так же стартового NCP.

Код:
QUEST.setInitialState(CREATED)
QUEST.addStartNpc(7056)
Обратите внимание: в файле htm стартового NCP обязательно должна быть ссылка на квест:

Код:
<a action="bypass -h npc_%objectId%_Quest">
Nytrex вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 12.06.2008, 21:04   #2
Аватар для lvs
Пользователь

По умолчанию Ответ: Написание квестов

Спасибо,мануал полезен.

Цитата:
Сообщение от LAMER Посмотреть сообщение
mne nado 25 soobw'enii sorry o4en' nado
Ужс почему еще не в бане?
__________________
НЕ ГРУЗИТЕ МЕНЯ, Я НЕ СУХОГРУЗ, Я - ТАНКЕР, НАЛЕЙТЕ МНЕ.
lvs вне форума Ответить с цитированием
Непрочитано 12.06.2008, 21:38   #3
Аватар для Black Angel
Герой

По умолчанию Ответ: Написание квестов

Цитата:
Сообщение от lvs Посмотреть сообщение
Ужс почему еще не в бане?
к сожалению я один... и я не робот... постоянно в онлайне быть не могу
__________________
Если вам что то не нравиться идем сюда

Black Angel вне форума Ответить с цитированием
Непрочитано 12.06.2008, 22:05   #4
Аватар для lvs
Пользователь

По умолчанию Ответ: Написание квестов

Цитата:
Сообщение от Black Angel Посмотреть сообщение
к сожалению я один... и я не робот... постоянно в онлайне быть не могу
Та это понятно...такие учётки надобно сразу удалять Хуже всего то что цель была достигнута, а именно 25 сообщений чистого флуда.
__________________
НЕ ГРУЗИТЕ МЕНЯ, Я НЕ СУХОГРУЗ, Я - ТАНКЕР, НАЛЕЙТЕ МНЕ.
lvs вне форума Ответить с цитированием
Непрочитано 12.06.2008, 22:16   #5
Аватар для PROGRAMMATOR
Администратор

По умолчанию Ответ: Написание квестов

lvs, зачем цитировать весь мануал?
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR вне форума Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Непрочитано 12.06.2008, 22:17   #6
Аватар для Black Angel
Герой

По умолчанию Ответ: Написание квестов

Цитата:
Сообщение от lvs Посмотреть сообщение
уже всего то что цель была достигнута
да и хер с ним если человек тормоз и не думает что потом ему что то еще понадобится никто в этом не виноват
__________________
Если вам что то не нравиться идем сюда

Black Angel вне форума Ответить с цитированием
Непрочитано 12.06.2008, 22:18   #7
Аватар для lvs
Пользователь

По умолчанию Ответ: Написание квестов

Цитата:
Сообщение от PROGRAMMATOR Посмотреть сообщение
lvs, зачем цитировать весь мануал?
Я процетировал? если да,то чисто машинально,извеняюсь
__________________
НЕ ГРУЗИТЕ МЕНЯ, Я НЕ СУХОГРУЗ, Я - ТАНКЕР, НАЛЕЙТЕ МНЕ.
lvs вне форума Ответить с цитированием
Непрочитано 12.06.2008, 22:18   #8
Аватар для Black Angel
Герой

По умолчанию Ответ: Написание квестов

Цитата:
Сообщение от PROGRAMMATOR Посмотреть сообщение
зачем цитировать весь мануал?
зато сообщение получилось баальсое и... ну больщое кароче
__________________
Если вам что то не нравиться идем сюда

Black Angel вне форума Ответить с цитированием
Непрочитано 09.09.2008, 22:28   #9
Пользователь

По умолчанию Ответ: Написание квестов

Ich!go, напиши пожалуйста фулл результат...а то я запутался...что, после чего должно стоять)
maxo вне форума Ответить с цитированием
Непрочитано 22.12.2008, 02:26   #10
Аватар для Mefisto
Пользователь

По умолчанию Ответ: Написание квестов

Подскажите пожалуйста где описывается текст в этапах квеста игрока на вкладке квесты и где описаны координаты поинта радара (точка куда бежать по квесту).

Добавлено через 16 часов 49 минут
По первой части вопроса разобрался, это всё описано в клиенте насколько я понял в это файле questname-e.dat, а вот где описаны координаты поинта на карте всё ещё нужна помощь!

Последний раз редактировалось Mefisto; 22.12.2008 в 19:16. Причина: Добавлено сообщение
Mefisto вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 08:09. Часовой пояс GMT +3.

Вверх