Вверх Вниз


  • Страница 101 из 101
  • «
  • 1
  • 2
  • 99
  • 100
  • 101
Модератор форума: Kris†a™, Multigone  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Вопросы по скриптам Papyrus
sansuli  Offline Сообщение №1 написано: 31 Августа 2012 в 17:29 | Отредактировано: Multigone - Четверг, 23 Апреля 2020, 17:24


The Red Sun


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


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


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

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

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
yakor77  Offline Сообщение №3001 написано: 07 Декабря 2020 в 00:23 | Отредактировано: yakor77 - Понедельник, 07 Декабря 2020, 00:29


Странник


28
Фродо01, идея красивая, свежая, но... опасная. Если в Скайриме начнется эпидемия, и все жители станут вампирами, будет очень плохо. Вводя яд, сразу надо готовить и противоядие. Подумайте, какой должна быть магическая вакцина, антивампирская прививка, чтобы эпидемию остановить и погасить. И соотв. квест от ярлов к Довакину. Да, и переболевшим и выздоровшим хорошо бы добавить какой-нибудь полезный вампирский перк. Остаточный и слабенький. Например, ночное зрение на 1 чвс. Повышенную сопротивляемость к ядам, болезням, холоду... ну, что-нибудь этакое.

С уважением.
Маг Иридий.
CYNIC78  Offline Сообщение №3002 написано: 07 Декабря 2020 в 18:39 | Отредактировано: CYNIC78 - Понедельник, 07 Декабря 2020, 19:04


Странник


4
Здравствуйте. Вопрос к знатокам папируса и CK.
У меня есть кастом раса и мне нужно сделать так чтоб на ней НЕ работали все эффекты восстановления здоровья - restore health, включая эффекты восстановления при помощи зельев. По задумке мода игрок должен восстанавливаться через команду Game.GetPlayer().ResetHealthAndLimbs(). Скрипт повешен на объекты, при активации которых происходит полное восстановления здоровья.
Как блокировать восстановление здоровья ванильными способами (с помощью магии восстановления и зелий) наиболее эффективно и надежно? Самый тупой способ, до которого я пока додумался это добавить в creation kit к соответствующим магическим эффектам условие, при котором эффект не срабатывает если у персонажа есть кейворд моей кастомной расы. При наличие данного условия все работает как надо - эффекты не срабатывают на моей расе, но тут же возникает проблема - если после моего мода будет загружен любой мод, меняющий магические эффекты зелий или соответствующих заклинаний восстановления, то, естественно, у них не будет данного условия и моя фича перестанет работать. Значит, нужно найти другой способ, например добавить к моей расе абилку, которая должна проверять и блокировать все эффекты восстановления здоровья, которые применяются на игроке во время игры. Но как это сделать по проще и понадежнее? Или может есть другой способ, например, через скрипты? Заранее спасибо.

Dsion  Offline Сообщение №3003 написано: 07 Декабря 2020 в 19:09 | Отредактировано: Dsion - Понедельник, 07 Декабря 2020, 19:10



1286
CYNIC78, вроде, у перков есть entry point, позволяющая усилить или ослабить силу входящих заклинаний. Можно попробовать умножить силу заклинаний с кевордом хила на ноль. Хотя это я так - сам не проверял.
Но менять эффекты - точно лажа.

Multigone  Offline Сообщение №3004 написано: 07 Декабря 2020 в 22:10 | Отредактировано: Multigone - Понедельник, 07 Декабря 2020, 22:30



654
frodo01, вроде в Better Vampires это уже реализовано (заражение).

CYNIC78, есть моды, где здоровье добавляется скриптами (SomeActor.RestoreAV("Health", 10.0)). С этим-то что будешь делать? Еще здоровье меняется, если надевается шмот с бустом максимума здоровья (в этот момент к текущему здоровью прибавляется величина, равная бусту. То же самое происходит, если менять макс. здоровья командой ModAV). И с этим?
Я к тому, что, если озаботиться вопросами совместимости, то надо предусмотреть как можно больше вещей, касающихся твой идеи.

CYNIC78  Offline Сообщение №3005 написано: 07 Декабря 2020 в 23:53


Странник


4
Цитата Multigone ()
CYNIC78, есть моды, где здоровье добавляется скриптами (SomeActor.RestoreAV("Health", 10.0)). С этим-то что будешь делать? Еще здоровье меняется, если надевается шмот с бустом максимума здоровья (в этот момент к текущему здоровью прибавляется величина, равная бусту. То же самое происходит, если менять макс. здоровья командой ModAV). И с этим?Я к тому, что, если озаботиться вопросами совместимости, то надо предусмотреть как можно больше вещей, касающихся твой идеи.
Спасибо за замечания.
Насчет скриптовых объектов не подумал. В Скайриме как всегда, кажется , вроде, простая вещь, а начнешь реализовывать всплывает куча подводных камней, при чем на каждом шагу.  :) Баффы от зачарованного шмота, тоже проблема, хотя, в моем моде уже есть определенные штрафы за ношение ванильной брони (конечно на шмотках моего мода таких штрафов нет, а есть приятные плюшки), это частично компенсирует баффы на количество хп. Но ведь могут быть моды, в которых на броне висит тот же скрипт, восстанавливающий здоровье автоматически, что ломает всю идею. Впрочем, можно еще усилить штрафы за ношение ванильной и сторонней брони - сделать их еще жестче, что бы выгода от зачарования на здоровье была бы бессмысленна. Со шмотками вроде все проще, я тупо повесил способность на расу, которая добавляет штрафы при одевании вещей с ключевыми словами armor. А в шмотках, добавленных моим модом я специально не стал вставлять эти ключи и штрафов на них, соответственно нет. Понимаю, что туповато сделано, но меня пока устраивает.

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

Цитата Dsion ()
CYNIC78, вроде, у перков есть entry point, позволяющая усилить или ослабить силу входящих заклинаний. Можно попробовать умножить силу заклинаний с кевордом хила на ноль. Хотя это я так - сам не проверял.Но менять эффекты - точно лажа.

Спасибо за подсказку. Попробую сделать через перки. Если все получится, то хотя бы ванильные эффекты будут отсечены. Надеюсь получится. Обязательно отпишусь о результатах.

CYNIC78  Offline Сообщение №3006 написано: 08 Декабря 2020 в 04:46


Странник


4
Цитата yakor77 ()
нафига?
Суть не в том чтобы ослабить себя, а внедрить в геймплей способы исцеления заменяющие ванильные, способы, созданные специально под конкретную расу с учетом ее особенностей, - с уникальными заклинаниями, оружием, броней, и других уникальных объектов.  У моей расы есть как слабые так и сильные стороны и неспособность пользоваться стандартными зельями и заклинаниями - часть геймплея, помимо прочего это еще часть истории данной расы.
 Фишка в том, что эта система делает многие добавленные моим модом объекты необходимыми для прохождения, иначе нафига их вообще добавлять если ими никто не будет пользоваться? В какой-то мере это может осложнить игру, но и, надеюсь, сделает ее интереснее и разнообразнее, чем тупо прокладывать себе путь напролом вынося монстров и НПС пачками. В чем интерес такой игры, поясните?
 А лучше, подскажите как реализовать то что мне нужно, если, конечно есть что сказать.

Добавлено (08 Декабря 2020, 16:14)
---------------------------------------------

Цитата Dsion ()
вроде, у перков есть entry point
Еще раз спасибо. Вобщем, сделал перк, добавил Multiplier 0.00 в условиях проставил все заклинания с ключевыми словами healing и все сработало. Единственно пришлось добавить абилку на расу и в скрипте прописать добавление нужного перка, другого способа добавления перка чето не нашел.

Myprism  Offline Сообщение №3007 написано: 08 Декабря 2020 в 17:15


Физик


1620
У меня очередной дурацкий затык. Так всегда бывает, когда долго не работаю со скриптами. Почему
Код
Scriptname _HDTPhysics extends ObjectReference
Event OnEquipped(Actor akActor)
Debug.MessageBox(Self.GetBaseObject() as Armor)
endEvent

Всегда сообщает "none"?
Речь идёт об экипировке шмотки, на которой висит данный скрипт, на левельном актёре при первой встрече его в игре. Да, если важно, то актёр изначально мёртв. Шмотка экипируется, поэтому и событие срабатывает. Шмотка на актёре отображается правильно, но почему её не распознаёт скрипт?

Multigone  Offline Сообщение №3008 написано: 08 Декабря 2020 в 19:05 | Отредактировано: Multigone - Четверг, 10 Декабря 2020, 17:19



654
Myprism, потому что предмет, находящийся в инвентаре, но не (находящийся в алиасе / попавший в инвентарь из мира), не имеет собственного RefID? Т.к. твой Self - это ObjectReference.
В таких случаях, если скрипт планируется добавлять к нескольким разным предметам (т.е. использовать как шаблон), создают несколько Property, но заполняют только какой-то один, и заполняют именно тем предметом, которому этот скрипт добавлен:

Код
Armor Property MyARMO Auto
Weapon Property MyWEAP Auto
MiscObject Property MyMISC Auto
...

Event OnEquipped(Actor akActor)
   IF MyARMO
      Debug.MessageBox(MyARMO)
   ELSEIF MyWEAP
      Debug.MessageBox(MyWEAP)
   ELSEIF MyMISC
      Debug.MessageBox(MyMISC)
   ...

endEvent


Еще можно поместить актера в алиас, и узнавать экипированный предмет через OnObjectEuipped().

grumpos  Offline Сообщение №3009 написано: 02 Января 2021 в 22:32


Странник


24
Всех с наступившим! Нужна помощь со скриптом. Допустим, игрок подбирает Предмет. По умолчанию, этот Предмет оказывается в инвентаре игрока и исчезает из игрового мира. Как сделать так, чтобы Предмет оказался в инвентаре игрока, но не исчез из игрового мира, а отключился (Disable). А после того, как предмет удалится из инвентаря игрока, он вновь появился (Enable) там, откуда его взяли. Буду рад любой помощи.  :)

Myprism  Offline Сообщение №3010 написано: 03 Января 2021 в 10:21


Физик


1620
grumpos, существует событие: предмет попал в ваш инвентарь. Ваш инвентарь, это контейнер, и для него существует такое событие. Так же такое событие (смена контейнера) существует и для предмета. Вот в эти события мы можем вставить код манипулирования объектом. Но при этом заметьте, эти события происходят только в том случае, если игрок взял этот предмет. Иначе нам некуда вставлять свой код. В случае, если игрок выбросил этот предмет, можно отдать команду выбрасывания такого же предмета в интересующую нас локацию, причём, его можно перенести именно в назначенные координаты. А можно отреспавнить всю локацию, чтобы предмет там сам восстановился.

grumpos  Offline Сообщение №3011 написано: 03 Января 2021 в 11:34


Странник


24
Приоткрою завесу тайны ) Предмет - это мыло. В игре это выглядит так: мыло лежит на тумбочке (не в контейнере!), игрок берет это мыло и идет в душ. По окончании процесса (анимация запускается только при наличии у игрока мыла) оно удаляется из инвентаря игрока и вновь появляется на тумбочке. Локация всегда одна - дом игрока. Как должен выглядеть скрипт в части появления мыла? Можно как-то вместо удаления переместить его из инвентаря на прежнее место?

Multigone  Offline Сообщение №3012 написано: 03 Января 2021 в 11:49



654
grumpos, а это предмет с постоянным референсом? Т.е. находится в алиасе / размещен в мире через ObjectWindow? Если так, и если в инвентарь игрока не может попасть более одной его копии, то можно попробовать так:

Код
; На ObjectReference предмета.

ObjectReference Property MyMarker Auto ; Референс Х-маркера (Static), заранее размещенный в положенном месте.

Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
   IF akOldContainer == Game.GetPlayer()
      MoveTo(MyMarker)
   Endif
EndEvent

Или так:

Код
; На алиас игрока.

ObjectReference Property MyItem Auto ; Референс предмета.
ObjectReference Property MyMarker Auto ; Референс Х-маркера (Static), заранее размещенный в положенном месте.

Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
   IF akItemReference == MyItem
      MyItem.MoveTo(MyMarker)
   Endif
EndEvent

Если целевое место предмета находится в ванильной локации, вместо Х-маркера, чтобы не нарушать ее "ванильность", можно взять референс любого предустановленного предмета из этой локации, т.е. просто закинуть предмет туда. А когда предмет Event OnLoad(), выставить его координаты SetPosition(). Координаты места в локации смотреть в СК.

Чтобы предмет не респавнился вместе с локацией, у его референса нужно снять флаг Respawns (?).

Добавлено (03 Января 2021, 12:03)
---------------------------------------------
grumpos, в следующий раз, кхм, приоткрывай завесу тайны в формулировании вопроса.

Код
; В скрипт, управляющий анимацией.

MiscObject Property MyItem Auto ; Мыло.
ObjectReference Property MyMarker Auto ; Референс Х-маркера (Static), заранее размещенный в положенном месте.

Event ???
   Game.GetPlayer().RemoveItem(MyItem, 999)
   MyMarker.PlaceAtMe(MyItem)
EndEvent

emelya8307  Offline Сообщение №3013 написано: 03 Января 2021 в 17:22


Странник


16
Приветствую! Друзья, не могу разобраться с пакетами АИ. Почему не работает пакет в алиасе?
Создал квест, алиас актера. Алиас заполняется случайным уникальным персонажем, список персонажей есть в кондишенах алиаса. В алиасе создал пакет. Актер должен при страте квеста прийти в определенную локацию и находиться там.
Дело в том, что актер при старте квеста продолжают заниматься своими делами, и никуда не идёт. Алиас заполняется как надо, случайным персонажем из кондишенов. В пакете прописана локация и референс, возле которого он должен находиться и юзать маркеры. Если его принудительно фрагментом скрипта отправить в эту локацию, он там появляется и юзает маркеры, как положено.
Не идет. Смотрел похожий мод, там все работает, делал точно так же.
Вобщем долго рассказывать, может кто-то сталкивался с похожей проблемой?

Multigone  Offline Сообщение №3014 написано: 04 Января 2021 в 12:39



654
emelya8307, попробуй MyActor.EvaluatePackage().

emelya8307  Offline Сообщение №3015 написано: 05 Января 2021 в 00:59


Странник


16
Multigone, разобрался. На двери в локацию висел скрипт. Убрал скрипт с двери - актеры стали заходить, пакет заработал.

Myprism  Offline Сообщение №3016 написано: 05 Января 2021 в 08:50


Физик


1620
emelya8307, на некоторых дверях есть скрипты, которые запрещают проход всем, кроме ГГ.

emelya8307  Offline Сообщение №3017 написано: 12 Января 2021 в 01:20 | Отредактировано: emelya8307 - Вторник, 12 Января 2021, 01:20


Странник


16
Скажите, пожалуйста, как получить день недели? Мне нужно, чтобы событие происходило регулярно в определенный день недели. (Сандас, например). Как игра это вычисляет? Единственное, что нашел, это глобальная переменная GameDaysPassed, количество дней с начала игры. Как из нее вычислить текущий день недели? Заранее, спасибо.
blush

yakor77  Offline Сообщение №3018 написано: 12 Января 2021 в 12:53 | Отредактировано: Multigone - Вторник, 12 Января 2021, 19:17


Странник


28
Цитата emelya8307 ()
количество дней с начала игры. Как из нее вычислить текущий день недели?
- арифметически. Каждый день недели закономерно повторяется через 7 дней. Значит, надо делить на 7, и смотреть остаток от деления. Математики в таких случаях говорят про "вычет по модулю 7". Погуглите, например, как строятся "вечные календари".

С уважением.
Маг Иридий.
Multigone  Offline Сообщение №3019 написано: 12 Января 2021 в 20:10 | Отредактировано: Multigone - Вторник, 12 Января 2021, 22:17



654
emelya8307,
Получение дня недели:
Код
X = (GameDaysPassed.Value As Int + 6) % 7 + 1
Или: X = (Utility.GetCurrentGameTime() AS Int + 6) % 7 + 1

Где X - целое число от 1 до 7, соответствующее текущему дню недели, начиная с понедельника.

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

Код
Float fSomeDay = 3.25 ; Среда, 6 утра

FUNCTION Start()
   RegisterForSingleUpdateGameTime(fMod(fMod(fSomeDay, 7.0) - Utility.GetCurrentGameTime(), 7.0) * 168.0)
ENDFUNCTION

EVENT OnUpdateGameTime()
   Float fDaysWait = fMod(fMod(fSomeDay, 7.0) - Utility.GetCurrentGameTime(), 7.0) * 7.0
   IF fDaysWait < 0.01
      RegisterForSingleUpdateGameTime(168.0)
   ELSE
      RegisterForSingleUpdateGameTime(fDaysWait * 24.0)
   ENDIF
   ; Далее желаемые действия.
ENDEVENT

Float FUNCTION fMod(Float A, Float B = 1.0) ; Модуло.
    IF B
      RETURN A - Math.Floor(A / B) * B
    ENDIF
ENDFUNCTION

emelya8307  Offline Сообщение №3020 написано: 13 Января 2021 в 02:27


Странник


16
Multigone, спасибо огромное! Я конечно, сегодня тоже добился получения дня недели, но у меня трехэтажный уродливый код вышел. А у вас так всё элегантно и просто!

Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
  • Страница 101 из 101
  • «
  • 1
  • 2
  • 99
  • 100
  • 101
Поиск: