• Страница 1 из 13
  • 1
  • 2
  • 3
  • 12
  • 13
  • »
Форум » Записи участника [AleksTirex]

Результаты поиска
AleksTirex  Offline  Сообщение №1 | Тема: Вопросы по скриптам Papyrus написано: 10 мая 2013, 21:49 | Отредактировано: AleksTirex - 10 мая 2013, 21:53


Архимаг


371
Цитата Insomniac

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



В строке If (Utility.RandomInt() <= 1) цифра "1" - это шанс 1%, если поставишь 50 - будет 50%, строку удалишь (+ End) - мгновенное убийство.


AleksTirex  Offline  Сообщение №2 | Тема: Вопросы по скриптам Papyrus написано: 11 мая 2013, 12:26 | Отредактировано: AleksTirex - 11 мая 2013, 13:10


Архимаг


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

Как сделать, чтобы после того, как заканчивается диалог, экран темнел(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

introFX.apply(1.0)
Utility.Wait(5.0)
IntroFX.remove()

AleksTirex  Offline  Сообщение №3 | Тема: Вопросы по скриптам Papyrus написано: 11 мая 2013, 16:49


Архимаг


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

Как сделать, чтобы если стадия квеста меньше 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  Offline  Сообщение №4 | Тема: Вопросы по скриптам Papyrus написано: 12 мая 2013, 20:23 | Отредактировано: AleksTirex - 12 мая 2013, 20:24


Архимаг


371
Иsкатель, какой вариант включения актёров у тебя сделан? При каком ответе что должно происходить? (при каждом ответе)
Поясни, тогда быстро всё поправим.

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

Сперва перед командой Utility.Wait(5.0) поставь точку с запятой, скомпилируй. Тогда эта команда перестанет работать.
Потом открой свой эффект и в окне Duration увеличивай время (5 - 15), то есть настрой как надо тебе. Цифру поменял - проверил в игре, если не нравится, то опять меняй. Потом эту окончательную цифру пропиши в команде Utility.Wait(5.0) вместо "5.0" и убери точку с запятой, скрипт скомпилируй.

AleksTirex  Offline  Сообщение №5 | Тема: Вопросы по скриптам Papyrus написано: 13 мая 2013, 13:08


Архимаг


371
Иsкатель, как я понял, то у тебя при любом ответе должны появляться актёры и срабатывает стадия №5?
Тогда включай основного актёра на стадии №5 (а не №10). Или добавляй эту команду прямо в скрипт топиков (в каждый топик).
 
Но вот "появляется только основной актёр" - этого не может быть (если правильно назначены паренты). Скорее всего там бродит другой актёр, не тот основной.

AleksTirex  Offline  Сообщение №6 | Тема: Вопросы по Creation Kit. Старая тема написано: 14 мая 2013, 21:27 | Отредактировано: AleksTirex - 14 мая 2013, 21:36


Архимаг


371
Цитата valambar

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]

"MS Shell Dlg"="MS Sans Serif,204"

"MS Serif,0"="MS Sans Serif,204"

"MS Sans Serif,0"="MS Sans Serif,204"

"Helv,0"="MS Sans Serif,204"

"Microsoft Sans Serif"="MS Sans Serif,204"

"Microsoft Sans Serif,0"="MS Sans Serif,204"



Сохраните файл с расширением .reg Например так: fixFontCK.reg
Потом запустите файл, ответьте "Да". Перезагрузите компьютер. Кракозябров в СК больше не будет.

AleksTirex  Offline  Сообщение №7 | Тема: Вопросы по Creation Kit. Старая тема написано: 14 мая 2013, 22:06 | Отредактировано: AleksTirex - 14 мая 2013, 22:11


Архимаг


371
Цитата Koxae

AleksTirex, это же повлияет и на другие программы, а мне нельзя, я ж убьюсь, если у меня, вместо Хильветики, будет Сенс Сирифом печатать.



Тогда вычеркни эти две строки: "Helv,0"="MS Sans Serif,204" и "MS Shell Dlg"="MS Sans Serif,204". И не один шрифт не пострадает вообще.

*** Но и без этого ничего с Хельветикой не будет, ведь это "другая" Хельветика, не наша, а буржуйская.
*****Глифы любого шрифта визуально тоже не изменятся.

AleksTirex  Offline  Сообщение №8 | Тема: Вопросы по скриптам Papyrus написано: 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

AleksTirex  Offline  Сообщение №9 | Тема: Вопросы по скриптам Papyrus написано: 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)
 
*************
Если ты для дружбы с драуграми добавляешь ГГ фракцию "драугров", то это не поможет. Чтобы они начали драться со скелетами - надо воздействовать на самих драугров, а не на ГГ. Попробуй сделать зачарование на шлем по подобию крика "Дружба со зверями", только в условиях там пропиши "раса драугров".

AleksTirex  Offline  Сообщение №10 | Тема: Вопросы по скриптам Papyrus написано: 18 мая 2013, 12:18


Архимаг


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

AleksTirex  Offline  Сообщение №11 | Тема: Вопросы по скриптам Papyrus написано: 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 прописываешь нужные тебе условия на срабатывание.

AleksTirex  Offline  Сообщение №12 | Тема: Вопросы по скриптам Papyrus написано: 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.

AleksTirex  Offline  Сообщение №13 | Тема: Вопросы по скриптам Papyrus написано: 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() с большими значениями использовать только в целях теста, то это нормально, но оставлять в постоянных скриптах такое не желательно. У Скайрима есть беда - сохранки, и там записывается работа скриптов, помимо всего остального. И если скрипт не отработал, то в сохранке остаётся на это запись. В последствии могут возникать глюки и вылеты.
Люди даже специальные программы пишут по очистке сохранок от остатков скриптов.

AleksTirex  Offline  Сообщение №14 | Тема: Вопросы по скриптам Papyrus написано: 19 мая 2013, 12:30


Архимаг


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

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

AleksTirex  Offline  Сообщение №15 | Тема: Вопросы по скриптам Papyrus написано: 19 мая 2013, 12:36


Архимаг


371
Цитата PaukSama

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



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

AleksTirex  Offline  Сообщение №16 | Тема: Вопросы по скриптам Papyrus написано: 19 мая 2013, 12:49


Архимаг


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

AleksTirex  Offline  Сообщение №17 | Тема: Вопросы по скриптам Papyrus написано: 19 мая 2013, 21:53


Архимаг


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

AleksTirex  Offline  Сообщение №18 | Тема: Вопросы по скриптам Papyrus написано: 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, скачал твой мод, посмотрю на него "вживую".


AleksTirex  Offline  Сообщение №19 | Тема: Вопросы по скриптам Papyrus написано: 20 мая 2013, 14:56


Архимаг


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

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

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


AleksTirex  Offline  Сообщение №20 | Тема: Вопросы по скриптам Papyrus написано: 20 мая 2013, 16:39 | Отредактировано: AleksTirex - 20 мая 2013, 16:46


Архимаг


371
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  ; подобрать желаемый эффект

auto state StatDefaulf
Event OnPackageEnd(Package akOldPackage)
PlayImpactEffect(FXDragonLandingImpactSet, "NPC Pelvis", 0, 0, -1, 512)
KnockAreaEffect(1, 2*getLength())
EffSh.Play(self, 4)
utility.wait(3.5)
Dragon.Resurrect()
utility.wait(0.3)
self.Disable()
gotoState("StatDone")
endif
endEvent
endState

state StatDone
;
endState

AleksTirex  Offline  Сообщение №21 | Тема: Вопросы по скриптам Papyrus написано: 20 мая 2013, 17:39


Архимаг


371
Цитата PaukSama

Хочу оставить так как есть, только чтобы конец эффекта добавлял Dis при условии что в начале эффекта он был удален.


 
Через переменную.

if Game.GetPlayer().HasSpell(Dis)
akCaster.RemoveSpell (Dis)
bDone = true
Utility.Wait(480)
akCaster.AddSpell (Dis)
endif

 event onEffectFinish
if bDone == true
akCaster.AddSpell (Dis)
enfif

AleksTirex  Offline  Сообщение №22 | Тема: Вопросы по скриптам Papyrus написано: 20 мая 2013, 21:35 | Отредактировано: AleksTirex - 20 мая 2013, 22:07


Архимаг


371
Цитата PaukSama

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



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 onEffectFinish(....)
if bDone == true
akCaster.AddSpell (Dis)
enfif
aaaaGlobal.SetValue(0)
endEvent

Но лучше сильная потеря здоровья, пусть тренирует школу Восстановления или зелья локает. ok А вот при приёме третьей бутылки - можно и закиллить, раз уж не понятно, что скуума - это яд, хоть и приятный. Тогда будет так:

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

Event onEffectFinish(....)
if bDone == true
akCaster.AddSpell (Dis)
enfif
aaaaGlobal.SetValue(aaaaGlobal.getValue() - 1)
endEvent

Как то так.

AleksTirex  Offline  Сообщение №23 | Тема: Вопросы по скриптам Papyrus написано: 21 мая 2013, 10:37 | Отредактировано: AleksTirex - 21 мая 2013, 10:38


Архимаг


371
Конечно, дело хозяйское как делать, но твои опасения напрасны, всех этих нестыковок можно избежать.
1. "очень некрасиво может добавить Dis по рандому" - чтобы этого не было просто добавь в рендом условие, что на ГГ сейчас только один этот эффект, который добавился только что: if (Utility.RandomInt() <= 50) && aaaaGlobal.getValue() == 1

2. "Сколько бы бутылок со скумой не выпил а положительные эффекты будут как от одной" - вот для этого есть строка ГГ.addSpell(потеря здоровья...  Здесь можно добавить второй эффект, который наложится на первый, ведь это совсем другой эффект. Опьянение сделать ещё сильнее, упадок здоровья, "размыть экран" и т.д.
"дополнительные положительные эффекты..." - да точно так же добавь их таким вариантом.

3. "Скрипт идеально работает только пока он один" - для этого есть переменная aaaaGlobal.getValue(), ей можно ограничивать команды в тех местах, где таковые должны быть только одни (без повторов).

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

В общем, хозяин-барин, но всё-таки подумай.

AleksTirex  Offline  Сообщение №24 | Тема: Вопросы по скриптам Papyrus написано: 21 мая 2013, 11:25 | Отредактировано: AleksTirex - 21 мая 2013, 11:51


Архимаг


371
Цитата AleksTirex

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



Так там же написано: добавляется сильная потеря здоровья, эффектов опьянения можно не добавлять, проблем с 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

Event onEffectFinish(....)
if bDone == true
akCaster.AddSpell (Dis)
enfif
aaaaGlobal.SetValue(aaaaGlobal.getValue() - 1)
endEvent

Т.е. если один эффект уже есть на ГГ, то все команды эффекта скуумы игнорируются (и Dis тоже).

*****
Вместо "потери здоровья" можешь любую "мотивацию" туда воткнуть, хоть сообщение "Пить не хорошо", хоть ...

AleksTirex  Offline  Сообщение №25 | Тема: Вопросы по скриптам Papyrus написано: 21 мая 2013, 13:54


Архимаг


371
Вот здесь:

 

AleksTirex  Offline  Сообщение №26 | Тема: Вопросы по скриптам Papyrus написано: 21 мая 2013, 14:11 | Отредактировано: AleksTirex - 21 мая 2013, 14:12


Архимаг


371
Это ты правильно заметил, и вовремя. ;) Дело в том, что removeCrossFade - глобальная функция, и я не уверен, что она не удалит эффект от другого скрипта, который присутствует на экране (это я не проверял). Поэтому желательно удалять именно твой эффект командой Pery.remove(), а так же добавлять лучше командой Pery.apply(1.0) . К тому же в варианте apply можно настроить желаемую амплитуду эффекта.

AleksTirex  Offline  Сообщение №27 | Тема: Вопросы по скриптам Papyrus написано: 21 мая 2013, 15:13


Архимаг


371
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
 
В твоём варианте это будет так:
 

 Доступно только для пользователейScriptname SkoomaDrug extends activemagiceffect

  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  Offline  Сообщение №28 | Тема: Вопросы по скриптам Papyrus написано: 21 мая 2013, 16:04


Архимаг


371
Цитата PaukSama

AleksTirex, судя по всему не совсем так. Надо   PeryStart  PeryStatic  PeryFinish сделать свойствами наверное. А вообще для чего это? Вроде раньше ничего этого небыло, но плавность в появлении\исчезании присутствовала. Может это зависит от свойств самой анимации...



Естественно, это всё свойства, просто не стал дописывать в твой скрипт.
 
Это всё для того, чтобы было всё красиво и плавно. Практически все дефолтные эффекты именно так делаются, там, где нужна анимация эффекта. Например крик Замедление времени, эффект Берсека и т.д.
 
ImageSpaceModifier может быть как статичным, так и анимированным, это как его сделаешь в настройках.
 
Если не хочешь с этим заморачиваться, то просто imageSpaceModifier.removeCrossFade(2.0) смени на Pery.remove(), и у тебя будет всё как и раньше.

**********
"зависит от свойств самой анимации..." - не анимации, а ImageSpaceModifier

AleksTirex  Offline  Сообщение №29 | Тема: Вопросы по скриптам Papyrus написано: 21 мая 2013, 16:49


Архимаг


371
PaukSama, мы наверное, не поняли друг друга. Всё, что я писал выше, относится только к ImageSpaceModifier и к анимации никакого отношения не имеет.
ImageSpaceModifier сама может быть статичной или анимированной/изменяющейся.
 
По поводу "гг лежит на земле держась за живот" не факт, что эта анимация будет работать через команду скрипта, надо проверять (хорошо если будет). Очень многие анимации не запускаются командой PlayIdle. Но если так произойдёт, то можно использовать фурнитуру-маркер Wounded02FloorMarker для этих целей, она точно работает.

AleksTirex  Offline  Сообщение №30 | Тема: Вопросы по скриптам Papyrus написано: 21 мая 2013, 17:37 | Отредактировано: AleksTirex - 21 мая 2013, 17:51


Архимаг


371
Так оно будет всегда, ведь этот скрипт написан исключительно для формлистов. Но если формлист составлен из  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

Форум » Записи участника [AleksTirex]
  • Страница 1 из 13
  • 1
  • 2
  • 3
  • 12
  • 13
  • »
Поиск:





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