Этапы прохождения квеста

Refren

Путник
Пользователь
Сообщения
50
Розыгрыши
0
Репутация
0
Реакции
4
Баллы
0
Подскажите, пожалуйста, как сделать этапы прохождения квеста. Скажем, я набил нужное количество итемов, как в этот момент вызвать иконку со знаком вопроса и переход к следующему этапу? Это касается и скрипта и клиентской части. Хроники интерлюд, сборка PW-soft.
 
Подскажите, пожалуйста, как сделать этапы прохождения квеста. Скажем, я набил нужное количество итемов, как в этот момент вызвать иконку со знаком вопроса и переход к следующему этапу? Это касается и скрипта и клиентской части. Хроники интерлюд, сборка PW-soft.
Посмотреть, как сделано в других квестах?
 
В том-то и беда, что посмотрел, но из-за отсутствия знаний не понял, как это устроено.
В том то и беда, кроме вас никто не сможет это сделать поэтому открывайте квест Q001_LettersOfLove и будем разбирать вместе как с лялькой, которая не в состоянии передвигаться самостоятельно.

Но сначала надо будет указать:
1. Сборку
2. Хроники

и установить хоть что-то похожее на IDE типа эклипса или нетбинса, при этом у вас должна быть установлена java для компиляции и если квесты и сборка aCis тогда нужно настроить IDE на отладку, чтобы не заходить по сотни раз в игру и перепроверять то дерьмо что будет написано.
 
В том то и беда, кроме вас никто не сможет это сделать поэтому открывайте квест Q001_LettersOfLove и будем разбирать вместе как с лялькой, которая не в состоянии передвигаться самостоятельно.

Но сначала надо будет указать:
1. Сборку
2. Хроники

и установить хоть что-то похожее на IDE типа эклипса или нетбинса, при этом у вас должна быть установлена java для компиляции и если квесты и сборка aCis тогда нужно настроить IDE на отладку, чтобы не заходить по сотни раз в игру и перепроверять то дерьмо что будет написано.
Хроники интерлюд, сборка PW-soft.
 
Спасибо Psycho за явно указание сборки, из сообщения ТСа которое я даже не прочитал до конца, мне хватило: "Подскажите, пожалуйста, как сделать этапы прохождения квеста..."
PW-soft боже, надо перекреститься как следует.

Первое что хочется сказать, это - квесты написаны на питоне. Не люблю питон. Питон скриптовый язык программирования, который напоминает мне костыль (если юзается с явой в паре).

Ну ладно, начнём по порядку. Для начала откроем файл именуемый как __init__.py в папке \data\jscript\quests\q1_LettersOfLove1
Что мы там видим?
Ёб твою мать... мы видим там убогий синтаксис питона с не менее убогим форматированием... но это нас не должно волновать, мы должны разобраться в том, что такое этапы квеста и как они создаются.

Начнём с базы.
g3EV2sAAQceVVZigHARtnQ.png

На вашем экране показаны каракули.
Синий Шарик - означает что это стандартное говно всех квестов и как правило его не надо трогать (или надо обязательно вставлять в ваши собственные квесты с нуля) без знаний 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)

Данный форум позволяет вам вставлять код в свои сообщения, посредством нахождения (плюсика) в панели редактирования поста:
erNCwqZKSSOTY80NazwROw.png
Мы вставляем код, чтобы глаза ломались не только у одного меня но и у всех зевак заходящих сюда.

Код:
 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) серверный конд который мы храним в базе и достаём по мере надобности (квест так же проверяет эту хрень при заходе чара в игру.)

В любом случае надо либо бежать с этой херни, либо изучать квестовый движок в исходниках.
 

    risi

    Баллов: 11
    Отличный мануал

    Enmity

    Баллов: 42
    заорал дурниной со строки где убогий синтаксис питона, спасибо :pandaredlol:

    Psycho

    Баллов: 34
    Ору :D
finfan, спасибо за детальное пояснение, многое стало понятней! Остается только два момента: Вы написали открыть файл "questgrp.dat", может ли он носить название "questname.dat"? Из квестовых в клиенте я только этот нахожу. А параметр st.setInt("cond", 0) в нем указан как "quest_prog", верно ли я понял? По этапам и описанию квеста всё совпадает, но вызывает "quest_prog" ли знаки вопроса пока не ясно.
 
Похоже разобрался, теперь всё работает, как и хотелось. Большое спасибо всем, и особенно finfan!
 
  • Мне нравится
Реакции: risi
Назад
Сверху Снизу