Перейти к содержанию

Тонкости скриптов


Рекомендуемые сообщения

Для тех, кто ещё не видел, оставлю это здесь. Сам до конца не вник, но звучит тревожно для любителей скриптинга чисто в КС и MWSE-ненавистников.

Хрнчамд сказал:

The script compiler in the CS has similar expression related bugs, but not as severe. This time, the CS compiler has copied garbage bytes onto the end of an If expression. In the expression:

 

If ( "AA_Laurenna"->GetMysticism > ( Random 100 ) )

 

The Random 100 is correctly compiled into an opcode + argument, but the last two characters '00' have also been copied into the compiled data. This was only permissible by coincidence, the engine still mangles the high byte of the Random argument. You can see in the script that the branch body is commented out, probably because it never worked right. This is going to be a real pain to work around.

There is already a better compiler available in the form of MWEdit.

 

Realistically, very few authors or players will recompile scripts on the many existing mods. It's better to figure what checks can be added to ignore those few junk bytes. I may still have made a mistake in the patch too.

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 335
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Для тех, кто ещё не видел, оставлю это здесь. Сам до конца не вник, но звучит тревожно для любителей скриптинга чисто в КС и MWSE-ненавистников.

Хрнчамд сказал:

Чёт не до конца понимаю, что тут написано. Но сама конструкция никаких затруднений не вызывает, всегда можно присвоить одной переменной значение мистицизма, другой дать рандом 100 и их уже сравнить.
Может ли кто еще подсказать, как сделать, допустим, что-то вроде сторожевого кричера? Есть библиотека, дверной проем там открытый в общий зал, где есть NPС, но форма комнаты такая, что большая ее часть не просматривается. NPC ставить не хочу туда, но сигналку какую-то стоит поставить, чтобы безнаказанно тырить книги нельзя было...

Во первых нужно бы знать какой функционал этот охранник несёт. Если он охраняет от игрока, то можно ставить любого кричура. Если он охраняет для игрока, то вопрос в том будут ли воры, если нет, то меняется AI fight, если воры будут, то уже скриптовать кричура надо.

Ссылка на комментарий
Поделиться на другие сайты

Чёт не до конца понимаю, что тут написано. Но сама конструкция никаких затруднений не вызывает

дело не в конструкции, а в копировании лишней инфы в скрипт.

Автор советует МВЭдит, в общем

Ссылка на комментарий
Поделиться на другие сайты

  • 7 месяцев спустя...

Здравствуйте, мастера, прошу вашего совета. Такая проблема: есть плагин с NPC компаньоном, и он должен реагировать на определенный список локаций. Список столь велик, что банальным перебором с GetPCCell это не решаемо. "Частичное совпадение" названия локации тоже исключается. Хотелось бы выслушать ваше мнение по поводу решения данной задачи, т.к. мое решение - тот еще индусский код. И да, реакция используется не в диалоге.

 

Изначально была идея повесить компаньону скрипт с "GetDistance" до метки (если объект вне текущего interior, то он возвращет 0), но к сожалению он определяет расстояние только для уникального объекта - либо для последнего добавленного в CS объекта, NPC или кричера. Пришлось отказаться.

 

Вот, собсвенно то, до чего я додумался: в каждую локацию, в пустоту на карте помещается объект "метка" со скриптом, который раз в секунду изменяет на +1 определенную глоб. переменную. А NPC каждые 2 секунды проверяет, изменилась ли переменная (значит локация помечена) или нет (значит реакция не нужна).

Изменено пользователем DlinnyiAl
Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

if callchanged == 1

startscript ID_lock

endif

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

Ссылка на комментарий
Поделиться на другие сайты

в id_lock проверяем нужные нам локации

Спасибо, но как я уже писал выше, список столь велик, что перебором это не решить. Да и есть мнение, хоть и недоказанное, что cellchanged не сработает при телепортации.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, но как я уже писал выше, список столь велик, что перебором это не решить. Да и есть мнение, хоть и недоказанное, что cellchanged не сработает при телепортации.

внушительный список меньше тысячи локаций? Тогда строчек вам хватит.
Ссылка на комментарий
Поделиться на другие сайты

> ...есть мнение, хоть и недоказанное, что cellchanged не сработает при телепортации.

это из Morrowind_Scripting_for_Dummies_8.1, а вот в 9.0:

 

CellChanged returns 1 for one frame when player changes cells. It doesn’t return 1 for scripted teleporting or magic teleporting. CellChanged returns true almost immediately after the player changes cells. This means a local script running in an interior cell won't fire when the user leaves a cell, but rather when the player enters the cell.

 

Scripted teleporting may trigger CellChanged if the script is global or targeted (local scripts will not trigger it). (Forum info / Zennorious, Tamandra)

 

Note:

CellChanged doesn't always trigger, even if the player enters the cell via a normal teleport door. Possibly scripts running in the cell can have some effect on this, somehow. ForceGreeting seems to muck it up in particular (and no there wasn't a menumode return in that script).

 

> ...список столь велик, что перебором это не решить.

 

да хоть все что есть... только нужно помнить об ограничениях в скриптах:

вложенность elseif - что-то около не более 10

размер скрипта - до 30 кб

 

в конце проверки из первого вызывается второй и т.д...

Ссылка на комментарий
Поделиться на другие сайты

> ...есть мнение, хоть и недоказанное, что cellchanged не сработает при телепортации.

это из Morrowind_Scripting_for_Dummies_8.1, а вот в 9.0:

 

 

 

> ...список столь велик, что перебором это не решить.

 

да хоть все что есть... только нужно помнить об ограничениях в скриптах:

вложенность elseif - что-то около не более 10

размер скрипта - до 30 кб

 

в конце проверки из первого вызывается второй и т.д...

Забыли упомянуть ограничение в символах и строках
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Ув. olol, простите мне мой английский, но на мой взгляд, в вашей цитате из девятой редакции MSD приведено ровно тоже самое, что я написал. Что cellchanged не сработает при телепортации:

It doesn’t return 1 for scripted teleporting or magic teleporting.

И что хуже, есть уточнение, что CellChanged может не сработать даже при обычном перемещении через дверь:

CellChanged doesn't always trigger, even if the player enters the cell via a normal teleport door.

Однако, вы разумеется правы, не стоит плодить лишние сущности. Уже сделал список локаций, постараюсь разбить их поэффективнее на малые части и проверить через массив скриптов. Спасибо за ваши с mortuus советы насчет скриптов. От себя добавлю, что не стоит забывать и про максимальное количество возможных условий if-elseif в одном скрипте (127). С учетом множественных проверок это даже более важно, чем максимальный размер скрипта.

____

P.S.:

внушительный список меньше тысячи локаций? Тогда строчек вам хватит.

Больше.

Ссылка на комментарий
Поделиться на другие сайты

Больше.

Stopscript A

Startscript B

Но если бы вы точнее объяснили чего хотите, то, возможно, вам что-то более дельное посоветовали.

Ссылка на комментарий
Поделиться на другие сайты

mortuus

Да, спасибо, olol уже это предлагал, действительно гораздо более "чистый" способ с точки зрения загрязнения игрового мира. Гораздо более трудоемкий, чем предложенный мной, но чистый.

Но если бы вы точнее объяснили чего хотите, то, возможно, вам что-то более дельное посоветовали.

По сути, если вкратце - прикручиваю озвучку Вильи из Скайрима к компаньону в Морр. Как это выглядит с точки зрения моего вопроса: по таймеру компаньон говорит фразу из заготовленного списка + в зависимости от местности + при наличии определенных условий расы/пола/здоровья/погоды/времени суток и т.д. Как-то так.

При использовании описанных мной меток, было бы достаточно раскидать их по локациям. А так, нужно over1000 локаций прописывать в скриптах. И по сути, что-то более дельное сложно предложить, все-таки скриптовый язык Морра весьма скуден, а MWSE я не буду использовать исходя из его некоторой глюковатости.

 

Но это уже не проблема, гораздо сложнее будет найти способ, чтобы враги не нападали на компаньона в драке (нечего у меня прокачку отбирать). Конечно, можно сделать компаньона трусом, чтобы он сразу убегал, но в таком случае враги иногда начинают его преследовать, а такой паровоз это уже ни в какие ворота... Самое обидное, что та же Emma явно пыталась решить эту проблему в своих плагинах, но ни один из её способов не работает. Пока что не придумал ничего умнее, чем дать каждому зверю\изначально_агрессивному_npc скрипт, либо встроить в его скрипт, если он есть:

if DontAttackCompanion == 1
 if GetTarget id_Companion == 1
	  StopCombat
	  StartCombat, Player
 endif
endif

 

Но затронуть столько npc - это индусский код чистой пробы. Думаю, что сделаю две версии: с возможностью режима пацифиста и без.

Ну вот как-то так, объяснил поточнее все свои текущие трудности, с которыми столкнулся, спасибо за внимание и за прошлые и будущие советы)

Ссылка на комментарий
Поделиться на другие сайты

> Scripted teleporting may trigger CellChanged if the script is global or targeted (local scripts will not trigger it). (Forum info / Zennorious, Tamandra)

разве это не говорит о том, что работает, но только в глобальных и направленных скриптах ?

 

> CellChanged может не сработать даже при обычном перемещении через дверь... & ForceGreeting...

это имеет значение, когда nps говорит фразу добавляющую игроку квестовые топики.

и при случайном несрабатывании которых может испортиться сюжет.

 

а при обычных приветствиях - без разницы (типа: вздохнул, почесался...)

ну, даже если и не сказал и что ?

Ссылка на комментарий
Поделиться на другие сайты

разве это не говорит о том, что работает, но только в глобальных и направленных скриптах ?

Ну как сказать, "may trigger" еще можно перевести, как "может сработать, а может и не сработать, как повезет". В общем, как и с дверьми. Привносит в рандом еще больший рандом, но работать с этим можно, конечно.

Ссылка на комментарий
Поделиться на другие сайты

я не знаток анГельского...

 

ситуация, когда что-то не срабатывает, связана именно с многократными запусками других скриптов.

в этом случае меняется порядок их обработки и часть скриптов может запуститься в следующем фрейме

 

т.е. CellChanged (как впрочем и другая одноразовая проверка) может не сработать в последующих скриптах,

но если она будет только в первом, то проблемы быть не должно.

Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...
Скриптом можно добавить один левельный список в другой левельный список?
Ссылка на комментарий
Поделиться на другие сайты

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

Все ID объектов в морке уникальны и ошибок быть не должно.

Ссылка на комментарий
Поделиться на другие сайты

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

Все ID объектов в морке уникальны и ошибок быть не должно.

 

Понятно. Значит будем тестить. Спасибо за ответ, Олол!

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Есть у меня два вопроса.

 

1) Работает довольно длинный глобальный скрипт, в котором много проверок на предметы и сложение количества найденных. Если сначале его поставить "Return" при условии "If ( MenuMode == 0 )", он будет меньше грузить игру вне инвентаря, чем без такого разворота? Обратная проверка часто используется в скриптах только потому, что просто нет смысла их выполнять в статичном инвентаре или же они могут заметно замедлить работу с интерфейсом?

 

2) Функция Menumode == 1 сработает в любом меню или только в собственно инвентаре? Конкретно интересуют интерфесы контейнеров и инициализация диалога с НИП.

Ссылка на комментарий
Поделиться на другие сайты

Есть у меня два вопроса.

 

1) Работает довольно длинный глобальный скрипт, в котором много проверок на предметы и сложение количества найденных. Если сначале его поставить "Return" при условии "If ( MenuMode == 0 )", он будет меньше грузить игру вне инвентаря, чем без такого разворота? Обратная проверка часто используется в скриптах только потому, что просто нет смысла их выполнять в статичном инвентаре или же они могут заметно замедлить работу с интерфейсом?

 

2) Функция Menumode == 1 сработает в любом меню или только в собственно инвентаре? Конкретно интересуют интерфесы контейнеров и инициализация диалога с НИП.

 

Возможен вариант, когда скрипт должен отрабатывать в конкретном меню инвентаря (например, открыв конкретный контейнер), тогда можно использовать запуск глобального скрипта из локального. Таким образом я делал проверку на забор аппаратуры в контейнерной алхимии. Сами локальные скрипты на аппаратуре работают только во время активации и запускают нужный глобальный скрипт.

Ссылка на комментарий
Поделиться на другие сайты

режим меню-моде - сам по себе тормозной до ужаса.

именно по этому и стараются его не нагружать лишним.

 

любой интерфейс и диалог - это меню-моде (с книгами из-за этого есть проблемы).

Ссылка на комментарий
Поделиться на другие сайты

Если бы задача была описана более явно, то можно было бы получить более детальный ответ, а может быть и альтернативное решение задачи.
Ссылка на комментарий
Поделиться на другие сайты

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...