...прочитал несколько полезных советов на UESP, в частности, на
http://12.145.63.45/~uesp/morrow/editor/mw...scripting.shtml Чтобы не иметь проблем с глюками, надо соблюдать ряд требований (из которых, кстати, видна отвратная реализация скриптов в движке).
1: перед и после скобок и операторов ОБЯЗАТЕЛЬНО должен стоять пробел. Пример:
if ( SomeValue == 1 ) ; правильно
if (SomeValue==1) ; неправильно
2: при вызове функций обязательно используйте зяпятые:
AiActivate, ObjectID, 0 ; правильно
AiActivate ObjectID 0 ; неправильно
3: в сложноом выражении может быть несколько функций, но все они принудительно приводятся к одному объекту:
set LocalVar to ( player->GetPos, X ) + ( player->GetPos, Y ); правильно
set LocalVar to ( player->GetPos, X ) + ( GetPos, Y ); имеет тот же смысл, что и строка выше
set LocalVar to ( player->GetPos, X ) + ( aengoth->GetPos, Y ); неправильно, надо разбивать на две строки
- эти нюансы не обнаруживаются при сохранении скрипта в TESCS, но больно бьют по Морровинду, вызывая совершенно невнятные ошибки при запуске скриптов.
Ну, и последняя мелочь: если имена объектов содержат пробелы, надо заключать их в кавычки:
"urzul gra-agum"->Enable
..возможно, эту тему стоит тоже поднять чтобы новички не продирались через эти дебри без путеводной звезды?..
Ещё, кажется, нашёл один потенциальный источник ошибок - слишком длиный скрипт.
Если кто тоже встречался с ошибкой "Infix to posfix", просьба поделиться наблюдениями.
И вообще будет работать скрипт длиннее 255 строк?
Точно! Разобрал один большой скрипт на несколько маленьких, сократив его размер до 254 строк - и мистическая "Infix to posfix" тут же исчезла.
Довольный был как слон :)
Infernal knight
28 June 2003 | 00:55
Хотел бы добавить, что:
* Я так и не смог использовать elseif
* Переменные вроде OnPCEquip вызывают непонятные ошибки, хотя может я неправильно использую?
* Некоторые функции с условиями внутри которых есть пробел даже в действиях вроде сложения требуют, чтобы их ставили в скобки, иначе говорят, что-то насчет Infix postfix
* Нельзя использовать больше 10 If для одного дейтсвия. Способ решения проблемы: мне понадобилось использовать 40 If для одного дейтсвия, но использовать можно максимум 10, поэтому я ввел 4 переменных и разбил блок из 40 Ifов на 4 блока по 10 Ifов в каждом, в каждом из десяти блоков происходило изменение своей переменной на 1, а потом после четырех блоков происходила проверка всех четрырех переменных, примерно так:
short FirstNumb
short SecondNumb
short ThirdNumb
short ForthNumb
if ( aa == 1 )
if ( ab == 2 )
...
if ( aj == 9 )
if ( ah == 10 )
set FirstNumb to 1
endif
endif
..
endif
endif
{Тут идут еще два блока вроде того, что снизу и сверху}
if ( da == 1 )
if ( db == 2 )
...
if ( dj == 9 )
if ( dh == 10 )
set ForthNumb to 1
endif
endif
..
endif
endif
If ( FirstNumb == 1 )
If ( SecondNumb == 1 )
If ( ThirdNumb == 1 )
If ( ForthNumb == 1 )
{Тут пишется действие, требовавшее 40 Ifов}
endif
endif
endif
endif
Alesandros
19 October 2004 | 10:45
ПОЖАЛУСТА ПОМОГИИИТЕ!!!!
Хочу, чтобы непись в определённое время ходил в одну точку, а в другое время ходил в другую точку, в общем, чтобы режим дня соблюдал, а не стоял на месте как пень круглые сутки, знаю что слишком многово хочу, но всё же.
Пишу сначала стартовый скрипт в виде;
Begin 0_TimeScript
if ( GameHour == 20 )
Set AAARisTravel to 10
endif
if ( GameHour == 7 )
Set AAARisTravel to 30
endif
End 0_TimeScript
Затем вешаю на перса скрипта в виде;
Begin 0_Travel_Collect
if ( AAARisTravel == 10 )
AiTravel, 21335, -50460, 1300
Set AAARisTravel to 20
endif
if ( AAARisTravel == 30 )
AiTravel, 19062, -51064, 1200
Set AAARisTravel to 0
endif
end 0_Travel_Collect
Кто знает, что я делаю не так ПАМАГИТЕ!!!
Ой ой ой чуть не забыл ишчо не работает функция StopSound "блаблабла", надо шобы звучок прекратился и начался другой, дык другой начинается, а предыдуций не кончается ну никак, четыре раза менял переменные от которых зависит отключение звука нивкакую;
Выглядит примерно так
Begin 00_ArenaScript
if ( AA_Call_State == 90 )
if ( OnActivate == 1 )
StopSound, "Into The Arena" - Не работает
MessageBox "Десятый уровень"
PlaceAtPc, "00_ArenaScamp10", 1, 1024, 1
PlaceAtPc, "00_ArenaScamp10_2", 1, 1024, 1
PlaceAtPc, "00_ArenaScamp10_3", 1, 1024, 1
Set AA_Call_State to 97
PlaySound, "Soldiers Of Hell"
endif
endif
Infernal knight
19 October 2004 | 21:08
Пункт раз: попробуй использовать функцию StopScript для остановки предыдущего скрипта, перед использованием последующего
Пункт два: делать через глобальный скрипт - это делать через задницу... вешай все на самого перса.
Пункт три: переменная GameHour - это насколько я знаю общее время игры с начала игрового процесса, так что твой срипт проработает первые 24 часа и заткнется :)
Пункт четыре: персы НЕ умеют правильно находить дорогу через дюны :) они очень сильно тупят и у них отвратительный алгоритм нахождения правильного пути, поэтому разработчики говорят: кладите им рельсы, по которым они будут ходить :) Юзай World->edit cell path grid
Пункт пять: ты УВЕРЕН, что для разнообразия не стоит использовать AI package Wanderer, которые юзают все нормальные NPC компа в результате чего они шляются по округе? Объясняю - по всем окрестностям раскладываются рельсы и персы по ним гуляют ;) Если ты хочешь, чтобы он гулял, ТОЛЬКО между 2 точками - проложи рельсы там, где ты хочешь, чтобы он гулял и все, и можешь сделать несколько разных скриптов Wanderer :) работать они будут начинать разное время и работать четко определенное число часов :)
Отправлено: [mergetime]1098209793[/mergetime]
Насчет StopSound - ничего не знаю... :( читай скриптовый учебник Ган Бури Гана, в переводе Aidana - может там найдешь... могу только одно сказать: ты уверен, что какой-нибудь скрипт не перезапускает этот звук бесконечно? ;)
Alesandros
20 October 2004 | 00:35
Раз - А что собственно стоп.
два - пробовал таже фихня
три - А как же не общее
четыре - Понял
пять - млин мне не надо шобы они не бродили, а нужно шобы вечером непись шёл к дому и если получится телепортовался в него и утром шёл обратно на поле работать (типа режим).
StopSound я и вычитал в руководстве.
Infernal knight
20 October 2004 | 19:14
- тааак... пункт 1 - забей :) меня сглючило я почему-то решил, что тебе нужно останавливать скрипт :)
- 2 вполне возможно, кстати, а эта твоя переменная AAARisTravel - это глобальная переменная? с ней больше никакие левые скрипты не работают? может ее стоит вообще всю закатать в локальную в скрипт?
- насчет 3 - а черт его знает... кажется такого вообще нет :)
можно так: раз в полчаса сверяешь - не изменился ли день, если день изменился - производишь подсчет секунд равных 7 часам, врубаешь AI Package, считаешь еще тринадцать часов - врубаешь новый... лучше - не знаю как сделать.
- насчет 5 - есть такая отличная вещь ;) функция, которая отвечает смотришь ты на перса или нет? ;) и если ты на него не смотришь например около минуты - ты можешь с легкой совестью исчезать его и делать, чтоб он появлялся в доме ;) таким образом игрок не будет видеть как они уходят :)) и наоборот - если например игрок не смотрит на дверь дома - из нее появляется перс. не забудь также о наличии отличнейшей функции Random, которая генерит случайные числа, как например время выхода персов из дома, чтобы оно не совпадало друг с другом и не было одинаковым каждый день ;) Еще есть функция Lock запирающая замки на дверях и Unlock отпирающая их ;)
- это вобщем фенечки, что я придумал для иммитации жизни в Морре когда-то
Alesandros
27 October 2004 | 01:33
Да она глобальная и сней связан тока ентот скрипт
Цитирую из руководства по скриптам редакции за номером семь: ниже приведённый скрипт доказывает, что GameHour отвечает не за общее время игры.
QUOTE |
Пример: Проверка времени, используя функцию GameHour: Begin AfternoonTea
If ( GameHour >= 17 ) If ( GameHour <= 19 ) “Cup of Tea” -> Enable endif elseif ( GameHour < 17 ) if ( GameHour >19 ) “Cup of Tea” -> Disable endif endif
End AfternoonTea |
А фенечки и правда ничего до того, что если ты не смотришь и перс исчезает я както недодумался попробую.
Infernal knight
27 October 2004 | 18:35
Функция называется GetLOS или чего-то подобное...
Насчет переменной - возможно, возможно я и ошибался... Есть идеи почему твой скрипт не работает? ;)
Alesandros
31 October 2004 | 00:18
Есть парочка безумных
1. Я не очень точно указываю переменную Z
2. Непомерная тупость AI
3. Нежелание одного зависеть от другого, результат чего не рабочее состояние скрипта.
Artem13
18 January 2005 | 10:45
Infernal knight
QUOTE |
* Переменные вроде OnPCEquip вызывают непонятные ошибки, хотя может я неправильно использую? |
Это не переменная - это ф-ция, возвращающая значение. Посему на присваивание использовать не можно... (RTFM)
Infernal knight
18 January 2005 | 21:32
Спасибо, за пол года я как-то сам разобрался ;)
FM я читаю только в подлиннике - вот выдержка:
QUOTE |
Certain inventory activities can be checked through scripts using local variables. These local variables are automatically set when the Player does the action. They are NOT functions, but variables that are true or false.
OnPCEquip (is local short variable) Short OnPCEquip If ( OnPCEquip == 1 ) The PC has the object equipped (remains true while object is equipped) This game variable (needs to be declared) gets set to 1 if the player is equipping the calling object. It will remain "true" while the item is still equipped, but gets reset to 0 if the item is unequipped. So, in some cases you might want to manually reset it.
|
Надеюсь, что переводить тебе не надо? Так вот OnPCEquip - это переменная Так что ты ошибаешься - в следующий раз, проверяй информацию, прежде, чем ее постить ;)
Ошибка как я позже выяснил заключалась в том, что я считал, что это переменная глобальная и не нуждается в описании в локальном скрипте, однако оказалось, что это локальная переменная с автоматическим присваиванием и ошибка заключалась в том, что я ее не описывал. Понятно объяснил? ;)