• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Доброго всем, уважаемые! Впервые юзаю папирус, хотел сделать заклинание, накладываемое на труп поверженного противника, чтоб он не исчезал с течением времени (и, возможно, менял уровень). По идее, надо как-то поменять флаг "Respawn" на false, но чето никак не могу разобраться как это запилить. Подскажите плиз реализацию скрипта на мой спелл.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №212
написано: 17 мая 2013, 14:21
| Отредактировано: AleksTirex - 17 мая 2013, 15:01
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
1)Как сделать, чтобы когда ГГ одевает шлем(ID шлема LOTDHelmet), все драугры Скайрима перестают его атаковать, нападать и начинают сражатся на стороне ГГ, а если ГГ снимает шлем, то драугры возврощаются к своему прежнему состоянию(то есть ГГ для них снова враг)? Пытался сделать через добавление фракции, по сути получалось что-то подобное, но с ОЧЕНЬ большым минусом, а именно, когда на ГГ одет шлем, и он сражается с драконьями жрецами или скелетами, то драугры не атакуют их. Дело в том, что в фракции драугров драконии жрецы и скелеты установлены как ally, friend. Я думаю вносить изменения во фракцию драугров не стоит так, как это нарушит баланс игры. Может быть есть другой способ или можно усовершенствовать способ которым я пытался?
**********************************
2)Как сделать свою GlobalValue(или GlobalVariable)?
**********************************
3)AleksTirex, хоты Вы и писали, что Цитата AleksTirex { если с этим будут сложности, то первые две-три строки можно не писать } ну мне все ровно интересно. Property LandingMarker - какой static предмет нужно назначить(предмета LandingMarker в static'ах нету)?
**********************************
4) У меня есть 4 костяных дракона и 4 дракона призрака. Как сделать, чтобы 4 костяных дракона, изначально были мертвые? Как сделать, чтобы когда ГГ зайдет в зону триггера, прелетали 4 дракона призрака и каждый из них садился на(или в) одного из 4 костяных драконов, после этого драконы призраки исчезали и оживали костяные драконы. После того как они ожили происходило вот это:
Цитата Иsкатель
Есть 4 дракона, как сделать, чтобы 1 атаковал DGFNPCSerana, только, чтобы не огнем и не холодом, а просто кусал, после 2-3 укусов, DGFNPCSerana падала и ползала(как ползают NPC когда у них мало health), пока ГГ не убьет всех драконов и не заговорит с ней и кстати когда она ползает, дракон который ее атаковал, должен перестать ее атаковать и начать атаковать ГГ
Только все-таки я решил сделать чтобы 2 дракона атаковали Серану и не обязательно кусали, еще после того, как ГГ поговорил с Сераной, она должна не бегать, а только ходить, пока не наступит определенная стадия квеста, как наступит(определенная стадия квеста), она снова должна "уметь" бегать. Как все это сделать?
Делаю скрипт на заклинание столкнулся с таким вопросом, не могу никак подобрать строку условия. Она должна означать "Если на персонаже висит заклинание" пишу вот так if Game.Getplayer().addspell (Spell) скрипт компилируется без ошибок, но что то не правильно, думаю мое условие совсем не то означает. Как правильно кто знает?
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №215
написано: 18 мая 2013, 11:13
| Отредактировано: AleksTirex - 18 мая 2013, 11:46
Делаю скрипт на заклинание столкнулся с таким вопросом, не могу никак подобрать строку условия. Она должна означать "Если на персонаже висит заклинание" пишу вот так 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)
************* Если ты для дружбы с драуграми добавляешь ГГ фракцию "драугров", то это не поможет. Чтобы они начали драться со скелетами - надо воздействовать на самих драугров, а не на ГГ. Попробуй сделать зачарование на шлем по подобию крика "Дружба со зверями", только в условиях там пропиши "раса драугров".
AleksTirex, Иsкатель, пасиб ребят, вечером или утром попробую и отпишусь.
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
Изменение репутации для пользователя Иsкатель
ИsкательOffline
Сообщение №217
написано: 18 мая 2013, 11:55
| Отредактировано: Иsкатель - 18 мая 2013, 12:02
4) У меня есть 4 костяных дракона и 4 дракона призрака. Как сделать, чтобы 4 костяных дракона, изначально были мертвые? Как сделать, чтобы когда ГГ зайдет в зону триггера, прелетали 4 дракона призрака и каждый из них садился на(или в) одного из 4 костяных драконов, после этого драконы призраки исчезали и оживали костяные драконы. После того как они ожили происходило вот это:
Есть 4 дракона, как сделать, чтобы 1 атаковал DGFNPCSerana, только, чтобы не огнем и не холодом, а просто кусал, после 2-3 укусов, DGFNPCSerana падала и ползала(как ползают NPC когда у них мало health), пока ГГ не убьет всех драконов и не заговорит с ней и кстати когда она ползает, дракон который ее атаковал, должен перестать ее атаковать и начать атаковать ГГ
Только все-таки я решил сделать чтобы 2 дракона атаковали Серану и не обязательно кусали, еще после того, как ГГ поговорил с Сераной, она должна не бегать, а только ходить, пока не наступит определенная стадия квеста, как наступит(определенная стадия квеста), она снова должна "уметь" бегать. Как все это сделать?
Драконам-призракам поставь галочки "IsGhost", размести их в игровом мире (где-то недалеко) и задисабли (выключи), добавь им пакеты Trevell к маркеру "посадки" (DragonMarker). При входе ГГ в триггер - эти драконы включаются и сами полетят на место посадки. Когда сядут, то ... далее сработает скрипт, потом напишу.
Имей в виду, что надо сделать достаточно места на земле, чтобы все драконы могли разместиться там, да и сражаться надо будет. Постарайся сделать так, чтобы рядом не было других актёров/животных и любых врагов, дабы они не мешали всему этому процессу. (у драконов есть дурная привычка - мочить крабов вместо ГГ)
AleksTirex, кстати такой еще к тебе вопрос. Хотел я как то написать скрипт расширитель крафта. Все облазил, пытался найти эвент который начинается при крафте. Есть ли вообще такое событие 'игрок начал крафт'? Не активировал кузницу а именно скрафтил вещь.
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
AleksTirex, кстати такой еще к тебе вопрос. Хотел я как то написать скрипт расширитель крафта. Все облазил, пытался найти эвент который начинается при крафте. Есть ли вообще такое событие 'игрок начал крафт'? Не активировал кузницу а именно скрафтил вещь.
Есть такое, но только в квестовых событиях. Чтобы воспользоваться надо создать квест с запуском по событию Craft Item, когда квест запустится от этого события... далее уже легко придумать как и что делать с этим. Но чтобы событие сработало, надо сперва прописать свой квест в менеджере событий -SM Event Node. Открываешь его и находишь позицию Craft Item, в верхней строке правой кнопкой New Quest Node, даёшь ему свой ID. Далее в нём прав.кн. Add Quests, и назначаешь там свой квест. В Quest Node прописываешь нужные тебе условия на срабатывание.
Изменение репутации для пользователя PaukSama
PaukSamaOffline
Сообщение №222
написано: 18 мая 2013, 19:38
| Отредактировано: PaukSama - 18 мая 2013, 19:42
AleksTirex, ммм так вот оно что. Сохраню себе твои инструкции, время будет попробую.
Добавлено (18.05.2013, 23:38) --------------------------------------------- AleksTirex, все проверил все работает, заклинание при условии что оно есть исчезает и возвращается назад по истечении срока действия скрипта все как и надо. Использовал if Game.GetPlayer().HasSpell(___)
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №223
написано: 18 мая 2013, 22:34
| Отредактировано: AleksTirex - 18 мая 2013, 22:50
И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.
Вот еще чего хотел узнать. Я часто в своих временных скриптах использую Utility.Wait(), но не только для того чтобы там сделать кулдаун между командами, чтобы например проигрывание анимаций дальнейшие действия скрипта не прерывали. Я ставлю большие временные значения скажем пять или десять минут, бывает так что все что есть уже выполнено остается этот расчет времени. Вообще я так тестил и сохраняться во время работы счетчика, выходить из игры и возвращаться в сохранку, вроде бы все нормально. Но меня интересует насколько вообще Utility.Wait() подходит для моих действий, может лучше использовать чтото расчитанное на долгое действие, или же все и так сойдет?
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №225
написано: 19 мая 2013, 11:44
| Отредактировано: AleksTirex - 19 мая 2013, 11:46
Вот еще чего хотел узнать. Я часто в своих временных скриптах использую 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() с большими значениями использовать только в целях теста, то это нормально, но оставлять в постоянных скриптах такое не желательно. У Скайрима есть беда - сохранки, и там записывается работа скриптов, помимо всего остального. И если скрипт не отработал, то в сохранке остаётся на это запись. В последствии могут возникать глюки и вылеты. Люди даже специальные программы пишут по очистке сохранок от остатков скриптов.
AleksTirex, вот это меня и напрягало. Понимая как работает Utility.Wait() мысль о его действии на игровой процесс сразу возникает. Конкретно в моем случае я делал - эффект начался - Utility.Wait(5 мин) - эффект удалился. Оно конечно работает но за это время десять раз сохраниться можно. Потому и спросил лучший вариант. Буду пробовать.
Добавлено (19.05.2013, 16:20) --------------------------------------------- вобще в моем скрипте фича тайминга в том что действие должно совершаться не сразу как эффект заклинания пройдет. Так то просто было бы эвентами 'эффект старт и эффект финиш' но дело в том что действие произойдет только спустя 3 минуты после 'эвент эффект финиш'
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
PaukSama, самый лучший способ - использовать события, но они не всегда есть. В твоём варианте с эффектами лучше использовать "обратную связь". Напрмер, ты делаешь эффект, по окончании которого тебе надо дальше что-то делать в своём скрипте, тогда в OnEffectFinish даёшь команду своему скрипту, котоый должен продолжить работу после этого эффекта.
Event OnEffectFinish(Actor akTarget, Actor akCaster) (myObject as myObjectScript).myFunction() endEvent
В твоём скрипте функция myFunction() запускает нужные тебе команды и т.д. Этой же функцией ты можешь передать в свой скрипт всю нужную собранную информацию этим эффектом. Например, данные об объекте, на котором был применён эффект и т.д.
AleksTirex, тем не менее таймер все равно нужен...ну сегодня вечером после одинадцати просто выложу свой скрипт как он выглядит на данный момент. Так будет проще оценить где я не прав.
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
AleksTirex, да там еще не совсем все так просто. Первая половина блока должна происходить до 'эффект финиш' а ее следствие после. Тут в общем несложно будет главное не запутаться. Скрипт и сейчас работает так как мне надо. Но я все же не хочу чтобы он представлял нагрузку для сохранок.
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
imageSpaceModifier property Pery auto Idle property Start auto Idle property Stop auto Spell Property Dis Auto
event onEffectStart(actor akTarget, actor akCaster) Game.Getplayer().playidle(Stop) Utility.Wait(0.1) if Game.Getplayer().GetSitState() == 0 Game.Getplayer().playidle(Start) endif if (Utility.RandomInt() <= 50) akCaster.AddSpell (Dis) endif if Game.GetPlayer().HasSpell(Dis) akCaster.RemoveSpell (Dis) Utility.Wait(480) akCaster.AddSpell (Dis) endif if akTarget == game.GetPlayer() Utility.Wait(5) Pery.applyCrossFade(2.0) endif EndEvent event onEffectFinish(actor akTarget, actor akCaster) if akTarget == game.GetPlayer() imageSpaceModifier.removeCrossFade(2.0) endif EndEvent
желтым я показал тот самый проблемный блок. В нем таймер расчитан на время превосходящее "эффект финиш" на три минуты, то есть как бы спустя это время после того как кончится эффект должно произойти akCaster.AddSpell (Dis)но только при условии if Game.GetPlayer().HasSpell(Dis) akCaster.RemoveSpell (Dis) которое проходит проверку до окончания эффекта в самом начале после каста.
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
PaukSama, кто является akCaster? У тебя два актёра принимают участие в пьянке? Из скрипта не видно самого алгоритма действия. Ты словами расскажи об этом действии (кто, чего и как).
Возможно, стоит использовать два спелла, тогда можно будет отказаться от "ожидания".
Изменение репутации для пользователя Иsкатель
ИsкательOffline
Сообщение №234
написано: 20 мая 2013, 04:06
| Отредактировано: Иsкатель - 20 мая 2013, 04:11
Во-первых, я сделал чтобы дракон не прелитал, а просто подходил(потому что я не знаю как сделать чтобы он прелитал). Сделал я это так: создал квест, в квесте создал алиас с пакетом 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
PaukSamaOffline
Сообщение №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
AleksTirexOffline
Сообщение №236
написано: 20 мая 2013, 13:20
| Отредактировано: AleksTirex - 20 мая 2013, 13:24
И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
PaukSamaOffline
Сообщение №237
написано: 20 мая 2013, 13:51
| Отредактировано: PaukSama - 20 мая 2013, 13:53
AleksTirex, не на что там смотреть. Я его еще не обновил до зависимости. Она в процессе.
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
Как сделать, чтобы Серана из DLC Dawnguard не одевала копюшон?
Добавлено (20.05.2013, 18:29) --------------------------------------------- Как сделать чтобы драконы подлетали или прилетали к определенному актеру или маркеру(например DragonMarker)?
if (Utility.RandomInt() <= 50) akCaster.AddSpell (Dis) Это не имеет смысла, т.к. при любом раскладе Dis удаляется.
Можно при выпивании скуумы дать два спелла: опьянение (2 мин.) и безобидное или положительное (5 мин.), например повышение тонуса (выносливость+ и здоровье+). После окончания опьянения остаётся второе ещё на 3 мин, а в нём по окончании добавляется Dis.
**************** Иsкатель, чуть позже расскажу, как это сделать.
AleksTirex, как раз это имеет смысл. Тк отвечает за добавление спелла. То есть если этот рандом не сработает то и никакого заклинания удалено не будет. И после удаления в конце скрипта обратно не появится. Эти строки как раз начинают все действие. Сейчас он 50 процентный лишь для теста. В финале он будет около 10. И да Dis это оно.
Добавлено (20.05.2013, 20:18) --------------------------------------------- и да мне ничего лишнего не надо. Хочу оставить так как есть, только чтобы конец эффекта добавлял Dis при условии что в начале эффекта он был удален.
Отними у меня апельсин - и я тебя убью Съешь мой апельсин - и я тебя убью Подари мне апельсин - и... я тебя убью Мне не нужен никто, лишь мой апельсин А тот кто не пойман - не ассасин!
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)