Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
День добрый.
Я с недавнего времени начал увлекаться созданием квестов к мультиплееру ПЗ и столкнулся вот с какой проблемой:
Создаю квест, где требуется уничтожить группу юнитов (как например черные единороги на Ингосе). В mob-файле нового квеста (раздел ID_SS_TEXT) объявляю глобальные переменные с именами юнитов (LMPTigerRed2 : object),
далее в процедуре "WorldScript" загоняю объекты в группу (LMPTigerRed2 = GetObjectByID( "1000317" )
AddObject( AllMonsters1, GetObject( "1000317" ) )
И, наконец прописываю QObjKillGroup( "AllMonsters1" ).
Квест загружается, но несмотря на это, не срабатывает "уничтожение группы" и квест не завершается. Все ID монстров внимательно проверил - номера не перепутал.
Как можно разрешить данную проблему?
Цитата:(если в разделе написано еще что-то ниже, то поставь .
Эээ... точно ;? По-моему там просто запятую надо ставить...
Сообщений: 312
Тем: 5
Зарегистрирован: Apr 2004
Во первых ставить надо запятую, а во вторых названия групп рекомендую придумывать вручную %)
Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
04.05.2006, 00:44
(Сообщение последний раз редактировалось: 04.05.2006, 00:45 Ivan.)
Увы, все оказалось не так просто.
Я добавил переменную группы в раздел GlobalVars, а также поменял имя группы (как посоветовал SnAIperK) - результат все тот же.
Может мне стоит показать целиком код квеста?
Сообщений: 312
Тем: 5
Зарегистрирован: Apr 2004
Ага, покажи. Хотя стой. Сначала в блоке WorldScript напиши команду:
ConsoleString("Test!")
Затем зайди в игру, и посмотри в консоль. Если надписи "Test!" не появилось, то тогда и покажи...
Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
Сделал.
Надпись Test! в консоли появилась.
Сообщений: 312
Тем: 5
Зарегистрирован: Apr 2004
Kreig
Ничего, ьывает
Ivan
Это значит, что твой код работает. Итак, хорошо. У меня к тебе такой совет: убери своё QObjKillGroup(просто я его не люблю ). Взамен поставь скрипт, который засчитывает очередное подзадание, проверяя всю группу юнитов. Например:
Код: Script IsUnitsKilled
//Этот скрипт проверяет убитость юнитов
(
if
(
Every(i,MyGroup,Not(IsAlive(i))) //i - переменная типа object, не забудьте объявить её в GlobalVars
)
then
(
KillScript( )
GsSetVarMax(0,"q.zXqY.zXqY.Z",2) //Здесь: zXqY - имя файла mq, без расширения, а Z - номер подзадания по убиению группы;)
)
)
Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
SnAIperK, я сделал как ты посоветовал. Подзадания начали выполняться, но
к моменту начала последнего подзадания (а это и есть уничтожение группы) игра мне сообщает, что квест уже выполнен (определение скрипта после GlobalVars и его вызов с "NULL" в конце World-Scripta я не забыл).
Как теперь правильно обратиться к этому скрипту из основного?
Я попытался обратиться к нему перед QFinish и в качестве параметра передавал this (смотрел примеры готовых квестов).
Сообщений: 312
Тем: 5
Зарегистрирован: Apr 2004
Короче смысл вот в чём: тебе надо, чтобы скрипт следил за всем твоим квестом. Вот например такая схема:
Код: Объявить Скрипты:
-Выдача_квеста
-Подзадание_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
(
Вызываешь скрипт "Выдача_Квеста"
)
Программируя по этой схеме, ты получишь нормальный квест. Я, конечно, могу выдать готовый скрипт - но важно чтоб ты сам этому научился, тогда проблемм с другими квестами тоже не будет
Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
05.05.2006, 11:30
(Сообщение последний раз редактировалось: 05.05.2006, 11:44 Ivan.)
Спасибо...
Вот только ещё один маленький вопрос:
Как в блоке условия прописать вхождение игрока в область (что-то аналогичное QObjArea)?
Сообщений: 312
Тем: 5
Зарегистрирован: Apr 2004
Сначала ты прописываешь данному району все зоны. Это ты наверняка сделал, раз уж юзаешь QObjArea. Затем просто делаешь проверку для любого юнита игрока:
Any(i,Heroes,IsInArea(GetX(i),GetY(i),idArea))
Здесь idArea - та цифра... ну ты понял
Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
Сделал, теперь все работает уже протестировал.
SnAIperK, Kreig спасибо вам огромное. <_<
Да, можно ещё один вопрос задать, скорее организационный (я в форумах редко бываю): если у меня вознинут ещё проблемы в создании квестов, но другого характера, мне обязательно создавать новую тему, или можно будет этой воспользоваться?
Сообщений: 312
Тем: 5
Зарегистрирован: Apr 2004
Не за что Дашь поиграть в квест?
Ндя. Сложный вопрос. Короче так: если у тебя проблемма класса "да или нет", подразумевающая маленький ответ - пользуйся этой темой. Если же что-то глобальное(например, полный разбор полётов всего квеста) - можешь создать новую. Ну новая тема - это и есть тема. То есть то, что не укладывается в старую Я кстати тоже ХЗ в этих вопросах. Если что по скрипту - обращайся!
Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
Ай, кажется я рано порадовался...
что-то у меня герой в область перестал заходить (помнишь, спрашивал про аналог QObjArea), так вот если я добавляю область (AddRectToArea), то в условии скрипта с подзаданием я ставлю номер области, правильно?
На всякий случай, где именно я должен описать область? Достаточно ли одного описания области в скрипте выдачи квеста?
А квест, как только доработаю, обязательно пришлю. Правда он рассчитан скорее для начинающих игроков. Место - Предгорья. А тема простая: ходил как-то охотник из Поселка по окрестным лесам и заметил тигриные следы, поскольку он уже возвращался с охоты, то самому ему было лень искать причину этих следов, вот и решил Ривар предложить это дело герою, что дескать тигр, в отличие от волка, может и пастуха запросто сожрать. Пошел герой выяснять в чем дело ну и наткнулся на выводок тигров...
Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
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 )
)
Даже после замены прямоугольной области на круговую, все равно игра не распознает вход героя в область...
Сообщений: 312
Тем: 5
Зарегистрирован: Apr 2004
DeclareScript IsInArea ( this : object )
Ты что! Это ж зарезервированная игровая команда! Смени имя скрипта, а то ошибка будет!
Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
Исправил название на другое, вот только результат все тот-же. Не хочет игра засчитывать вход героя в область: ни в прямоугольную, ни круговую.
Сообщений: 312
Тем: 5
Зарегистрирован: Apr 2004
Хм. А теперь напиши в скрипте проверки области консольстринг: например так:
Код: 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")
)
)
Если консольная фраза появится - значит ты неправильно обработал подзадание. А если нет - неправильно вызван скрипт или задана зона
Сообщений: 20
Тем: 4
Зарегистрирован: May 2006
07.05.2006, 22:41
(Сообщение последний раз редактировалось: 07.05.2006, 22:49 Ivan.)
Я бы с радостью, Kreig, да вот только когда я пытаюсь "прикрепить" файлы, мне на форуме выдается сообщение, что у меня нет прав загрузки файлов с данным расширением (*.mob *.mq), а своего сайта я не имею, так что дать гиперссылку тоже не могу, увы.
SnAIperK, я сделал вывод консольной строки, но на сей раз ничего не отображается, а координаты области я проверил, герой должен был туда попасть (у меня есть урощенный вариант квеста, где я использовал QObjArea).
Может я случайно "напортачил" с условием скрипта? Проверь, пожалуйста.
А так, если убрать данный скрипт и сократить число подзаданий до уничтожения группы, то все прекрасно работает (в смысле, группа уничтожается )
Сообщений: 452
Тем: 22
Зарегистрирован: May 2003
Цитата:Я бы с радостью, Kreig, да вот только когда я пытаюсь "прикрепить" файлы, мне на форуме выдается сообщение, что у меня нет прав загрузки файлов с данным расширением (*.mob *.mq), а своего сайта я не имею, так что дать гиперссылку тоже не могу, увы.
А ты попробуй запакуй WinRar'ом и выложи. Должно получится.
|