Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)

Вопросы по скриптам Papyrus
sansuli  Offline  Сообщение №1 написано: 31 августа 2012, 13:29 | Отредактировано: Multigone - 23 апреля 2020, 14:24


The Red Sun


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


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


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

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

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Umbra  Offline  Сообщение №211 написано: 17 мая 2013, 06:15



14
Доброго всем, уважаемые! Впервые юзаю папирус, хотел сделать заклинание, накладываемое на труп поверженного противника, чтоб он не исчезал с течением времени (и, возможно, менял уровень). По идее, надо как-то поменять флаг "Respawn" на false, но чето никак не могу разобраться как это запилить. Подскажите плиз реализацию скрипта на мой спелл.

AleksTirex  Offline  Сообщение №212 написано: 17 мая 2013, 14:21 | Отредактировано: AleksTirex - 17 мая 2013, 15:01


Архимаг


371
Цитата Иsкатель

AleksTirex, добавил в топик. Теперь все появляются. Спасибо!!!=)  Есть 4 дракона, как сделать, чтобы 1 атаковал DGFNPCSerana, только, чтобы не огнем и не холодом, а просто кусал, после 2-3 укусов, DGFNPCSerana падала и ползала(как ползают NPC когда у них мало health), пока ГГ не убьет всех драконов и не заговорит с ней и кстати когда она ползает, дракон который ее атаковал, должен перестать ее атаковать и начать атаковать ГГ



Мда... начинающему модмейкеру такое сделать крайне тяжело, ведь по уму, это надо делать через сцену. Попробуй сделать с "малой кровью", через алиас и скрипт.
У первого дракона в настройках удаляются все крики, они потом скриптом добавятся. Делается алиас Сераны в своём квесте (DGFNPCSeranaAliasDragon, галочка Optional и Essential, пустая позиция Specific Refererce). На алиас вешается скрипт. Для запуска надо Серану назначить этому алиасу (DGFNPCSeranaAliasDragon.ForceRefTo(DGFNPCSerana)) в нужный момент. С началом разговора алиас сам очистится.

========= DGFNPCSeranaAliasDragonScript
Actor Property DGFNPCSerana  Auto
Actor Property Dragon1  Auto
Actor Property Dragon2  Auto
Actor Property Dragon3  Auto
Actor Property Dragon4  Auto
Shout Property Shout1  Auto  ;  крик дракона
Shout Property Shout2  Auto  ;  крик дракона
Static Property LandingMarker  Auto  ; статик LandingMarker для приземления дракона
int numHit
float fHealRate

Event OnInit()
{ если с этим будут сложности, то первые две-три строки можно не писать
}
ObjectReference aLandingMarker1 = DGFNPCSerana.PlaceAtMe(LandingMarker, 1)
Dragon1.SetForcedLandingMarker(aLandingMarker1)
Dragon1.SetAllowFlying(false)
Dragon1.StartCombat(DGFNPCSerana)
DGFNPCSerana.StartCombat(Dragon1)
EndEvent

Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, \
bool abBashAttack, bool abHitBlocked)
if akAggressor == Dragon1 && !self.GetActorRef().GetNoBleedoutRecovery()
numHit +=1
if numHit == 3 || self.GetActorRef().GetAV("Health") < 10  ; три укуса или упало здоровье
self.GetActorRef().DamageAV("Health", self.GetActorRef().GetAV("Health"))
fHealRate = self.GetActorRef().getAV("HealRate")
self.GetActorRef().SetAV("HealRate", 0)
self.GetActorRef().SetNoBleedoutRecovery(true)
self.GetActorRef().StopCombatAlarm()
Dragon1.SetAllowFlying(true)
Dragon1.addShout(Shout1)
Dragon1.addShout(Shout2)
Dragon1.StartCombat(game.GetPlayer())
endif
endif
if self.GetActorRef().GetNoBleedoutRecovery()
self.GetActorRef().StopCombatAlarm()
endif
EndEvent

Event OnActivate(ObjectReference akActionRef)
if akActionRef == game.GetPlayer() && !game.GetPlayer().IsInCombat()
if Dragon1.IsDead() && Dragon2.IsDead() && Dragon3.IsDead() && Dragon4.IsDead()
self.GetActorRef().SetNoBleedoutRecovery(false)
self.GetActorRef().SetAV("HealRate", fHealRate)
self.GetActorRef().RestoreActorValue("Health", self.GetActorRef().GetBaseAV("Health"))
self.Clear()
endIf
endIf
EndEvent

Иsкатель  Offline  Сообщение №213 написано: 18 мая 2013, 07:46 | Отредактировано: Иsкатель - 18 мая 2013, 10:02



71
1)Как сделать, чтобы когда ГГ одевает шлем(ID шлема LOTDHelmet), все драугры Скайрима перестают его атаковать, нападать и начинают сражатся на стороне ГГ, а если ГГ снимает шлем, то драугры возврощаются к своему прежнему состоянию(то есть ГГ для них снова враг)?
Пытался сделать через добавление фракции, по сути получалось что-то подобное, но с ОЧЕНЬ большым минусом, а именно, когда на ГГ одет шлем, и он сражается с драконьями жрецами или скелетами, то драугры не атакуют их. Дело в том, что в фракции драугров драконии жрецы и скелеты установлены как ally, friend. Я думаю вносить изменения во фракцию драугров не стоит так, как это нарушит баланс игры.
Может быть есть другой способ или можно усовершенствовать способ которым я пытался?

**********************************

2)Как сделать свою GlobalValue(или GlobalVariable)?

**********************************

3)AleksTirex, хоты Вы и писали, что Цитата AleksTirex
{ если с этим будут сложности, то первые две-три строки можно не писать }
ну мне все ровно интересно. Property LandingMarker - какой static предмет нужно назначить(предмета LandingMarker в static'ах нету)?

**********************************

4) У меня есть 4 костяных дракона и 4 дракона призрака. Как сделать, чтобы 4 костяных дракона, изначально были мертвые? Как сделать, чтобы когда ГГ зайдет в зону триггера, прелетали 4 дракона призрака и каждый из них садился на(или в) одного из 4 костяных драконов, после этого драконы призраки исчезали и оживали костяные драконы. После того как они ожили происходило вот это:
Только все-таки я решил сделать чтобы 2 дракона атаковали Серану и не обязательно кусали, еще после того, как ГГ поговорил с Сераной, она должна не бегать, а только ходить, пока не наступит определенная стадия квеста, как наступит(определенная стадия квеста), она снова должна "уметь" бегать. Как все это сделать?

PaukSama  Offline  Сообщение №214 написано: 18 мая 2013, 09:46


Прячущий свое сердце


Делаю скрипт на заклинание столкнулся с таким вопросом, не могу никак подобрать строку условия. Она должна означать "Если на персонаже висит заклинание" пишу вот так if Game.Getplayer().addspell (Spell) скрипт компилируется без ошибок, но что то не правильно, думаю мое условие совсем не то означает. Как правильно кто знает?

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
AleksTirex  Offline  Сообщение №215 написано: 18 мая 2013, 11:13 | Отредактировано: AleksTirex - 18 мая 2013, 11:46


Архимаг


371
Цитата PaukSama

Делаю скрипт на заклинание столкнулся с таким вопросом, не могу никак подобрать строку условия. Она должна означать "Если на персонаже висит заклинание" пишу вот так if Game.Getplayer().addspell (Spell) скрипт компилируется без ошибок, но что то не правильно, думаю мое условие совсем не то означает. Как правильно кто знает?



if Game.GetPlayer().HasSpell(akSpell) - если актёр имеет/знает такое заклинание
if Game.GetPlayer().HasMagicEffect(akMagicEffect) - если на актёре наложено/действует такой магический эффек, т.е. актёр находится под воздействием данного маг.эффекта
if Game.GetPlayer().HasMagicEffectWithKeyword(akKeyword) - если на актёре наложено/действует магический эффек с таким кейвордом, т.е. актёр находится под воздействием любого маг.эффекта, который имеет такой кейворд
if Game.GetPlayer().GetEquippedSpell(1) == akSpell - если у актёра (ГГ) экипировано заклинание akSpell на правой руке (http://www.creationkit.com/GetEquippedSpell_-_Actor)
**addSpell - это "добавить заклинание"
**************
Иsкатель, LandingMarker - это статик-маркер DragonMarker, он в виде дракона/самолёта.
На дохлых драконов поставь эти DragonMarker-ы, на них будут садится твои драконы. Далее призраков отключаешь, а дохлых оживляешь. В общем, это скрипт (скрипты) поболее того, что я чуть раньше писал, это не так скоро будет. К тому же, ты сперва полностью определись, что именно ты хочешь сделать, дабы скрипты по нескольку раз не переписывать. Как будет окончательный вариант - придумаем как это сделать.
 
*************
"Как сделать свою GlobalValue(или GlobalVariable)? " - очень просто, в СК есть такой раздел (в разделе Miscellaneous)
 
*************
Если ты для дружбы с драуграми добавляешь ГГ фракцию "драугров", то это не поможет. Чтобы они начали драться со скелетами - надо воздействовать на самих драугров, а не на ГГ. Попробуй сделать зачарование на шлем по подобию крика "Дружба со зверями", только в условиях там пропиши "раса драугров".

PaukSama  Offline  Сообщение №216 написано: 18 мая 2013, 11:34


Прячущий свое сердце


AleksTirex, Иsкатель, пасиб ребят, вечером или утром попробую и отпишусь.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
Иsкатель  Offline  Сообщение №217 написано: 18 мая 2013, 11:55 | Отредактировано: Иsкатель - 18 мая 2013, 12:02



71
Цитата Иsкатель

4) У меня есть 4 костяных дракона и 4 дракона призрака. Как сделать, чтобы 4 костяных дракона, изначально были мертвые? Как сделать, чтобы когда ГГ зайдет в зону триггера, прелетали 4 дракона призрака и каждый из них садился на(или в) одного из 4 костяных драконов, после этого драконы призраки исчезали и оживали костяные драконы. После того как они ожили происходило вот это:



Только все-таки я решил сделать чтобы 2 дракона атаковали Серану и не обязательно кусали, еще после того, как ГГ поговорил с Сераной, она должна не бегать, а только ходить, пока не наступит определенная стадия квеста, как наступит(определенная стадия квеста), она снова должна "уметь" бегать. Как все это сделать?


Так как это все сделать?

AleksTirex  Offline  Сообщение №218 написано: 18 мая 2013, 12:18


Архимаг


371
Драконам-призракам поставь галочки "IsGhost", размести их в игровом мире (где-то недалеко) и задисабли (выключи), добавь им пакеты Trevell к маркеру "посадки" (DragonMarker).
При входе ГГ в триггер - эти драконы включаются и сами полетят на место посадки. Когда сядут, то ... далее сработает скрипт, потом напишу.
 
Имей в виду, что надо сделать достаточно места на земле, чтобы все драконы могли разместиться там, да и сражаться надо будет. Постарайся сделать так, чтобы рядом не было других актёров/животных и любых врагов, дабы они не мешали всему этому процессу. (у драконов есть дурная привычка - мочить крабов вместо ГГ)
 
Остальное потом напишу.

PaukSama  Offline  Сообщение №219 написано: 18 мая 2013, 12:26


Прячущий свое сердце


AleksTirex, кстати такой еще к тебе вопрос. Хотел я как то написать скрипт расширитель крафта. Все облазил, пытался найти эвент который начинается при крафте. Есть ли вообще такое событие 'игрок начал крафт'? Не активировал кузницу а именно скрафтил вещь.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
Иsкатель  Offline  Сообщение №220 написано: 18 мая 2013, 13:10



71
Цитата AleksTirex

 и задисабли (выключи)


AleksTirex, это надо поставить галочку Initially Disabled?

AleksTirex  Offline  Сообщение №221 написано: 18 мая 2013, 14:12 | Отредактировано: AleksTirex - 18 мая 2013, 14:15


Архимаг


371
Цитата PaukSama

AleksTirex, кстати такой еще к тебе вопрос. Хотел я как то написать скрипт расширитель крафта. Все облазил, пытался найти эвент который начинается при крафте. Есть ли вообще такое событие 'игрок начал крафт'? Не активировал кузницу а именно скрафтил вещь.



Есть такое, но только в квестовых событиях. Чтобы воспользоваться надо создать квест с запуском по событию Craft Item, когда квест запустится от этого события... далее уже легко придумать как и что делать с этим.
Но чтобы событие сработало, надо сперва прописать свой квест в менеджере событий - SM Event Node. Открываешь его и находишь позицию Craft Item, в верхней строке правой кнопкой New Quest Node, даёшь ему свой ID. Далее в нём прав.кн. Add Quests, и назначаешь там свой квест. В Quest Node прописываешь нужные тебе условия на срабатывание.

PaukSama  Offline  Сообщение №222 написано: 18 мая 2013, 19:38 | Отредактировано: PaukSama - 18 мая 2013, 19:42


Прячущий свое сердце


AleksTirex, ммм так вот оно что. Сохраню себе твои инструкции, время будет попробую.

Добавлено (18.05.2013, 23:38)
---------------------------------------------
AleksTirex, все проверил все работает, заклинание при условии что оно есть исчезает и возвращается назад по истечении срока действия скрипта все как и надо. Использовал  if Game.GetPlayer().HasSpell(___)

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
AleksTirex  Offline  Сообщение №223 написано: 18 мая 2013, 22:34 | Отредактировано: AleksTirex - 18 мая 2013, 22:50


Архимаг


371
Иsкатель, как я понял, то ты уже сделал до того момента, когда призраки летят и садятся на маркер и дохлого дракона. Делай следующий этап - на драконов-призраков повесь этот скрипт:

============скрипт для драконов-призраков
Actor Property Dragon  Auto  ; дракон, который должен оживать вместо этого призрака
ImpactDataSet Property FXDragonLandingImpactSet Auto ; нажать кнопочку Auto-Fill, само заполнится
EffectShader Property EffSh  Auto  ; подобрать желаемый визуальный эффект

auto state StatDefaulf
Event onLoad()
registerForAnimationEvent(self, "DragonForcefulLandEffect")
endEvent

Event onAnimationEvent(objectReference deliverator, string eventName)
if (eventName == "DragonForcefulLandEffect")
PlayImpactEffect(FXDragonLandingImpactSet, "NPC Pelvis", 0, 0, -1, 512)
KnockAreaEffect(1, 2*getLength())
; utility.wait(1.5) ; включи это, если надо чуть подождать до начала оживления
EffSh.Play(self, 3)
utility.wait(2.5)
Dragon.Resurrect() ; или Enable(), смотря как у тебя там сделано
utility.wait(0.3)
self.Disable()
gotoState("StatDone")
endif
endEvent
endState

state StatDone
;
endState

Повесь на всех призраков и протестируй. Начинать тестить надо обязательно на сохранке из другой локации и до момента написания этого скрипта. Это стандартная Скаевская проблема сохранок и теста модов.
Как сделаешь это, будем писать бой Сераны с драконом.
***
На призраках не должно быть больше никаких скриптов (!) и дефолтных тоже, если есть, то все удаляй. Галочки Respawn не должно быть, а галочка Is Ghost должна быть. В пакете должна быть галочка Ignore Combat.

PaukSama  Offline  Сообщение №224 написано: 19 мая 2013, 06:13


Прячущий свое сердце


Вот еще чего хотел узнать. Я часто в своих временных скриптах использую Utility.Wait(), но не только для того чтобы там сделать кулдаун между командами, чтобы например проигрывание анимаций дальнейшие действия скрипта не прерывали. Я ставлю большие временные значения скажем пять или десять минут, бывает так что все что есть уже выполнено остается этот расчет времени. Вообще я так тестил и сохраняться во время работы счетчика, выходить из игры и возвращаться в сохранку, вроде бы все нормально. Но меня интересует насколько вообще Utility.Wait() подходит для моих действий, может лучше использовать чтото расчитанное на долгое действие, или же все и так сойдет?

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
AleksTirex  Offline  Сообщение №225 написано: 19 мая 2013, 11:44 | Отредактировано: AleksTirex - 19 мая 2013, 11:46


Архимаг


371
Цитата PaukSama

Вот еще чего хотел узнать. Я часто в своих временных скриптах использую Utility.Wait(), но не только для того чтобы там сделать кулдаун между командами, чтобы например проигрывание анимаций дальнейшие действия скрипта не прерывали. Я ставлю большие временные значения скажем пять или десять минут, бывает так что все что есть уже выполнено остается этот расчет времени. Вообще я так тестил и сохраняться во время работы счетчика, выходить из игры и возвращаться в сохранку, вроде бы все нормально. Но меня интересует насколько вообще Utility.Wait() подходит для моих действий, может лучше использовать чтото расчитанное на долгое действие, или же все и так сойдет?



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

While(условие == истина)
выполняем действия и скрипт дальше не работает, работает только этот цикл
endWhile

Например, скрипт должен подождать, пока ГГ подойдёт к актёру на 200 пунктов:

While(akActor.GetDistance(Game.GetPlayer()) > 200)
выполняем какие-то действия
или просто ждём не выполнения условия, тогда можно Utility.Wait(0.2)
endWhile
akActor.StartCombat(Game.GetPlayer())

Как только ГГ и актёр сблизились менее 200, цикл прекращается и скрипт выполняется дальше, например актёр начинает бой с ГГ.

Если Utility.Wait() с большими значениями использовать только в целях теста, то это нормально, но оставлять в постоянных скриптах такое не желательно. У Скайрима есть беда - сохранки, и там записывается работа скриптов, помимо всего остального. И если скрипт не отработал, то в сохранке остаётся на это запись. В последствии могут возникать глюки и вылеты.
Люди даже специальные программы пишут по очистке сохранок от остатков скриптов.

PaukSama  Offline  Сообщение №226 написано: 19 мая 2013, 12:20


Прячущий свое сердце


AleksTirex, вот это меня и напрягало. Понимая как работает Utility.Wait() мысль о его действии на игровой процесс сразу возникает. Конкретно в моем случае я делал - эффект начался - Utility.Wait(5 мин) - эффект удалился. Оно конечно работает но за это время десять раз сохраниться можно. Потому и спросил лучший вариант. Буду пробовать.

Добавлено (19.05.2013, 16:20)
---------------------------------------------
вобще в моем скрипте фича тайминга в том что действие должно совершаться не сразу как эффект заклинания пройдет. Так то просто было бы эвентами 'эффект старт и эффект финиш' но дело в том что действие произойдет только спустя 3 минуты после 'эвент эффект финиш'


Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
AleksTirex  Offline  Сообщение №227 написано: 19 мая 2013, 12:30


Архимаг


371
PaukSama, самый лучший способ - использовать события, но они не всегда есть. В твоём варианте с эффектами лучше использовать "обратную связь".
Напрмер, ты делаешь эффект, по окончании которого тебе надо дальше что-то делать в своём скрипте, тогда в OnEffectFinish даёшь команду своему скрипту, котоый должен продолжить работу после этого эффекта.
 
Event OnEffectFinish(Actor akTarget, Actor akCaster)
  (myObject as myObjectScript).myFunction()
endEvent

 
В твоём скрипте функция myFunction() запускает нужные тебе команды и т.д. Этой же функцией ты можешь передать в свой скрипт всю нужную собранную информацию этим эффектом. Например, данные об объекте, на котором был применён эффект и т.д.

PaukSama  Offline  Сообщение №228 написано: 19 мая 2013, 12:35


Прячущий свое сердце


AleksTirex, тем не менее таймер все равно нужен...ну сегодня вечером после одинадцати просто выложу свой скрипт как он выглядит на данный момент. Так будет проще оценить где я не прав.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
AleksTirex  Offline  Сообщение №229 написано: 19 мая 2013, 12:36


Архимаг


371
Цитата PaukSama

дело в том что действие произойдет только спустя 3 минуты после 'эвент эффект финиш'



Тогда (myObject as myObjectScript).RegisterForSingleUpdate(180)
а в своём скрипте Event OnUpdate()

PaukSama  Offline  Сообщение №230 написано: 19 мая 2013, 12:42


Прячущий свое сердце


AleksTirex, да там еще не совсем все так просто. Первая половина блока должна происходить до 'эффект финиш' а ее следствие после. Тут в общем несложно будет главное не запутаться. Скрипт и сейчас работает так как мне надо. Но я все же не хочу чтобы он представлял нагрузку для сохранок.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
AleksTirex  Offline  Сообщение №231 написано: 19 мая 2013, 12:49


Архимаг


371
PaukSama, для этого можно разбивать блок по функциям и/или использовать статус.
Как выложишь свой скрипт, посмотрим на него.

PaukSama  Offline  Сообщение №232 написано: 19 мая 2013, 19:35 | Отредактировано: PaukSama - 19 мая 2013, 19:40


Прячущий свое сердце


AleksTirex, вот такой скриптосик

желтым я показал тот самый проблемный блок. В нем таймер расчитан на время превосходящее "эффект финиш" на три минуты, то есть как бы спустя это время после того как кончится эффект должно произойти akCaster.AddSpell (Dis) но только при условии
if Game.GetPlayer().HasSpell(Dis)
akCaster.RemoveSpell (Dis)

которое проходит проверку до окончания эффекта в самом начале после каста.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
AleksTirex  Offline  Сообщение №233 написано: 19 мая 2013, 21:53


Архимаг


371
PaukSama, кто является akCaster?
У тебя два актёра принимают участие в пьянке? Из скрипта не видно самого алгоритма действия. Ты словами расскажи об этом действии (кто, чего и как).
 
Возможно, стоит использовать два спелла, тогда можно будет отказаться от "ожидания".

Иsкатель  Offline  Сообщение №234 написано: 20 мая 2013, 04:06 | Отредактировано: Иsкатель - 20 мая 2013, 04:11



71
Во-первых, я сделал чтобы дракон не прелитал, а просто подходил(потому что я не знаю как сделать чтобы он прелитал). Сделал я это так: создал квест, в квесте создал алиас с пакетом travel в пакете указал Near linked(вроде так пишется), сделал триггер, на триггер повесил скрипт
(Actor Property DragonSG Auto
ReferenceAlias Property Alias_DragonSG Auto

Event OnTriggerEnter(ObjectRererence akActivator)
if akActivator == Game.GetPlayer()
Alias_DragonSG.ForceRefTo(DragonSG)
endif
endEvent)
И у дракона призрака(DragonSG) в Linked Ref указал костяного дракона.

Во-вторых, костяных драконов я убиваю не скриптом, а ставлю галочку "Start Dead"

Во-третьих, AleksTirex, в вашем скрипте я убрал "Actor Property Dragon Auto" и изменил это "Dragon.Resurrect()" на это
"
Actor LinkActor = (GetLinkedRef() as Actor)
LinkActor.Resurrect()
"

В итоге драконы призраки не исчезают, а костяные не оживают. Почему?

PaukSama  Offline  Сообщение №235 написано: 20 мая 2013, 06:06 | Отредактировано: PaukSama - 20 мая 2013, 06:08


Прячущий свое сердце


AleksTirex, кроче это скрипт для моего мода. Представляет собой добавление спелла наркотической зависимости. Сам скрипт висит на бутылке и активируется когда ее выпивает гг, никаких других akCaster быть не может. Для начала рандом, у меня там тестово 50% пока стоит то бишь с этим шансом после каждой бутылки можно получить спелл.
if Game.GetPlayer().HasSpell(Dis)
akCaster.RemoveSpell (Dis)
Utility.Wait(480)
akCaster.AddSpell (Dis)
Вот это проверяет получил ли я спелл, либо он у меня уже был от предыдущей бутылки. Спелл сразу же удаляяется, типа эйфория облегчает ломку, но как только пройдет 480 секунд вернется, поэтому каждая новая бутылка будет уже встречать спелл на игроке и
if (Utility.RandomInt() <= 50)
akCaster.AddSpell (Dis)
даже если шанс сработает вторично спелл не добавит, тк он уже есть.
Нет в общем то можно сделать некое упрощение и как только действие эффекта проходит - сразу спел выдавать чтобы скрипт не длился дольше onEffectFinish. Но даже если так что то я не соображу как привязку сделать чтобы
if Game.GetPlayer().HasSpell(Dis)
akCaster.RemoveSpell (Dis)
проверялось в эффект старт, а его следствие akCaster.AddSpell (Dis) в эффект финиш.

Добавлено (20.05.2013, 10:06)
---------------------------------------------
ммм да я не подумал. Незачем делать время превосходящее эффект финиш. Так будет даже лучше, тк спелл на котором висит скрипт и который его запускает ничего сам по себе не значит и нигде не отображен ему можно поставить просто временное значение больше остальных эффектов что будет давать выпитая бутылка. Таким образом визуальный эффект кончится раньше но скрипт позже. Осталось с этим блоком разобраться как его разбить на эффект старт и эффект финиш проверка в одном следствие в другом.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
AleksTirex  Offline  Сообщение №236 написано: 20 мая 2013, 13:20 | Отредактировано: AleksTirex - 20 мая 2013, 13:24


Архимаг


371
Иsкатель, тот скрипт рассчитан на полёт дракона, поэтому и не работает.
Сделай тогда простой триггер на месте, куда должен приползти призрак. На него повесь скрипт
OnTriggerEnter if akActivator == дракон-призрак, и там одного воскрешай, а другого выключай.

"ставлю галочку "Start Dead" " - тогда дракон оживать не будет. Сделай с костяным драконом так: где-то в квестовом скрипте, когда ГГ ещё далеко от этого места, пропиши на каждого такого дракона вот это:
DragonSG1.Enable()
DragonSG1.moveTo(DragonMarker1)
DragonSG1.Kill()
Тогда дракона можно будет оживить. Вот только на драконе не должно быть дефолтных скриптов, иначе его душа начнёт поглощаться. Если переделать дефолтный скрипт дракона и его повесить на призрака, то всё будет как положено.

"Оживлять" дракона можно и без убийства - достаточно изначально выключить ему AI
DragonSG1.EnableAI(false)
DragonSG1.SetGhost(true)
DragonSG1.BlockActivation(true)
"Оживление" будет таким:
DragonSG1.EnableAI(true)
DragonSG1.SetGhost(false)
DragonSG1.BlockActivation(false)
Но здесь будет небольшая беда - дракон не будет валяться как дохлый, а будет стоять. Хотя, можно предварительно ему проиграть анимацию "дохляка" и после этого выключить АИ, тогда он будет валяться.
 
**************
PaukSama, скачал твой мод, посмотрю на него "вживую".


PaukSama  Offline  Сообщение №237 написано: 20 мая 2013, 13:51 | Отредактировано: PaukSama - 20 мая 2013, 13:53


Прячущий свое сердце


AleksTirex, не на что там смотреть. Я его еще не обновил до зависимости. Она в процессе.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
Иsкатель  Offline  Сообщение №238 написано: 20 мая 2013, 14:29



71
Как сделать, чтобы Серана из DLC Dawnguard не одевала копюшон?

Добавлено (20.05.2013, 18:29)
---------------------------------------------
Как сделать чтобы драконы подлетали или прилетали к определенному актеру или маркеру(например DragonMarker)?


AleksTirex  Offline  Сообщение №239 написано: 20 мая 2013, 14:56


Архимаг


371
PaukSama, Dis - это ломка?
 
if (Utility.RandomInt() <= 50)
akCaster.AddSpell (Dis)

Это не имеет смысла, т.к. при любом раскладе Dis удаляется.

Можно при выпивании скуумы дать два спелла: опьянение (2 мин.) и безобидное или положительное (5 мин.), например повышение тонуса (выносливость+ и здоровье+). После окончания опьянения остаётся второе ещё на 3 мин, а в нём по окончании добавляется Dis.
 
****************
Иsкатель, чуть позже расскажу, как это сделать.


PaukSama  Offline  Сообщение №240 написано: 20 мая 2013, 16:18


Прячущий свое сердце


AleksTirex, как раз это имеет смысл. Тк отвечает за добавление спелла. То есть если этот рандом не сработает то и никакого заклинания удалено не будет. И после удаления в конце скрипта обратно не появится. Эти строки как раз начинают все действие. Сейчас он 50 процентный лишь для теста. В финале он будет около 10. И да Dis это оно.

Добавлено (20.05.2013, 20:18)
---------------------------------------------
и да мне ничего лишнего не надо. Хочу оставить так как есть, только чтобы конец эффекта добавлял Dis при условии что в начале эффекта он был удален.


Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск:





Ответ на жалобу смотрите в разделе жалоб