Никак не могу увеличить шанс прока на мгновенное убийство Бритвой Мерунеса. Вроде этот скрипт, но любые манипуляции с кодом не дают результат. Не подскажите в чем проблема?
В строке If (Utility.RandomInt() <= 1) цифра "1" - это шанс 1%, если поставишь 50 - будет 50%, строку удалишь (+ End) - мгновенное убийство.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №2
| Тема: Вопросы по скриптам Papyrus
написано: 11 мая 2013, 12:26
| Отредактировано: AleksTirex - 11 мая 2013, 13:10
Как сделать, чтобы после того, как заканчивается диалог, экран темнел(FadeIn), к игровому времени + 2 часа(например до того как диалог был активирован было время в игре 13.00, а после 15.00), через 5 секунд экран светлел(FadeOut)?
Это можно сделать через ImagespaseModifier Его создать самому или найти такой готовый в списке. Если кто помнит, где применялся такой эффект затемнения (квестовое действие, скрипт и т.д.), то можно найти.
Скрипт на его применение зависит от выбранного варианта ImagespaseModifier, и будет примерно такой:
1. На одном ImagespaseModifier:
ImageSpaceModifier Property IntroFX Auto ; назначается нужный эффект
introFX.apply(1.0) ; 1.0 - амплитуда эффекта (регулируется подбором) Utility.Wait(3.0) ; длительность эффекта (она прописана в самом эффекте) IntroFX.remove()
2. На двух ImagespaseModifier (убывание яркости и её восстановление):
ImageSpaceModifier Property IntroFX Auto ImageSpaceModifier Property OutroFX Auto
introFX.apply(1.0) ; 1.0 - амплитуда эффекта (регулируется подбором) Utility.Wait(1.5) ; длительность эффекта (она прописана в самом эффекте) introFX.PopTo(offFX, 1.0) ; замена первого эффекта на второй, 1.0 - амплитуда эффекта Utility.Wait(1.5) ; длительность эффекта (она прописана в самом эффекте) offFX.remove()
3. На трёх ImagespaseModifier (убывание яркости, темнота и её восстановление):
ImageSpaceModifier Property IntroFX Auto ImageSpaceModifier Property LoopFX Auto ImageSpaceModifier Property OutroFX Auto
introFX.apply(1.0) ; 1.0 - амплитуда эффекта (регулируется подбором) Utility.Wait(1.0) ; длительность эффекта (она прописана в самом эффекте) introFX.PopTo(LoopFX, 1.0) ; замена первого эффекта на второй, 1.0 - амплитуда эффекта Utility.Wait(1.0) ; длительность эффекта (произвольная) LoopFX.PopTo(offFX, 1.0) ; замена второго эффекта на третий, 1.0 - амплитуда эффекта Utility.Wait(1.5) ; длительность эффекта (она прописана в самом эффекте) offFX.remove()
----------------------
"Перепрыгнуть" два часа вперёд:
GlobalVariable Property GameHour Auto
GameHour.SetValue(GameHour.GetValue() + 2)
*******************
Ошибки Не понятно, где алиасы, а где актёры. Надо так: алиас.GetActorRef().EvaluatePackage() или актёр.EvaluatePackage() алиас.ForceRefTo(актёр) Свойство алиасов должно быть ReferenceAlias, а не Alias
********************** ********************** Открой ImagespaseModifier, задублируй VC01BlackOutImod, у дубликата поменяй ID, открой его. В окошке Duration измени значение 12.000 на 5.000, ОК. Сделай скрипт:
ImageSpaceModifier Property IntroFX Auto ; назначается твой ImagespaseModifier
Как сделать, чтобы если стадия квеста меньше 10, то актеры скрыты(disable), а если стадия больше или равна 10, то они появились(enable)?
В КК на этих актёрах ставится галочка Initially Disabled, тогда они выключены по умолчанию. Если актёров мало (1-3), то можно их включать каждый отдельно: akActor1.Enable() akActor2.Enable() akActor3.Enable() назначив каждому свойству (akActor) своего НПС. Если актёров много, то лучше выбрать одного и сделать его основным. В скрипте прописать только его akActor.Enable() У всех остальных актёров во вкладке Enable Parent назначить "родителем" твоего основного актёра (в той вкладке нажать на Select Refererce...) и курсором (в виде мишени) тыркнуть на этого основного актёра. Так надо сделать со всеми остальными актёрами, которые должны быть включены.
Команда akActor.Enable() прописывается в стадийном скрипте (Papyrus Fragment) стадии №10.
*******************************
Прекратить работу пакета можно разными способами. Если пакет свой (не дефолтный), то можно через условия пакета. Всё зависит от конкретной ситуации. Например, условие "Если актёр не в какой-то локации", тогда пакет не будет работать в той локации, куда ты телепортируешь актёра. Условие "Если у актёра есть фракция @@", тогда добавляя и удаляя фракцию у актёра, пакет будет включаться и выключаться. (это желательно делать с командой EvaluatePackage). Вариантов очень много.
Скрипт тригзоны:
ObjectReference Property DGFMarkerMoveSerana Auto
Event OnTriggerEnter(ObjectReference akActionRef) if akActionRef == DGFNPCSerana ; if стадия квеста и прочее ; DGFNPCSerana.RemoveFromFaction(aSeranaFaction) - например так, для прекращения пакета DGFNPCSerana.MoveTo(DGFMarkerMoveSerana) ; endif endif EndEvent
******* Если пакет должен будет работать потом, когда актёр покинет ту локацию, куда был перемещён, то лучше всего в условиях пакета прописать "Если не в ... локации".
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №4
| Тема: Вопросы по скриптам Papyrus
написано: 12 мая 2013, 20:23
| Отредактировано: AleksTirex - 12 мая 2013, 20:24
Иsкатель, какой вариант включения актёров у тебя сделан? При каком ответе что должно происходить? (при каждом ответе) Поясни, тогда быстро всё поправим.
*************
Сперва перед командой Utility.Wait(5.0) поставь точку с запятой, скомпилируй. Тогда эта команда перестанет работать. Потом открой свой эффект и в окне Duration увеличивай время (5 - 15), то есть настрой как надо тебе. Цифру поменял - проверил в игре, если не нравится, то опять меняй. Потом эту окончательную цифру пропиши в команде Utility.Wait(5.0) вместо "5.0" и убери точку с запятой, скрипт скомпилируй.
Иsкатель, как я понял, то у тебя при любом ответе должны появляться актёры и срабатывает стадия №5? Тогда включай основного актёра на стадии №5 (а не №10). Или добавляй эту команду прямо в скрипт топиков (в каждый топик).
Но вот "появляется только основной актёр" - этого не может быть (если правильно назначены паренты). Скорее всего там бродит другой актёр, не тот основной.
Сохраните файл с расширением .reg Например так: fixFontCK.reg Потом запустите файл, ответьте "Да". Перезагрузите компьютер. Кракозябров в СК больше не будет.
AleksTirex, это же повлияет и на другие программы, а мне нельзя, я ж убьюсь, если у меня, вместо Хильветики, будет Сенс Сирифом печатать.
Тогда вычеркни эти две строки: "Helv,0"="MS Sans Serif,204" и "MS Shell Dlg"="MS Sans Serif,204". И не один шрифт не пострадает вообще.
*** Но и без этого ничего с Хельветикой не будет, ведь это "другая" Хельветика, не наша, а буржуйская. *****Глифы любого шрифта визуально тоже не изменятся.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №8
| Тема: Вопросы по скриптам Papyrus
написано: 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
Делаю скрипт на заклинание столкнулся с таким вопросом, не могу никак подобрать строку условия. Она должна означать "Если на персонаже висит заклинание" пишу вот так 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)
************* Если ты для дружбы с драуграми добавляешь ГГ фракцию "драугров", то это не поможет. Чтобы они начали драться со скелетами - надо воздействовать на самих драугров, а не на ГГ. Попробуй сделать зачарование на шлем по подобию крика "Дружба со зверями", только в условиях там пропиши "раса драугров".
Драконам-призракам поставь галочки "IsGhost", размести их в игровом мире (где-то недалеко) и задисабли (выключи), добавь им пакеты Trevell к маркеру "посадки" (DragonMarker). При входе ГГ в триггер - эти драконы включаются и сами полетят на место посадки. Когда сядут, то ... далее сработает скрипт, потом напишу.
Имей в виду, что надо сделать достаточно места на земле, чтобы все драконы могли разместиться там, да и сражаться надо будет. Постарайся сделать так, чтобы рядом не было других актёров/животных и любых врагов, дабы они не мешали всему этому процессу. (у драконов есть дурная привычка - мочить крабов вместо ГГ)
Остальное потом напишу.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №11
| Тема: Вопросы по скриптам Papyrus
написано: 18 мая 2013, 14:12
| Отредактировано: AleksTirex - 18 мая 2013, 14:15
AleksTirex, кстати такой еще к тебе вопрос. Хотел я как то написать скрипт расширитель крафта. Все облазил, пытался найти эвент который начинается при крафте. Есть ли вообще такое событие 'игрок начал крафт'? Не активировал кузницу а именно скрафтил вещь.
Есть такое, но только в квестовых событиях. Чтобы воспользоваться надо создать квест с запуском по событию Craft Item, когда квест запустится от этого события... далее уже легко придумать как и что делать с этим. Но чтобы событие сработало, надо сперва прописать свой квест в менеджере событий -SM Event Node. Открываешь его и находишь позицию Craft Item, в верхней строке правой кнопкой New Quest Node, даёшь ему свой ID. Далее в нём прав.кн. Add Quests, и назначаешь там свой квест. В Quest Node прописываешь нужные тебе условия на срабатывание.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №12
| Тема: Вопросы по скриптам Papyrus
написано: 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.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №13
| Тема: Вопросы по скриптам Papyrus
написано: 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() с большими значениями использовать только в целях теста, то это нормально, но оставлять в постоянных скриптах такое не желательно. У Скайрима есть беда - сохранки, и там записывается работа скриптов, помимо всего остального. И если скрипт не отработал, то в сохранке остаётся на это запись. В последствии могут возникать глюки и вылеты. Люди даже специальные программы пишут по очистке сохранок от остатков скриптов.
PaukSama, самый лучший способ - использовать события, но они не всегда есть. В твоём варианте с эффектами лучше использовать "обратную связь". Напрмер, ты делаешь эффект, по окончании которого тебе надо дальше что-то делать в своём скрипте, тогда в OnEffectFinish даёшь команду своему скрипту, котоый должен продолжить работу после этого эффекта.
Event OnEffectFinish(Actor akTarget, Actor akCaster) (myObject as myObjectScript).myFunction() endEvent
В твоём скрипте функция myFunction() запускает нужные тебе команды и т.д. Этой же функцией ты можешь передать в свой скрипт всю нужную собранную информацию этим эффектом. Например, данные об объекте, на котором был применён эффект и т.д.
PaukSama, кто является akCaster? У тебя два актёра принимают участие в пьянке? Из скрипта не видно самого алгоритма действия. Ты словами расскажи об этом действии (кто, чего и как).
Возможно, стоит использовать два спелла, тогда можно будет отказаться от "ожидания".
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №18
| Тема: Вопросы по скриптам Papyrus
написано: 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, скачал твой мод, посмотрю на него "вживую".
if (Utility.RandomInt() <= 50) akCaster.AddSpell (Dis) Это не имеет смысла, т.к. при любом раскладе Dis удаляется.
Можно при выпивании скуумы дать два спелла: опьянение (2 мин.) и безобидное или положительное (5 мин.), например повышение тонуса (выносливость+ и здоровье+). После окончания опьянения остаётся второе ещё на 3 мин, а в нём по окончании добавляется Dis.
**************** Иsкатель, чуть позже расскажу, как это сделать.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №20
| Тема: Вопросы по скриптам Papyrus
написано: 20 мая 2013, 16:39
| Отредактировано: AleksTirex - 20 мая 2013, 16:46
PaukSama, akCaster == Game.GetPlayer() ведь так? Ведь нет больше никого, кроме ГГ, сам говорил. А так же, зачем добавлять спелл и сразу же его удалять? А не проще ли тогда так: if (Utility.RandomInt() <= 50) Utility.Wait(480) akCaster.AddSpell (Dis) endif Но, дело хозяйское.
************** Иsкатель, сделай своих призраков с одним пакетом Trevell на маркер (DragonMarker). В пакете поставь условие, например "стадия квеста". Как только ты заходишь в триг.зону там срабатывает скрипт и переключает стадию квеста, пакеты начинают работать и дракон летит на маркер. При отсутствии активного пакета драконы летают.
На самом драконе вешаешь простой скрипт:
Actor Property Dragon Auto ; дракон, который должен оживать вместо этого призрака ImpactDataSet Property FXDragonLandingImpactSet Auto ; нажать кнопочку Auto-Fill, само заполнится EffectShader Property EffSh Auto ; подобрать желаемый эффект
пока действие эффекта не кончилось принятие еще одной бутылки, то есть повтор эффекта вел к смерти персонажа. Ну смерть то прописать дело не хитрое, а вот условие повтора хотелось бы подсказку получить.
Event onEffectStart(....) if aaaaGlobal.getValue() == 1 ГГ.Kill() return endif aaaaGlobal.SetValue(1) .... if Game.GetPlayer().HasSpell(Dis) akCaster.RemoveSpell (Dis) bDone = true endif endEvent
Но лучше сильная потеря здоровья, пусть тренирует школу Восстановления или зелья локает. А вот при приёме третьей бутылки - можно и закиллить, раз уж не понятно, что скуума - это яд, хоть и приятный. Тогда будет так:
Event onEffectStart(....) if aaaaGlobal.getValue() == 1 ГГ.addSpell(потеря здоровья на 3-15 ед/сек в течении 3-4 мин.) или akSpellDamage.Cast(ГГ, ГГ) elseif aaaaGlobal.getValue() >= 2 ГГ.Kill() return endif aaaaGlobal.SetValue(aaaaGlobal.getValue() + 1) .... if Game.GetPlayer().HasSpell(Dis) akCaster.RemoveSpell (Dis) bDone = true endif endEvent
Конечно, дело хозяйское как делать, но твои опасения напрасны, всех этих нестыковок можно избежать. 1. "очень некрасиво может добавить Dis по рандому" - чтобы этого не было просто добавь в рендом условие, что на ГГ сейчас только один этот эффект, который добавился только что: if (Utility.RandomInt() <= 50) && aaaaGlobal.getValue() == 1
2. "Сколько бы бутылок со скумой не выпил а положительные эффекты будут как от одной" - вот для этого есть строка ГГ.addSpell(потеря здоровья... Здесь можно добавить второй эффект, который наложится на первый, ведь это совсем другой эффект. Опьянение сделать ещё сильнее, упадок здоровья, "размыть экран" и т.д. "дополнительные положительные эффекты..." - да точно так же добавь их таким вариантом.
3. "Скрипт идеально работает только пока он один" - для этого есть переменная aaaaGlobal.getValue(), ей можно ограничивать команды в тех местах, где таковые должны быть только одни (без повторов).
4. Реалистичность. Когда пипл начинает пить, то "одной" крайне редко ограничиваются, обязательно бегут за "второй". Так и в игре - обязательно выпьют вторую, дабы посмотреть на результат, а результат - килл, народ начнёт ругаться. Вот если после "второй" совсем опьянел и здоровье начало резко падать, то это намёк, что следующая бутылка будет последней в жизни.
В общем, хозяин-барин, но всё-таки подумай.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №24
| Тема: Вопросы по скриптам Papyrus
написано: 21 мая 2013, 11:25
| Отредактировано: AleksTirex - 21 мая 2013, 11:51
Но надо это чем то обусловить. Но только не эффектами. Смысл в принятии второй пока действует первая.
Так там же написано: добавляется сильная потеря здоровья, эффектов опьянения можно не добавлять, проблем с Dis тоже можно легко избежать.
Если это вторая бутылка (или третья), то кроме добавления "потери здоровья" и фиксации второй выпитой бутылки данный скрипт ничего не добавит, ни Dis, но опьянения, вообще ничего связанного с эффектом скуумы.
Event onEffectStart(....) aaaaGlobal.SetValue(aaaaGlobal.getValue() + 1) if aaaaGlobal.getValue() == 2 ГГ.addSpell(потеря здоровья на 3-15 ед/сек в течении 3-4 мин.) или akSpellDamage.Cast(ГГ, ГГ) elseif aaaaGlobal.getValue() >= 3 ГГ.Kill() return else .... if Game.GetPlayer().HasSpell(Dis) akCaster.RemoveSpell (Dis) bDone = true endif endif endEvent
imageSpaceModifier property Pery auto Idle property Start auto Idle property Stop auto Spell Property Dis Auto Bool Property bDone auto GlobalVariable Property aaaaGlobal 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
Это ты правильно заметил, и вовремя. Дело в том, что removeCrossFade - глобальная функция, и я не уверен, что она не удалит эффект от другого скрипта, который присутствует на экране (это я не проверял). Поэтому желательно удалять именно твой эффект командой Pery.remove(), а так же добавлять лучше командой Pery.apply(1.0) . К тому же в варианте apply можно настроить желаемую амплитуду эффекта.
PaukSama, не-е, не так. Pery.apply(1.0) - это "применить Pery с амплитудой 1.0", эффект от которой можно сделать от почти невидимой до полного перебора. По умолчанию сила эффекта == 1, это как в настройках самого ImageSpaceModifier в СК.
Для анимированного старта и финиша + и статичного долговременного эффекта применяется связка из трёх эффектов: apply - PopTo - Remove
PeryStart.apply(1.0) ; применяется анимированный эффект ImageSpaceModifier PeryStatic.PopTo(PeryStart, 1.0) ; эффект PeryStart заменяется статичным эффектом PeryStatic PeryFinish.PopTo(PeryStatic, 1.0) ; эффект PeryStatic заменяется анимированным эффектом PeryFinish PeryFinish.Remove() ; удаляется эффект PeryFinish
imageSpaceModifier property Pery auto Idle property Start auto Idle property Stop auto Spell Property Dis Auto Bool Property bDone auto GlobalVariable Property aaaaGlobal 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
aaaaGlobal.SetValue(aaaaGlobal.getValue() + 1) if aaaaGlobal.getValue() == 2 if akTarget == game.GetPlayer() Utility.Wait(5) PeryStart.apply(1.0) ; первый анимированный эффект Utility.Wait(2) ; время анимации первого эффекта PeryStatic.PopTo(PeryStart, 1.0) ;второй статичный эффект endif elseif aaaaGlobal.getValue() >= 3 akCaster.Kill() return else
if (Utility.RandomInt() <= 50) akCaster.AddSpell (Dis) endif
if Game.GetPlayer().HasSpell(Dis) akCaster.RemoveSpell (Dis) bDone = true endif endif EndEvent
event onEffectFinish(actor akTarget, actor akCaster) if akTarget == game.GetPlayer() PeryFinish.PopTo(PeryStatic, 1.0) ; анимированный эффект финиша Utility.Wait(2) ; время анимации последнего эффекта PeryFinish.Remove() ; удаляется последний эффект endif if bDone == true akCaster.AddSpell (Dis) endif aaaaGlobal.SetValue(aaaaGlobal.getValue() - 1) EndEvent
AleksTirex, судя по всему не совсем так. Надо PeryStart PeryStatic PeryFinish сделать свойствами наверное. А вообще для чего это? Вроде раньше ничего этого небыло, но плавность в появлении\исчезании присутствовала. Может это зависит от свойств самой анимации...
Естественно, это всё свойства, просто не стал дописывать в твой скрипт.
Это всё для того, чтобы было всё красиво и плавно. Практически все дефолтные эффекты именно так делаются, там, где нужна анимация эффекта. Например крик Замедление времени, эффект Берсека и т.д.
ImageSpaceModifier может быть как статичным, так и анимированным, это как его сделаешь в настройках.
Если не хочешь с этим заморачиваться, то просто imageSpaceModifier.removeCrossFade(2.0) смени на Pery.remove(), и у тебя будет всё как и раньше.
********** "зависит от свойств самой анимации..." - не анимации, а ImageSpaceModifier
PaukSama, мы наверное, не поняли друг друга. Всё, что я писал выше, относится только к ImageSpaceModifier и к анимации никакого отношения не имеет. ImageSpaceModifier сама может быть статичной или анимированной/изменяющейся.
По поводу "гг лежит на земле держась за живот" не факт, что эта анимация будет работать через команду скрипта, надо проверять (хорошо если будет). Очень многие анимации не запускаются командой PlayIdle. Но если так произойдёт, то можно использовать фурнитуру-маркер Wounded02FloorMarker для этих целей, она точно работает.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №30
| Тема: Вопросы по скриптам Papyrus
написано: 21 мая 2013, 17:37
| Отредактировано: AleksTirex - 21 мая 2013, 17:51
Так оно будет всегда, ведь этот скрипт написан исключительно для формлистов. Но если формлист составлен из LeveledItem, то предмет из это LeveledItem будет добавлен как обычный предмет. Т.е. этот скрипт может работать со списком уровневых предметов.
Смысл данного скрипта: при активации объекта ГГ добавляется один произвольный предмет из списка, если активатор не ГГ, то килл.
Чтобы добавить произвольный предмет из LeveledItem достаточно написать:
LeveledItem Property Litem Auto game.getPlayer().additem(Litem, 1)
Вот так:
Scriptname FormLevelScript extends ObjectReference LeveledItem Property Litem Auto Event OnActivate(ObjectReference akActionRef) If akActionRef == game.getplayer() game.getPlayer().additem(Litem, 1) elseif akActionRef (akActionRef as actor).kill() Endif endevent