• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Изменение репутации для пользователя modgms_user
modgms_userOffline
Сообщение №2611
написано: 11 января 2018, 09:41
| Отредактировано: Multigone - 22 апреля 2020, 12:55
Приветствую. Есть вопрос по скрипта и особенностям. В все том же моде 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 перед есть и в ошибке вроде как наличие эффекта отображает, но всё равно ошибка:
[01/11/2018 - 10:34:02PM] Error: Unable to call GetMagnitude - no native object bound to the script object, or object is of incorrect type stack: [Active effect 12 on (FF001B58)].XTD_StatPercentage.GetMagnitude() - "" Line ? [Active effect 12 on (FF001B58)].XTD_StatPercentage.OnPlayerLevelUpEx() - "xtd_statpercentage.psc" Line 59
Опять же, до этого такого рода случаев не замечалось и в ошибках было обычно [None].XTD_StatPercentage.GetMagnitude() и против таких ошибок self as string помогает, но вот с последней, естественно, нет.
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
sansuliOffline
Сообщение №2613
написано: 12 января 2018, 17:05
| Отредактировано: sansuli - 12 января 2018, 17:05
Так, ищу функцию для добавления предмета(брони/оружия) в избранное. И функцию отнимающее управление частично (об Game.Enable/DisablePlayerControls знаю, но она не подходит). Хотелось бы избирательно убрать управление, такие как ниже:
Как ты хочешь это сделать? Input позволяет получить клавишу контроля, или нажать / зажать / отпустить. Такого, чтобы разбиндить управление, там нет. Когда я делал мод на прыжки, в меню менял управление с пробела на неиспользуемую клавишу, регистрировал пробел, и когда игрок нажимал его, через TapKey() нажимал эту неиспользуемую клавишу. Ну а что поделать? Беседка построила кривую беседку, а мы продолжаем ее в чудесную башню (нет).
Изменение репутации для пользователя sansuli
sansuliOffline
Сообщение №2615
написано: 12 января 2018, 20:15
| Отредактировано: sansuli - 12 января 2018, 20:16
Тебе прям дату точную нужно отслеживать? Или просто количество убийств?
Если просто количество убийств, то тут 2 способа:
1) Скайримский - в Скайриме уже ведётся счёт твоих убийств. Насколько я понял, определяется глобальными. Выбери раздел Global и впиши в фильтр Kill - там будет много разных... и убийства риклингов, и драконов и т.п. Хочешь статистику вписать куда-то, то просто впиши (без ковычек) "< Global="здесь твоя глобальная, которую ты хочешь считать" >" и тебе будет высвечено число, например, в магическом эффекте. Это определит все убийства, которые уже были сделаны раньше и которые будут сделаны дальше.
2) Скриптом. Повесить на игрока магический эффект (Постоянный "на себя"), который будет плащом. Плащ распространяет эффект, на котором висит скрипт
Код
; вписать какую-то переменную. Глобальную, числовую (int), дробную (Float), в которой будет вестись счёт. Допустим, это будет Global (GlobalVariable property gKilledCount auto)
Теперь при каждом убийстве будет заполняться глобальная. Но считаться будут только те убийства, которые совершены после того, как эффект начался. Так же можно диффиренцировать убийства, например, драконов отдельно, кроликов отдельно и т.п. Но тогда придётся на каждый вид существ свою переменную создавать.
В общем, надо больше данных... хотите конкретный ответ - задавайте конкретные вопросы...
Добавлено (17 Января 2018, 18:46) --------------------------------------------- А вот теперь вопрос от меня:
Продвинутые ребята, подскажите, пожалуйста, есть способ скриптом отслеживать использование Ту'ума? Я пробовал через "Event OnSpellCast", выбирая при этом третье заклинание в крике, но это не дало никакого эффекта... не подскажите?
AlexeyVN, Lexo, попробуйте обое разобраться с запуском квестов по Story Manager Event. Там можно и убийство актора поймать, и каст заклинания. Хотя, может, от крика оно и не срабатывает.
Изменение репутации для пользователя AlexeyVN
AlexeyVNOffline
Сообщение №2619
написано: 17 января 2018, 19:04
| Отредактировано: AlexeyVN - 17 января 2018, 19:07
Dsion, Здравствуйте, пробовал Story Manager Event. Проблема в том, что если спутник взят собой, то и его убийства зачитываются ГГ (не могу понять почему так)
это-то я и обычным скриптом отследил... проблема именно с криками... квест, когда мы первый раз убиваем дракона, там есть "(Дополнительно: применить крик)"... я исковырял весь квест, но так и не понял, где там идёт отслеживание использования крика... в триггер-зоне, что ли?
Может вопрос очень простой но... как скриптом скрыть сразу несколько объектов? Больше 40? Если писать в ручную по одному очень долго, и не удобно - Object.disable()
А ещё как промотать время скриптом - функция в игре когда жмешь по кнопке T?
мне кажется, что только вручную... если, конечно, все объекты не находятся в одной зоне...
А как используется зона? Сейчас просто решил вопрос подменой локации (Интерьера) С другими объектами которые мне нужно было убрать, но всё равно интересен способ с зоной? Можно по подробней чуть чуть, и да мне сейчас очень нужен скрипт что бы промотать время игровое - есть такой?
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №2624
написано: 18 января 2018, 20:05
| Отредактировано: Dsion - 18 января 2018, 20:06
А к нему через enable parent привязано сколько нужно других объектов
Уже пробовал - создал Xmarker выбрал объекты которые нужно скрыть и в Enable Parent каждого из них указал на Xmarker, сам Xmarker скрыл скриптом - disable() - зашел а объекты связанные не скрыты =_=
Aksyonov, в своё время добрые люди дали мне скрипты, с их помощью можно активатором включать или выключать предметы, или же включая одни предметы, выключать другие. Используются для подмены не горящих дров в камине на горящие с добавлением огня и дыма. Или просто расставить предметы в доме. Действует на людей и прочее (можно отключать лошадь или толпу фолловеров (делал отряд клонов, бегающих за Довакином)... Если интересует, скину с инструкцией...
Изменение репутации для пользователя Aksyonov
AksyonovOffline
Сообщение №2627
написано: 23 января 2018, 14:55
| Отредактировано: Multigone - 22 апреля 2020, 12:58
а событие OnGetUp на игроке не срабатывает, когда тот встает? А там можно проверить, встал ли он именно с кроватки.
За условие спасибо, а можно пример как все койки захватить - что бы стадия сменилось если игрок после допустим захода в тригер - если поспит после на любой кровати стадия изменился - слушайте был же квест где то с этим действием связан - если не ошибаюсь гильдия темного братства!? Точно - может там скрипт подглядеть - там тоже после получения записки вроде если поспать оказываешься теле портируешься в хижину можно и там посмотреть правильно понимаю? - В прочем а как в вашем примере использовать можно функцию OnGetUp?
Изменение репутации для пользователя modgms_user
modgms_userOffline
Сообщение №2630
написано: 26 января 2018, 07:04
| Отредактировано: Multigone - 22 апреля 2020, 12:40
AlexeyVN, насколько я знаю, в Actor Values это никак не отражается. Если захват производится ванильным SoulTrap(), то тут можно мало что посоветовать. Способ есть, но с побочными действиями. А именно: попытаться захватить душу мертвого актера, временно выдав игроку подходящий камень душ. Если душа есть, то захват будет успешен. Поскольку SoulTrap() работает только для игрока, для этого придется поменять в СК пустые камни душ, чтобы они могли складываться с заполненными изначально; из игры убрать сообщения (душа захвачена / нет камней душ). Если такое устраивает...
Изменение репутации для пользователя AlexeyVN
AlexeyVNOffline
Сообщение №2633
написано: 31 января 2018, 12:49
| Отредактировано: Multigone - 22 апреля 2020, 12:41
Multigone, Мудрёно это как - то. Смысл такой - ГГ воскрешает мертвеца (навсегда) цена -15 здоровья и -10 силы
Код
Если воскрешённый умирает и не кто у него не захватывает душу здоровья и силы возвращаются к ГГ иначе сообщение (часть вашей души захвачена в камень) Всё
- смерть актера - наличие на нем эффекта захвата душ - наличие у игрока подходящих камней ПЕРЕД смертью актера.
Третий пункт невозможно выполнить. А проверка после смерти актера, есть ли у игрока подходящий заполненный камень (который мог бы образоваться в результате захвата), ни о чем не говорит, т.к. неизвестно, не таскал ли его игрок до этого. Плюс, камень станет полным только в случае, если размеры души и камня совпадают, иначе получается камень вроде "Великий камень душ (крохотный)", который все еще считается пустым с точки зрения GetItemCount().
Поэтому моя версия ответа - нет, по косвенным признакам нельзя определить.
Приветствую снова. Есть ли способ определить, просматривает ли игрок какой-либо контейнер(сундук, мешок, труп, вещи спутника). Если подробней о проблеме, то все тот же мод Worlds Dawn с определенными условиями добавляет зачарованные или улучшенные вещи в некоторые контейнеры(или может зачаровать\улучшить имеющиеся). В моде скрипт один скрипт проверяет контейнеры на валидность, чтобы куда не следует не добавлялось, потом запускает отдельный скрипт для контейнера, который с определенными условиями может производить вышеописанные действия по добавлению\улучшению. В игре заметил, что обработка может происходить в момент просмотра такого контейнера игроком, вещи просто появляются на глазах, что выглядит нелепо. Пробовал в скрипт совать считывание объекта перед курсором через GetCurrentCrosshairRef и прерывать процесс, когда объект совпадает с обрабатываемым контейнером, ведь часто перед открытием прицел как раз наведен на контейнер. Но такой вариант не проходит когда игрок уже смотрит содержимое контейнера. Как можно попроще сделать это дело, чтобы и такие нелепости с появлением вещей на глазах предотвратить и сильно скрипт не утяжелить, не замедлить?. Не смог найти нужной функции. Onitemremoved\onitemadded тоже сработают только при удалении, добавлении вещи, да и о них пишут, что они могут тормоза вызвать, если, например, вещей много и использована кнопочка "забрать всё". Может что-то ещё попроще есть, чтобы в скрипте получить objectreference открытого игроком контейнера и сравнить с обрабатываемым скриптом?
modgms_user, можно перком Activate получить референс "активируемого" игроком объекта, сделать что нужно (проверить, положить предметы, еtс.) и потом активировать его по-настоящему.
Изменение репутации для пользователя AlexeyVN
AlexeyVNOffline
Сообщение №2639
написано: 2 февраля 2018, 10:45
| Отредактировано: AlexeyVN - 2 февраля 2018, 10:48
Здравствуйте, помогите разобраться Поменял цвет глаз через SetEyeTexture() Можно ли обратно вернуть начальный цвет глаз пробовал Game.GetPlayer().Reset() - какой то 33 кадр появляется но глаза приобретают начальный цвет