Авторизация

Войдите, используя свой логин и пароль:

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: BlesseNtumble  
Форум » Lineage 2 "Java" » Мануалы » Учимся писать квесты на python часть 1
Учимся писать квесты на python часть 1
Отправлено 14.12.2009 - 16:021
Пользователи
100 сообщений
Мужчина
Статус: Offline
Это первый мануал по Jython Quest для Lineage2.
Перевод: Lirix
Оригинал: тут
Первое что нужно сделать, это добавить необходимые Java классы в квест.
(net.sf.l2j.gameserver.model.quest).
Code
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 и итемов.
Code
KELTIR_NPC_ID = 12082
FANGS_ITEM_ID = 1859
DROP_RATE     = 500000
WORLD_MAP_ITEM_ID = 1665

Затем объявите несколько вспомогательных функций.
Функция для получения количества квестовых предметов (keltir fangs) у игрока. (st должна быть в QuestState):
Code
def getCount(st) :
   return st.getQuestItemsCount(FANGS_ITEM_ID)

Функция для завершения квеста (st должна быть в QuestState):
Code
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):

Code
def check(st) :
   if getCount(st) >= 4 :
     completed(st)
   return

Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
Code
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.

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

Code
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.

Code
QUEST.setInitialState(CREATED)
QUEST.addStartNpc(7056)
#----------------------------------------#
#L2jFrost Server Developer Team. #
#L2jFrost WebDesign #
#--------------------------------------#
Профиль Личное сообщение Дом. страница icq
17
Отправлено 31.12.2010 - 16:402
Пользователи
87 сообщений
Мужчина
Статус: Offline
А самому слабо написать или только копировать можете?
Профиль Личное сообщение Дом. страница icq
0
Отправлено 01.01.2011 - 01:003
Пользователи
711 сообщений
Мужчина
Статус: Offline
PaulRa, Пфф, ты еще спрашиваеш....? и не такое может.
Профиль Личное сообщение Дом. страница icq
64
Отправлено 01.01.2011 - 03:474
Пользователи
186 сообщений
Мужчина
Статус: Offline
PaulRa, чья бы корова мычала...Ты и этого не умеешь)
Прошу не гадить на форуме!
Профиль Личное сообщение Дом. страница icq
19
Отправлено 01.01.2011 - 11:005
Пользователи
711 сообщений
Мужчина
Статус: Offline
Quote (Frostmourne)
PaulRa, чья бы корова мычала...Ты и этого не умеешь)

во во, аш всбесила сообщение его. Не знает и говорит.
Профиль Личное сообщение Дом. страница icq
64
Отправлено 01.01.2011 - 18:536
Пользователи
87 сообщений
Мужчина
Статус: Offline
Рот офните ... Просто только копированием занимаетесь....

Добавлено (01.01.2011, 18:53)
---------------------------------------------
Рот офните ... Просто только копированием занимаетесь....

Профиль Личное сообщение Дом. страница icq
0
Отправлено 01.01.2011 - 19:587
Модераторы форума
465 сообщений
Мужчина
Статус: Offline
ахаххахах PaulRa а ты бы стал писать заного мануал?) думаю не дин здраво мыслюший человек не станет изобретать велосипед)))
ЕсЛи ПоМоГ тЫкАй (+)
ГиперАктивный чел :D
Я тут живу, просьба не срать!!!
Профиль Личное сообщение Дом. страница icq
72
Отправлено 01.01.2011 - 22:158
Пользователи
87 сообщений
Мужчина
Статус: Offline
зачем такой же мануал ? взять хотя бы другой квест его разновидность описать по лучше .
Профиль Личное сообщение Дом. страница icq
0
Отправлено 01.01.2011 - 23:549
Пользователи
711 сообщений
Мужчина
Статус: Offline
PaulRa, тебя постояно на 2 одинаковых сообщения клинет? уже не первый раз вижу)) У тебя наверное руки тряслись как ты писал biggrin и какая вобще разница какой квест?
Профиль Личное сообщение Дом. страница icq
64
Отправлено 02.01.2011 - 05:2210
Модераторы форума
745 сообщений
Мужчина
Статус: Offline
Quote (PaulRa)
зачем такой же мануал ? взять хотя бы другой квест его разновидность описать по лучше

Ты в этой теме полностью не прав, так что лучше уймись.
flashboom, Как у вас там со сборкой? Смотрю в сроки не укладываетесь=)
Профиль Личное сообщение Дом. страница icq
65
Отправлено 02.01.2011 - 11:1911
Пользователи
711 сообщений
Мужчина
Статус: Offline
Naik, в связи с Новогодними буднями все работы пока приостановлены=) Да и потом люди нужны)
Профиль Личное сообщение Дом. страница icq
64
Отправлено 02.01.2011 - 17:2312
Пользователи
87 сообщений
Мужчина
Статус: Offline
Унимаюсь ) просто хочется почитать мануаль ! читаешь и что то не понимаешь пытаешься найти другой ! а везде одно и тоже) Вот разберусь напишу мануал для чайнков )

Добавлено (02.01.2011, 17:22)
---------------------------------------------
flashboom, я не понял к чему это ты

Добавлено (02.01.2011, 17:23)
---------------------------------------------
Лучше помогите

мой инишник!
Мне надо что бы за вознаграждения довало предмет под ID 9401 ! Как это сделать ? Rewards менял на 9401 вознагрождения вобще не довало =(
# Illegitimate Child Of A Goddess version 0.1
# by DrLecter
import sys
from com.l2jcore import Config
from com.l2jcore.Game.model.quest import State
from com.l2jcore.Game.model.quest import QuestState
from com.l2jcore.Game.model.quest.jython import QuestJython as JQuest

#Quest info
QUEST_NUMBER,QUEST_NAME,QUEST_DESCRIPTION = 358,"IllegitimateChildOfAGoddess","Illegitimate Child Of A Goddess"
qn = "358_IllegitimateChildOfAGoddess"

#Variables
DROP_RATE=12*Config.RATE_DROP_QUEST #in %
REQUIRED=108 #how many items will be paid for a reward (affects onkill sounds too)

#Quest items
SN_SCALE = 5868

#Rewards
REWARDS=range(6329,6340,2)+range(5364,5367,2)

#Changing this value to non-zero, will turn recipes to 100% instead of 70/60%
ALT_RP_100 = 0

#Messages
default = "<html><body>You are either not carrying out your quest or don't meet the criteria.</body></html>"

#NPCs
OLTLIN = 30840

#Mobs
MOBS = [ 20672,20673 ]

class Quest (JQuest) :

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

def onEvent (self,event,st) :
htmltext = event
if event == "30862-5.htm" :
st.setState(STARTED)
st.set("cond","1")
st.playSound("ItemSound.quest_accept")
elif event == "30862-6.htm" :
st.exitQuest(1)
elif event == "30862-7.htm" :
if st.getQuestItemsCount(SN_SCALE) >= REQUIRED :
st.takeItems(SN_SCALE,REQUIRED)
item=REWARDS[st.getRandom(len(REWARDS))]
if ALT_RP_100: item +=1
st.giveItems(item ,1)
st.exitQuest(1)
st.playSound("ItemSound.quest_finish")
else :
htmltext = "30862-4.htm"
return htmltext

def onTalk (self,npc,player):
htmltext = default
st = player.getQuestState(qn)
if not st : return htmltext

npcId = npc.getNpcId()
id = st.getState()
if id == CREATED :
st.set("cond","0")
if player.getLevel() < 63 :
st.exitQuest(1)
htmltext = "30862-1.htm"
else :
htmltext = "30862-2.htm"
elif id == STARTED :
if st.getQuestItemsCount(SN_SCALE) >= REQUIRED :
htmltext = "30862-3.htm"
else :
htmltext = "30862-4.htm"
return htmltext

def onKill(self,npc,player,isPet):
st = player.getQuestState(qn)
if not st : return
if st.getState() != STARTED : return

count = st.getQuestItemsCount(SN_SCALE)
numItems, chance = divmod(DROP_RATE,100)
if st.getRandom(100) < chance :
numItems += 1
if numItems != 0 :
if count + numItems >= REQUIRED :
numItems = REQUIRED - count
if numItems != 0 :
st.playSound("ItemSound.quest_middle")
st.set("cond","2")
else :
st.playSound("ItemSound.quest_itemget")
st.giveItems(SN_SCALE,int(numItems))
return

# Quest class and state definition
QUEST = Quest(QUEST_NUMBER, str(QUEST_NUMBER)+"_"+QUEST_NAME, QUEST_DESCRIPTION)

CREATED = State('Start', QUEST)
STARTED = State('Started', QUEST)
COMPLETED = State('Completed', QUEST)

QUEST.setInitialState(CREATED)

# Quest NPC starter initialization
QUEST.addStartNpc(OLTLIN)
# Quest initialization
QUEST.addTalkId(OLTLIN)

for i in MOBS :
QUEST.addKillId(i)
STARTED.addQuestDrop(i,SN_SCALE,1)

Профиль Личное сообщение Дом. страница icq
0
Отправлено 02.01.2011 - 18:4613
Модераторы форума
745 сообщений
Мужчина
Статус: Offline
Во-первых, для этого есть спойлер. Во-вторых, код практически не читаем и не удобен, скинь файлик лучше.
Профиль Личное сообщение Дом. страница icq
65
Отправлено 02.01.2011 - 21:5514
Пользователи
711 сообщений
Мужчина
Статус: Offline
PaulRa, это не тебе адресовано было. Внимательнее читай, там ник написан кому адресовано.
Профиль Личное сообщение Дом. страница icq
64
Отправлено 03.01.2011 - 01:2515
Пользователи
87 сообщений
Мужчина
Статус: Offline
Naik, http://dump.ru/file/4990245 вот держи
Профиль Личное сообщение Дом. страница icq
0
Форум » Lineage 2 "Java" » Мануалы » Учимся писать квесты на python часть 1
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: