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


Фотография

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

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

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

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

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


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

Отправлено

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

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

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

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



 




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

#402 Ссылка на это сообщение Vita2016

Vita2016
  • Новенький
  • 7 сообщений

Отправлено

Скрипт прикрепляешь к квесту, скрипт должен быть типа Conditional. Далее, внутри скрипта создаёшь функцию (к примеру - UnequipArmor(); как создавать свои функции написано здесь), которую будешь вызывать на определённой стадии квеста. Всё сделано? Идём далее - в Quest Stges, в своём квесте, ты создаёшь нужный этап квеста (10), а далее в таблице с надписью в верхней части "Log Entry" и выбираешь пункт "New" Закрываешь квест через кнопку "Ок", сохраняешь плагин. ДАлее заново открываешь квест, заходишь в этапы квеста, открываешь нужный этап и в поле Papyrus Fragment в "kmyQuest" выбираешь твой скрипт.

Далее, в этом же окошке прописываешь код, а нужную функцию вызываешь через "kmyQuest.UnequipArmor()"

спасибо, это работает. Теперь возник другой вопрос. У меня квест вызывается пакетом ForceGreet. Но когда он заканчивается и игрок сам вступает в разговор с персонажем квеста, линия диалогов из квеста становится видна в окне обычного диалога. Квест у меня повторяющийся. Как можно убрать квестовую линию диалога из окна обычного разговора? 



#403 Ссылка на это сообщение werr

werr
  • больной на всю голову

  • 1 733 сообщений
  •    

Отправлено

У меня квест вызывается пакетом ForceGreet. Но когда он заканчивается и игрок сам вступает в разговор с персонажем квеста, линия диалогов из квеста становится видна в окне обычного диалога. Квест у меня повторяющийся. Как можно убрать квестовую линию диалога из окна обычного разговора? 

Поменять тип бранчи диалога с Top-Level на Normal (цвет фона бранчи сменится с золотого на фиолетовый).



#404 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

Доброго времени суток господа. У меня сразу просьба - помогите решить проблемы со скриптами.  Есть скрипты которые работают - но работают не совсем так как нужно мне - ниже приведу примеры - и постараюсь описать всё как можно подробнее (прошу строго не судить - у меня совсем нет опыта в модестроении - поэтому и изъясняться я буду топорно)

 

1) Скрипт который рандомно включает (Enable) один из объектов когда ГГ (главный герой-Довакин-актёр) входит в область триггера и выключает (Disable) этот объект когда ГГ покидает область триггера. Суть в том что я уже три дня пытаюсь сделать так чтобы скрипт срабатывал не тольно на ГГ но так же на NPC - подскажите в чём моя проблема что нужно прописать в скрипте что бы он так же срабатывал на NPC (когда те входят в триггер и покидают его)

 

Scriptname _0000_HMD_Trigger_RandomObject_Enable extends ObjectReference

;-- Properties --------------------------------------
ObjectReference property RandomObjectEnable_1 auto
ObjectReference property RandomObjectEnable_2 auto
ObjectReference property RandomObjectEnable_3 auto
ObjectReference property RandomObjectEnable_4 auto
ObjectReference property RandomObjectEnable_5 auto
ObjectReference property RandomObjectEnable_6 auto
ObjectReference property RandomObjectEnable_7 auto

;-- Variables ---------------------------------------

;-- Functions ---------------------------------------

function OnTriggerLeave(ObjectReference akActionRef)

if akActionRef == game.GetPlayer() as ObjectReference
  RandomObjectEnable_1.DisableNoWait(true)
  RandomObjectEnable_2.DisableNoWait(true)
  RandomObjectEnable_3.DisableNoWait(true)
  RandomObjectEnable_4.DisableNoWait(true)
  RandomObjectEnable_5.DisableNoWait(true)
  RandomObjectEnable_6.DisableNoWait(true)
  RandomObjectEnable_7.DisableNoWait(true)
else
  return
endIf
endFunction

; Skipped compiler generated GetState

function OnTriggerEnter(ObjectReference akActionRef)

if akActionRef == game.GetPlayer() as ObjectReference
  Int random = utility.RandomInt(1, 75)
  if random >= 1 && random < 10
   RandomObjectEnable_1.EnableNoWait(true)
  elseIf random >= 10 && random < 20
   RandomObjectEnable_2.EnableNoWait(true)
  elseIf random >= 20 && random < 30
   RandomObjectEnable_3.EnableNoWait(true)
  elseIf random >= 30 && random < 40
   RandomObjectEnable_4.EnableNoWait(true)
  elseIf random >= 40 && random < 50
   RandomObjectEnable_5.EnableNoWait(true)
  elseIf random >= 50 && random < 60
   RandomObjectEnable_6.EnableNoWait(true)
  elseIf random >= 60
   RandomObjectEnable_7.EnableNoWait(true)
  endIf
else
  return
endIf
endFunction

; Skipped compiler generated GotoState

 

2) Есть скрипт который при активации триггера рандомно дает ГГ один из предметов ingredient - мне нужно что бы этот предмет + активный эффект (хороший отдых) ГГ получал спустя час - то есть при активации триггера должен проходить час (ну как со сном - только без возможности выбора временного интервала) и появлялось всплывающее окошко (Message box) в котором будет написано что прошел час  и ГГ хорошо отдохнул. Важно что бы хороший отдых ГГ получал в независимости от рандомной составляющей

 

Scriptname _0000_HMD_Crafting_Resources extends ObjectReference

ingredient property Eff1 auto
ingredient property Eff2 auto
ingredient property Eff3 auto
ingredient property Eff4 auto
ingredient property Eff5 auto
ingredient property Eff6 auto
ingredient property Eff7 auto

function OnActivate (ObjectReference akActionRef)

if akActionRef == game.GetPlayer() as ObjectReference
  Int random = utility.RandomInt(1, 75)
  if random >= 1 && random < 10
   game.getplayer().additem(Eff1, 1)
  elseIf random >= 10 && random < 20
   game.getplayer().additem(Eff2, 1)
  elseIf random >= 20 && random < 30
   game.getplayer().additem(Eff3, 1)
  elseIf random >= 30 && random < 40
   game.getplayer().additem(Eff4, 1)
  elseIf random >= 40 && random < 50
   game.getplayer().additem(Eff5, 1)
  elseIf random >= 50 && random < 60
   game.getplayer().additem(Eff6, 1)
  elseIf random >= 60
   game.getplayer().additem(Eff7, 1)
  endIf
else
  return
endIf
endFunction

 

Заранее спасибо.



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

Azazellz
  • Тактик
  • 1 879 сообщений
  •    

Отправлено

1)

Scriptname _0000_HMD_Trigger_RandomObject_Enable extends ObjectReference

ObjectReference property RandomObjectEnable_1 auto
ObjectReference property RandomObjectEnable_2 auto
ObjectReference property RandomObjectEnable_3 auto
ObjectReference property RandomObjectEnable_4 auto
ObjectReference property RandomObjectEnable_5 auto
ObjectReference property RandomObjectEnable_6 auto
ObjectReference property RandomObjectEnable_7 auto


function OnTriggerLeave(ObjectReference akActionRef)
  RandomObjectEnable_1.DisableNoWait(true)
  RandomObjectEnable_2.DisableNoWait(true)
  RandomObjectEnable_3.DisableNoWait(true)
  RandomObjectEnable_4.DisableNoWait(true)
  RandomObjectEnable_5.DisableNoWait(true)
  RandomObjectEnable_6.DisableNoWait(true)
  RandomObjectEnable_7.DisableNoWait(true)
endFunction


function OnTriggerEnter(ObjectReference akActionRef)
  Int random = utility.RandomInt(1, 75)
  if random >= 1 && random < 10
   RandomObjectEnable_1.EnableNoWait(true)
  elseIf random >= 10 && random < 20
   RandomObjectEnable_2.EnableNoWait(true)
  elseIf random >= 20 && random < 30
   RandomObjectEnable_3.EnableNoWait(true)
  elseIf random >= 30 && random < 40
   RandomObjectEnable_4.EnableNoWait(true)
  elseIf random >= 40 && random < 50
   RandomObjectEnable_5.EnableNoWait(true)
  elseIf random >= 50 && random < 60
   RandomObjectEnable_6.EnableNoWait(true)
  elseIf random >= 60
   RandomObjectEnable_7.EnableNoWait(true)
  endIf
endFunction

2)

Scriptname _0000_HMD_Crafting_Resources extends ObjectReference

actor property PlayerRef auto
messagebox property GoodRestMessage auto
spell property GoodRestSpell auto
ingredient property Eff1 auto
ingredient property Eff2 auto
ingredient property Eff3 auto
ingredient property Eff4 auto
ingredient property Eff5 auto
ingredient property Eff6 auto
ingredient property Eff7 auto

function OnActivate (ObjectReference akActionRef)

if akActionRef == game.GetPlayer() as ObjectReference
  Int random = utility.RandomInt(1, 75)
  if random >= 1 && random < 10
   game.getplayer().additem(Eff1, 1)
  elseIf random >= 10 && random < 20
   game.getplayer().additem(Eff2, 1)
  elseIf random >= 20 && random < 30
   game.getplayer().additem(Eff3, 1)
  elseIf random >= 30 && random < 40
   game.getplayer().additem(Eff4, 1)
  elseIf random >= 40 && random < 50
   game.getplayer().additem(Eff5, 1)
  elseIf random >= 50 && random < 60
   game.getplayer().additem(Eff6, 1)
  elseIf random >= 60
   game.getplayer().additem(Eff7, 1)
  endIf
GoodRestSpell.cast(PlayerRef, PlayerRef)
GoodRestMessage.Show()
endIf
endFunction

Не забудь проставить все проперти в СК.

PlayerRef - игрок

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

GoodRestSpell - заклинание с эффектом отдыха.



#406 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено


PlayerRef - игрок

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

GoodRestSpell - заклинание с эффектом отдыха.

 

 

 

ух ты как быстро помогли - спасибо огромное - пойду тестить)) про месседж бокс - ты абсолютно прав - так гораздо лучше и универсальнее.


Сообщение отредактировал CISCO.:i:..:i:.: 10 сентября 2018 - 13:46


#407 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

второй скрипт при компиляции выдает ошибку:

 

Starting 1 compile threads for 1 files...
Compiling "aaaaHMD_Crafting_Resources"...
C:\Games\Skyrim - Legendary Edition\Data\Scripts\Source\temp\aaaaHMD_Crafting_Resources.psc(5,20): unknown type messagebox
C:\Games\Skyrim - Legendary Edition\Data\Scripts\Source\temp\aaaaHMD_Crafting_Resources.psc(35,16): messagebox is not a known user-defined type
No output generated for aaaaHMD_Crafting_Resources, compilation failed.

Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on aaaaHMD_Crafting_Resources

 

что делать?



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

Azazellz
  • Тактик
  • 1 879 сообщений
  •    

Отправлено

Попробуй заменить в строчке

messagebox property GoodRestMessage auto

слово messagebox на просто message.

 

Что-то я не помню, как там эти сообщения в проперти должны быть.



#409 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

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



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

Azazellz
  • Тактик
  • 1 879 сообщений
  •    

Отправлено

А. Это я пропустил.

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

Можно попробовать разобрать каие-нибудь моды на такую тематику - их несколько существует. Living takes time или как-то так.

Еще была пара домов, которые строить надо - и которые при постройке "проматывали" время.


Сообщение отредактировал Azazellz: 10 сентября 2018 - 15:02


#411 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

не пашет заклинание -  ну скрипт скомпелировался без ошибок все есть и рандом и сообщение а в активных эфектах - отдыха шишь.



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

Azazellz
  • Тактик
  • 1 879 сообщений
  •    

Отправлено

Замени

GoodRestSpell.cast(PlayerRef, PlayerRef)

На

PlayerRef.AddSpell(GoodRestSpell)

Отдых, оказывается, не спелл, а абилити со скриптом-таймером. Через каст не добавится.



#413 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

щас попробую - спасибо. кстате первыи скрипт пашет на ура.



#414 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

Народ есть у кого нибудь готовый скрипт с принципом работы enable\disable. Дано три объекта A В С все изначально (desable) - объекты А и В - активируются (становятся enable) с помощью триггеров активаторов - а объект С активируется (становиться enable) только если объекты А и В enable. Если хотя бы один из объектов А и В становиться disable - тогда и объект С - становиться disable.

 

Скрипт на А и В у меня есть - они же простые))))) а вот на С не могу понять как накписать - смотрел принцип работы скрипта стены Бладскал - где дверь открывается если предыдущие активаторы сработали - но так и не смог разобраться что к чему - а где смотреть еще ума не приложу. Наверняка у Вас матёрых мододелов завалялось что нить подобное)

 

P.S. предыдущий мой вопрос с ожиданием времени (как при активации ожидания времени или сна)- так и не был решен мной - помощь всё еще нужна.


Сообщение отредактировал CISCO.:i:..:i:.: 11 сентября 2018 - 11:45


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

Azazellz
  • Тактик
  • 1 879 сообщений
  •    

Отправлено

Если скрипт на А и В у меня есть - они же простые

Ну так включай голову.

Условие "If" тебе знакомо же?

Вот и используй.

A.Enable(true)
if (B.IsEnabled())
C.Enable(true)
endif

Наоборот еще проще - если у тебя отключается А или B, то сразу отключается и С. Тут даже If не нужен, просто две строчки disable подряд.

A.Disable(true)
C.Disable(true)

Для B аналогично.



#416 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

Ну так включай голову.

Условие "If" тебе знакомо же?

Вот и используй.

A.Enable(true)
if (B.IsEnabled())
C.Enable(true)
endif

Наоборот еще проще - если у тебя отключается А или B, то сразу отключается и С. Тут даже If не нужен, просто две строчки disable подряд.

A.Disable(true)
C.Disable(true)

Для B аналогично.

ну это если я хочу что бы у меня С активировалось (становилось enable) от одного из частников цепи. А мне нужно что бы С становился enable только когда оба объекта станут enable. и что бы С становилось обратно disable если один из объектов либо А либо В становился disable. То есть если А и В (enable) - то тогда С тоже (enable). если А (enable) В (disable) то тогда С (disable) - как же еще объяснить - в общем мне нужно что бы скрипт на С запускал проверку на наличие (enable\disable) у двух объектов А и В - и если они оба (enable) тогда и С становится(enable) - если же один из них (disable неважно какой) тогда и С (disable)

 

P.S. заранее извиняюсь если чего не понял.



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

Azazellz
  • Тактик
  • 1 879 сообщений
  •    

Отправлено

P.S. заранее извиняюсь если чего не понял.

Извиняю, потому что ты не понял.

 

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

 

У тебя есть А и Б.

Ты включаешь А, и в скрипте, прицепленном к А, сразу проверяется состояние Б.

Если Б - включено, этим же скриптом включается и С. Если Б - не включено, ничего, кроме включения, А не происходит.

Т.е. это первый код в моем сообщении выше.

Для Б - аналогично.

Включаешь Б, этим же скриптом проверяется состояние А, если оно включено - включается и С.

Этот код уже напиши сам.

 

Опять же, если ты отключаешь любой из элементов, и хочешь, чтобы С работал, только пока включены оба, никакой скрипт на С тебе так же не нужен.

Ибо если хоть один из элементов у тебя отключен - С так же отключается.

Т.е. ты можешь просто отключать оба элемента одним скриптом - А и С (код в сообщении выше), или Б и С (код пиши сам).

 

Это самый простой метод, который требует минимума знаний СК и папируса.

Можно, конечно, замутить сложную систему (сделать квест, например, который будет включать\отключать С в зависимости от стадий, которые будут переключаться через А и Б...) - но тут это явно не нужно.


Сообщение отредактировал Azazellz: 11 сентября 2018 - 16:13


#418 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

ааа - ну вот теперь понял - пойду ковырять - спасибо.



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

Azazellz
  • Тактик
  • 1 879 сообщений
  •    

Отправлено

ааа - ну вот теперь понял - пойду ковырять - спасибо.

Главное - включай почаще логику и выбирай наиболее простой путь реализации.

 

Если тебе нужна зубочистка - не пили ради этого дерево. Найди спичку =)



#420 Ссылка на это сообщение CISCO.:i:..:i:.

CISCO.:i:..:i:.
  • Талант
  • 255 сообщений
  •  

Отправлено

Разобрался с временем ожидания - получилось следующие:

Скрипт

 

но смущает только одно что отдых добавляется как ингредиент - присутствует  надпись в левом верхнем углу - "Хороший отдых добавлено" я так понимаю это из за использования заклинания - и  как сделать так что бы убрать это сообщение? Можно ли замутить отдых через новый Keywords и если да то как?



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

Azazellz
  • Тактик
  • 1 879 сообщений
  •    

Отправлено

"Хороший отдых добавлено" я так понимаю это из за использования заклинания

Как ты игре добавлять сказал - так она это и делает. И это не ингридиент - это обычное сообщения о том, что игроку что-то добавлено. Магия, абилка, ингридиент, предмет - неважно.
Сделаешь так - сообщения не будет.
PlayerRef.AddSpell(MySpell, false)

Можно ли замутить отдых через новый Keywords и если да то как?

Какой еще кейворд? Зачем?
Отдых по сути - перк, ускоряющий прокачку, прицепленный к заклинанию-способности с постоянным эффектом (и скриптом, который этот эффект через нужное время снимает).
Где там кейворды?

GameHour.SetValue(GameHour.GetValue() + Time)

У меня кстати есть сомнения, как это вот будет работать, если у тебя, скажем, на часах - 23:00, а в Time стоит 2 часа.
Нормально оно на час ночи промотается, или таки что-то сломается?
Рекомендую протестировать такой вариант.

Сообщение отредактировал Azazellz: 13 сентября 2018 - 16:34






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

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

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