Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)

Вопросы по скриптам Papyrus
sansuli  Offline  Сообщение №1 написано: 31 августа 2012, 13:29 | Отредактировано: Multigone - 23 апреля 2020, 14:24


The Red Sun


193
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok


Тема регламентирована.


• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней.
• Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней.
• При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС.
• При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "
+" полезного сообщения.

Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
modgms_user  Offline  Сообщение №2611 написано: 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 помогает, но вот с последней, естественно, нет.

Multigone  Offline  Сообщение №2612 написано: 11 января 2018, 20:45



832

Error: Unable to call RegisterForSingleUpdate - no native object bound to the script object, or object is of incorrect type
Невозможно вызвать RegisterForSingleUpdate - нет объекта. Значит, эффект был снят в промежутке, когда выполнялся очередной onUpdate(). Даже если сделать проверку на наличие эффекта перед каждым RegisterForSingleUpdate (а их там 2), это не даст 100% гарантии, поскольку эффект может быть снят точно между проверкой и регистрацией. Типа так:


Код
Event onUpdate()
    ; ...
    IF self as sring != "[scriptname <None>]"
        ; в этот момент эффект внезапно! снимается.
        RegisterForSingleUpdate(1.0)
    ENDIF
endif
Endevent

Шанс этого ничтожен, но если эффекты распространенные, несколько могут и сработать таким образом.

Ну, я так думаю.

Вообще, такую конструкцию, как в том скрипте, я много раз где видел, никто с этим особо не парился. Ну да, в лог может кинуть ошибку. И... все.

sansuli  Offline  Сообщение №2613 написано: 12 января 2018, 17:05 | Отредактировано: sansuli - 12 января 2018, 17:05


The Red Sun


193
Так, ищу функцию для добавления предмета(брони/оружия) в избранное.
И функцию отнимающее управление частично (об Game.Enable/DisablePlayerControls знаю, но она не подходит).
Хотелось бы избирательно убрать управление, такие как ниже:

Если функции нет, то можно но ли как нибудь заблокировать выбранный контроль, или придется блокировать клавишу?

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Multigone  Offline  Сообщение №2614 написано: 12 января 2018, 18:47 | Отредактировано: Multigone - 12 января 2018, 18:49



832
Цитата sansuli

или придется блокировать клавишу

Как ты хочешь это сделать? Input позволяет получить клавишу контроля, или нажать / зажать / отпустить. Такого, чтобы разбиндить управление, там нет.
Когда я делал мод на прыжки, в меню менял управление с пробела на неиспользуемую клавишу, регистрировал пробел, и когда игрок нажимал его, через TapKey() нажимал эту неиспользуемую клавишу.
Ну а что поделать? Беседка построила кривую беседку, а мы продолжаем ее в чудесную башню (нет).

sansuli  Offline  Сообщение №2615 написано: 12 января 2018, 20:15 | Отредактировано: sansuli - 12 января 2018, 20:16


The Red Sun


193
Multigone, хотел добавлять в меню избранное объекты которые экипировал ГГ автоматически.

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
AlexeyVN  Offline  Сообщение №2616 написано: 16 января 2018, 20:40 | Отредактировано: AlexeyVN - 16 января 2018, 20:44



52
Здравствуйте, скажите пожалуйста через скрипт можно ли узнать, когда ГГ убил кого нибудь? (без SKSE)
Хочу сделать статистику убийств ГГ

Lexo  Offline  Сообщение №2617 написано: 17 января 2018, 15:46 | Отредактировано: Lexo - 17 января 2018, 15:44


Всепознающий мододел


223
Цитата AlexeyVN

когда ГГ убил кого нибудь

Тебе прям дату точную нужно отслеживать? Или просто количество убийств?

Если просто количество убийств, то тут 2 способа:

1) Скайримский - в Скайриме уже ведётся счёт твоих убийств. Насколько я понял, определяется глобальными. Выбери раздел Global и впиши в фильтр Kill - там будет много разных... и убийства риклингов, и драконов и т.п. Хочешь статистику вписать куда-то, то просто впиши (без ковычек) "< Global="здесь твоя глобальная, которую ты хочешь считать" >" и тебе будет высвечено число, например, в магическом эффекте. Это определит все убийства, которые уже были сделаны раньше и которые будут сделаны дальше.

2) Скриптом. Повесить на игрока магический эффект (Постоянный "на себя"), который будет плащом. Плащ распространяет эффект, на котором висит скрипт


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

В общем, надо больше данных... хотите конкретный ответ - задавайте конкретные вопросы...

Добавлено (17 Января 2018, 18:46)
---------------------------------------------
А вот теперь вопрос от меня:

Продвинутые ребята, подскажите, пожалуйста, есть способ скриптом отслеживать использование Ту'ума? Я пробовал через "Event OnSpellCast", выбирая при этом третье заклинание в крике, но это не дало никакого эффекта... не подскажите?


"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Dsion  Offline  Сообщение №2618 написано: 17 января 2018, 18:26



AlexeyVN, Lexo, попробуйте обое разобраться с запуском квестов по Story Manager Event. Там можно и убийство актора поймать, и каст заклинания. Хотя, может, от крика оно и не срабатывает.

AlexeyVN  Offline  Сообщение №2619 написано: 17 января 2018, 19:04 | Отредактировано: AlexeyVN - 17 января 2018, 19:07



52
Dsion, Здравствуйте, пробовал Story Manager Event. Проблема в том, что если спутник взят собой, то и его убийства зачитываются ГГ (не могу понять почему так)

Lexo  Offline  Сообщение №2620 написано: 18 января 2018, 16:05


Всепознающий мододел


223
Цитата Dsion

и каст заклинания

это-то я и обычным скриптом отследил... проблема именно с криками... квест, когда мы первый раз убиваем дракона, там есть "(Дополнительно: применить крик)"... я исковырял весь квест, но так и не понял, где там идёт отслеживание использования крика... в триггер-зоне, что ли?

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Aksyonov  Offline  Сообщение №2621 написано: 18 января 2018, 17:01 | Отредактировано: Aksyonov - 18 января 2018, 18:32



937
Может вопрос очень простой но... как скриптом скрыть сразу несколько объектов?
Больше 40? Если писать в ручную по одному очень долго, и не удобно - Object.disable()

А ещё как промотать время скриптом - функция в игре когда жмешь по кнопке T?

Lexo  Offline  Сообщение №2622 написано: 18 января 2018, 18:47


Всепознающий мододел


223
Цитата Aksyonov

скрыть сразу несколько объектов

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

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Aksyonov  Offline  Сообщение №2623 написано: 18 января 2018, 18:56



937
Цитата Lexo

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


А как используется зона? Сейчас просто решил вопрос подменой локации (Интерьера) С другими объектами которые мне нужно было убрать, но всё равно интересен способ с зоной? Можно по подробней чуть чуть, и да мне сейчас очень нужен скрипт что бы промотать время игровое - есть такой?

Dsion  Offline  Сообщение №2624 написано: 18 января 2018, 20:05 | Отредактировано: Dsion - 18 января 2018, 20:06



Цитата Lexo

квест, когда мы первый раз убиваем дракона


Там обычное OnSpellCast на алиасе игрока (MQ104PlayerScript). Весьма подозрительно, что у тебя оно не работает :)

Aksyonov  Offline  Сообщение №2625 написано: 18 января 2018, 20:17



937
Цитата Dsion

А к нему через enable parent привязано сколько нужно других объектов


Уже пробовал - создал Xmarker выбрал объекты которые нужно скрыть и в Enable Parent каждого из
них указал на Xmarker, сам Xmarker скрыл скриптом - disable() - зашел а объекты связанные не скрыты =_=

DarkVetal  Сообщение №2626 написано: 18 января 2018, 21:12

Aksyonov, в своё время добрые люди дали мне скрипты, с их помощью можно активатором включать или выключать предметы, или же включая одни предметы, выключать другие. Используются для подмены не горящих дров в камине на горящие с добавлением огня и дыма. Или просто расставить предметы в доме. Действует на людей и прочее (можно отключать лошадь или толпу фолловеров (делал отряд клонов, бегающих за Довакином)... Если интересует, скину с инструкцией...

Aksyonov  Offline  Сообщение №2627 написано: 23 января 2018, 14:55 | Отредактировано: Multigone - 22 апреля 2020, 12:58



937
Какой скриптовой командой можно заставить изменится стадию после пропуска времени? Конкретно нужно после сна на любой кровати. Такое возможно?

Dsion  Offline  Сообщение №2628 написано: 23 января 2018, 17:56 | Отредактировано: Dsion - 23 января 2018, 17:56



Aksyonov, а событие OnGetUp на игроке не срабатывает, когда тот встает? А там можно проверить, встал ли он именно с кроватки.

Aksyonov  Offline  Сообщение №2629 написано: 25 января 2018, 14:49 | Отредактировано: Aksyonov - 26 января 2018, 05:44



937
Цитата Dsion

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


За условие спасибо, а можно пример как все койки захватить - что бы стадия сменилось если игрок после допустим захода в тригер - если поспит после на любой кровати стадия изменился - слушайте был же квест где то с этим действием связан - если не ошибаюсь гильдия темного братства!? Точно - может там скрипт подглядеть - там тоже после получения записки вроде если поспать оказываешься теле портируешься в хижину можно и там посмотреть правильно понимаю? - В прочем а как в вашем примере использовать можно функцию OnGetUp?

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



20
Цитата Aksyonov

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


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

AlexeyVN  Offline  Сообщение №2631 написано: 30 января 2018, 21:28



52
Здравствуйте, подскажите пожалуйста как определить что у жертвы забрали душу в камень?

Multigone  Offline  Сообщение №2632 написано: 31 января 2018, 12:30



832
AlexeyVN, насколько я знаю, в Actor Values это никак не отражается. Если захват производится ванильным SoulTrap(), то тут можно мало что посоветовать.
Способ есть, но с побочными действиями. А именно: попытаться захватить душу мертвого актера, временно выдав игроку подходящий камень душ. Если душа есть, то захват будет успешен. Поскольку SoulTrap() работает только для игрока, для этого придется поменять в СК пустые камни душ, чтобы они могли складываться с заполненными изначально; из игры убрать сообщения (душа захвачена / нет камней душ). Если такое устраивает...

AlexeyVN  Offline  Сообщение №2633 написано: 31 января 2018, 12:49 | Отредактировано: Multigone - 22 апреля 2020, 12:41



52
Multigone, Мудрёно это как - то. Смысл такой - ГГ воскрешает мертвеца (навсегда) цена -15 здоровья и -10 силы
Код
Если воскрешённый умирает и не кто у него не захватывает душу
  здоровья и силы возвращаются к ГГ
иначе
  сообщение (часть вашей души захвачена в камень)
Всё

Multigone  Offline  Сообщение №2634 написано: 31 января 2018, 14:07



832
AlexeyVN, SoulTrap() не оставляет на актере никаких (видимых) следов своего выполнения. Но мы знаем, что она возвращает false, если:

1) Душа уже была захвачена (эта функция ранее успешно выполнялась на этом актере).
2) У заклинателя нет подходящего камня душ.

Исключив второй пункт (выдав игроку нужный камень), можно утверждать, что SoulTrap() вернет false, если захват происходил ранее, и true, если еще нет.


Мудрёно это как - то
Когда найдешь простой способ, не забудь сообщить, ладно?

AlexeyVN  Offline  Сообщение №2635 написано: 31 января 2018, 14:19



52
Цитата Multigone

Когда найдешь простой способ, не забудь сообщить, ладно?

Хорошо ))))
А если использовать HasMagicEffect может получиться?

Multigone  Offline  Сообщение №2636 написано: 31 января 2018, 14:46



832
AlexeyVN, давай по косвенным признакам:

- смерть актера
- наличие на нем эффекта захвата душ
- наличие у игрока подходящих камней ПЕРЕД смертью актера.

Третий пункт невозможно выполнить. А проверка после смерти актера, есть ли у игрока подходящий заполненный камень (который мог бы образоваться в результате захвата), ни о чем не говорит, т.к. неизвестно, не таскал ли его игрок до этого. Плюс, камень станет полным только в случае, если размеры души и камня совпадают, иначе получается камень вроде "Великий камень душ (крохотный)", который все еще считается пустым с точки зрения GetItemCount().

Поэтому моя версия ответа - нет, по косвенным признакам нельзя определить.

modgms_user  Offline  Сообщение №2637 написано: 31 января 2018, 18:22



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

Multigone  Offline  Сообщение №2638 написано: 31 января 2018, 19:33



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

AlexeyVN  Offline  Сообщение №2639 написано: 2 февраля 2018, 10:45 | Отредактировано: AlexeyVN - 2 февраля 2018, 10:48



52
Здравствуйте, помогите разобраться
Поменял цвет глаз через SetEyeTexture()
Можно ли обратно вернуть начальный цвет глаз
пробовал Game.GetPlayer().Reset() - какой то 33 кадр появляется но глаза приобретают начальный цвет

Multigone  Offline  Сообщение №2640 написано: 2 февраля 2018, 14:47



832
AlexeyVN, QueueNiNodeUpdate() не подходит?

Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск:





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