KFan 7 Опубликовано 25 декабря, 2011 Будем учиться писать квесты на 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 файл этого гайда Скачать 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
1Rock_Lee1 2 Опубликовано 25 декабря, 2011 Мммм спасибо, жду продолжения, интересная информация, может быть напишу свой первый квест) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
KFan 7 Опубликовано 25 декабря, 2011 Я думаю ссылку на сам квест у нпц люди смогут сделать)) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BlackDream 321 Опубликовано 25 декабря, 2011 Спасибо огромное) ))нужная вещь ) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты