LordVadim, да, теперь работает! Тестовую абилку сделала идентичную твоей (огненный плащ), радиус увеличила до 15000. Если при первой загрузке игры скрипт быстро раздает всем актерам в локации абилку, то после перехода в новую локацию довольно часто бывает ситуация, когда некоторым ближайшим к игроку актерам абилка дается в последнюю очередь. Примерно, 1-2 из 5 актеров в радиусе примерно 500 юнитов получают абилку с большой задержкой, уже когда и самые дальние актеры загорелись. Соответственно, вопрос. Можно ли в в одном цикле сделать несколько этапов проверки FindRandomActorFromRef? Например, 4 этапа: до 500, потом до 2500, потом до 7500, потом до 15000, или для этого лучше сделать 4 цикла и соответственно 4 форм. листа, или вообще каждый цикл в отдельном скрипте?
LordVadim, при выходе+входе задержка в обработке нпс бывает довольно заметна... Но это не критично. Хм, в принципе, можно в блоке OnCellAttach() очищать FormList?
Добавлено (30 Марта 2014, 18:08) --------------------------------------------- Мде, рано я обрадовалась. Пошли вылеты. Не хватает ему 5 секунд, видимо.
Изменение репутации для пользователя Alliria
AlliriaOffline
Сообщение №277
| Тема: Вопросы по скриптам Papyrus
написано: 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
Изменение репутации для пользователя Alliria
AlliriaOffline
Сообщение №279
| Тема: Вопросы по скриптам Papyrus
написано: 31 марта 2014, 06:00
| Отредактировано: Alliria - 31 марта 2014, 06:01
LordVadim, так визуальных эффектов там только ледяной плащ у мертвяков, активируется в бою. Все остальное без визуалок... Хм, пропылесошу на всякий случай.) Для памяти я использую enb+интегрированный в последний SKSE фикс+CellStabilizer, все нормально было... Просто, без мода - не вылетает. Хм... ну, попробую еще чистилку поставить. В любом случае спасибо за помощь!
nepewka, если коротко, то: 1 скрипт - отслеживает, какая анимация проигрывается на игроке, если экипирован blodskaal - отслеживает, когда игрок экипирует blodskaal - запрещает отслеживание анимации, когда blodskaal деэкипирован; - кастует заклинания, когда игрок с blodskaal проиграл ту или иную анимацию; 2 скрипт - назначает дополнительный урон по Закрисосу, если экипирован blodskaal 3 скрипт отслеживает активацию триггера и вызывает срабатывание триггера.
Добавлено (01 Апреля 2014, 05:21) --------------------------------------------- LordVadim, похоже, какой-то конфликт словила. Потерла несколько модов, пока пару часов без вылетов.
Alliria, если у тебя цель скрипта "повесить абилку на НПС и потом её удалить при отдалении или смрти НПС", то не надо никаких массивов и форм-листов, и не надо вообще запрминать каких-либо НПС. Есть решение проще:делаешь цикл только на поиск НПС и раздачу абилок тем, у кого нет такой абилки.
На абилке я пытаюсь добиться устойчивой работы скрипта. Когда это будет, я хочу ввести в скрипт учет типа существ. Для каждого типа будут выдаваться свои абилки. Когда это будет, можно добавлять в маг.эффекты абилок скрипты (как минимум, надо реализовать определение типа входящего урона и разрушение оружия). Потом пойдут манипуляции с инвентарем и уровневыми списками (замена экипировки). Если все это можно сделать в одной абилке - то сделаю, как ты сказал.
Хотя хотелось универсального решения старой задачи "динамического назначения скриптов актерам" не через Cloack эффект с прицепленным скриптом.
Изменение репутации для пользователя Alliria
AlliriaOffline
Сообщение №283
| Тема: Вопросы по скриптам Papyrus
написано: 3 апреля 2014, 06:35
| Отредактировано: Alliria - 3 апреля 2014, 06:39
AleksTirex, LordVadim, путем манипуляций с блоком OnUpdate выяснила несколько забавных вещей: - скрипт AleksTirex, который он давал (где цикл внутри цикла) не работал потому, что циклы запускались в блоке OnInit; если его запускать в блоке OnUpdate, то он работает, но AleksTirex сказал, что так делать нельзя, ибо циклы начнут плодиться и -> CTD; - скрипт LordVadim и любые его модификации, сделанные мной, работал, но вызывал частые вылеты; похоже, CTD происходил при запуске нового цикла проверки, если ГГ в бою, и при очистке мертвых актеров. Предложите вЫпить йАду и убиться аПстИну? А вот вигвам. Квестовый скрипт: Обратите внимание, чистка трупов в одной функции с раздачей. В итоге в бою не вылетает. С расстоянием пока непонятно, к тому же яхз, куда его пихать.
aaAlliriaRCRPlayerQuestScript Property aaAlliriaRCRPlayerQuest Auto Spell Property aaARCRWeapArmMatSpecBase auto Spell Property aaARCRabilityUndead auto
Function StartSpecsNPC(Actor akActor) If (akActor != None) && (!akActor.IsDead()) && (akActor != Game.GetPlayer()) If !akActor.HasSpell(aaARCRWeapArmMatSpecBase) akActor.AddSpell(aaARCRWeapArmMatSpecBase) ElseIf !akActor.HasSpell(aaARCRabilityUndead) akActor.AddSpell(aaARCRabilityUndead) EndIf EndIf If akActor.IsDead() akActor.RemoveSpell(aaARCRWeapArmMatSpecBase) akActor.RemoveSpell(aaARCRabilityUndead) EndIf EndFunction
Скрипт алиаса: Да, я запускаю цикл в OnUpdate, и он работает!
Perk Property aaAlliriaRCRSilverPerk Auto Actor Property aaARCRplayerRef Auto Hidden Actor Property aaARCRnpcRef Auto Hidden Bool StartSpecsPlayerIdent = False
Event OnInit() aaARCRplayerRef = Game.GetPlayer() If !StartSpecsPlayerIdent;;;- не выдано aaARCRplayerRef.AddPerk(aaAlliriaRCRSilverPerk) StartSpecsPlayerIdent = True ;;;- выдано Debug.Notification("ReVamp applyed Specs") EndIf RegisterForSingleUpdate(6.0) EndEvent Event OnUpdate() UnregisterForUpdate() Debug.Notification("ReVamp Cicle Started") int iIndex = 40 While(iIndex > 0) ; поиск актёров около ГГ iIndex -= 1 aaARCRnpcRef = Game.FindRandomActorFromRef(aaARCRplayerRef, 7500.00) (GetOwningQuest() as aaAlliriaRCRPlayerQuestScript).StartSpecsNPC(aaARCRnpcRef) Utility.Wait(0.5) ;;;- задержка перед переходом к поиску следующего актера, в итоге на цикл уходит 20 секунд; EndWhile Debug.Notification("ReVamp Cicle Completed") ;;;- интервал обновления, т.е. пауза между окончанием первого цикла и запуском второго RegisterForSingleUpdate(6.0) EndEvent
Если не ошибаюсь, стакаются не только скрипты на одном маг.эффекте, но и одинаковые маг.эффекты. Соответственно, если на одну цель наложить один эффект n-цать раз (подозреваю, что 256), двиг вылетит в трубу.
Тяга человечества к хламу неистребима. Спора нет, на фоне ванили UNP и CBBE выигрывают, но сидеть на этом, когда есть LB и DG... И ведь с лутом то же самое, достаточно глянуть топ того же нексуса.
Имхо, там не в размере губы дело, а в том, что помада не по линии губ идет. Из-за этого нижняя губа кажется тоньше, чем она есть, а верхняя вздернутой. У 99% тинтмасок аналогичные проблемы.
Стоит Mistress of Night. Демонику подключила не сначала. Проблем с showracemenu нет. Сундук со стартовым шмотом на месте. Ванильные шлемы можно заменить на Open Helmets или перековать в обручи в CCO. Гонцы общаются в штатном режиме. Проверенные квестгиверы тоже. Пассивки данмеров, ночное видение и заклинания призыва в наличии.
Это уже про СК. Пытался сделать пресеты для себя любимого в СК, они не отображаются в игре. То есть, я открываю демоника.есм, сохраняю свой плагин как блабла.есп, делаю нужные мне пресеты, добавляю в расу, сохраняю... - в игре нет новых пресетов.
Я делала пресет. Все работает. Но я загружаю пустой есп и демонику.есм.
Неотображение одежды при овампиривании.Дубляж прически при овампиривании. Некорректное положение оружия на теле. С гонцами пока под вопросом (сам не видел). Баг с прической №8. Могу морфы губ пополнить, если Криста их амнистирует (какие?).
Прошу напомнить, что я пропустил, времени нет всё искать самому.
Еще ты обещал накидать пресетов. Если будешь их включать, могу сбросить свой чарген, а то каждый раз переделывать есп при обновлении есм-а... как-то некомильфо.
VALKNUT, в WryeBash есть функция создать есп. В нем привязка только к Skyrim.esm, больше никаких записей нет. Т.е. он пустой. Вот эта пустышка загружается как активный плагин с демоникой в мастерах. Все Ок.
Добавлено (09 Апреля 2014, 11:34) --------------------------------------------- EdwardLock, а какая разница, при 2Гб оперативы x64 может и похуже x32 работать.
@perture, гыыы... Смотри внимательно, тебе прога error'ы написала. Если ты этот есп грузанешь в игре с другим порядком модов, выйдет пшик, т.к. FormID поменяются. Если грузанешь СК, то как и Криста получишь то, что конструктор поставит (т.е. первую попавшуюся запись).