Будем учиться писать квесты на Python.
Мануал авторский, не откуда не скопирован.
Мануал долгий и нудный расчитан на полное разжевывание каждой запятой,
у кого нет терпения можете не читать
Для начала определяем, что это будет, простой нпц который выполнит какую то операцию и все,
или же квест со сценарием который нужно вывести в окне квестов в игре.
1. Если простой нпц или вывод в окно квестов не нужен то можно поставить квест в папку data/scripts/custom/
2. Если все таки квест требует вывода то он должен распологаться здесь data/scripts/quest/
Cоздаем главный файл __init__.py
Первые строки которые там должны быть в любом скрипте:
import sys
from com.l2jfrozen.gameserver.model.quest import State
from com.l2jfrozen.gameserver.model.quest import QuestState
from com.l2jfrozen.gameserver.model.quest.jython import QuestJython as JQuest
Далее введем несколько переменных (Для простоты, и чтобы в случае чего не пришлось лезть в глубь скрипта)
к примеру:
NPC_ID = [40001] - Какие нпц будут задействованы, лично я рекомендую создавать здесь массив, то есть все в квадратных скобках и через запятую
qn = "9990_testquest" - название нашего квеста (так он будет записан в базе)
QuestId = -1 - если квест не требует вызова квест окна значит можно смело ставить -1 ну а если все таки нужно значит ставим любое не занятое число другими квестами
QuestDesc = "custom" - в идеале это не так важно, но я все таки так пишу
print qn + " Loading...." - это нужно чтобы знать грузиться ли наш квест вообще...
теперь перейдем в самый конец скрипта, вот что там должно быть:
QUEST = Quest(QuestId, qn, QuestDesc) - Здесь идет обьявление квеста, по выше указанным переменным
CREATED = State('Start', QUEST) - Это статус квеста можно вводить другие виды...
STARTED = State('Started', QUEST) - Это статус квеста можно вводить другие виды...
COMPLETED = State('Completed', QUEST) - Это статус квеста можно вводить другие виды...
QUEST.setInitialState(CREATED) - Это какой статус будет присваиваться квесту в самом начале разговора с нпц, то есть автоматически
for i in NPC:
QUEST.addStartNpc(i)
QUEST.addTalkId(i)
Теперь поясню для чего мы использовали массив для указания нпц, т.к. бывают случаи что нужно использовать более 1 нпц, делают цикл, нежели указывать 4 значения вместо двух,
именно по этому чтобы облегчить задачу мы указали массив в данном случае там одно число, значит цикл пройдет 1 раз и задействован будет 1 раз, то есть фактически разницы нет,
разница в том что если будет 10 нпц, придеться вводить 20 строк, а в этом случае всего 3 строки при любом их количестве.
Так же если в квесте нужно будет убивать монстров то нужно добавить строки
MOB_ID = [40001]
for i in MOB_ID :
QUEST.addKillId(i)
Теперь немного о питоне, синтаксис питона немного отличается от явы, все разделения зависят от "пробелов" пример:
if 1 > 2: if 1 > 2:
stat = "yes" stat = "yes"
print stat print stat
Это 2 разных кода, в 1 принт выведеться в любом случае, а во втором только при верно условии...
перейдем к телу скрипта
Этот код расположен обычно между print в начале и перед обьявлением переменной квест QUEST в конце
Обьяснить первые строки я не смогу))) так я сам не изучал основ питона))))
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def onTalk (self, npc, player): - это то что будет видеть игрок при начале разговора...
htmltext = "1.htm"
st = player.getQuestState(qn)
if not st : return htmltext
npcId = npc.getNpcId()
return htmltext
def onEvent(self, event, st): - Этот метод используется после начала разговора
htmltext = event
return htmltext
есть еще много методов onKill к примеру, он используется когда моб внесенный в список был убит, или onAttack он используется каждый раз когда моб был атакован
теперь давайте сделаем так чтобы при разговоре игроку в системное сообщение писало "Hello! Quest start!"
Начнем... Я думаю вы разберетесь куда это вставить...
def onTalk (self, npc, player):
htmltext = "Error" - в данном случае это не нужно, но я оставлю...
st = player.getQuestState(qn) - получаем информацию о статусе квеста
if not st : return htmltext - если квест не начался шлем ошибку
htmltext = "Hello! Quest start!"
npcId = npc.getNpcId() - это нужно только если вы используется более 1 нпц...
return htmltext - есть пара моментов, если в переменной htmltext будет html код то выведеться окно, а если нет то будет вывод просто в окно системных сообщений игрока
Это так)) нубо квест))
Теперь сделаем кое что посложнее, попробуйте прочитав код определить что будет происходить а потом проверьте правильно ли вы его поняли :pardon:
def onTalk (self, npc, player):
htmltext = "Error"
st = player.getQuestState(qn)
if not st : return htmltext
if st.getQuestItemsCount(57) >= 5000000 :
htmltext = "<html><body>Yes! Go location! :)</body></html>"
st.takeItems(57, 5000000)
teleToLocation(x, y, z)
else :
htmltext = "<html><body>Hey! Fuck! Dead!"
st.getPlayer().reduceCurrentHp(st.getPlayer().getMaxHp() + st.getPlayer().getMaxCp() + 1, st.getPlayer())
return htmltext
В данном случае проверяется, если у игрока есть адена в количестве 5000000 или больше, то ее забирают и телепортируют куда то,
а если нет то он труп
Так же есть такая особенность что в папку со скриптом можно положить файлы к примеру 1.htm, 2.htm и в различных ситуациях их показывать, в питоне нельзя писать русские символы а в html файлах можно
просто вместо htmltext = "..." нужно писать htmltext = "1.htm" ну или тому подобное
На сегодня все, в следующий раз напишу что то более стоящее Я думаю то что здесь есть разжеванно так что даже младенец спокойной проглотит)))
Извиняйте за орфорграфические ошибки))
Это 1 часть
следующая часть появиться как только будет время
Кому нужно вот txt файл этого гайда Скачать