• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
LordVadim, EVENT onDying - основное событие. При смерти актера, к которому будет применен магический эффект (Constant Self) с этим скриптом, происходит взрыв в точке местонахождения актера. Скрипт УЖЕ работает, но остался огрызок EVENT OnEffectStart от первоначального скрипта (этот скрипт используется в Ability огненного атронаха для создания огненного шлейфа и взрыва при гибели). Вот этот огрызок и надо удалить, чтобы скрипт оставался работоспособным. Также надо изменить условия активации события EVENT onDying, поскольку в текущий момент, если актер убит добивающим ударом ближнего боя (киллмуви), то событие гарантированно не срабатывает (взрыва не происходит). Может, надо убрать проверку по величине здоровья? Если просто удалить EVENT OnEffectStart, то скрипт не компилируется (или не работает, не помню сейчас), похоже, ему нужно вот это: selfRef = caster. Как-то так.
Nothing is...
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №783
написано: 27 марта 2014, 17:09
| Отредактировано: LordVadim - 27 марта 2014, 17:13
LordVadim, EVENT onDying - основное событие. При смерти актера, к которому будет применен магический эффект (Constant Self) с этим скриптом, происходит взрыв в точке местонахождения актера. Скрипт УЖЕ работает, но остался огрызок EVENT OnEffectStart от первоначального скрипта (этот скрипт используется в Ability огненного атронаха для создания огненного шлейфа и взрыва при гибели). Вот этот огрызок и надо удалить, чтобы скрипт оставался работоспособным. Также надо изменить условия активации события EVENT onDying, поскольку в текущий момент, если актер убит добивающим ударом ближнего боя (киллмуви), то событие гарантированно не срабатывает (взрыва не происходит). Может, надо убрать проверку по величине здоровья? Если просто удалить EVENT OnEffectStart, то скрипт не компилируется (или не работает, не помню сейчас), похоже, ему нужно вот это: selfRef = caster. Как-то так.
Событие OnEffectStart удалить не получится, так как именно в нем определяется к кому будет применен эффект, то есть задается значение переменной selfRef. Что бы скрипт срабатывал всегда можно событие onDying() заменить на OnDeath() Тогда скрипт будет выглядеть так:
LordVadim, Пойду тестировать... И спасибо. И Java не работает у меня сегодня в браузере...
UPD: Увы, чуда не произошло. В смысле, взрыва не произошло. В смысле, по неведомой причине скрипт не работает. Хм...
Добавлено (27 Марта 2014, 22:31) --------------------------------------------- LordVadim, а вы, случайно, в Package (Form: PACK) не разбираетесь? Хотелось бы узнать, можно ли через них определить поведение НПС в бою (например, каст определенного заклинания при выполнении неких условий, которые будут указаны в Conditions, например, при (S) Health < 50%).
LordVadim, да, теперь работает! Тестовую абилку сделала идентичную твоей (огненный плащ), радиус увеличила до 15000. Если при первой загрузке игры скрипт быстро раздает всем актерам в локации абилку, то после перехода в новую локацию довольно часто бывает ситуация, когда некоторым ближайшим к игроку актерам абилка дается в последнюю очередь. Примерно, 1-2 из 5 актеров в радиусе примерно 500 юнитов получают абилку с большой задержкой, уже когда и самые дальние актеры загорелись. Соответственно, вопрос. Можно ли в в одном цикле сделать несколько этапов проверки FindRandomActorFromRef? Например, 4 этапа: до 500, потом до 2500, потом до 7500, потом до 15000, или для этого лучше сделать 4 цикла и соответственно 4 форм. листа, или вообще каждый цикл в отдельном скрипте?
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №788
написано: 28 марта 2014, 06:51
| Отредактировано: LordVadim - 28 марта 2014, 06:59
LordVadim, да, теперь работает! Тестовую абилку сделала идентичную твоей (огненный плащ), радиус увеличила до 15000. Если при первой загрузке игры скрипт быстро раздает всем актерам в локации абилку, то после перехода в новую локацию довольно часто бывает ситуация, когда некоторым ближайшим к игроку актерам абилка дается в последнюю очередь. Примерно, 1-2 из 5 актеров в радиусе примерно 500 юнитов получают абилку с большой задержкой, уже когда и самые дальние актеры загорелись. Соответственно, вопрос. Можно ли в в одном цикле сделать несколько этапов проверки FindRandomActorFromRef? Например, 4 этапа: до 500, потом до 2500, потом до 7500, потом до 15000, или для этого лучше сделать 4 цикла и соответственно 4 форм. листа, или вообще каждый цикл в отдельном скрипте?
Новый вариант под спойлером, но все равно могут оставаться пропущенные персонажи, FindRandomActorFromRef - рандомная функция, может одного и того же найти 10 раз, а другой не попадется ни разу. Самое поганое, что FindRandomActorFromRef и ГГ находит постоянно, причем чаще чем всех остальных вместе взятых. В связи с этим я убрал else из проверки.
Scriptname aaTestSCRIPT extends ReferenceAlias;- Скрипт на алиасе игрока
Spell Property aaTest_Spell auto;- Спелл должен быть способностью
FormList Property aaTest_FormList Auto;- Используем форм-лист вместо массива (создать пустой форм-лист prClosestActors в СК и не забыть присвоить свойство в скрипте)
Actor Property prActor Auto Hidden Int ivIndex
Event OnInit();- При инициализации RegisterForSingleUpdate(5) EndEvent
Event OnUpdate() ivIndex = 20;- Количество попыток поиска НПС для первого прохода While ivIndex > 0;- Поиск НПС около ГГ ivIndex -= 1 prActor = Game.FindRandomActorFromRef(Game.GetPlayer(), 500.00);- Радиус поиска if (prActor != None) && (prActor != Game.GetPlayer());- Если НПС найден if !aaTest_FormList.HasForm(prActor);- Если НПС нет в форм-листе значит и спелов у него нет (если они даются только из скрипта) aaTest_FormList.AddForm(prActor);- Добавляем НПС в форм-лист prActor.AddSpell(aaTest_Spell, False);- Добавляем спелл EndIf EndIf EndWhile ivIndex = 30;- Количество попыток поиска НПС для второго прохода While ivIndex > 0;- Поиск НПС около ГГ ivIndex -= 1 prActor = Game.FindRandomActorFromRef(Game.GetPlayer(), 2000.00);- Радиус поиска if (prActor != None) && (prActor != Game.GetPlayer());- Если НПС найден if !aaTest_FormList.HasForm(prActor);- Если НПС нет в форм-листе значит и спелов у него нет (если они даются только из скрипта) aaTest_FormList.AddForm(prActor);- Добавляем НПС в форм-лист prActor.AddSpell(aaTest_Spell, False);- Добавляем спелл EndIf EndIf EndWhile ivIndex = 50;- Количество попыток поиска НПС для третьего прохода While ivIndex > 0;- Поиск НПС около ГГ ivIndex -= 1 prActor = Game.FindRandomActorFromRef(Game.GetPlayer(), 10000.00);- Радиус поиска if (prActor != None) && (prActor != Game.GetPlayer());- Если НПС найден if !aaTest_FormList.HasForm(prActor);- Если НПС нет в форм-листе значит и спелов у него нет (если они даются только из скрипта) aaTest_FormList.AddForm(prActor);- Добавляем НПС в форм-лист prActor.AddSpell(aaTest_Spell, False);- Добавляем спелл EndIf EndIf EndWhile ivIndex = aaTest_FormList.GetSize();- Количество НПС в форм-листе While ivIndex > 0;- Поиск далёких или мёртвых НПС ivIndex -= 1 prActor = aaTest_FormList.GetAt(ivIndex) as Actor;- Текущий НПС из форм-листа if (prActor.GetDistance(Game.GetPlayer()) > 12000) || (prActor.IsDead());- Если НПС далеко или мёртв (радиус поиска) if prActor.HasSpell(aaTest_Spell);- Если у НПС есть спелл prActor.RemoveSpell(aaTest_Spell);- Убираем спелл EndIf aaTest_FormList.RemoveAddedForm(prActor);- Убираем НПС из форм-листа ivIndex = aaTest_FormList.GetSize();- Пересчитываем количество НПС в форм-листе EndIf EndWhile RegisterForSingleUpdate(5) EndEvent
Event OnCellAttach() RegisterForSingleUpdate(0.1);- При смене локации/ячейки скрипт должен срабатывать без задержки EndEvent
LordVadim, при выходе+входе задержка в обработке нпс бывает довольно заметна... Но это не критично. Хм, в принципе, можно в блоке OnCellAttach() очищать FormList?
Добавлено (30 Марта 2014, 18:08) --------------------------------------------- Мде, рано я обрадовалась. Пошли вылеты. Не хватает ему 5 секунд, видимо.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №795
написано: 30 марта 2014, 15:14
| Отредактировано: nepewka - 30 марта 2014, 15:25
Bool Property bPlayerOnly = False auto {Set this if you only want this Imod to play if the player is the spell caster.} float property fDelay = 0.83 auto {time to wait before switching to constant Imod} ImageSpaceModifier property IntroFX auto {IsMod applied at the start of the spell effect} ImageSpaceModifier property LoopFX auto {main isMod for spell} ImageSpaceModifier property OutroFX auto {IsMod applied at the end of the spell effect} Float Property fImodStrength = 1.0 auto {IsMod Strength from 0.0 to 1.0} ; sound property IntroSoundFX auto ; create a sound property we'll point to in the editor; sound property OutroSoundFX auto ; create a sound property we'll point to in the editor; Obtain the target of the active fire effect Bool bIsOkToPlay = true bool bIsFinishing = false actor TargetActor actor CasterActor ;======================================================================================;; EVENTS /;=============/
if bPlayerOnly if CasterActor != game.GetPlayer() bIsOkToPlay = False endif endif
if bIsOkToPlay ;int instanceID = IntroSoundFX.play((target as objectReference)) ; play IntroSoundFX sound from my self IntroFX.remove() LoopFX.remove() ;Kill Imods from another cast, if running. OutroFX.remove()
introFX.apply(fImodStrength) ; apply isMod at full strength utility.wait(fDelay) ; NOTE - neccessary? if bIsFinishing == False ; LoopFX.apply() introFX.PopTo(LoopFX,fImodStrength) ; remove initial FX endif endif
EndEvent
Event OnEffectFinish(Actor Target, Actor Caster)
bIsFinishing = True if bIsOkToPlay ;int instanceID = OutroSoundFX.play((target as objectReference)) ; play OutroSoundFX sound from my self introFX.remove() ;LoopFX.remove() LoopFX.PopTo(OutroFX,fImodStrength) endif endEvent
и 2 вопроса.
1) Как изменить его активный эффект? (увелививает весь наш урон в 2 раза и снижает получаемый на 50%)
в самом скрипте Float Property fImodStrength = 1.0 auto
отвечает за цвет экрана при включении таланта, изменив с 1.0 на 10.0 экран настолько оранжевый, что разглядеть что то было довольно таки трудно
Помимо скрипта, пробовал в самом спелле изменить магнитуду с 1.0 на 10.0, как таковых изменений тоже не заметил...
2) Хотелось бы, чтобы этот талант ещё влиял и на магию. Сейчас он удваивает урон только с оружия которое наносит физический (луки, двуручки, одноручки).
Можно ли что нибудь сделать, чтобы и урон со спеллов стал в 2 раза сильнее?
Всем привет, у меня 2 вопроса по скрипту, отвечающему за расовую способность Орков - берсерк.
Не силен в заклинаниях и талантах, но в приведенном скрипте нет ничего кроме визуализации. Так что назначение эффектов и способностей происходит где то в другом месте.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №797
написано: 30 марта 2014, 21:38
| Отредактировано: nepewka - 30 марта 2014, 21:50
Оказывается скрипты в работе этого таланта совершенно непричем(они видимо за визуальную составляющую отвечали только), всё было завязано на 1 перке. Который был привязан к этому таланту и срабатывал при активации таланта.
Есть другой вопрос
Каким декомпилером из pex пользовать удобнее всего?
есть скрипты из dragonborn, все в pex.
нужен какой то читабельный формат..
Изменение репутации для пользователя Alliria
AlliriaOffline
Сообщение №798
написано: 31 марта 2014, 01:32
| Отредактировано: Alliria - 31 марта 2014, 01:48
nepewka, чтобы закачались исходники, надо в Стиме сначала скачать CreationKit, а потом запустить проверку хеша. Тогда Стим докачает исходники скриптов в папку: Steam/SteamApps/Common/Skyrim/Data/Scripts/Source/ А чем открывать уже скомпиллированные pex, я не знаю. LordVadim, пока подправила скрипт так:
Perk Property aaAlliriaRCRSilverPerk Auto Spell Property aaARCRWeapArmMatSpecBase auto Spell Property aaARCRabilityWeapArmMatSpecDrag auto Spell Property aaARCRabilityUndead auto ;Spell Property aaARCRabilityUndeadMod auto ;Faction Property _00SICUndeadFaction auto FormList Property aaARCRactors_FormListA Auto ;- Используем форм-лист вместо массива (создать пустой форм-лист в СК и присвоить свойство в скрипте) FormList Property aaARCRactors_FormListB Auto FormList Property aaARCRactors_FormListC Auto FormList Property aaARCRactors_FormListD Auto
Actor Property prActor Auto Hidden Actor Property aaARCRplayerRef Auto Hidden
Int ivIndex Bool ivOnCellLoad = False ;;;- эта функция добавляет спелл с проверками нпс Function StartSpell(Actor akActor) if (akActor != None) && (akActor != Game.GetPlayer()) ;- Если НПС найден ;;;-проверка первого форм-листа if !aaARCRactors_FormListA.HasForm(akActor);- Если НПС нет в форм-листе значит и спелов у него нет (если они даются только из скрипта) if aaARCRactors_FormListA.GetSize() < 40 ;- Если в форм-листе меньше 40 актеров aaARCRactors_FormListA.AddForm(akActor) ;- Добавляем НПС в форм-лист akActor.AddSpell(aaARCRWeapArmMatSpecBase, False) ;- Добавляем спелл akActor.AddSpell(aaARCRabilityWeapArmMatSpecDrag, False) ;- Добавляем спелл akActor.AddSpell(aaARCRabilityUndead, False) ;;;-провера второго форм-листа elseif !aaARCRactors_FormListB.HasForm(akActor) if aaARCRactors_FormListB.GetSize() < 40 aaARCRactors_FormListB.AddForm(akActor) ;- Добавляем НПС в форм-лист akActor.AddSpell(aaARCRWeapArmMatSpecBase, False) ;- Добавляем спелл akActor.AddSpell(aaARCRabilityWeapArmMatSpecDrag, False) ;- Добавляем спелл akActor.AddSpell(aaARCRabilityUndead, False) ;;;-проверка третьего форм-листа elseif !aaARCRactors_FormListC.HasForm(akActor) if aaARCRactors_FormListC.GetSize() < 40 aaARCRactors_FormListC.AddForm(akActor) ;- Добавляем НПС в форм-лист akActor.AddSpell(aaARCRWeapArmMatSpecBase, False) ;- Добавляем спелл akActor.AddSpell(aaARCRabilityWeapArmMatSpecDrag, False) ;- Добавляем спелл akActor.AddSpell(aaARCRabilityUndead, False) ;;;- проверка четвертого форм-листа elseif !aaARCRactors_FormListD.HasForm(akActor) if aaARCRactors_FormListD.GetSize() < 40 aaARCRactors_FormListD.AddForm(akActor) ;- Добавляем НПС в форм-лист akActor.AddSpell(aaARCRWeapArmMatSpecBase, False) ;- Добавляем спелл akActor.AddSpell(aaARCRabilityWeapArmMatSpecDrag, False) ;- Добавляем спелл akActor.AddSpell(aaARCRabilityUndead, False) ;;;- если все заполнены, очистка Else aaARCRactors_FormListA.Revert() aaARCRactors_FormListB.Revert() aaARCRactors_FormListC.Revert() aaARCRactors_FormListD.Revert() EndIf EndIf EndIf EndIf EndIf EndIf EndFunction ;;;- эта функция обновляет спеллы игрока при инициализации Function StartSpecsPlayer(Actor akActor) aaARCRplayerRef.RemoveSpell(aaARCRWeapArmMatSpecBase) aaARCRplayerRef.RemoveSpell(aaARCRabilityWeapArmMatSpecDrag) aaARCRplayerRef.RemovePerk(aaAlliriaRCRSilverPerk) Debug.Notification("Alliria Specs removed for PC") ; сообщение для теста Utility.Wait(2.0) aaARCRplayerRef.AddSpell(aaARCRWeapArmMatSpecBase) aaARCRplayerRef.AddSpell(aaARCRabilityWeapArmMatSpecDrag) aaARCRplayerRef.AddPerk(aaAlliriaRCRSilverPerk) ;ARCRplayerRef = none Debug.Notification("Alliria Specs applyed for PC") ; сообщение для теста EndFunction
Event OnUpdate() aaARCRplayerRef = Game.GetPlayer() ;- Игрок StartSpell(Game.FindClosestActor(aaARCRplayerRef.X + 500, aaARCRplayerRef.Y + 500, aaARCRplayerRef.Z, 450)) ;- Если НПС найден - дать спелл StartSpell(Game.FindClosestActor(aaARCRplayerRef.X - 500, aaARCRplayerRef.Y - 500, aaARCRplayerRef.Z, 450)) ;- Если НПС найден - дать спелл StartSpell(Game.FindClosestActor(aaARCRplayerRef.X + 500, aaARCRplayerRef.Y - 500, aaARCRplayerRef.Z, 450)) ;- Если НПС найден - дать спелл StartSpell(Game.FindClosestActor(aaARCRplayerRef.X - 500, aaARCRplayerRef.Y + 500, aaARCRplayerRef.Z, 450)) ;- Если НПС найден - дать спелл StartSpell(Game.FindClosestActor(aaARCRplayerRef.X + 500, aaARCRplayerRef.Y, aaARCRplayerRef.Z, 450)) ;- Если НПС найден - дать спелл StartSpell(Game.FindClosestActor(aaARCRplayerRef.X - 500, aaARCRplayerRef.Y, aaARCRplayerRef.Z, 450)) ;- Если НПС найден - дать спелл StartSpell(Game.FindClosestActor(aaARCRplayerRef.X, aaARCRplayerRef.Y + 500, aaARCRplayerRef.Z, 450)) ;- Если НПС найден - дать спелл StartSpell(Game.FindClosestActor(aaARCRplayerRef.X, aaARCRplayerRef.Y - 500, aaARCRplayerRef.Z, 450)) ;- Если НПС найден - дать спелл
ivIndex = 40 ;- Количество попыток поиска НПС While ivIndex > 0 ;- Поиск НПС около ГГ ivIndex -= 1 if ivOnCellLoad Return ;- Выход при смене локации EndIf StartSpell(Game.FindRandomActorFromRef(aaARCRplayerRef, 1000.00)) ;- Если НПС найден - дать спелл EndWhile ivIndex = 40 ;- Количество попыток поиска НПС While ivIndex > 0 ;- Поиск НПС около ГГ ivIndex -= 1 if ivOnCellLoad Return ;- Выход при смене локации EndIf StartSpell(Game.FindRandomActorFromRef(aaARCRplayerRef, 2000.00)) ;- Если НПС найден - дать спелл EndWhile ivIndex = 40 ;- Количество попыток поиска НПС While ivIndex > 0 ;- Поиск НПС около ГГ ivIndex -= 1 if ivOnCellLoad Return ;- Выход при смене локации EndIf StartSpell(Game.FindRandomActorFromRef(aaARCRplayerRef, 10000.00)) ;- Если НПС найден - дать спелл EndWhile ;;;- очистка форм-листов, когда актер умер или далеко ;;;- очистка первого форм-листа ivIndex = aaARCRactors_FormListA.GetSize() ;- Количество НПС в форм-листе While ivIndex > 0 ;- Поиск далёких или мёртвых НПС ivIndex -= 1 if ivOnCellLoad Return ;- Выход при смене локации EndIf prActor = aaARCRactors_FormListA.GetAt(ivIndex) as Actor ;- Текущий НПС из форм-листа If (prActor.GetDistance(Game.GetPlayer()) > 12000) || (prActor.IsDead()) ;- Если НПС далеко или мёртв (радиус поиска) prActor.RemoveSpell(aaARCRWeapArmMatSpecBase) ;- Убираем спелл prActor.RemoveSpell(aaARCRabilityWeapArmMatSpecDrag) ;- Убираем спелл prActor.RemoveSpell(aaARCRabilityUndead) ;- Убираем спелл aaARCRactors_FormListA.RemoveAddedForm(prActor) ;- Убираем НПС из форм-листа ivIndex = aaARCRactors_FormListA.GetSize() ;- Пересчитываем количество НПС в форм-листе EndIf EndWhile ;;;- очистка второго форм-листа ivIndex = aaARCRactors_FormListB.GetSize() ;- Количество НПС в форм-листе While ivIndex > 0 ;- Поиск далёких или мёртвых НПС ivIndex -= 1 if ivOnCellLoad Return ;- Выход при смене локации EndIf prActor = aaARCRactors_FormListB.GetAt(ivIndex) as Actor ;- Текущий НПС из форм-листа If (prActor.GetDistance(Game.GetPlayer()) > 12000) || (prActor.IsDead()) ;- Если НПС далеко или мёртв (радиус поиска) prActor.RemoveSpell(aaARCRWeapArmMatSpecBase) ;- Убираем спелл prActor.RemoveSpell(aaARCRabilityWeapArmMatSpecDrag) ;- Убираем спелл prActor.RemoveSpell(aaARCRabilityUndead) ;- Убираем спелл aaARCRactors_FormListB.RemoveAddedForm(prActor) ;- Убираем НПС из форм-листа ivIndex = aaARCRactors_FormListB.GetSize() ;- Пересчитываем количество НПС в форм-листе EndIf EndWhile ;;;- очистка третьего форм-листа ivIndex = aaARCRactors_FormListC.GetSize() ;- Количество НПС в форм-листе While ivIndex > 0 ;- Поиск далёких или мёртвых НПС ivIndex -= 1 if ivOnCellLoad Return ;- Выход при смене локации EndIf prActor = aaARCRactors_FormListC.GetAt(ivIndex) as Actor ;- Текущий НПС из форм-листа If (prActor.GetDistance(Game.GetPlayer()) > 12000) || (prActor.IsDead()) ;- Если НПС далеко или мёртв (радиус поиска) prActor.RemoveSpell(aaARCRWeapArmMatSpecBase) ;- Убираем спелл prActor.RemoveSpell(aaARCRabilityWeapArmMatSpecDrag) ;- Убираем спелл prActor.RemoveSpell(aaARCRabilityUndead) ;- Убираем спелл aaARCRactors_FormListC.RemoveAddedForm(prActor) ;- Убираем НПС из форм-листа ivIndex = aaARCRactors_FormListC.GetSize() ;- Пересчитываем количество НПС в форм-листе EndIf EndWhile ;;;- очистка четвертого форм-листа ivIndex = aaARCRactors_FormListD.GetSize() ;- Количество НПС в форм-листе While ivIndex > 0 ;- Поиск далёких или мёртвых НПС ivIndex -= 1 if ivOnCellLoad Return ;- Выход при смене локации EndIf prActor = aaARCRactors_FormListD.GetAt(ivIndex) as Actor ;- Текущий НПС из форм-листа If (prActor.GetDistance(Game.GetPlayer()) > 12000) || (prActor.IsDead()) ;- Если НПС далеко или мёртв (радиус поиска) prActor.RemoveSpell(aaARCRWeapArmMatSpecBase) ;- Убираем спелл prActor.RemoveSpell(aaARCRabilityWeapArmMatSpecDrag) ;- Убираем спелл prActor.RemoveSpell(aaARCRabilityUndead) ;- Убираем спелл aaARCRactors_FormListD.RemoveAddedForm(prActor) ;- Убираем НПС из форм-листа ivIndex = aaARCRactors_FormListD.GetSize() ;- Пересчитываем количество НПС в форм-листе EndIf EndWhile ;;;- интервал перезапуска проверок RegisterForSingleUpdate(5) EndEvent ;;;- очистка форм-листов при загрузке локации Event OnCellLoad() ;- Загрузка локации UnregisterForUpdate() ;- Пока идёт проверка не даём новых спеллов ivOnCellLoad = True ;- Если идёт раздача спеллов, надо её завершить Utility.Wait(0.1) ;- Задержка ivIndex = aaARCRactors_FormListA.GetSize() ;- Количество НПС в форм-листе While ivIndex > 0 ivIndex -= 1 (aaARCRactors_FormListA.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRWeapArmMatSpecBase) ;- Убираем спелл у НПС (aaARCRactors_FormListA.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRabilityWeapArmMatSpecDrag) ;- Убираем спелл у НПС (aaARCRactors_FormListA.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRabilityUndead) ;- Убираем спелл у НПС EndWhile ivIndex = aaARCRactors_FormListB.GetSize() ;- Количество НПС в форм-листе While ivIndex > 0 ivIndex -= 1 (aaARCRactors_FormListB.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRWeapArmMatSpecBase) ;- Убираем спелл у НПС (aaARCRactors_FormListB.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRabilityWeapArmMatSpecDrag) ;- Убираем спелл у НПС (aaARCRactors_FormListB.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRabilityUndead) ;- Убираем спелл у НПС EndWhile ivIndex = aaARCRactors_FormListC.GetSize() ;- Количество НПС в форм-листе While ivIndex > 0 ivIndex -= 1 (aaARCRactors_FormListC.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRWeapArmMatSpecBase) ;- Убираем спелл у НПС (aaARCRactors_FormListC.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRabilityWeapArmMatSpecDrag) ;- Убираем спелл у НПС (aaARCRactors_FormListC.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRabilityUndead) ;- Убираем спелл у НПС EndWhile ivIndex = aaARCRactors_FormListD.GetSize() ;- Количество НПС в форм-листе While ivIndex > 0 ivIndex -= 1 (aaARCRactors_FormListD.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRWeapArmMatSpecBase) ;- Убираем спелл у НПС (aaARCRactors_FormListD.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRabilityWeapArmMatSpecDrag) ;- Убираем спелл у НПС (aaARCRactors_FormListD.GetAt(ivIndex) as Actor).RemoveSpell(aaARCRabilityUndead) ;- Убираем спелл у НПС EndWhile aaARCRactors_FormListA.Revert() aaARCRactors_FormListB.Revert() aaARCRactors_FormListC.Revert() aaARCRactors_FormListD.Revert() ;- Очищаем форм-лист ivOnCellLoad = False ;- Можно запускать раздачу спеллов RegisterForSingleUpdate(0.1) ;- При смене ячейки скрипт должен срабатывать без задержки EndEvent
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №801
написано: 31 марта 2014, 03:44
| Отредактировано: nepewka - 31 марта 2014, 03:45
Если я вас попрошу выложить папку Skyrim/Data/Scripts/Source/Dragonborn с исходниками в pcs (размер её не должен превышать 10мб), на какой нибудь яндекс диск и прислать мне в лс. Вас это сильно затруднит?)
Вылетова стало меньше, но все равно часто вылетает. Причем, общи принцип такой: где-то полчаса - час работает стабильно. Потом появляются одиночные вылеты. А потом начинает вылетать примерно раз в 5-10 минут.
Alliria, Это похоже на засорение памяти скайрима. При больших количествах визуальных эффектов может происходить. В этом случае скрипт не причем, вернее как ты его не переделывай все равно будет вылетать. У меня была такая же история когда я делал "Звёзды небесного края". Помогла установка SSME + SMC. Скайрим стал грузиться чуть дольше, но вылеты практически исчезли.
Изменение репутации для пользователя Alliria
AlliriaOffline
Сообщение №803
написано: 31 марта 2014, 06:00
| Отредактировано: Alliria - 31 марта 2014, 06:01
LordVadim, так визуальных эффектов там только ледяной плащ у мертвяков, активируется в бою. Все остальное без визуалок... Хм, пропылесошу на всякий случай.) Для памяти я использую enb+интегрированный в последний SKSE фикс+CellStabilizer, все нормально было... Просто, без мода - не вылетает. Хм... ну, попробую еще чистилку поставить. В любом случае спасибо за помощь!
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №804
написано: 31 марта 2014, 06:07
| Отредактировано: nepewka - 31 марта 2014, 06:32
Скрипты от бладскал блейда. Хочу реализовать подобный эффект на другом оружии(Лук). Чтобы при выстреле, помимо стрелы вылетал, допустим какой нибудь файрболл.
есть 3 скрипта, нужна ваша помощь.
Собственно меня интересует эффект, где при ударе вылетает спелл. 2 скрипт, прост даже для меня. Насколько я понимаю он отвечает за дополнительный урон против босса, поправте если не прав.
Actor property selfRef auto hidden Spell Property DLC2BloodskalBladeSpellHoriz auto Spell Property DLC2BloodskalBladeSpellVert auto weapon property selfWeapon auto hidden hidden ammo property DLC2BloodskalAmmo auto ReferenceAlias Property BloodskalBlade auto objectReference Property ObjSelf auto hidden
Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) if akNewContainer as Actor selfWeapon = (self.getReference().getBaseObject() as weapon) utility.wait(0.1) if (akNewContainer as Actor).isEquipped(selfWeapon) OnEquipped(akNewContainer as Actor) endif endif BloodskalBlade.ForceRefTo(objSelf) endEvent
nepewka, если коротко, то: 1 скрипт - отслеживает, какая анимация проигрывается на игроке, если экипирован blodskaal - отслеживает, когда игрок экипирует blodskaal - запрещает отслеживание анимации, когда blodskaal деэкипирован; - кастует заклинания, когда игрок с blodskaal проиграл ту или иную анимацию; 2 скрипт - назначает дополнительный урон по Закрисосу, если экипирован blodskaal 3 скрипт отслеживает активацию триггера и вызывает срабатывание триггера.
Добавлено (01 Апреля 2014, 05:21) --------------------------------------------- LordVadim, похоже, какой-то конфликт словила. Потерла несколько модов, пока пару часов без вылетов.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №806
написано: 1 апреля 2014, 08:02
| Отредактировано: nepewka - 1 апреля 2014, 02:51
Хочу скриптом увеличить дамаг, выдает ошибку no viable alternative at input
Как обьяснить ему, что моя цель таргет или Victim, чтобы небыло этой ошибки?
какую команду можно написать
Добавлено (01 Апреля 2014, 11:57) --------------------------------------------- Nevermind ))) разобрался
пришлось посидеть 4 часа с этими скриптами и с уровня новичка, теперь понимаю на базовом)
Подскажите как правильно использовать функцию GetRandomPercent?
хочу сделать, чтобы при срабатывании рандома, допустим в 20% цели наносился дополнительный урон
надо как то использовать if и GetRandomPercent, но как правильно?
Добавлено (01 Апреля 2014, 12:02) --------------------------------------------- Допустим у меня есть функция с дополнительным уроном, но её надо запустить после попадание в эти 20% как сделать?
Подскажите как правильно использовать функцию GetRandomPercent? хочу сделать, чтобы при срабатывании рандома, допустим в 20% цели наносился дополнительный урон надо как то использовать if и GetRandomPercent, но как правильно?
if Utility.RandomInt(0, 99) <= 19 ;- Ваши действия endif
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №808
написано: 1 апреля 2014, 08:21
| Отредактировано: nepewka - 1 апреля 2014, 08:24
Неделю назад даже не думал о них, а щас чутка разобрался.
омг это же такой потенциал и возможности
Добавлено (01 Апреля 2014, 12:52) --------------------------------------------- LordVadim, можешь скачать один скрипт .pex декомпилировать и выложить мне назад? если не трудно http://rusfolder.com/40299960
мой декомпилятор ужасно работает, на мой взгляд.
Хочу узнать, намного ли твой лучше (сам проверить не могу, твой Champ не работает у меня почему то :((
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)