Перейти к содержанию
Авторизация  
««†KENVOOD†»»

Учимся Писать Квесты На Python (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.QuestJython. Затем мы объявляем метод 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)

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...