"Группирование" монстров в квесте
#1
День добрый.
Я с недавнего времени начал увлекаться созданием квестов к мультиплееру ПЗ и столкнулся вот с какой проблемой:

Создаю квест, где требуется уничтожить группу юнитов (как например черные единороги на Ингосе). В mob-файле нового квеста (раздел ID_SS_TEXT) объявляю глобальные переменные с именами юнитов (LMPTigerRed2 : object),
далее в процедуре "WorldScript" загоняю объекты в группу (LMPTigerRed2 = GetObjectByID( "1000317" )
AddObject( AllMonsters1, GetObject( "1000317" ) )
И, наконец прописываю QObjKillGroup( "AllMonsters1" ).

Квест загружается, но несмотря на это, не срабатывает "уничтожение группы" и квест не завершается. Все ID монстров внимательно проверил - номера не перепутал.

Как можно разрешить данную проблему?
Ответ
#2
Цитата:(если в разделе написано еще что-то ниже, то поставь Wink.

Эээ... точно ;? По-моему там просто запятую надо ставить...
Ответ
#3
Во первых ставить надо запятую, а во вторых названия групп рекомендую придумывать вручную %)
Ответ
#4
Увы, все оказалось не так просто.

Я добавил переменную группы в раздел GlobalVars, а также поменял имя группы (как посоветовал SnAIperK) - результат все тот же.
Sad

Может мне стоит показать целиком код квеста?
Ответ
#5
Ага, покажи. Хотя стой. Сначала в блоке WorldScript напиши команду:

ConsoleString("Test!")

Затем зайди в игру, и посмотри в консоль. Если надписи "Test!" не появилось, то тогда и покажи...
Ответ
#6
Сделал.

Надпись Test! в консоли появилась.
Ответ
#7
Kreig
Ничего, ьывает

Ivan
Это значит, что твой код работает. Итак, хорошо. У меня к тебе такой совет: убери своё QObjKillGroup(просто я его не люблю Smile ). Взамен поставь скрипт, который засчитывает очередное подзадание, проверяя всю группу юнитов. Например:
Код:
Script IsUnitsKilled
//Этот скрипт проверяет убитость юнитов
(
 if
 (
   Every(i,MyGroup,Not(IsAlive(i)))  //i - переменная типа object, не забудьте объявить её в GlobalVars
 )
 then
 (
   KillScript( )
   GsSetVarMax(0,"q.zXqY.zXqY.Z",2) //Здесь: zXqY - имя файла mq, без расширения, а Z - номер подзадания по убиению группы;)
 )
)
Ответ
#8
SnAIperK, я сделал как ты посоветовал. Подзадания начали выполняться, но
к моменту начала последнего подзадания (а это и есть уничтожение группы) игра мне сообщает, что квест уже выполнен (определение скрипта после GlobalVars и его вызов с "NULL" в конце World-Scripta я не забыл).

Как теперь правильно обратиться к этому скрипту из основного?

Я попытался обратиться к нему перед QFinish и в качестве параметра передавал this (смотрел примеры готовых квестов).
Ответ
#9
Короче смысл вот в чём: тебе надо, чтобы скрипт следил за всем твоим квестом. Вот например такая схема:

Код:
Объявить Скрипты:
-Выдача_квеста
-Подзадание_1
-Подзадание_2
...
-Подзадание_N
----------------------------------
Скрипт Выдача_Квеста:
(
 блок if пустой, в блоке then выдано первое подзадание и вызван скрипт 1-го подзадания:
 KillScript( )
 GsSetVarMax(0,"q.zXqY.zXqY.1",1)
 Подзадание_1(NULL)
)

Скрипт Подзадание_1:
(
 В блоке if условие выполнения подзадания, в блоке then выполнено первое подзадание, выдано второе и выдан скрипт, отвечающий за второе:
 
 KillScript( )
 GsSetVarMax(0,"q.zXqY.zXqY.1",2)
 GsSetVarMax(0,"q.zXqY.zXqY.2",1)

 Подзадание_2(NULL)

)

...

Скрипт Подзадание_N
(
 if
 (
   Условие для N-го подзадания
 )
 then
 (
    KillScript()
    GsSetVarMax(0,"q.zXqY.zXqY",2)    
    QuestComplete(0,"q.zXqY.zXqY")
 )
)

WorldScript
(
 Вызываешь скрипт "Выдача_Квеста"
)

Программируя по этой схеме, ты получишь нормальный квест. Я, конечно, могу выдать готовый скрипт - но важно чтоб ты сам этому научился, тогда проблемм с другими квестами тоже не будет Wink
Ответ
#10
Спасибо...

Вот только ещё один маленький вопрос:
Как в блоке условия прописать вхождение игрока в область (что-то аналогичное QObjArea)?
Ответ
#11
Сначала ты прописываешь данному району все зоны. Это ты наверняка сделал, раз уж юзаешь QObjArea. Затем просто делаешь проверку для любого юнита игрока:

Any(i,Heroes,IsInArea(GetX(i),GetY(i),idArea))

Здесь idArea - та цифра... ну ты понял Smile
Ответ
#12
Сделал, теперь все работает уже протестировал.

SnAIperK, Kreig спасибо вам огромное. <_<

Да, можно ещё один вопрос задать, скорее организационный (я в форумах редко бываю): если у меня вознинут ещё проблемы в создании квестов, но другого характера, мне обязательно создавать новую тему, или можно будет этой воспользоваться?
Ответ
#13
Не за что Smile Дашь поиграть в квест? Smile
Ндя. Сложный вопрос. Короче так: если у тебя проблемма класса "да или нет", подразумевающая маленький ответ - пользуйся этой темой. Если же что-то глобальное(например, полный разбор полётов всего квеста) - можешь создать новую. Ну новая тема - это и есть тема. То есть то, что не укладывается в старую Smile Я кстати тоже ХЗ в этих вопросах. Если что по скрипту - обращайся!
Ответ
#14
Ай, кажется я рано порадовался...

что-то у меня герой в область перестал заходить (помнишь, спрашивал про аналог QObjArea), так вот если я добавляю область (AddRectToArea), то в условии скрипта с подзаданием я ставлю номер области, правильно?

На всякий случай, где именно я должен описать область? Достаточно ли одного описания области в скрипте выдачи квеста?

А квест, как только доработаю, обязательно пришлю. Правда он рассчитан скорее для начинающих игроков. Место - Предгорья. А тема простая: ходил как-то охотник из Поселка по окрестным лесам и заметил тигриные следы, поскольку он уже возвращался с охоты, то самому ему было лень искать причину этих следов, вот и решил Ривар предложить это дело герою, что дескать тигр, в отличие от волка, может и пастуха запросто сожрать. Пошел герой выяснять в чем дело ну и наткнулся на выводок тигров...
Ответ
#15
Kreig, вот мой код в Mob-файле.

Код:
GlobalVars (
 NULL : object,
 VSS#i#val : object,
 i : object,
 AllTigs1 : group,
 LMPTigerRed21 : object,
 LMPTigerRed22 : object,
 LMPTigerRed23 : object,
 LMPTigerRed24 : object,
 LMPTigerRed25 : object,
 LMPTigerRed26 : object,
 LMPTigerRed27 : object
)

DeclareScript IsInArea ( this : object )
DeclareScript VTriger#2#1 (  this : object )
DeclareScript VTriger#2#2 (  this : object )
DeclareScript IsTigsKilled ( this : object )

Script VTriger#2#1
(
 if
 (
 )
 then
 (
   KillScript(  )
   AddRoundToArea( 1, 50, 173, 35)
   QStart("z3q5")
   GsSetVarMax(0,"q.z3q5.z3q5.1",1)
   IsInArea( NULL )
 )
)

Script IsInArea
(
 if
 (
   Any( i, Heroes, IsInArea( GetX( i ), GetY( i ),1))
 )
 then
(
  GsSetVarMax(0,"q.z3q5.z3q5.1",2)
  GsSetVarMax(0,"q.z3q5.z3q5.2",1)
  IsTigsKilled( NULL )
)
)

Script IsTigsKilled
(
 if
 (
    Every(i,AllTigs1,Not(IsAlive( i )))
 )
 then
 (
    KillScript(  )
    GsSetVarMax(0,"q.z3q5.z3q5.1",2)
    QuestComplete(0,"q.z3q5.z3q5")
    QFinish(  )
 )
)



Script VTriger#2#2
(
 if
 (
 )
 then
 (
   KillScript(  )
   ActivateTrap( Pyramid, 0 )
 )
)

WorldScript
(
 ConsoleString("Test!")
 Sleep( 2 )
 LMPTigerRed21 = GetObjectByID( "1000317" )
 LMPTigerRed22 = GetObjectByID( "1000329" )
 LMPTigerRed23 = GetObjectByID( "1000324" )
 LMPTigerRed24 = GetObjectByID( "1000332" )
 LMPTigerRed25 = GetObjectByID( "1000330" )
 LMPTigerRed26 = GetObjectByID( "1000328" )
 LMPTigerRed27 = GetObjectByID( "1000316" )
 AddObject( AllTigs1, GetObject( 1000317 )  )  
 AddObject( AllTigs1, GetObject( 1000329 )  )  
 AddObject( AllTigs1, GetObject( 1000324 )  )  
 AddObject( AllTigs1, GetObject( 1000332 )  )  
 AddObject( AllTigs1, GetObject( 1000330 )  )  
 AddObject( AllTigs1, GetObject( 1000328 )  )  
 AddObject( AllTigs1, GetObject( 1000316 )  )  
VTriger#2#1( NULL )
 VTriger#2#2( NULL )

)

Даже после замены прямоугольной области на круговую, все равно игра не распознает вход героя в область...
Ответ
#16
DeclareScript IsInArea ( this : object )

Ты что! Это ж зарезервированная игровая команда! Смени имя скрипта, а то ошибка будет!
Ответ
#17
Исправил название на другое, вот только результат все тот-же. Не хочет игра засчитывать вход героя в область: ни в прямоугольную, ни круговую.
Ответ
#18
Хм. А теперь напиши в скрипте проверки области консольстринг: например так:

Код:
Script IsInZone
(
  if
  (
    Any(i,Heroes,IsInArea(GetX(i),GetY(i),idArea))
  )
  then
  (
     KillScript()
     ConsoleString("Area!")
     GsSetVarMax(0,"q.zXqY.zXqY",2)    
     QuestComplete(0,"q.zXqY.zXqY")
  )
)



Если консольная фраза появится - значит ты неправильно обработал подзадание. А если нет - неправильно вызван скрипт или задана зона
Ответ
#19
Я бы с радостью, Kreig, да вот только когда я пытаюсь "прикрепить" файлы, мне на форуме выдается сообщение, что у меня нет прав загрузки файлов с данным расширением (*.mob *.mq), а своего сайта я не имею, так что дать гиперссылку тоже не могу, увы.


SnAIperK, я сделал вывод консольной строки, но на сей раз ничего не отображается, а координаты области я проверил, герой должен был туда попасть (у меня есть урощенный вариант квеста, где я использовал QObjArea).
Может я случайно "напортачил" с условием скрипта? Проверь, пожалуйста.

А так, если убрать данный скрипт и сократить число подзаданий до уничтожения группы, то все прекрасно работает (в смысле, группа уничтожается Smile )
Ответ
#20
Цитата:Я бы с радостью, Kreig, да вот только когда я пытаюсь "прикрепить" файлы, мне на форуме выдается сообщение, что у меня нет прав загрузки файлов с данным расширением (*.mob *.mq), а своего сайта я не имею, так что дать гиперссылку тоже не могу, увы.
А ты попробуй запакуй WinRar'ом и выложи. Должно получится. Wink
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)