• Страница 1 из 1
  • 1
Форум » Записи участника [modgms_user]

Результаты поиска
modgms_user  Offline  Сообщение №1 | Тема: Вопросы по скриптам Papyrus написано: 19 декабря 2017, 18:14 | Отредактировано: Multigone - 22 апреля 2020, 13:06



20
Приветствую. Хотелось задать вопрос об одной проблеме, непонятной проблеме.
Проблема такая. В лог папирус периодически кидает сообщение об ошибке:


Есть код в скрипте:
Код
function OnUpdate()

   if PlayerRef.IsWeaponDrawn() || PlayerRef.GetAnimationVariableBool("bIsRiding") || PlayerRef.GetAnimationVariableBool("IsFirstPerson")
      if PlayerRef.GetAnimationVariableBool("IsNPC")
         PlayerRef.SetLookAt(PlayerRef as objectreference, false)
         PlayerRef.ClearLookAt()
         PlayerRef.SetAnimationVariableInt("IsNPC", 0)
      endIf
      self.RegisterForSingleUpdate(1.00000)
      return
   elseIf !PlayerRef.GetAnimationVariableBool("IsNPC")
      PlayerRef.SetAnimationVariableInt("IsNPC", 1)
   endIf
   if game.GetCurrentCrosshairRef() != none && math.Abs(PlayerRef.GetHeadingAngle(game.GetCurrentCrosshairRef())) < 90 as Float
      PlayerRef.ClearLookAt()
      PlayerRef.SetLookAt(game.GetCurrentCrosshairRef(), false)
   else
      PlayerRef.ClearLookAt()
      PlayerRef.SetLookAt(PlayerRef as objectreference, false)
   endIf
   self.RegisterForSingleUpdate(0.250000)
endFunction


И вроде как есть условие проверки на None: if game.GetCurrentCrosshairRef() != none
..но все равно периодически кидает указанную выше ошибку.

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

modgms_user  Offline  Сообщение №2 | Тема: Вопросы по скриптам Papyrus написано: 22 декабря 2017, 06:05 | Отредактировано: Multigone - 22 апреля 2020, 13:08



20
Цитата Dsion

нативные функции в этих скриптах выполняются очень медленно. А у тебя их досточно много между проверкой на None и установкой цели. Может, игрок успевает убрать прицел с цели, пока всё это выполняется.


Спасибо за наставление, посыл понятен. Действительно, автор другой, это redux-вариант мода Headtracking, что в сборке SLMP-GR, может ему тоже ссыль на ответ отправлю, или уже исправленный скрипт. Самостоятельно, в основном, только правки косяков в скриптах модов делались, которые авторы оставили по тем или иным причинам, чтобы игра стабильнее была. Подобные мысли про тормоза тоже были, но как-то не дошло, что значение Game.GetCurrentCrosshairRef() может измениться и занести заранее значение в переменную будет разумнее, ну и руки не дошли, поэтому, наверное, все же было полезно узнать здесь. Спасибо еще раз.

Добавлено (22 Декабря 2017, 09:05)
---------------------------------------------
Приветствую еще раз. Есть другой вопрос по ошибке в скрипте.
Есть скрипт из мода Worlds dawn, начинается так:
Код
Scriptname XTD_FortifyDecimal extends activemagiceffect

Event onEffectStart(Actor akTarget, Actor akCaster)
   ValueMod = self.GetMagnitude()/100.0


Бывает, порой часто, что кидает в лог следующую ошибку:


Часто группа таких ошибок находится недалеко от конца лога, в той сессии, когда произошел вылет игры. Пробовал добавлять проверку "if self as XTD_FortifyDecimal", но не прокатывает. Что-то можно ещё сделать, проверку какую, или нужно в других частях мода искать причину?

modgms_user  Offline  Сообщение №3 | Тема: Вопросы по скриптам Papyrus написано: 22 декабря 2017, 19:52 | Отредактировано: Multigone - 22 апреля 2020, 13:09



20
Цитата Multigone

попробуй так:


IF !akTarget тоже не прокатило, такая же ошибка в лог, только номер строки соответствующий, проверялось, естественно, с загрузкой игры, где мод ещё был выключен и скрипт еще не был загружен.
Возникла дурацкая мысль и вопрос, связанный с этим. Если, допустим, сделать условие "if self.GetMagnitude()" и спрятать под ним остальную часть, выполнится ли та основная часть кода, до endif, если будет ошибка в этом условии или же тупо будет проигнорирована строка условия if и будут тупо выполняться все остальные строки под ним? Тоесть, будет первая строка условия "if self.GetMagnitude()" и под ней, допустим, три строки кода, а потом endif и в случае ошибки перепрыгнет сразу за endif или будет просто дальше выполнять те три строки кода. Интересно узнать, как будет работать в такой ситуации.
Может еще что-то можно попробовать?

modgms_user  Offline  Сообщение №4 | Тема: Вопросы по скриптам Papyrus написано: 23 декабря 2017, 18:08



20
Multigone, в описанном выше моде Worlds dawn, в одном из скриптов видел условие "if target && target != NONE", а ведь по той же логике с условиями "if target" это то же, что и "target != NONE" и второе там избыточно и можно обойтись вместо этого просто условием "if target"? Считаю так, но мало ли, может в папирусе свои особенности еще какие есть.

По ошибке с self.GetMagnitude(), видимо все же, как писал выше о глупой идее, то даже если возникнет ошибка в условии "self.GetMagnitude()" и тогда будет пропущено всё, что стоит вложенное в это условие, до endif. Это конечно все равно будет вызывать ошибку и её регистрацию в логе, но по крайней мере можно предотвратить деструктивные изменения в дальнейшем скрипте, да и ошибка бы была в любом случае, но в условии, по крайней мере, не будет запущен спрятанный под условием код. Хотя бы как временное решение, меньше зло. Может еще что можно придумать, чтобы предотвратить ошибку с self.GetMagnitude() на OnEffectStart, в озвученном выше скрипте?
Пробовал прятать код под условия "if self as XTD_FortifyDecimal", "if akTarget"(и предложенный обратный "if !akTarget" с return), но не сработало, так и выдает ошибку, вот, пока только временно, засунув в условие self.GetMagnitude(), хоть как-то предотвратить выполнение кода, точнее последствий его выполнения, в виде искасяченных статов неписей, но идеально было бы вообще найти решение без ошибки в лог.
Видел моды, которые даже авторы годаим не могли довести до нормального состояния, а другие пользователи делали патчи, где в том числе и в скриптах исправляли казавшиеся неисправляемыми косяки, точно вспоминая LL мод Beeing Female и патч к нему, где автор писал[а] о множестве безрезультатных попыток исправить баги, которые рушили стабильность игры, были и другие моды с похожей историей, да и неофициальный патч к игре тоже имеет множество фиксов скриптов, на которые даже у разрабов игры руки не дошли.

modgms_user  Offline  Сообщение №5 | Тема: Вопросы по скриптам Papyrus написано: 25 декабря 2017, 17:48 | Отредактировано: Multigone - 22 апреля 2020, 13:11



20
По GetMagnitude в условии, сначала изменил скрипты, тестил, вроде видел только ошибку в условии и не было других, но потом, после более долгих тестов увидел две ошибка подряд:

Код
Error: Unable to call GetMagnitude - no native object bound to the script object, or object is of incorrect type
stack:
[None].XTD_ProcSelf.GetMagnitude() - "<native>" Line ?
[None].XTD_ProcSelf.OnEffectStart() - "xtd_procself.psc" Line 7
Error: Unable to call GetMagnitude - no native object bound to the script object, or object is of incorrect type
stack:
[None].XTD_ProcSelf.GetMagnitude() - "<native>" Line ?
[None].XTD_ProcSelf.OnEffectStart() - "xtd_procself.psc" Line 9

, т.е. после ошибки в условии. строка с присвоением, где тоже произошла записсанная в лог ошибка, также выполнялась. Это другой скрит, там их несколько таких с похожим присвоением. Получается, что все же, после ошибка в условии строка с условием просто игнорится, пишется ошибка в лог и продолжает выполнять дальше, по другому, эти две подряд ошибки, с указанием на обе строки с условием и присвоением, где было GetMagnitude , объяснить сложно.
Сделал другим способом, опять же, меньшим злом, убрал первое условие с GetMagnitude и после строки присвоения сделал проверку, чтобы выполнять только если значение больше нуля, т.к. вспомнил, что совал debug.trace и помнится, числовые переменные просто были равны нулю, когда была ошибка в self.GetMagnitude(). Все же одна ошибка- меньшее зло и пропуск последующего кода, во первых, сэкономит время папируса и не будет тормозить выполнением кучи лишних команд, а во вторых, предотвратит возможные отрицательные последствия выполнения кода с неправильными значениями.

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

modgms_user  Offline  Сообщение №6 | Тема: Вопросы по скриптам Papyrus написано: 26 декабря 2017, 10:03 | Отредактировано: Multigone - 22 апреля 2020, 13:11



20
Цитата Multigone

Конкретно в том скрипте - не будет никакого влияния на глобальную и AV актера, если GetMagnitude() вернет 0.0


Но код все равно будет выполняться и создаст лишнюю нагрузку впустую, выполнит рассчеты с неверным значением. В Worlds Dawn, из отрицательных эффектов, бывало, как раз ловил завышенные статы у компаньонов, когда они носили шмотки с чарами из этого мода.

А так, конечно, можно скрипт попробовать. Только там, в предложенном коде что-то не дошло. На onEffectFinish, понятно, цикл WHILE iLock < 2 крутится пока iLock меньше двух и не дойдет до конца onEffectStart где он станет равен 2, чтобы как раз описанную возможную ситуацию предотвратить, с нулевой длительностью эффекта, но на начале onEffectStart стоит WHILE iLock. WHILE iLock, это разве не крутить, пока переменная не примет какое-то значение, больше нуля? Или я просто запутался или там восклицательный знак перед iLock должен был быть, в начале onEffectStart, хотя цель наличия цикла в начале onEffectStart тоже не дошла.

modgms_user  Offline  Сообщение №7 | Тема: Вопросы по скриптам Papyrus написано: 26 декабря 2017, 13:17 | Отредактировано: Multigone - 22 апреля 2020, 13:12



20
Цитата Multigone

modgms_user, финиш должен ждать окончания старта. Старт должен ждать финиш


Ясно, свои особенности. Финиш понятно, там стоит цикл с WHILE iLock < 2 и пока выполняется начало эффекта, будет меньше двух, но на самом начале стоит цикл WHILE iLock, которому вроде как надо число отличное от нуля, чтобы выйти из цикла и продолжить, а iLock равно нулю изначально и в конце финиша. Или рассуждение ошибочно и там на самом деле должен стоять WHILE iLock, не WHILE !iLock? (речь про код предложенного примера скрипта и цикл в самом начале)

modgms_user  Offline  Сообщение №8 | Тема: Вопросы по скриптам Papyrus написано: 27 декабря 2017, 05:43 | Отредактировано: Multigone - 22 апреля 2020, 13:12



20
Вот не понятно, почему условие "if self as XTD_FortifyDecimal" не работает перед GetMagnitude(). Перед опробыванием последнего предложенного варианта скрипта засунул строку debug.trace перед return, чтобы, когда ошибка, выводила информацию о значении переменных. После очередного теста в игре смотрел лог и рядом с ошибкой с "Unable to call GetMagnitude" для XTD_FortifyDecimal была выведена отладочная вписанная строчка отладки: "XTD_FortifyDecimal > self=[XTD_FortifyDecimal ],ValueMod=0.000000". ValueMod, понятно, при ошибке с GetMagnitude() остался в значении ноль, но ведь self равен [XTD_FortifyDecimal ], т.е. вроде бы как self as XTD_FortifyDecimal должен был бы сработать в условии перед GetMagnitude(), но даже с ним, прямо перед GetMagnitude(), все равно отображалась ошибка.

Может как-то по другому надо условие прописать условие?

modgms_user  Offline  Сообщение №9 | Тема: Вопросы по скриптам Papyrus написано: 27 декабря 2017, 12:20 | Отредактировано: modgms_user - 27 декабря 2017, 12:23



20
Multigone, сразу подвох какой-то почувствовал, еще перед тем, как что-то делать..., но все равно сделал.
Сообщение отобразило 0.0000000, а в лог кинуло ошибку "Error: Unable to call GetMagnitude - no native object bound to the script object, or object is of incorrect type". Это такой ответ через предложенное действие, что при нулевой длительности происходит такое или просто для проверки? Показалось, что это ответ такой.
Если все таки это был ответ, то было бы полезно услышать о механике в таких ситуациях, вроде раз ноль длительности, то эффект был удален сразу, то брать магнитуду уже было неоткуда или в таком роде, корректными словами. Также было бы полезно узнать, как же все таки предотвратить ошибку, раз проверка if self не работала.

modgms_user  Offline  Сообщение №10 | Тема: Вопросы по скриптам Papyrus написано: 28 декабря 2017, 15:34 | Отредактировано: modgms_user - 28 декабря 2017, 15:35



20
Multigone, еще с предыдущей версии этого скрипта в игре столкнулся с одной очень неприятной проблемой, фпс стал падать с установленного 50-60-ти до 37-ми. Начало происходит сразу после начала тестов с той версией, где был добавлен while. Последний предложенный вариант уже постабильней, долго не падало, после хождений в Ривервуд, прохожденийя одной пещеры и только в пещерах Хелгена, там, где при обычном старте проходишь обучение, фпс опять упал до 38ми, м самое интересное, там, где валялись 4ре трупа(игра начата через альтернативный старт), в пещере перед мостом, где еще потом пауки и спящий медведь в нормальном старте, а в альтернативном у моста завален вход.

Сделал сохранение с просевшим фпс и потом сравнил с нормальным сохранением в Save Cleaner'е. В активных появились два скрипта XTD_FortifyDecimal. Для проверки конкретной причины в нихудалил их из активных клинером и сохранил. После загрузки сохранения с удаленными из активных указанными скриптами фпс вернулся до 60ти. Потом еще раз проверил, в том же месте, загрузил ближайшее нормальное, дошел до места и словил падение фпс, сделал сохранение, посмотрел, опять наличие двух экземпляров этого скрипта в активных, удалил оттуда и загруженное то же сохранение, но без экземпляров скрипта в активных, грузится в 60фпс, когда с ними сразу 38.
Может на этом цикле while застревает?

Потом отредактировал этот скрипт, добавив туда несколько debug.trace'ов в разных частях, с переменными, но после нескольких повторных попыток загрузки последнего сохранения с нормальным фпс, без этого скрипта, пока поймать падение фпс не получилось, т.к., видимо, зачарования каждый раз генерируются разные и последний предложенный вариант постабильней предыдущего, падение может наблюдаться только с отдельными зачарованиями, не со всеми, с которыми грузится экземпляр этого скрипта.
Поставлю шансы выпадения маг. вещей очень высокими и попробую еще попробовать побегать половить падение. Вообще странно, что и на мертвых телах эффекты действуюи, загружаются скрипты, потом может полезно будет добавить к ним, в esp, что-то вроде условия isdead 0, чтобы работали только на живых.
Вот, какие данные можно получить в Save Cleaner'е об указанных активных скриптах, если это хоть что-то даст. Кинул ссылку на архив с текстовыми файлами, т.к. текста прилично, а у меня здесь что-то форматирование сообщения не работает, только на MG.( rgho.st/ private/8h2T7Vh9P/e8dbf8659152a8ea255a97962159b672 ), в ссылке убрать пробел перед private.

modgms_user  Offline  Сообщение №11 | Тема: Вопросы по скриптам Papyrus написано: 29 декабря 2017, 06:37 | Отредактировано: Multigone - 22 апреля 2020, 12:50



20
Цитата Multigone

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


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

Попробую третий вариант в следующем забеге по тому же маршруту в игре. В этом моде, на самом деле есть несколько скриптов, ошибки в которых происходят с тем же GetMagnitude(). Кроме xtd_fortifydecimal ошибки происходят так же в таких скриптах Worlds Dawn как: xtd_statpercentage, xtd_procself, xtd_alchattributepercent и XTD_ProcOnBlockBuff. В них, пока использованы простые проверки или пробую аналоги предлагаемых вариантов, возможно, после нахождения оптимального варианта, без ошибок в лог, непредвиденных изменений статов персонажей и падения фпс, можно будет уже использовать что-то конкретное. В может есть и другие проблемы и вопросы, многое по балансу и известно из отзывов пользователей оригинальной версии, но это пока второе.

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

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

modgms_user  Offline  Сообщение №12 | Тема: Вопросы по скриптам Papyrus написано: 6 января 2018, 12:28 | Отредактировано: modgms_user - 6 января 2018, 15:35



20
Multigone, спасибо, особенности полезно знать, чтобы не пихать куда попало чего не следует или наоборот.

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

[b]Добавлено[/b] (06 Января 2018, 15:28)
---------------------------------------------
Приветствую в очередной раз. Делал тесты скрипта и мода в целом. В моде нашел один ломающий характеристики неписей баг, но о нем позже.

1)
По скрипту xtd_fortifydecimal. Смотрел в логе, сообщения об ошибках с GetMagnitude все равно встречаются. Появились кое какие размышления. В других скриптах этого мода, например в XTD_PlayerRecoveryScript, были также разные ошибки, например RegisterForSingleUpdate выдавал ошибку no native object bound... . В том случае я вставлял сразу перед RegisterForSingleUpdate проверку вроде "if target.HasMagicEffect(abRecovery.GetNthEffectMagicEffect(0))" и больше ошибок в логе не было. Так вот, относительно xtd_fortifydecimal, как магического эффекта и ранее обсуждавшейся ситуации возникновения ошибка с GetMagnitude из за снятия эффекта, несмотря на это, но выполнения строк скрипта до конца. Обдумывался вариант получить айди эффекта через что нибудь и засунуть его в строку "if target.HasMagicEffect(abRecovery.GetNthEffectMagicEffect(0))", вместо abRecovery. Но пока писал это сообщение подумал о более тупом способе и опробовал его на том тестовом заклинании и скрипте TEST777, что ранее предлагалось посмотреть.
Условие "if self as xtd_fortifydecimal" возвращает TRUE и равно "[xtd_fortifydecimal <Active Efffect ## on ########>]", когда есть еффект, или "[xtd_fortifydecimal <None>]", когда его нет.
Сначала подумал присвоить значение какой-нибудь переменной типа activemagiceffect, например ActEffect, но если ей присвоить значение через "ActEffect = self as xtd_fortifydecimal", в моем тестовом скрипте было "ActEffect = self as xtd_fortifydecimal", соответственно, в Debug.trace\messagebox такая переменная будет показывать значение None, но в моем тестовом скрипте условие "if ActEffect == None" все равно не выполнялось.
Тогда решил сделать проверку через строковую. Создал "string EffString", потом присвоил, в тестовом скрипте TEST777, значение через "EffString=(self as TEST777) as string" и после была проверка if EffString=="[TEST777 <None>]", которая уже прошла, ведь строковое значение self as TEST777 отличалось, в случаях когда эффект был или его не было. Можно и без переменной, полагаю, просто условием " if ((self as TEST777) as string) == "[TEST777 <None>]" ".
Может тупо так и предотвращать ошибку с следующим далее GetMagnitude? Может это можно прописать более быстрым вариантом? Кстати, какое условие легче и выполнится быстрее "if target.HasMagicEffect(SpellVisual.GetNthEffectMagicEffect(0))" или " if ((self as XTD_CombatBuffScript) as string) != "[XTD_CombatBuffScript <None>]" "?

2)
Касательно описанной большой проблемой мода. Ранее писал, что замечал, что с модом у неписей косячились показатели и в одной из тестовой игр, видимо, увидел причину, которая их портит. В моде Worlds Dawn, кроме зачарований, есть еще РПГ атрибуты(сила, выносливость, проворность, ловкость, интеллект, мудрость,харизма), которые имеют свои эффекты. На игроке они работают нормально, но они также могут оказывать эффект и на неписей, вроде спутников, т.к. присутствуют в зачарованиях на вещах, которые можно одеть на тех же компаньонов. Так вот, просматривая характеристики компаньона, случайно(или не очень), увидел, в каком случае характеристики запарывались. Первое, что увидел, чрезвычайно большой бонус от характеристик, аномально большой. Своему персу, для тестов, установил все указанные атрибуты в значение 100, чтобы видеть и насколько они несбалансированы, что надо уменьшать, и в случае чего, вот такие баги.
Посмотрел у спутника параметр AttackDamageMult, он был равен 1. Была шмотка с чарами +1 к силе, а сила здесь, одним из эффектов, имеет +к урону. Надел на спутника шмотку с +1 силы и увидел, что AttackDamageMult вырос с 1-го до 2.88, что, очевидно, мягко говоря перебор, соответственно, +10 к силе уже увеличивало до неприличных значений. Это при РПГ-атрибутах игрока в значении 100. Для сравнения, 100 силы у игрока увеличивает AttackDamageMult, если не ошибаюсь, до 1.77, но это 100 силы.
Проверил, там же в игре, понизил все атрибуты до 50-ти, сбросом через Debug мода и +1 силы стало давать компаньону, в общем-то, в два раза меньший бонус к AttackDamageMult.
Далее выяснил, тогда же, когда сбросил атрибуты, в какой ситуации AttackDamageMult остался измененным навечно. Когда менял атрибуты, то шмотка была надета на персонаже и когда шмотка была снята, эффект уменьшился только на величину, которая была при значении РПГ-атрибутов 50, и AttackDamageMult уже не вернулся в значение 1.
Примерно понял, что эти дела присваиваются в скрипте xtd_alchattributepercent, сначала попробовал немного поменять в указанном скрипте код, в надежде исправить баг, не прокатило, в результате, не нашел ничего лучше, чем просто отрубить процесс для неписей, оставив только для игрока, после чего неписи перестали получать бонусы от плюсов к рпг-атрибутам на надетых на них шмотках, но и дикие прибавки и навечно измененные значения характеристик также исчезли, вроде onlyplayer рпг-атрибуты.
Вообще, начал проверять эти дела после того, как увидел, что у спутника скорость в игре стала 1500 вместо ста и из шмоток была только та, что добавляла бонус от рпг-атрибута, притом значение росло по ходу игры, видимо, когда распределял атрибуты и в других ситуация, вроде переодевания шмоток и т.п. Думал, может чего накосячил в скриптах и вернул оригинальные, начал новую игру и проверил снова, с оригинальными были такие же дела. В XTD_AlchAttributePercent тоже есть вначале GetMagnitude в начале, тоже кидал те же ошибки иногда.

Может в XTD_AlchAttributePercent там какая ошибка есть в коде? Так-то код небольшой, и из XTD_AlchAttributePercent используется также и xtd_attributes, в котором задаются величины эффектов от рпг-атрибутов, баланс велечины которых - отдельный вопрос. Код скрипта могу кинуть, если надо, но вроде, как понял с xtd_fortifydecimal, исходники есть.
Не знаю, какой именно атрибут игрока влиял на бонус от силы для непися, не проверил еще, полагаю та же сила 100, бонус которой каким-то образом перемножается с бонусом силы для непися.
Может и onlyplayer атрибуты, с отключением кода для неписей, даже и лучше, но как бы это не повлияло на работоспособность многих эффектов от других зачарований. Видимо надо кучу debug-строк вставлять в скрипт и смотреть, что там чему равно.

modgms_user  Offline  Сообщение №13 | Тема: Вопросы по скриптам Papyrus написано: 7 января 2018, 19:40 | Отредактировано: Multigone - 22 апреля 2020, 12:54



20
Есть вопрос о скорости и затрачиваемых действиях в примере далее. Есть, допустим скрипт, в нем я, допустим, добавил необходимую проверку "IF self as string != "[Scriptname ]" ". Эта проверка по скрипту повторяется раз 5-10. Будет ли иметь смысл, с точки зрения скорости и затрачиваемого папирусом времени, добавить в начале определение переменной, например "string MEffectNone = "[Scriptname ] " и далее по скрипту заменить все проверки на "IF self as string != MEffectNone"? Будет ли это быстрее хоть как-то? Скомпилированный скрипт становится чуть меньше после таких изменений и часто это имеет смысл, особенно, когда много действий при присвоении выполняется, но здесь как-то не настолько прямо всё ясно.

modgms_user  Offline  Сообщение №14 | Тема: Вопросы по скриптам Papyrus написано: 11 января 2018, 09:41 | Отредактировано: Multigone - 22 апреля 2020, 12:55



20
Приветствую. Есть вопрос по скрипта и особенностям. В все том же моде World Dawn есть скрипты, где используется RegisterForSingleUpdate. Этот RegisterForSingleUpdate кидал ошибку "Unable to call RegisterForSingleUpdate - no native object bound to the script object, or object is of incorrect type", для ликвидации которых я использовал, в последний раз, условие "self as sring != "[scriptname ]" ", которое везде работало, кроме одного скрипта, где продолжало иногда кидать ошибку.
Засунал между условием и RegisterForSingleUpdate отладочное сообщение, чтобы посмотреть состояние разных переменных на момент ошибки. В логи было следующее:

Код
[01/10/2018 - 10:12:35PM] XTD_CombatBuffScript line 80 > target=[NPCPotions < (02003478)>]XTD_Debug.GetValue() as int=2, SpellVisual.GetNthEffectMagicEffect(0)=[MagicEffect < (920CA0CE)>], Self=[XTD_CombatBuffScript <Active effect 11 on (02003478)>], SpellVisual.GetNthEffectMagicEffect(0) as bool=TRUE, (target.HasMagicEffect(SpellVisual.GetNthEffectMagicEffect(0))) as bool=False
[01/10/2018 - 10:12:36PM] XTD_CombatBuffScript line 80 > target=[NPCPotions < (02003478)>]XTD_Debug.GetValue() as int=2, SpellVisual.GetNthEffectMagicEffect(0)=[MagicEffect < (920CA0CE)>], Self=[XTD_CombatBuffScript <Active effect 11 on (02003478)>], SpellVisual.GetNthEffectMagicEffect(0) as bool=TRUE, (target.HasMagicEffect(SpellVisual.GetNthEffectMagicEffect(0))) as bool=False
[01/10/2018 - 10:12:36PM] Error: Unable to call RegisterForSingleUpdate - no native object bound to the script object, or object is of incorrect type
stack:
[Active effect 11 on (02003478)].XTD_CombatBuffScript.RegisterForSingleUpdate() - "<native>" Line ?
[Active effect 11 on (02003478)].XTD_CombatBuffScript.OnUpdate() - "xtd_combatbuffscript.psc" Line 81

Отладочное сообщение вставил после условия (строка 79), перед RegisterForSingleUpdate. Этот скрипт работает для баффов, которые активируются в начале боя и какое-то время. Дело в том, что как помню, с оригинальным скриптом, до условия, ошибка была вида "[None].XTD_CombatBuffScript.RegisterForSingleUpdate() - "" Line ?". Но тут и вроде и эффект есть, типа self не None, но все равно иногда попадается ошибка. Это только в этом скрипте так, условие было добавлено после таких же ошибок и в другой скрит, но там нет такого.
С чем это может быть связано? Может быть каким-то другим способом можно предотвратить подобного рода ошибки? Может показывает, когда объект с эффектом мертв и нужно еще добавить какой-нибудь "!target.isDead", какие-то еще особенности?

ps
в последней тестовой игре похожая история получилась с GetMAgnitude. Проверкаs elf as string перед есть и в ошибке вроде как наличие эффекта отображает, но всё равно ошибка:

Опять же, до этого такого рода случаев не замечалось и в ошибках было обычно [None].XTD_StatPercentage.GetMagnitude() и против таких ошибок self as string помогает, но вот с последней, естественно, нет.

modgms_user  Offline  Сообщение №15 | Тема: Вопросы по скриптам Papyrus написано: 26 января 2018, 07:04 | Отредактировано: Multigone - 22 апреля 2020, 12:40



20
Цитата Aksyonov

Конкретно нужно после сна на любой кровати.


А событие OnSleepStop не подойдет?

modgms_user  Offline  Сообщение №16 | Тема: Вопросы по скриптам Papyrus написано: 31 января 2018, 18:22



20
Приветствую снова. Есть ли способ определить, просматривает ли игрок какой-либо контейнер(сундук, мешок, труп, вещи спутника). Если подробней о проблеме, то все тот же мод Worlds Dawn с определенными условиями добавляет зачарованные или улучшенные вещи в некоторые контейнеры(или может зачаровать\улучшить имеющиеся).
В моде скрипт один скрипт проверяет контейнеры на валидность, чтобы куда не следует не добавлялось, потом запускает отдельный скрипт для контейнера, который с определенными условиями может производить вышеописанные действия по добавлению\улучшению.
В игре заметил, что обработка может происходить в момент просмотра такого контейнера игроком, вещи просто появляются на глазах, что выглядит нелепо.
Пробовал в скрипт совать считывание объекта перед курсором через GetCurrentCrosshairRef и прерывать процесс, когда объект совпадает с обрабатываемым контейнером, ведь часто перед открытием прицел как раз наведен на контейнер. Но такой вариант не проходит когда игрок уже смотрит содержимое контейнера. Как можно попроще сделать это дело, чтобы и такие нелепости с появлением вещей на глазах предотвратить и сильно скрипт не утяжелить, не замедлить?. Не смог найти нужной функции. Onitemremoved\onitemadded тоже сработают только при удалении, добавлении вещи, да и о них пишут, что они могут тормоза вызвать, если, например, вещей много и использована кнопочка "забрать всё". Может что-то ещё попроще есть, чтобы в скрипте получить objectreference открытого игроком контейнера и сравнить с обрабатываемым скриптом?

modgms_user  Offline  Сообщение №17 | Тема: Вопросы по скриптам Papyrus написано: 5 февраля 2018, 12:59 | Отредактировано: Multigone - 22 апреля 2020, 12:47



20
Приветствую. Есть вопрос о целесообразности определенного кода. Есть такой мод NIOHighHeels, в нем есть скрипт со следующим фрагментом:
Код
Event OnDeath(Actor akKiller)
If effectActor
Self.RemoveEffect()
EndIf
EndEvent

Event OnUnload()
If effectActor
Self.RemoveEffect()
EndIf
EndEvent

Event OnCellDetach()
If effectActor
Self.RemoveEffect()
EndIf
EndEvent

Event OnDetachedFromCell()
If effectActor
Self.RemoveEffect()
EndIf
EndEvent

Function RemoveEffect()
Self.Dispel()
EndFunction

Т.е. при этих событиях установлено снимать эффект. Но в логе вижу периодические сообщения об ошибках:


Есть ли в этом коде вообще смысл? Может эффект прибивается при этих событиях и без надобности его снятия? Эффект поднимает перса, когда на нем высокие сапоги. Может этот кусок кода закомментировать?(точнее, я то закомментировал :) и проверю, но интересно узнать теорию. )

Просто на одной страничке с интерпретацией различных ошибок папируса читал вот такое:
When a magic effect is ready to expire, the Papyrus VM will aggressively destroy the instance of the script. It will generate errors like this if the script had an event pending before this happened.

modgms_user  Offline  Сообщение №18 | Тема: Вопросы по скриптам Papyrus написано: 6 февраля 2018, 18:36 | Отредактировано: Multigone - 22 апреля 2020, 12:48



20
Цитата Multigone

можно перком Activate получить референс "активируемого" игроком объекта, сделать что нужно (проверить, положить предметы, еtс.) и потом активировать его по-настоящему


Спасибо за совет, только пока, полагаю, не могу воспользоваться, если правильно думаю. Там есть какие-то особенности, где-то специально галочки надо поставить? Создал перк, сделал Entry Point Activate, выбрал активировать немедленно, вставил скрипт, записал в функцию Fragment_0 код и добавил debug.trace, чтобы проверить, работает ли, но строки в логе нет, хотя в сохранении скрипт есть. Пробовал и условия во все три места добавлять(для перка, для активирующего и активируемого), вроде условия для активирующего GetIsID=Player , в условия перка тоже условие добавлял, вообще удалял все условия, но проверочной строчки так и не увидел. Что-то где-то пропустил и дойти никак не может. Код примерно такой:

Код
Scriptname PRKF_XTDPerk_OnContainerActi_0458E509 Extends Perk Hidden

import XTDUtil

MiscObject Property WDToken Auto
FormList Property WDContainersBlacklist Auto
Keyword Property AnimalKeyword Auto

Function Fragment_0(ObjectReference akTargetRef, Actor akActor)
If akTargetRef && !(WDContainersBlacklist.HasForm(akTargetRef.GetBaseObject() as Form)) && !akTargetRef.HasKeyword(AnimalKeyword) && !akTargetRef.GetItemCount(WDToken)
akTargetRef.AddItem(WDToken,1)
Endif
debug.trace("PRKF_XTDPerk_OnContainerActi_0458E509 Fragment_0 Executed > akTargetRef="+akTargetRef+", akActor="+akActor)
akTargetRef.Activate(akActor)
EndFunction

В конце debug.trace, от которого ожидалась информация в логе, но информации нет.

modgms_user  Offline  Сообщение №19 | Тема: Вопросы по Creation Kit (продолжение старой темы) написано: 9 мая 2018, 04:41



20
Приветствую. Есть вопрос по магическим эффектам. Пытаюсь убрать использование скриптов для некоторых эффектов одного мода. Есть эффект, увеличивающий физический урон, его значение mag динамическое, без скрипта там можно выставить Value Modifier и Attack Damage Multiplier, но также необходимо, чтобы в описании отражалось, допустим, увеличение физического урона 10% или любое иное, но для данного эффекта значение mag, для десяти процентов, должно быть 0.1. Что можно сделать, чтобы, допустим, описание эффекта "Увеличение урона на <mag>%" отображало в игре "Увеличение урона на <10>%" и в игре этот множитель повышался на 0.1, т.е. те 10%?
Значение может быть динамическим, т.е. и 5, и 15, и любое другое, в разумных пределах. Может там вроде прицепленным перком можно изменить конечный эффект этого маг. эффекта на игрока, сделав его нужным или как-то по другому, без скриптов? Кратко говоря при значении mag 10 описание отобразит 10%, но конечный эффект должен увеличивать Attack Damage Multiplier на 0.1. Такое вообще возможно без скриптов?

Также по другому случаю, можно ли без скриптов реализовать эффект, например, то же увеличение урона на 10%, но только при начале боя и на 20 секунд, т.е. в начале каждого боя на 20сек. урон становился на 10% больше?

modgms_user  Offline  Сообщение №20 | Тема: Вопросы по скриптам Papyrus написано: 22 мая 2018, 04:34 | Отредактировано: Multigone - 22 апреля 2020, 12:39



20
Цитата Sithis380

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


Есть мод FNIS Spells, так он делает описанное, можно в нем посмотреть скрипты на заклинаниях.

Форум » Записи участника [modgms_user]
  • Страница 1 из 1
  • 1
Поиск:





Ответ на жалобу смотрите в разделе жалоб