Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Подскажите, пожалуйста, как сделать этапы прохождения квеста. Скажем, я набил нужное количество итемов, как в этот момент вызвать иконку со знаком вопроса и переход к следующему этапу? Это касается и скрипта и клиентской части. Хроники интерлюд, сборка PW-soft.
Подскажите, пожалуйста, как сделать этапы прохождения квеста. Скажем, я набил нужное количество итемов, как в этот момент вызвать иконку со знаком вопроса и переход к следующему этапу? Это касается и скрипта и клиентской части. Хроники интерлюд, сборка PW-soft.
В том то и беда, кроме вас никто не сможет это сделать поэтому открывайте квест Q001_LettersOfLove и будем разбирать вместе как с лялькой, которая не в состоянии передвигаться самостоятельно.
Но сначала надо будет указать:
1. Сборку
2. Хроники
и установить хоть что-то похожее на IDE типа эклипса или нетбинса, при этом у вас должна быть установлена java для компиляции и если квесты и сборка aCis тогда нужно настроить IDE на отладку, чтобы не заходить по сотни раз в игру и перепроверять то дерьмо что будет написано.
В том то и беда, кроме вас никто не сможет это сделать поэтому открывайте квест Q001_LettersOfLove и будем разбирать вместе как с лялькой, которая не в состоянии передвигаться самостоятельно.
Но сначала надо будет указать:
1. Сборку
2. Хроники
и установить хоть что-то похожее на IDE типа эклипса или нетбинса, при этом у вас должна быть установлена java для компиляции и если квесты и сборка aCis тогда нужно настроить IDE на отладку, чтобы не заходить по сотни раз в игру и перепроверять то дерьмо что будет написано.
Спасибо Psycho за явно указание сборки, из сообщения ТСа которое я даже не прочитал до конца, мне хватило: "Подскажите, пожалуйста, как сделать этапы прохождения квеста..."
PW-soft боже, надо перекреститься как следует.
Первое что хочется сказать, это - квесты написаны на питоне. Не люблю питон. Питон скриптовый язык программирования, который напоминает мне костыль (если юзается с явой в паре).
Ну ладно, начнём по порядку. Для начала откроем файл именуемый как __init__.py в папке \data\jscript\quests\q1_LettersOfLove1
Что мы там видим?
Ёб твою мать... мы видим там убогий синтаксис питона с не менее убогим форматированием... но это нас не должно волновать, мы должны разобраться в том, что такое этапы квеста и как они создаются.
Начнём с базы.
На вашем экране показаны каракули. Синий Шарик - означает что это стандартное говно всех квестов и как правило его не надо трогать (или надо обязательно вставлять в ваши собственные квесты с нуля) без знаний JQuest структуры и чё там происходит.
Конкретно QUEST.setInitialStat(CREATED) обозначает что квест находится в состоянии CREATED (создан) при загрузке файла __init__.py, т.е. при первой прогрузке файла квест создаётся и имеет данный стейт.
Оранжевым цветом - помечено самое главное что вам надо знать.
addStartNpc(DARIN) - в скобочка указывается ID NPC у которого этот квест переходит в фазу STARTED. В даннмо случае это DARIN, смазлив олень, которому не даёт Roxxy. ТОЛЬКО ЭТОТ NPC даёт данный квест. Если мы сделаем вот так: addStartNpc(DARIN,MYNPC) то его смогут давать оба этих кретина. Проблема в том, что я не лазил в JQuest движок и не смотрел есть ли там метод с генериками, так что мой пример - это не точно.
P.S в ходе написания нашёл: генериков нет. Т.е. написание по 10 строк addNpcId или addTalkId это норма.
addTalkId(DARIN) - добавить пиздящих NPC, это как раз то, что вам НУЖНО. Это этап квеста который обрабатывается другие этапы внутри метода def onTalk (self,npc,player) который находится в этом же файле. Это достаточно большой метод из из-за конченного форматирования для меня он трудночитабельный, но мы всё равно прорвёмся.
Голубой цвет - это установка дропающихся итемов, которые непонятно почему названы дропающиеся, ибо DARINS_LETTER игрок получает от дарина, он не дропается.
Ладно смысл в том, что установка (значения в скобках проходит по принципу: NPCID, ITEMID, ITEM_COUNT)
Данный форум позволяет вам вставлять код в свои сообщения, посредством нахождения (плюсика) в панели редактирования поста:
Мы вставляем код, чтобы глаза ломались не только у одного меня но и у всех зевак заходящих сюда.
Код:
def onTalk (self,npc,player): //начало метода
st = player.getQuestState(qn) //получаем состояние квеста у player
htmltext = "<html><body>You are either not carrying out your quest or don't meet the criteria.</body></html>" //устанавливаем базовый html, который будет возвращаться игроку при определённых условиях
if not st: return htmltext //если у игрока нет данного квеста (он не начинал его) то отсылаем заготовленный HTML
npcId = npc.getNpcId() //устанавливает ID NPC в переменную, которую будем дёргать для этапов
id = st.getState() //получаем состояние квеста у игрока: Пройден или стартует и т.д.
if id == CREATED : //если квест СОЗДАН (т.е. он удачно грузанулся (даже звучит кончено)
st.setState(STARTING) //то устанавливаем STATE квеста (наш st) на START - т.е. игрок начал его прохождение (квест взят)
st.set("cond","0") // установка базовых параметров
st.set("onlyone","0")// установка NONREPEAT или REPEAT параметра, тип проходим только один раз (реализация просто 3.14здец)
st.set("id","0")// установка базовых параметров ID, которые я вообще не понимаю зачем здесь нужны
cond = st.getInt("cond") // получение нашего cond, который установили выше
onlyone = st.getInt("onlyone") // получение нашего onlyone который так же установили выше
ItemsCount_DL = st.getQuestItemsCount(DARINGS_LETTER) // установка кол-ва вещей с идиотским именем №1
ItemsCount_RK = st.getQuestItemsCount(RAPUNZELS_KERCHIEF)// установка кол-ва вещей с идиотским именем №2
ItemsCount_DR = st.getQuestItemsCount(DARINGS_RECEIPT)// установка кол-ва вещей с идиотским именем №3
ItemsCount_BP = st.getQuestItemsCount(BAULS_POTION)// установка кол-ва вещей с идиотским именем №4
// в будущем в квесте всё это проверяется, т.е. сколько у игрока вещей DARINGS_LETTER например.
if npcId == DARIN and cond == 0 and onlyone == 0 : // Пошли этапы. Этап 1: Если ID NPC = DARIN и cond == 0 и квест проходится впервые
if player.getLevel() >= 2 : // то выполянем всё нижеописанное (проверки на уровень, и прочее)
if cond < 15 :
htmltext = "30048-02.htm"
else:
htmltext = "30048-01.htm"
st.exitQuest(1)
else:
htmltext = "<html><body>Quest for characters level 2 and above.</body></html>"
st.exitQuest(1)
elif npcId == DARIN and cond == 0 and onlyone == 1 : // Этап 2: Если ID NPC = DARIN и cond == 0 и квест УЖЕ ПРОЙДЕН
htmltext = "<html><body>This quest has already been completed.</body></html>" // то шлём игрока нахер
elif id == STARTED : // Этап STARTED
if npcId == ROXXY and cond and onlyone == 0: //Этап 1: Если npcId = ROXXY и cond и onlyone равны 0 т овыполняем код ниже и т.д.
if ItemsCount_RK == 0 and ItemsCount_DL :
htmltext = "30006-01.htm"
st.takeItems(DARINGS_LETTER,-1)
st.giveItems(RAPUNZELS_KERCHIEF,1)
st.set("cond","2")
st.set("id","2")
st.playSound("ItemSound.quest_middle")
elif ItemsCount_BP or ItemsCount_DR :
htmltext = "30006-03.htm"
elif ItemsCount_RK :
htmltext = "30006-02.htm"
elif npcId == DARIN and cond and ItemsCount_RK > 0 and onlyone == 0 :
htmltext = "30048-08.htm"
st.takeItems(RAPUNZELS_KERCHIEF,-1)
st.giveItems(DARINGS_RECEIPT,1)
st.set("cond","3")
st.set("id","3")
st.playSound("ItemSound.quest_middle")
elif npcId == BAULRO and cond and onlyone == 0 :
if ItemsCount_DR > 0 :
htmltext = "30033-01.htm"
st.takeItems(DARINGS_RECEIPT,-1)
st.giveItems(BAULS_POTION,1)
st.set("cond","4")
st.set("id","4")
st.playSound("ItemSound.quest_middle")
elif ItemsCount_BP > 0 :
htmltext = "30033-02.htm"
elif npcId == DARIN and cond and ItemsCount_RK == 0 and onlyone == 0 :
if ItemsCount_DR > 0 :
htmltext = "30048-09.htm"
elif ItemsCount_BP > 0 :
htmltext = "30048-10.htm"
st.takeItems(BAULS_POTION,-1)
st.giveItems(NECKLACE,1)
st.set("cond","0")
st.set("onlyone","1")
st.setState(COMPLETED)
st.playSound("ItemSound.quest_finish")
else:
htmltext = "30048-07.htm"
return htmltext
Всё остальное делается по аналогии комментариев.
Всегда есть базовый этап вида проверки:
if npcId == DARIN :
if npcId == ROXXY :
и так далее.
Этапы могут состоять из более длиных првоерок как например проверка с cond, onlyone и т.д.
В итоге визуально (ПРИМЕРНО) это выглядит как:
1 этап: подошёл к Дарину - подхожу по уровням и условим - он даёт квест и письмо дарина впридачу
2 этап: надо идти к Рокси - если есть письмо от дарина - рокси говорит с нами - квест продолжается
3 этап: подходим к дарину и говорим с ним - если есть какая-то хрень от рокси - берём след часть квеста.
Важно знать главное: Как клиент определяется выдавать ему вам знак вопросика и отсылать на след. чатсь или нет?
Клиент операется на st.setInt("cond", 0), если вы откроете файл questgrp.dat то увидите там state (они же cond) рядом с ID у каждого квеста, это и есть наш st.setInt("cond", 1) серверный конд который мы храним в базе и достаём по мере надобности (квест так же проверяет эту хрень при заходе чара в игру.)
В любом случае надо либо бежать с этой херни, либо изучать квестовый движок в исходниках.
finfan, спасибо за детальное пояснение, многое стало понятней! Остается только два момента: Вы написали открыть файл "questgrp.dat", может ли он носить название "questname.dat"? Из квестовых в клиенте я только этот нахожу. А параметр st.setInt("cond", 0) в нем указан как "quest_prog", верно ли я понял? По этапам и описанию квеста всё совпадает, но вызывает "quest_prog" ли знаки вопроса пока не ясно.
На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.