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


Фотография

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

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

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

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

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


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

Отправлено

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

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

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

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



 




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

#382 Ссылка на это сообщение allgamer955

allgamer955
  • Новенький
  • 6 сообщений

Отправлено

Это принудительный фасттревел, так что, по идее, компаньоны и КО (призванные существа там всякие, компаньоны-животные, etc) должны повести себя стандартно, т.е телепортироваться вместе с игроком.
Единственное "но" - я не помню, получится ли так телепортировать игрока в локацию, в настройках которой запрещена возможность фасттревела.

 

 

Фендел телепортируется и с улицы и из дома. Из пещеры пока не пробовал.

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

Не получается установить маркер возврата на место компаньона. Не принципиально.

 

Спасибо.



#383 Ссылка на это сообщение Sharpcliff

Sharpcliff
  • Новенький
  • 2 сообщений

Отправлено

Здравствуйте. Прошерстил топик с готовыми скриптами и не нашел тот, что мне нужен. Есть ли скрипт на "снятие зачарования" при использовании предмета, к примеру прочтения книги? Хочу сделать мод, в котором можно выучить зачарование, прочитав книгу, по аналогу с томами заклинаний. Насколько это осуществимо?


Сообщение отредактировал Sharpcliff: 16 августа 2018 - 15:20


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

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

Отправлено

Насколько это осуществимо?

Осуществимо.

Функция SetPlayerKnows из SKSE может такое делать.



#385 Ссылка на это сообщение rkirgizov

rkirgizov
  • Новенький
  • 6 сообщений
  •  

Отправлено

Какой функцией можно применить эффекты яда на игрока?

 

Вроде всё перекопал, должно ж просто быть а не соображу.

Помогите, плз.



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

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

Отправлено

Какой функцией можно применить эффекты яда на игрока?

 

Вроде всё перекопал, должно ж просто быть а не соображу.

Помогите, плз.

Так как любой яд - это заклинание, то через Cast Spell



#387 Ссылка на это сообщение rkirgizov

rkirgizov
  • Новенький
  • 6 сообщений
  •  

Отправлено

Так пробовал, когда вызывапишет что "cast is not a function or does not exist".

Уточнюсь, вызвать функцию надо из события OnItemRemoved скрипта "extends ReferenceAlias".

Может в этом загвоздка? 

По идее эту функцию надо вызывать из заклинания, но как это заклинание вытащить из объекта akItemReference?

 

mySpell.cast(myActivator, playerRef)
; myActivator has cast mySpell on the player!

 

 

Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)

     akItemReference.cast (playerRef, playerRef)
EndEvent


Сообщение отредактировал rkirgizov: 20 августа 2018 - 11:51


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

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

Отправлено

По идее эту функцию надо вызывать из заклинания, но как это заклинание вытащить из объекта akItemReference?

Эту функцию можно вызывать откуда угодно и как угодно.

Конкретно у тебя надо сначала определить, какой итем и откуда ты собираешь удалять.

Т.е. должны быть условия if, в которых будет это все прописано.

Ну а дальше уже может быть что-то типа

PoisonSpell.cast(PlayerRef, PlayerRef)

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

 

А то в твоем варианте у тебя не заклинание кастуется, а референс предмета.


Сообщение отредактировал Azazellz: 20 августа 2018 - 15:20


#389 Ссылка на это сообщение rkirgizov

rkirgizov
  • Новенький
  • 6 сообщений
  •  

Отправлено

Эту функцию можно вызывать откуда угодно и как угодно.

Конкретно у тебя надо сначала определить, какой итем и откуда ты собираешь удалять.

Т.е. должны быть условия if, в которых будет это все прописано.

Ну а дальше уже может быть что-то типа

PoisonSpell.cast(PlayerRef, PlayerRef)

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

 

А то в твоем варианте у тебя не заклинание кастуется, а референс предмета.

 

 

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

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

Референс применяемого яда есть, akItemReference.

Сам кусок скрипта - ниже.

 

Вот как из этого применить Spell применяемого яда на игрока?

 

Scriptname KelaPoisonProjectMain extends ReferenceAlias

 

Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)

  If IsReallyApplyPoisonToWeapon(akBaseItem, akItemReference, akDestContainer)
     WornRemovePoison(kPlayer, 1)
     kPlayer.RemoveItem(akBaseItem as Potion, 1, True)
     WornSetPoison(kPlayer, 1, akBaseItem as Potion, GetMaxCharges())
     kppPoisonUse.Play(kPlayer)
   elseIf !IsWeaponPoisoned(1) ;
    kPlayer.RemoveItem(akBaseItem as Potion, 1, True)
    WornSetPoison(kPlayer, 1, akBaseItem as Potion, GetMaxCharges())
    kppPoisonUse.Play(kPlayer) 
   endIf
  endIf

----  Вот здесь мне надо случайным образом применить яд на игрока
endIf
EndEvent



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

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

Отправлено

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

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

Что-то похожее было в СКСЕ кажется, но сам я такое не применял никогда. Может кто из более опытных скриптеров подскажет.

 

Для "рандомности" можно использовать https://www.creation...omInt_-_Utility

int random = Utility.RandomInt(0, 10)
if random <= 5
	;do stuff
else
	;do nothing
endif

Как-то так.


Сообщение отредактировал Azazellz: 21 августа 2018 - 07:23


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

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

Отправлено

Если еще актуально, то, собственно, вот.

Правильно я помнил, что в СКСЕ есть такая штука, которая позволяет "снять" эффекты с зелий (а заодно и с зачарований, и прочих штук).

Только надо придумать, как на игрока эти эффекты сбросить - ибо Cast работает только со спеллами, а не с эффектами.


Сообщение отредактировал Azazellz: 22 августа 2018 - 14:10


#392 Ссылка на это сообщение rkirgizov

rkirgizov
  • Новенький
  • 6 сообщений
  •  

Отправлено

Если еще актуально, то, собственно, вот.

Правильно я помнил, что в СКСЕ есть такая штука, которая позволяет "снять" эффекты с зелий (а заодно и с зачарований, и прочих штук).

Только надо придумать, как на игрока эти эффекты сбросить - ибо Cast работает только со спеллами, а не с эффектами.

 

Актуально, вроде доделываю, остался как раз этот момент нереализованным из задуманного.

Спасибо за ссылку, покопаюсь.



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

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

Отправлено

Подскажите пожалуйста, как написать скрипт, который заставил бы снять с персонажа игрока броню и передать ее в инвентарь npc (как фрагмент скрипта, прикрепленный к диалогу)? Верcия оригинал (не SKSE)


Сообщение отредактировал Vita2016: 28 августа 2018 - 23:46


#394 Ссылка на это сообщение mr Jyggalag

mr Jyggalag
  • Ветеран

  • 609 сообщений
  •    

Отправлено

Подскажите пожалуйста, как написать скрипт, который заставил бы снять с персонажа игрока броню и передать ее в инвентарь npc (как фрагмент скрипта, прикрепленный к диалогу)? Верcия оригинал (не SKSE)

В SSE есть возможность определить какой предмет "надет" в определённом слоту у персонажа: GetEquippedArmorInSlot() - в SLE такого нет. Есть функция UnequipItemSlot(), благодаря которой можно просто снять вещь из занимаемого ей слота. Есть функция UnequipItem(), но для неё нужно знать, какой предмет снимать. С помощью IsEquipped() можно узнать, какой конкретный предмет экипирован.

Иначе говоря, либо нужно SSE, либо придётся корячиться на SLE. Если на SLE надо снимать определённую броню (скажем, уникальную) то это довольно просто. В противном случае можно легко её снять, но вот только с помощью костылей удастся передать её NPC.

Можно проверить один раз инвентарь игрока на наличие предметов с кейвордом "Броня" (условный кейворд), затем добавить полученные результаты в массив, элементы которого ты далее проверишь на "экипирование" игроком. Эти "проверенные" элементы ты потом снимаешь и отдаёшь NPC.



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

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

Отправлено

Вообще, есть ивент OnObjectUnequipped - Actor

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


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


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

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

Отправлено

Вообще, есть ивент OnObjectUnequipped - Actor

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

Спасибо, вот я попытался вставить такой скрипт:

 

Game.GetPlayer().UnequipItemSlot(30)

Event OnObjectUnequipped(Form akBaseObject, ObjectReference akReference)

MyNPC.GetReference().AddItem(akBaseObject.GetReference())

EndEvent

 

Компилятор выдал ошибку:

 

mismatched input 'Event' expecting ENDFUNCTION
missing EOF at 'EndFunction'



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

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

Отправлено

Вот тут уж хз.

С фрагментами я совсем мало работал, как у них там синтаксис устроен - не в курсе.

 

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

Фрагмент в этом случае будет "пусковым механизмом" - будет запускать квест или кастовать магический эффект.



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

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

Отправлено

Вот тут уж хз.

С фрагментами я совсем мало работал, как у них там синтаксис устроен - не в курсе.

 

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

Фрагмент в этом случае будет "пусковым механизмом" - будет запускать квест или кастовать магический эффект.

Я вообще нуб, может глупый вопрос, а как запускать событие не через фрагмент? Ну вот у меня есть квест, там диалог, я просто тупо вставляю в окне диалога где begin и end эти фрагменты и что-то происходит.  А как это делать не через фрагменты?



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

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

Отправлено

Я вообще нуб, может глупый вопрос, а как запускать событие не через фрагмент? Ну вот у меня есть квест, там диалог, я просто тупо вставляю в окне диалога где begin и end эти фрагменты и что-то происходит.  А как это делать не через фрагменты?

Если я правильно понимаю систему этих фрагментов, весь код в них стартует либо на запуске диалога, либо на завершении. Т.е. имеет встроенные Event'ы, и других в себе не поддерживает (хз, так ли это на самом деле, но звучит вроде логично).

И чтоб запускать другие евенты - надо писать полноценные скрипты.

 

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

А вот серия более "практических" туториалов. Там подробно описано, что это за ивенты такие, и как скрипты к объектам прикреплять.



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

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

Отправлено

Если я правильно понимаю систему этих фрагментов, весь код в них стартует либо на запуске диалога, либо на завершении. Т.е. имеет встроенные Event'ы, и других в себе не поддерживает (хз, так ли это на самом деле, но звучит вроде логично).

И чтоб запускать другие евенты - надо писать полноценные скрипты.

 

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

А вот серия более "практических" туториалов. Там подробно описано, что это за ивенты такие, и как скрипты к объектам прикреплять.

Я создал скрипт на вкладке Gameplay. Скомпилировал. Но не понял, как его запустить из квеста... Например, есть стадия квеста 10. Как из нее вызвать этот скрипт?



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

mr Jyggalag
  • Ветеран

  • 609 сообщений
  •    

Отправлено



Я создал скрипт на вкладке Gameplay. Скомпилировал. Но не понял, как его запустить из квеста... Например, есть стадия квеста 10. Как из нее вызвать этот скрипт?

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

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







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

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

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