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

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


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

Смотри, платформа должна загрузиться до того как игрок на нее телепортируется, во время загрузки локации. Это есть. Потом игрок должен железно стоять на ней, не убирай ее сразу, пропусти пару кадров для верности. Потом дизейбли ее, потом пропусти кадр, и потом fall.
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Fall - это падение, а не спуск. Если резко убирается платформа из под ног, то без нее NPC будет висеть в воздухе.

Также спускает вниз летающие существа.

Не летающие оказываются сразу внизу. На скалах NPS скользит за счет касания со скалой.

 

Чтоб спустить или поднять NPS нужно плавно смещать платформу.

Мне раньше приходилось подбирать скорость платформы для старого проекта обливион, чтоб NPS не проваливался при быстром подъеме.

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

Всем добрый день еще раз (кому уже надоедал по данному вопросу). В общем, некоторое время я делал плагин с балансом под себя, в целом, был почти доволен, но одной из никак не поддающихся частей данного творения стали скрипты, дающие (точнее, заставляющие) НПС пить зелья здоровья, маны и усталости с регулярной четкостью. Данные скрипты мне помогали делать два товарища, Муурн Шепард и olol, за что им огромное спасибо, но увы, что-то идет не так и полностью адекватно эти скрипты работать не хотят. Общая концепция была такова- есть общий скрипт для большинства НПС в игре, не затронутых иными скриптами, заботливо мной развешенный вручную на тонну НПС, так или иначе агрессивно или потенциально агрессивно настроеннных к ГГ - его название:  A_A_NPC_USING_POTION, и его текст здесь:

 

begin A_A_NPC_USING_POTION
float timerHealth
float timerMag
float timerFat
short doOnce
 
if ( doOnce ); NPC мертв
  return
elseIf ( OnDeath ); NPC умер
 set doOnce to 1; фиксируем смерть
 return
endif
if ( timerHealth > 0 ); если задан таймер задержки
  set timerHealth to ( timerHealth - getsecondspassed ); уменьшаем таймер
elseif ( GetEffect, sEffectRestoreHealth ); еще не кончился эффект
elseif ( GetHealthGetRatio < 0.5); стало мало жизни
  if ( GetItemCount "p_restore_health_e" > 0 ); есть в наличии бутылек
    Equip, "p_restore_health_e" 1; выпить бутылек
        set timerHealth to 3; задаем три секунды таймеру
  elseif ( GetItemCount "p_restore_health_q" > 0 ); проверка на следующий бутылек если нет предыдущего
    Equip, "p_restore_health_q" 1
    set timerHealth to 3
  elseif ( GetItemCount "p_restore_health_c" > 0 )
    Equip, "p_restore_health_c" 1
    set timerHealth to 3
  elseif  ( GetItemCount "p_restore_health_s" > 0 )
    Equip, "p_restore_health_s" 1
    set timerHealth to 3
  elseif  ( GetItemCount "p_restore_health_b" > 0 )
    Equip, "p_restore_health_b" 1
    set timerHealth to 3
  endif
endif
;---------------------------------Магия
if ( timerMag > 0 ); если задан таймер задержки
  set timerMag to ( timerMag - getsecondspassed ); уменьшаем таймер
elseif ( GetEffect, sEffectRestoreSpellPoints ); еще не кончился эффект
elseif ( GetMagicka < 100); стало мало маны
  if ( GetItemCount "p_restore_magicka_e" > 0 ); есть в наличии бутылек
    Equip, "p_restore_magicka_e" 1; выпить бутылек
        set timerMag to 3; задаем три секунды таймеру
  elseif ( GetItemCount "p_restore_magicka_q" > 0 ); проверка на следующий бутылек если нет предыдущего
    Equip, "p_restore_magicka_q" 1
    set timerMag to 3
  elseif ( GetItemCount "p_restore_magicka_c" > 0 )
    Equip, "p_restore_magicka_c" 1
    set timerMag to 3
  elseif  ( GetItemCount "p_restore_magicka_s" > 0 )
    Equip, "p_restore_magicka_s" 1
    set timerMag to 3
  elseif  ( GetItemCount "p_restore_magicka_b" > 0 )
    Equip, "p_restore_magicka_b" 1
    set timerMag to 3
  endif
endif
;----------------------------Усталость
if ( timerFat > 0 ); если задан таймер задержки
  set timerFat to ( timerFat - getsecondspassed ); уменьшаем таймер
elseif ( GetEffect, sEffectRestoreFatigue ); еще не кончился эффект
elseif ( GetFatigue < 100); стало мало сил
  if ( GetItemCount "p_restore_fatigue_e" > 0 ); есть в наличии бутылек
    Equip, "p_restore_fatigue_e" 1; выпить бутылек
        set timerFat to 3; задаем три секунды таймеру
  elseif ( GetItemCount "p_restore_fatigue_q" > 0 ); проверка на следующий бутылек если нет предыдущего
    Equip, "p_restore_fatigue_q" 1
    set timerFat to 3
  elseif ( GetItemCount "p_restore_fatigue_c" > 0 )
    Equip, "p_restore_fatigue_c" 1
    set timerFat to 3
  elseif  ( GetItemCount "p_restore_fatigue_s" > 0 )
    Equip, "p_restore_fatigue_s" 1
    set timerFat to 3
  elseif  ( GetItemCount "p_restore_fatigue_b" > 0 )
    Equip, "p_restore_fatigue_b" 1
    set timerFat to 3
  endif
endif
end

 

 

Для НПС, уже имеющих некие скрипты, данный скрипт копировался с изменением названия, и был создан специальный активатор, на который был повешен скрипт-свитчер (помещен в Имперскую канцелярию на старте игры), под названием A_A_ACTIVATOR_USING_POTION, его текст здесь:

 

begin A_A_ACTIVATOR_USING_POTION
 
short doOnce
 
if ( doOnce )
   Return
endif
 
Set doOnce to 1
"Orvas Dren Druglord"->StartScript "A_Orvas_USING_POTION"
"draramu hloran"->StartScript "A_draramu_hloran"
"bolvyn venim"->StartScript "A_bolvyn_venim"
"Satyana"->StartScript "A_Satyana"
"relas arothan"->StartScript "A_relas_arothan"
"sovisa adas"->StartScript "A_sovisa_adas"
"durus marius"->StartScript "A_durus_marius"
"derar hlervu"->StartScript "A_derar_hlervu"
"alvur hleran"->StartScript "A_alvur_hleran"
"dondir"->StartScript "A_dondir"
"sorkvild the raven"->StartScript "A_sorkvild_the_raven"
"mavus ules"->StartScript "A_mavus_ules"
"Frinnius Posuceius"->StartScript "A_Frinnius_Posuceius"
"Hrargal the Crow"->StartScript "A_Hrargal_the_Crow"
"Aebondeius Jucanis"->StartScript "A_Aebondeius_Jucanis"
"Manos Othreleth"->StartScript "A_Manos_Othreleth"
"Ranes Ienith"->StartScript "A_Ranes_Ienith"
"Navil Ienith"->StartScript "A_Navil_Ienith"
"Furius Acilius"->StartScript "A_Furius_Acilius"
"Varus Vatinius"->StartScript "A_Varus_Vatinius"
"ulath-pal"->StartScript "A_ulath_pal"
"ahaz"->StartScript "A_ahaz"
"baladas demnevanni"->StartScript "A_baladas_demnevanni"
"arius rulician"->StartScript "A_arius_rulician"
"oritius maro"->StartScript "A_oritius_maro"
"lugrub gro-ogdum"->StartScript "A_lugrub_gro_ogdum"
"brilnosu llarys"->StartScript "A_brilnosu_llarys"
"bjadmund"->StartScript "A_bjadmund"
"ormax geles"->StartScript "A_ormax_geles"
"gulitte cienne"->StartScript "A_gulitte_cienne"
"banden indarys"->StartScript "A_banden_indarys"
"eno romari"->StartScript "A_eno_romari"
"Salas Valor"->StartScript "A_Salas_Valor"
"gavis velas"->StartScript "A_gavis_velas"
"milyn faram"->StartScript "A_milyn_faram"
"Ahnia"->StartScript "A_Ahnia"
"Golena Sadri_a"->StartScript "A_Golena_Sadri_a"
"dandras vules"->StartScript "A_dandras_vules"
"Black Dart Adren"->StartScript "A_Black_Dart_Adren"
"Black Dart Malar"->StartScript "A_Black_Dart_Malar"
"yarnar"->StartScript "A_yarnar"
"armion"->StartScript "A_armion"
"Hloggar the Bloody"->StartScript "A_Hloggar_Bloody"
"tirer belvayn"->StartScript "A_tirer_belvayn"
"gothren"->StartScript "A_gothren"
"reynel uvirith"->StartScript "A_reynel_uvirith"
"ulyne henim"->StartScript "A_ulyne_henim"
"lorbumol gro-aglakh"->StartScript "A_lorbumol_gro_aglakh"
"trebonius artorius"->StartScript "A_trebonius_artorius"
"eydis fire-eye"->StartScript "A_eydis_fire_eye"
"sarayn sadus"->StartScript "A_sarayn_sadus"
"nels llendo"->StartScript "A_nels_llendo"
"dreynis nothro"->StartScript "A_dreynis_nothro"
"sjoring hard-heart"->StartScript "A_sjoring_hard_heart"
"farvyn oreyn"->StartScript "A_farvyn_oreyn"
"vala herennius"->StartScript "A_vala_herennius"
"Fjol"->StartScript "A_Fjol"
"kashtes ilabael"->StartScript "A_kashtes_ilabael"
"emul-ran"->StartScript "A_emul_ran"
"synette jeline"->StartScript "A_synette_jeline"
"umbra"->StartScript "A_umbra_script"
 
end

 

 

Предполагалось, что этот глобальный скрипт будет запускать нацеленные индивидуальные скрипты на тех НПС, что в нем указаны (именные скрипты), а большинство остальных в игре будут запускаться автоматически на НПС, на которых они развешены.

Прошло несколько дней тестов. В общем, данная система скриптов не хочет работать корректно, какие бы мы варианты не перебирали с товарищем olol. Причем, нельзя сказать, что скрипты не работают полностью. Но четкой работы нет. Часто возникают ошибки вроде этих (как на глобальном с нацеленными, тк и в локальных):

Script Error: EXPRESSION in A_A_NPC_USING_POTION
Right eval
Script Error: EXPRESSION in A_ahaz
Right eval
Script Error: EXPRESSION in A_Aebondeius_Jucanis
Right eval

Ситуации самые разные. Персонаж может идти по дороге за переделами города - и выплывает ошибка, дается вариант выбора, если нажать "No" - игра вылетает. Если нажать Yes - в данной ячейке (например, если это локальный скрипт A_A_NPC_USING_POTION) - скрипт перестает работать. Иногда эти ошибки не возникают при повторной загрузке с более старого сейва, но потом могут потом появиться снова. Почти гарантированно возникают, если вернуться в ту же локацию, где уже был, но там остался недобитым НПС, на котором и висел этот скрипт. Плюс еще постоянно вылезающие ошибки по нацеленным скриптам для НПС, с которыми я еще даже близко не встречался! Иногда можно играть 1,5 - 2 часа, и никаких ошибок не выползает - а потом вдруг снова. Я убирал\ставил снова запятые после Equip, проверял синтаксис по руководству MSFD - результатов это не давало.

Для сравнения - в этом же моде у меня есть активатор-скрипт, "запускающий" броню на многих существах в игре, тоже глобальный с нацеленными скриптами в нем, но там ошибок не возникает...У кого есть конструктивные мысли\советы, как можно, наконец, доработать эти скрипты до их полной работоспособности. Есть мнение, что, может, надо устраивать скриптам некие проверки на дистанции, дабы все они отключались, как только ГГ удаляется из ячейки, но в каком именно ключе это должно быть прописано?

Я бы еще понял, если все было так плохо, и не работало НИЧЕГО. Но были, как я уже говорил, часы тестов, когда НПС исправно пили свои зелья стамины, здоровья и маны, отчаянно не желая сдаваться и умирать, а потом на ровном месте в игре возникали ошибки.

 

Прилагаю свой ESP для проверки на всякий случай. Надеюсь на помощь, спасибо заранее!

 

 

 

MorrowindAgain.zip

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

Запускать нацеленный скрипт в незагруженную локацию с незагруженным неписем, звучит как очень плохая затея.
Ссылка на комментарий
Поделиться на другие сайты

Запускать нацеленный скрипт в незагруженную локацию с незагруженным неписем, звучит как очень плохая затея.

 

А поконкретнее? Как я уже говорил, проблема не только в нацеленных, но и в локальных...

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

А поконкретнее? Как я уже говорил, проблема не только в нацеленных, но и в локальных...

Когда непись незагружен, то его параметры ещё не определены, они вычисляются только при загрузке непись, поэтому скрипт там вечно проверяет непонятно что, он не падает спустя три секунды только потому, что там нет активных действий. Right eval означает что переменная не определена. Локальные лучше потестить отдельно.

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

Когда непись незагружен, то его параметры ещё не определены, они вычисляются только при загрузке непись, поэтому скрипт там вечно проверяет непонятно что, он не падает спустя три секунды только потому, что там нет активных действий. Right eval означает что переменная не определена. Локальные лучше потестить отдельно.

 

Что значит "не падает" спустя 3 сек? 

И что надо делать...а локальные смысл тестить отдельно, если и так ясно, что игра в них тоже видит что-то не то (а что именно, я хз)...

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

Что значит "не падает" спустя 3 сек? 

И что надо делать...а локальные смысл тестить отдельно, если и так ясно, что игра в них тоже видит что-то не то (а что именно, я хз)...

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

А как вы понимаете, что локальный скрипт косякнул?

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

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

А как вы понимаете, что локальный скрипт косякнул?

 

 

Периодически при запусках сейвов вылезает:

Script Error: EXPRESSION in A_A_NPC_USING_POTION (локальный скрипт большинства НПС, как я писал выше)

Right eval

Также иногда вылезает при приближении агрессивного НПС в локации, иногда вообще ниоткуда при прогулка по городам и весям. 

post-8386-0-43474400-1577641726.jpg

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

Периодически при запусках сейвов вылезает:

Script Error: EXPRESSION in A_A_NPC_USING_POTION (локальный скрипт большинства НПС, как я писал выше)Right eval

Также иногда вылезает при приближении агрессивного НПС в локации, иногда вообще ниоткуда при прогулка по городам и весям.

Я бы посоветовал больше заглушек поставить. ГГц

If ( getdisabled )

Rsturn

Endif

If ( menumode )

Return

Endif

Почему два elseif идут подряд без какой либо команды внутри блока? Лучше проверять сначала параметр, который уменьшился, а потом geteffect, причем не elseif geteffect, # а if geteffect, # == 0

Это просто советы, я осмотрел бегло.

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

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

 

возможно глобальные сбоят и мешают локальным

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

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

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

 

возможно глобальные сбоят и мешают локальным

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

 

Как мне сейчас отключить глобальные и продолжить тест? Просто удалить их игры и оставить лишь локалку? И почему тогда глобальные скрипты, вешающие броньку на кричуров, работают норм, и ошибок не выдают?

 

ПС Сейчас удалил глобалку со всеми "именными скриптами". Запустил сейв, зашел в ячейку с НПС под локалкой. Ошибки не было никакой (не считая ругательств касательно отсутствующих скриптов глобальных при запуске), ИИ начал пить зелья и убил меня. Но при еще одной перезагрузке с того же сейва ИИ уже не пил ничего и просто дал себя быстро убить. Т.е. локалка тоже по-своему нестабильна, или я что-то не понимаю о перезапусках сейвов в одной сессии игры?

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

для проверки достаточно удалить активатор запускающий глобальные скрипты и начать новую игру

сохранялки для проверки не предсказуемы

 

бутылки отличаются от брони своим эффектом, окончание их действия видимо сбоит в игре

если локалки будут сбоить, то это уже баг движка и тогда нужно сообщить это для МСР или смотреть нужно в ОпенМВ.

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

для проверки достаточно удалить активатор запускающий глобальные скрипты и начать новую игру

сохранялки для проверки не предсказуемы

 

бутылки отличаются от брони своим эффектом, окончание их действия видимо сбоит в игре

если локалки будут сбоить, то это уже баг движка и тогда нужно сообщить это для МСР или смотреть нужно в ОпенМВ.

У меня просто есть ощущения, что локалки тоже "падают" либо после вторичного посещения локации с недобитым неписем с локалкой на нем, либо повторной подгрузки сейва игры в одной сессии, или, наооборот, зависают даже после того, как ГГ ушел, и, как следствие, глючат. Может, подстраховаться какой-то проверкой на дистанцию все же, дабы скрипт отключался при отдалении\уходе героя от локации?

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

скрипт не работает при уходе из ячейки, дистанция вряд ли поможет.

а вот убирать труп сразу после убийства пока не кончилось действие бутылька не нужно

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

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

скрипт не работает при уходе из ячейки, дистанция вряд ли поможет.

а вот убирать труп сразу после убийства пока не кончилось действие бутылька не нужно

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

 

Я не удаляю трупы. Никогда.

В общем, я сделал, как вы сказали - убрал глобалки вообще. Создал тестового сильного перса, погнал тестить.  Зашел в Аддамасартус, Зайнсипилу и Рамимилк. В первых двух пещерах бегал, перезаходил в помещение по 2-3 раза, выходил из игры и загружался - ошибок не было, правда, игра 2 раза вылетела прямо в бою, чего раньше у меня никогда не было. Потом дошел до Рамимилка, и мне еще на входе - та -дам! Уж не знаю, это сглюкнули персы в самой локации, или меня ДОГНАЛ скрипт, зависший в какой-то из передыдущих локаций (хотя там все работало идеально). После этого в самом Рамимилке из 4 персон только 1 или 2 хоть как-то пили зелья.

Script Error: EXPRESSION in A_A_NPC_USING_POTION

Infix to postfix

Вылетает ошибка, снова...как видите, локальный скрипт тоже не хочет работать корректно на постоянной основе.

Вопрос...что же мне делать?

Ты говорил насчет передачи инфы в MCP.

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

я с MCP не связывался, помню фриц русской морки передавал автору.

 

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

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

я с MCP не связывался, помню фриц русской морки передавал автору.

 

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

 

А что это такое за режим?

Вот, пожалуйста.

Morrowind.7z

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

Просто хотелось бы получить более-менее четкий ответ касательно целесообразности дальнейшей работы с данным скриптом. На все мучительные попытки итак с перерывами уже ушло полгода, в праздники хотелось бы хоть немного поиграть. Т.е. если шансов нормально наладить его нет, и проблема на уровне движка-глючности скриптовой команды, я забиваю и делаю иные, более банальные способы усилить НПС в игре. Просто тут вроде все еще немало матерых монстров моддинга на форуме, в т.ч. спецов по скриптам, и немного странно, что до этого никто или даже не задавался мыслью слепить такой скрипт для разнообразия игры, или, имея вагон опыта скриптописания, не имеет никаких идей касательно возможных ошибок, по причине которых не работает именно данный вариант.

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

 

ПС Не может ли быть ошибкой отсутствие переменной для функциональной команды Equip, хотя  в руководстве ее не нашел для NPC, только для ГГ (Short OnPCEquip  и Short PCSkipEquip)?

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

трудно исправить ошибку которой нет...

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

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

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

трудно исправить ошибку которой нет...

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

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

А нужна ли цифра 1 после наименования зелья? Ведь итак больше 1 не выпивает на 1 раз? Или это несущественно?

 

Equip, "p_restore_health_b" 1 или просто Equip, "p_restore_health_b" ?

 

 

 

How to make a NPC drink a potion

The short answer is: you can't. Neither in Morrowind alone, nor with Tribunal. Apparently NPCs could be made to use a potion with Equip in Morrowind, where the function is broken; I haven't seen this myself. In Tribunal/Bloodmoon, where Equip does work, the PC can be made to "equip" (drink/eat) potions and foodstuffs/ingredients, but not put on wearables, while NPCs can be made to equip wearables (clothes and armour) but not potions - they are "equipped", ie. separated from the stack like a worn item of clothing, but not drunk - or scrolls, or ingredients/edibles, to which the same applies; and all "equipped" scrolls, potions and ingredients are unequipped as soon as any of them are lifted from the inventory via companion share. The only item type both PC and NPC can be made to equip is weapons.

So, how about AIActivate? Apparently this can make NPCs open loaddoors and pick up weapons. This function was likewise broken and said only to work with potions before Tribunal, although it doesn't seem to work with potions at all. I tested some situations and the results were inconsistent, probably because I didn't know what I was doing: did the item have to be in the NPC's inventory, or (as with loaddoors) outside and close to the NPC? AIActivate was said to make NPCs pick up a weapon, which suggested the latter. In any case, AIActivate will not work with a potion name (if the code was in the result field, an error check in TESCS produces a message that a creature/NPC of that name can't be found; the same message also appears when typing the code in the console) and won't do anything while the dialogue window is open. In the console, while leading Menelras (a buyable slave) around, I used PlaceAtMe to create a Scroll of Vigor and "menelras->AIActivate sc_vigor" to make him pick it up and read it: this caused a loop in which new scrolls were being opened for taking or closing (by the PC!) all the time until the game crashed - because scrolls (like soulgems, see What NPCs will and won't use) are always aimed at the PC? Maybe that's why NPCs won't use scrolls that were not in their inventory when they were created. When a potion is placed near the NPC and the NPC is told "NPC->AIActivate potion" in a script, nothing happens.

On a potion in a companion's inventory, AIActivate seemed to work if there was only one of the chosen item in the inventory. If it wasn't in the inventory at all, then AIActivate didn't work unless I used AddItem to add something different as well. To quote my (tidied-up) notes: 

 

Case: NPC has no potions in inventory, "NPC->AIActivate potionname". 

The first time this is used, nothing happens. After a different potion is added and used with AIActivate, it works. This seems to be reset by changing the NPC's health from the console. 

Case: NPC has no potions in inventory, "NPC->AddItem potionname 1", "NPC-> AIActivate potionname". 

It works and the potion disappears from the inventory. 

Case: NPC has no potions in inventory, "NPC->AddItem potionname 1", "NPC-> Equip potionname". 

It works and the potion disappears from the inventory. (Equip should not need AddItem, but else the encumbrance might be messed up.) 

 

But then it didn't work any more, or maybe it never really had worked, so I gave up and tried a different approach.

I took up the suggestion of MSFD9: make a spell that does the same as the potion (which is a spell cast on the drinker) and use that spell instead, also removing one potion from the inventory to give the impression of having used it. There were several options:

  • An ability, plus timer code. The ability, a constantly self-casting spell just like a disease, is added, then removed when the timer runs out. Advantage: the drinker stands still and doesn't do the spellcasting animation. Disadvantage: keeping track of the timers, which requires scripts and makes it difficult to apply to more than one NPC. Also, an ability can't stack, ie. I can't lower a NPC's intelligence 20 points per jug of sujamma. Actually drinking the potion does make the effects stack.
  • A spell that works on self, cast by the drinker on the drinker. Advantage: a spell has its own timer. Disadvantages: the effects don't seem to stack, casting it again when "drinking" a second potion just prolongs its duration; the drinker goes through a spellcasting animation; and since Cast needs an explicit target even for spells cast on self and the only reliably present target is "player", it seems that the drinker is attacking the player. Paralyzing the drinker while the spell takes effect does not work, as the spellcasting animation is simply delayed until the paralysis is lifted.
  • A touch spell cast on the drinker by someone else. Advantages: the spell has its own timer and the drinker doesn't move. Disadvantages: the effects don't stack and the caster can't cast on just anyone, the target has to be put after the command, so this is only useful for one NPC, like a companion, and not for just any old NPC you meet. The caster can be anywhere, so you can have a spell cast by the distant, hidden Lord Cluttermonkey, but must be alive (getting Ralen Hlaalo to cast spells didn't work) or the spell can be cast by an object or static, but in that case the object/static must be nearby or still loaded in memory, else having it cast a spell through a script will abort the script, even if its "persistent" box is ticked, and in any case the casting will fail.
  • A spell that works on self, cast using ExplodeSpell. Advantage: the spell has its own timer, and no target is needed, since ExplodeSpell is supposed to be cast on itself (by objects rather than actors), so it can be used on any NPC. Major disadvantage: ExplodeSpell doesn't exist in Morrowind, it was added in Tribunal. Other disadvantages: the drinker still casts a spell, but now turns around and away from the PC to do so, and the effects don't stack.

What absolutely doesn't work: giving the NPC a weapon with a "cast once" enchantment. Say, a sword that, each time it's wielded, makes the NPC's health go up by 20. That would stack every time the sword was re-wielded, right? Just make the NPC wield the sword with StartCombat, quickly followed by StopCombat to nip the accompanying verbal abuse in the bud. Nope. Apparently such enchantments can't be cast, least of all on self, except through a scroll, which NPCs can't be scripted to use. Weapons only have "cast when used", so the NPC has to clock someone, or "permanent effect" which is no use when simulating potion-quaffing. Or there's the option where the actor casts a spell added to the spell list by wielding/wearing an item (like Fargoth's healing ring), which actors also can't be scripted to do.

 

 

 

ВОТ нашел на буржуйском сайте, судя по всему, тоже ничего не удалось через эти команды, чувак сдался и начал через спеллы. И тоже не сильно преуспел.

В общем, вот и ответ, походу. Функция СЛОМАНА, судя по всему, юзание зелий через Equip на нормальной рабочей основе невозможно, ибо это рабочая команда для шмота и одежды, и Трибунал проблему не решил, поэтому то, что написано в описании MCP - неправда.

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

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

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

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

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

Если движок теряет указатель после его выпивания, то есть вероятность, что это поможет

А поточнее? Так?

 

if ( GetItemCount "p_restore_health_e" > 0 ); есть в наличии бутылек

    AddItem "p_restore_health_e"" 1

    Equip  "p_restore_health_e" 1; выпить бутылек

    RemoveItem "p_restore_health_e"" 1

        set timerHealth to 3; задаем три секунды таймеру

  elseif ( GetItemCount "p_restore_health_q" > 0 ); проверка на следующий бутылек если нет предыдущего

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

Можно так или Add, Remove, Equip, Add, Remove.

Все это пляски с бубном, но есть вероятность того, что это поможет.

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

Можно так или Add, Remove, Equip, Add, Remove.

Все это пляски с бубном, но есть вероятность того, что это поможет.

Увы. Не помогло, вдобавок каждый второй бой игра стала вылетать.

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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

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

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