Полная Версия: Почему не работают скрипты
Cheb
...прочитал несколько полезных советов на 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

..возможно, эту тему стоит тоже поднять чтобы новички не продирались через эти дебри без путеводной звезды?..
Cheb
Ещё, кажется, нашёл один потенциальный источник ошибок - слишком длиный скрипт.
Если кто тоже встречался с ошибкой "Infix to posfix", просьба поделиться наблюдениями.
И вообще будет работать скрипт длиннее 255 строк?

Точно! Разобрал один большой скрипт на несколько маленьких, сократив его размер до 254 строк - и мистическая "Infix to posfix" тут же исчезла.
Довольный был как слон :)
Infernal knight
Хотел бы добавить, что:
* Я так и не смог использовать 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
ПОЖАЛУСТА ПОМОГИИИТЕ!!!!

Хочу, чтобы непись в определённое время ходил в одну точку, а в другое время ходил в другую точку, в общем, чтобы режим дня соблюдал, а не стоял на месте как пень круглые сутки, знаю что слишком многово хочу, но всё же.

Пишу сначала стартовый скрипт в виде;

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
Пункт раз: попробуй использовать функцию StopScript для остановки предыдущего скрипта, перед использованием последующего
Пункт два: делать через глобальный скрипт - это делать через задницу... вешай все на самого перса.
Пункт три: переменная GameHour - это насколько я знаю общее время игры с начала игрового процесса, так что твой срипт проработает первые 24 часа и заткнется :)
Пункт четыре: персы НЕ умеют правильно находить дорогу через дюны :) они очень сильно тупят и у них отвратительный алгоритм нахождения правильного пути, поэтому разработчики говорят: кладите им рельсы, по которым они будут ходить :) Юзай World->edit cell path grid
Пункт пять: ты УВЕРЕН, что для разнообразия не стоит использовать AI package Wanderer, которые юзают все нормальные NPC компа в результате чего они шляются по округе? Объясняю - по всем окрестностям раскладываются рельсы и персы по ним гуляют ;) Если ты хочешь, чтобы он гулял, ТОЛЬКО между 2 точками - проложи рельсы там, где ты хочешь, чтобы он гулял и все, и можешь сделать несколько разных скриптов Wanderer :) работать они будут начинать разное время и работать четко определенное число часов :)

Отправлено: [mergetime]1098209793[/mergetime]
Насчет StopSound - ничего не знаю... :( читай скриптовый учебник Ган Бури Гана, в переводе Aidana - может там найдешь... могу только одно сказать: ты уверен, что какой-нибудь скрипт не перезапускает этот звук бесконечно? ;)
Alesandros
Раз - А что собственно стоп.

два - пробовал таже фихня

три - А как же не общее

четыре - Понял

пять - млин мне не надо шобы они не бродили, а нужно шобы вечером непись шёл к дому и если получится телепортовался в него и утром шёл обратно на поле работать (типа режим).

StopSound я и вычитал в руководстве.

Infernal knight
- тааак... пункт 1 - забей :) меня сглючило я почему-то решил, что тебе нужно останавливать скрипт :)

- 2 вполне возможно, кстати, а эта твоя переменная AAARisTravel - это глобальная переменная? с ней больше никакие левые скрипты не работают? может ее стоит вообще всю закатать в локальную в скрипт?

- насчет 3 - а черт его знает... кажется такого вообще нет :)
можно так: раз в полчаса сверяешь - не изменился ли день, если день изменился - производишь подсчет секунд равных 7 часам, врубаешь AI Package, считаешь еще тринадцать часов - врубаешь новый... лучше - не знаю как сделать.

- насчет 5 - есть такая отличная вещь ;) функция, которая отвечает смотришь ты на перса или нет? ;) и если ты на него не смотришь например около минуты - ты можешь с легкой совестью исчезать его и делать, чтоб он появлялся в доме ;) таким образом игрок не будет видеть как они уходят :)) и наоборот - если например игрок не смотрит на дверь дома - из нее появляется перс. не забудь также о наличии отличнейшей функции Random, которая генерит случайные числа, как например время выхода персов из дома, чтобы оно не совпадало друг с другом и не было одинаковым каждый день ;) Еще есть функция Lock запирающая замки на дверях и Unlock отпирающая их ;)
- это вобщем фенечки, что я придумал для иммитации жизни в Морре когда-то
Alesandros
QUOTE
AAARisTravel


Да она глобальная и сней связан тока ентот скрипт



Цитирую из руководства по скриптам редакции за номером семь: ниже приведённый скрипт доказывает, что 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
Функция называется GetLOS или чего-то подобное...
Насчет переменной - возможно, возможно я и ошибался... Есть идеи почему твой скрипт не работает? ;)
Alesandros
Есть парочка безумных

1. Я не очень точно указываю переменную Z

2. Непомерная тупость AI

3. Нежелание одного зависеть от другого, результат чего не рабочее состояние скрипта.
Artem13
Infernal knight

QUOTE
* Переменные вроде OnPCEquip вызывают непонятные ошибки, хотя может я неправильно использую?


Это не переменная - это ф-ция, возвращающая значение. Посему на присваивание использовать не можно... (RTFM)
Infernal knight
Спасибо, за пол года я как-то сам разобрался ;)

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 - это переменная Так что ты ошибаешься - в следующий раз, проверяй информацию, прежде, чем ее постить ;)

Ошибка как я позже выяснил заключалась в том, что я считал, что это переменная глобальная и не нуждается в описании в локальном скрипте, однако оказалось, что это локальная переменная с автоматическим присваиванием и ошибка заключалась в том, что я ее не описывал. Понятно объяснил? ;)
Ваш ответ: