Перейти к содержимому


Фотография

Вопросы по скриптам

papyrus help скрипты вопросы

  • Авторизуйтесь для ответа в теме

#741 Ссылка на это сообщение Potatoider

Potatoider
  • Знаменитый оратор


  • 4 350 сообщений
  •    

Отправлено

Тема для вопросов по скриптингу.

Функции папируса:

На английском

На русском (не все, но базис)



 




  • Авторизуйтесь для ответа в теме
Сообщений в теме: 832

#742 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

Добрый день.

Хочу сделать скрипт в котором при активации кнопки исчезала/появлялась определенная стена, однако не просто disable/enable, а чтобы была анимация исчезновения/появления. например через "effectshader property"

Знающие скриптеры подскажите как можно такое реализовать? Нечто похожее с исчезновением есть в Апокрифе у расширяющихся коридоров.

Ну так если есть коридоры - посмотри, как они устроены. Я в детали не лазил, но скорее всего там в самой стене это закодировано, через анимацию. Скриптом она только вызывается.

 

Самый простой способ добавить эффект - скастовать какой-нибудь визуальный explosion на нужный объект. Через PlaceAtMe, или как там этот аналог в папирусе прописан.



#743 Ссылка на это сообщение ломгом

ломгом
  • Новенький
  • 11 сообщений

Отправлено

Добрый день. Я снова по своему скрипту, теперь по детальней.

 

У меня есть активатор на основе сокета под парагон (на него я и вешаю скрипт) и кристалл который в него вставляется и активирует его. Так же есть стена, которая должна исчезнуть при активации сокета.

 

Вот мой код, который я сумел реализовать.

 

scriptName aaWallDisable01 extends ObjectReference

 

Bool property HasKey auto
ObjectReference property Wall auto (Это собственно будет стена которая должна исчезнуть)
message property DontHave auto (Сообщение что у меня нет нужного предмета)
miscobject property Stone auto (Это тот самый кристалл который вставляется в сокет)
EffectShader Property DisableEffect  Auto  (Это эффект при исчезновении стены)
EffectShader Property EnableEffect  Auto  (Это эффект при появлении стены)
Float Property ShaderTime  Auto (Это время в течение которого должна исчезнуть появится стена)

 

function OnActivate(ObjectReference akActionRef)
   if akActionRef == game.GetPlayer() as ObjectReference

      if HasKey == false
         if game.GetPlayer().GetItemCount(Stone as form) >= 1

            self.PlayAnimationAndWait("PlaceWhite", "Done")
            game.GetPlayer().RemoveItem(Stone as form, 1, false, none)
            Wall.Disable(false)
            HasKey = true
         else
            DontHave.Show(0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000)
         endIf

      else

         self.PlayAnimationAndWait("TakeWhite", "Done")
         game.GetPlayer().AddItem(Stone as form, 1, false)
         Wall.Enable(false)
         HasKey = false
     endIf
   endIf
endFunction

 

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

Я плохо разбираюсь в папирусе, поэтому не знаю переменных которые надо вписать


Сообщение отредактировал ломгом: 26 сентября 2021 - 13:53


#744 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

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

Я плохо разбираюсь в папирусе, поэтому не знаю переменных которые надо вписать

Ну, собственно, команда вот:

https://www.creation..._-_EffectShader

Подставляешь свою стену и эффект туда. Вписываешь в скрипт перед Disable (и после enable).

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



#745 Ссылка на это сообщение ломгом

ломгом
  • Новенький
  • 11 сообщений

Отправлено

Ну, собственно, команда вот:

https://www.creation..._-_EffectShader

Подставляешь свою стену и эффект туда. Вписываешь в скрипт перед Disable (и после enable).

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

Прописал по вашему совету. Ничего не изменилось

 

Bool property HasKey auto
ObjectReference property Wall auto
message property DontHave auto
miscobject property Stone auto
EffectShader Property DisableEffect  Auto 
EffectShader Property EnableEffect  Auto 
Float Property ShaderTime  Auto 

 

function OnActivate(ObjectReference akActionRef)
   if akActionRef == game.GetPlayer() as ObjectReference
      if HasKey == false
         if game.GetPlayer().GetItemCount(Stone as form) >= 1
            self.PlayAnimationAndWait("PlaceWhite", "Done")
            game.GetPlayer().RemoveItem(Stone as form, 1, false, none)
            DisableEffect.Play(Wall, ShaderTime)
            utility.Wait(ShaderTime)
            Wall.Disable(false)
            HasKey = true
         else
            DontHave.Show(0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000)
         endIf
      else
         self.PlayAnimationAndWait("TakeWhite", "Done")
         game.GetPlayer().AddItem(Stone as form, 1, false)
         Wall.Enable(false)
         EnableEffect.Play(Wall, ShaderTime)
         utility.Wait(ShaderTime)
         HasKey = false
      endIf
   endIf
endFunction

 

Эффекты не проигрываются

Может что то неправильно вписал, но компиляцию скрипт прошел


Сообщение отредактировал ломгом: 26 сентября 2021 - 15:39


#746 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

Эффекты не проигрываются

Может что то неправильно вписал, но компиляцию скрипт прошел

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

Поэкспериментируй с разными эффектами.

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



#747 Ссылка на это сообщение ломгом

ломгом
  • Новенький
  • 11 сообщений

Отправлено

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

Поэкспериментируй с разными эффектами.

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

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



#748 Ссылка на это сообщение Dragon055

Dragon055
  • Новенький
  • 1 сообщений

Отправлено

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

Сообщение отредактировал Dragon055: 17 октября 2021 - 08:03


#749 Ссылка на это сообщение aaa112aaa

aaa112aaa
  • Новенький
  • 28 сообщений

Отправлено

Обновлено! 

Кто шарит в скриптописании?
С этим уже разобрался: 

(а именно как с помощью jsonutil (PapyrusUtil) и fiss (FileAccess Interface) сохранять и загружать значения строк, сохранять то сохраняет, а вот загружать... Похоже если и загружает, то не присваивает значения переменным или присваивает, но не всегда.

Старая версия работает как надо, но есть задержка перед показом первого меню, собственно поэтому и решил заморочиться с условиями обработки в функции - "GetCellName()", чтобы каждый раз не перебирала все строки, а только те которые пустые и те которые отличаются (2 вводные переменные строк для этого).)

 

 

Теперь другая проблема.

Функция - GetCellName() 

 

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

 

Возможно ли оптимизировать время выполнения этой функции?

 

Если нужно будет, старые версии скриптов можете взять с моего мода, распакуйте BSA, там есть исходники  - https://www.nexusmod...tion/mods/57064

 

Решил пока сделать по простому, поэтому текста в скрипте много, вот собственно и эти скрипты:

 

Большая часть скрипта, остальная часть не важна, там функции "SetObjectiveDisplayed"

MarkAndRecallQuestScript

 

Второй скрипт полностью:

MarkAndRecallScriptEffect

Сообщение отредактировал aaa112aaa: 18 октября 2021 - 18:47


#750 Ссылка на это сообщение aaa112aaa

aaa112aaa
  • Новенький
  • 28 сообщений

Отправлено

С сохранением и загрузкой разобрался, всё работает. Теперь другой вопрос, он в посте выше, пост я отредактировал под новый вопрос. И текст скриптов скопировал сюда новый.


Сообщение отредактировал aaa112aaa: 18 октября 2021 - 18:50


#751 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

Возможно ли оптимизировать время выполнения этой функции?

 

Я так думаю, что дело не в самой функции, а в том, что ты вызываешь ее по 16 (?) раз.

Не проще ли при установке метки делать это один раз, писать результат в проперти типа стринг, и потом уже оттуда его в меню подтягивать?

Ну или вообще без проперти обойтись, тупо переменной. Квестовые скрипты активны постоянно, поэтому оно все равно никуда не пропадет.



#752 Ссылка на это сообщение aaa112aaa

aaa112aaa
  • Новенький
  • 28 сообщений

Отправлено

Я так думаю, что дело не в самой функции, а в том, что ты вызываешь ее по 16 (?) раз.

Не проще ли при установке метки делать это один раз, писать результат в проперти типа стринг, и потом уже оттуда его в меню подтягивать?

Ну или вообще без проперти обойтись, тупо переменной. Квестовые скрипты активны постоянно, поэтому оно все равно никуда не пропадет.

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

String Function GetCellName(ObjectReference O, String S1, String S2)
if (O.GetParentCell().IsInterior() == 0); Обработка Exterior
  If (O.GetCurrentLocation().GetName() != "")
   return (O.GetCurrentLocation().GetName() + " (Снаружи)")
  ElseIf ((O.GetCurrentLocation().GetName() == "") && (O.GetParentCell().GetName() == "")); Обработка World Space
   Int xcell = math.floor(O.getpositionX() / 4096 as Float)
   Int ycell = math.floor(O.getpositionY() / 4096 as Float)
   Int zcell = math.floor(O.getpositionZ())
   return ("Тамриэль " + xcell as String + " , " + ycell as String); Скайрим
  Endif
ElseIf (O.GetParentCell().IsInterior() == 1); Обработка Interior и дефолтный Cell
  If (O.GetParentCell().GetName() != "")
   If ((S1 == "Mark And Recall Markers Cell") && (S2 == "Пусто"))
   Else
    return (O.GetParentCell().GetName())
   Endif
  EndIf
EndIf
EndFunction

Сообщение отредактировал aaa112aaa: 18 октября 2021 - 20:34


#753 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

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

Ну, вообще, все зависит от реализации.

Я не понимаю, зачем у тебя такие сложности? Зачем вызывать функцию 16 раз?

Пометка-возврат делается же элементарно.

Кастуется пометка, выбирается слот, на точку игрока переносится определенный заранее созданный маркер. При касте возврата и выбора определенной строки, игрока на этот маркер телепортирует.

 

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

Плюс портянки эти с кодом - мне аж поплохело, когда я это все увидел, даже вникать глубоко не стал, что именно ты этими простынями делаешь =)



#754 Ссылка на это сообщение aaa112aaa

aaa112aaa
  • Новенький
  • 28 сообщений

Отправлено

Ну, вообще, все зависит от реализации.

Я не понимаю, зачем у тебя такие сложности? Зачем вызывать функцию 16 раз?

Пометка-возврат делается же элементарно.

Кастуется пометка, выбирается слот, на точку игрока переносится определенный заранее созданный маркер. При касте возврата и выбора определенной строки, игрока на этот маркер телепортирует.

 

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

Плюс портянки эти с кодом - мне аж поплохело, когда я это все увидел, даже вникать глубоко не стал, что именно ты этими простынями делаешь =)

Понял, сделал, проверяю. )



#755 Ссылка на это сообщение aaa112aaa

aaa112aaa
  • Новенький
  • 28 сообщений

Отправлено

Ну вроде всё оптимизировал на сколько возможно, меню показывает быстро, теперь другая проблема, сделал сохранение имени локации в которой стою в конфиг, а после от туда подтягиваю, и вставляю в функцию CenterOnCell() сначала всё было как надо, помечал, загружал сохранение предыдущее, делал возврат и о чудо, оказывался там где ставил метку, только вот пока это было всего 4 переменных (Имя локации, X, Y, Z), всё работала, а когда сделал на все 16 меток по 4 переменные, то функция CenterOnCell() перестало работать, есть какой альтернативный способ телепортации в локацию без использования указания цели (ObjectReference) ?

Или как сохранить ссылку на ObjectReference? что-то навроде ида, а потом выбирать по этому иду.


Сообщение отредактировал aaa112aaa: 20 октября 2021 - 16:04


#756 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

Ну вроде всё оптимизировал на сколько возможно, меню показывает быстро, теперь другая проблема, сделал сохранение имени локации в которой стою в конфиг, а после от туда подтягиваю, и вставляю в функцию CenterOnCell() сначала всё было как надо, помечал, загружал сохранение предыдущее, делал возврат и о чудо, оказывался там где ставил метку, только вот пока это было всего 4 переменных (Имя локации, X, Y, Z), всё работала, а когда сделал на все 16 меток по 4 переменные, то функция CenterOnCell() перестало работать, есть какой альтернативный способ телепортации в локацию без использования указания цели (ObjectReference) ?

Или как сохранить ссылку на ObjectReference? что-то навроде ида, а потом выбирать по этому иду.

Зачем тебе вообще CenterOnCell использовать?

Используй MoveTo с указанием объекта. Я ж не зря писал про маркеры в старом сообщении.

Берешь 16 маркеров, ставишь их куда-нибудь в служебную ячейку (лучше в ванильную, уже созданную), забиваешь их в проперти скрипта по номерам.

При касте пометки делаешь MoveTo на маркер под нужным номером, указывая целью игрока. Типа такого: ReturnMarker01.MoveTo(Player, abMatchRotation = true)

При касте возврата делаешь MoveTo на игрока, указывая целью маркер под нужным номером. Типа такого: Player.MoveTo(ReturnMarker01, abMatchRotation = true)

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

 

Т.е. вся система работает по принципу: вариант в меню (индекс) == маркер. И все.

Имя локации тебе нужно только для интерфейса и отображения, чтоб игрок не путался. В самом скрипте оно нигде не используется.

 

Если совсем круто сделать хочешь - позволь игроку самому название вводить.

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

Я когда-то что-то такое делал, но за давностью лет уже забыл, как именно это окошко с вводом текста вызывается, и с какой системы оно идет вообще =)



#757 Ссылка на это сообщение aaa112aaa

aaa112aaa
  • Новенький
  • 28 сообщений

Отправлено

Зачем тебе вообще CenterOnCell использовать?

Используй MoveTo с указанием объекта. Я ж не зря писал про маркеры в старом сообщении.

Берешь 16 маркеров, ставишь их куда-нибудь в служебную ячейку (лучше в ванильную, уже созданную), забиваешь их в проперти скрипта по номерам.

При касте пометки делаешь MoveTo на маркер под нужным номером, указывая целью игрока. Типа такого: ReturnMarker01.MoveTo(Player, abMatchRotation = true)

При касте возврата делаешь MoveTo на игрока, указывая целью маркер под нужным номером. Типа такого: Player.MoveTo(ReturnMarker01, abMatchRotation = true)

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

 

Т.е. вся система работает по принципу: вариант в меню (индекс) == маркер. И все.

Имя локации тебе нужно только для интерфейса и отображения, чтоб игрок не путался. В самом скрипте оно нигде не используется.

 

Если совсем круто сделать хочешь - позволь игроку самому название вводить.

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

Я когда-то что-то такое делал, но за давностью лет уже забыл, как именно это окошко с вводом текста вызывается, и с какой системы оно идет вообще =)

У меня итак сделано по принципу MoveTo, но я решил попытаться сделать "костыль" сохранения помеченных точек телепорта в конфиг, если например начал новую игру или сделал пометку в другом сохранении, то скрипт бы загрузил названия локаций (в моём случае, пока что) и при нажатии на "возврат" сверяет имена по доп функции, если имена не совпадают или имя пустое, телепортирует через CenterOnCell, если совпадают, телепортирует стандартно через MoveTo. Пока у меня так сделано, но из-за того что функция CenterOnCell перестала работать пришлось "запретить" использование по умолчанию.


If (IsAllowed == True)
	CheckMark(MarkerReturn, CellName_16, fX_16, fY_16, fZ_16)
Else
	Recall()
EndIf

Сообщение отредактировал aaa112aaa: 20 октября 2021 - 20:04


#758 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

но я решил попытаться сделать "костыль" сохранения помеченных точек телепорта в конфиг, если например начал новую игру или сделал пометку в другом сохранении

Передавай между сохранениями ID/имя ячейки и координаты маркеров.

По нажатию какой-нибудь специальной кнопки пусть скрипт эти данные подгружает и заново расставляет маркеры.

Не уверен, правда, как это можно сделать.


но из-за того что функция CenterOnCell перестала работать пришлось "запретить" использование по умолчанию.

Вообще да, на вики вон про нее пишут, что скайрим может вообще зависнуть. Так что лучше ее осторожно использовать.



#759 Ссылка на это сообщение aaa112aaa

aaa112aaa
  • Новенький
  • 28 сообщений

Отправлено

И снова здравствуйте.

Снова я, снова проблема.

 

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

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

 

Вот собственно код Event OnInit() :

OnInit()

 

А вот, если нужно, весь скрипт:

 

MarkAndRecallQuestScript

Сообщение отредактировал aaa112aaa: 26 октября 2021 - 01:05


#760 Ссылка на это сообщение Azazellz

Azazellz
  • Знаменитый оратор
  • 2 055 сообщений
  •    

Отправлено

И снова здравствуйте.

Снова я, снова проблема.

 

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

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

 

Вот собственно код Event OnInit() :

OnInit()

 

А вот, если нужно, весь скрипт:

 

MarkAndRecallQuestScript

https://www.creation...hp?title=OnInit

Тут внизу написано.



#761 Ссылка на это сообщение aaa112aaa

aaa112aaa
  • Новенький
  • 28 сообщений

Отправлено

И снова здравствуйте.

 

Отредактировано.

Уже понял как.


Сообщение отредактировал aaa112aaa: 28 октября 2021 - 09:10






Темы с аналогичным тегами papyrus, help, скрипты, вопросы

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых