Dsion, тогда это DLC1NPCMonitoringPlayer. Ну, там каждую секунду проверяется, прошел ли игрок за 8 предыдущих секунд 150 юнитов. И да, есть лишние телодвижения, такие, как смещение всего массива на одну ячейку.
gangrena1972, а в чем разница? И апдейт, и условие на модном квесте, будут проверять одно и то же - состояние ванильного квеста. Только для апдейта период можно задать произвольный, а для условия квеста он фиксированный (не знаю какой, но в маг. эффектах = 1с, может, и там такой же).
Lexo, в SKSE есть кое-что (в Actor.psc и ActorBase.psc). А именно:
Код
; returns the face textureset of the actor (Player Only?) TextureSet Function GetFaceTextureSet() native Function SetFaceTextureSet(TextureSet textures) native
И, возможно, придется применять это заново при каждой загрузке сохранения.
veto, я проверил, призванное существо не входит во фракцию PlayerFaction, его имя не содержит имени игрока (в игре так: Грозовой атронах - Имя игрока; GetDisplayName() возвращает имя только базового актера). Мне тоже интересно, как получить референс владельца существа.
Как я бы сделал, если было очень нужно: при касте заклинания с требуемыми ключ. словами (MagicSummon...) игрок кидает Cast() еще одно заклинание Aimed в точку, куда смотрит (т.е. потенциально рядом с появлением атронаха). Дальше по смыслу: снаряд - взрыв - активатор (с моделью Effects\FXEmptyObject.nif). Активатор ищет ближайший SummonTargetFXActivator, а от него - ближайшее существо IsCommandedActor() и дает ему Misc-предмет. Предмет отмечает актера и позволяет легко отличить в перке Activate.
Достоинства: позволяет реализовать идею. Недостатки: узнаются только существа, призванные после подключения мода; малый шанс неправильного определения; сложность (и кривизна) реализации.
Dsion, не проверял, увы. Зато проверял еще некоторые бредовые идеи, вроде GetEnableParent() или кто является источником / целью маг. эффекта, накладываемого на игрока при вызове.
veto, это как? Если в SummonCreature поставить своего актера, ничего не изменится, т.к. НПС пользуются теми же заклинаниями, что и игрок (они тоже будут призывать твоих существ). Если при вызове убирать дефолтное существо и на его место помещать твое, то нужно сперва получить его референс, а это опять сложности и шанс провала, если рядом стоит другой призванный НПС-ом атронах (или призывается в этот момент). Плюс дефолтный актер и маг. эффект в меню связаны, с этим что делать?
veto, перк не нужен, достаточно условия "ID Цели == Игрок".
И описанный способ - как по мне, так себе. Как призвать несколько одинаковых актеров? Как быть со смертностью актера? Как наложить эффект-таймер, снимающийся при смерти актера (наподобие ванильного)? Banish / Command работать не будут. Прощайте, остальные моды на призыв. Затрагивание заклинаний.
То, что я предложил в начале - оптимально. Позволяет получить референс сразу, не требуя активации кнопкой. Вместо выдачи предмета можно, к примеру, поместить актера в алиас или дать Ability с кучей скриптов. Все зависит от того, какая задача поставлена.
Dsion, теперь проверил, да, none.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №822
| Тема: Вопросы по скриптам Papyrus
написано: 2 августа 2017, 19:27
| Отредактировано: Multigone - 2 августа 2017, 19:33
Dsion, так заклинание поднятия нежити накладывается прямиком на мертвого актера. Там есть доп. эффект "если игроком взят перк, Value Mod +100 AV Health + флаг Recover".
Кстати, интересное наблюдение - шкала здоровья НПС привязана к базовому максимуму AV Health, а не текущему максимуму AV Health (которое с модификаторами). Это означает, что если модификатором удвоить здоровье, то урон не будет виден, пока расчетное здоровье не станет меньше половины; если снизить вдвое - то начальное положение полоски здоровья будет таково, как будто ему уже сняли половину ХП.
xRg, убрать мастер - прогой TES5Edit. Для начала - удалить все связи с формами, присущими только Update.esm (если твой мод использует что-то, что есть в Skyrim.esm, но перезаписывается в Update.esm, то это не считается связью с Update.esm). Затем ПКМ на названии твоего мода -> CleanMasters.
Проверить, экипировано ли оружие:
В обычных условиях СК:
(S) (HasBoundWeaponEquipped) (Left) == 1.0 (OR) (S) (HasBoundWeaponEquipped) (Right) == 1.0 (AND)
Miter, я больше скажу - нет никакой возможности нацелить Aimed-заклинание, исходящее от актера, в произвольном направлении. Этого сделать просто нельзя. Т.е. огненный шар никогда не полетит от актера вправо, скажем. Только туда, куда смотрит его башня. Это касается и игрока. Даже определив, что враг находится в секторе обзора (или в конусе Х градусов от прицела), нельзя направить заклинание-снаряд от игрока к нему. Правда, можно поставить впереди маркер, и кастовать от него (объекты не-актеры могут творить заклинания куда хотят), но это уже совсем другая история.
Dsion, я имел в виду обычное заклинание. Снаряд как отдельный референс не даст информации о заклинателе (поскольку его нет). Следовательно, пользоваться таким способом может только игрок.
В целом ты одновременно прав и не совсем. Дело в том, что на projectile физический импульс никак не воздействует. Я провел серию опытов - вне зависимости от указанной модели (имеет ли она инфу о физ. свойствах или нет), а также от флагов, снаряд всегда летит по заданной траектории. Другое дело, если снаряд делать как MovableStatic, тогда он сможет наносить урон столкновением, однако взрыв и прочие плюшки projectile будут ему недоступны.
Но! Можно управлять полетом projectile, используя SetAngle. Там, правда, довольно большие объемы расчетов, но как факт. А референс снаряда получаем триггером, помещаемым под носом игрока (встречные снаряды можно отсеять проверкой углов снаряда и триггера).
К примеру, таким образом мне удалось реализовать ручное управление (примерно как ракетой в Half-Life 2). Правда, те, что летят быстро, не успевают среагировать на большой угол.
Все желающие могут забирать сырье :D. Вешается на триггер, который помещаем перед игроком заклинанием или чем-нибудь еще (можно через OnSpellCast в алиасе).
Float Property MaxDist = 10000.0 Auto ; Макс. дистанция снаряда от игрока. Float Property MaxAim = 2000.0 Auto ; Расстояние управляющей точки от игрока. Float Property MaxAngle = 9.0 Auto ; Макс. угол реакции снаряда за 0.05 сек.
Float FUNCTION fInt(Float A, Float B = 1.0, Float C = 0.0) IF B > C IF A >= B RETURN B ELSEIF A < C RETURN C ENDIF ELSEIF A <= B RETURN B ELSEIF A > C RETURN C ENDIF RETURN A ENDFUNCTION
STATE S EVENT OnTriggerEnter(ObjectReference xR) ENDEVENT ENDSTATE
Lexo, лучший способ раздать заклинание - вовсе не плащ, а эффект с Area. И нагрузка будет меньше, как мне кажется.
Dsion, так я управляю любым снарядом, выпущенным игроком. А триггер нужен как самый простой способ получить его реф. А ты предлагаешь спавнить MovableStatic (?), не умеющий втыкаться в актеров, как ледяная стрела, или взрываться с наложением маг. эффекта, не оставляющий попаданий в поверхность. А если не статик, то что?
Добавлено (13 Августа 2017, 20:30) --------------------------------------------- Dsion, когда спавнишь, по умолчанию применяется matchRotation, как для объекта-источника спавна. На какой угол он повернут, туда и полетит. Наверное. Во всяком случае, реф. снаряда применимы некоторые (если не большинство) функции ObjectReference - Disable, Delete, MoveTo и пр.
Dsion, а что не так с триггером? Он находится в своей локации, перемещается по требованию и уезжает в закат, когда необходимость отпадает. Есть что-то, чего я не знаю?
Цитата Dsion
попробовать прицепить скрипт
А что там вообще можно сделать? Единственное, получить Self. А если реф. известен извне, не проще запихнуть в алиас.
xRg, за силу отвечает параметр Settings - fMagicDualCastingEffectivenessBase, за расход маны - fMagicDualCastingCostMult. Просто в фильтре "Dual", будут показаны все подходящие настройки.
Stacie, обнаружение нежити работает на актерах, имеющих ключ. слово "ActorTypeUndead". Все расы вампиров имеют ключ. слово "Vampire". Значит, нужно добавить ему эти ключ. слова - в ActorBase или через алиас квеста.
ObjectReference Property MindXMarkerREF Auto ; Маркер локации.
; Автозаполнение. Static Property XMarker Auto Spell Property GhostAbility Auto Spell Property MG08ParalysisAbility Auto
Event OnEffectStart(Actor xT, Actor xC) xT.SetGhost() xT.BlockActivation() xT.EnableAI(false) xC = Game.GetPlayer() ObjectReference XPlayPos = xC.PlaceAtMe(XMarker) Actor xA = MindXMarkerREF.PlaceAtMe(xT.GetBaseObject()) AS Actor xA.BlockActivation() xA.RemoveAllItems() xA.RemoveFromAllFactions() Int iC = xT.GetNumItems() WHILE iC Form xF = xT.GetNthForm(iC) IF xT.IsEquipped(xF) xA.AddItem(xF, 99) xA.EquipItem(xF, true) ENDIF iC -= 1 ENDWHILE xC.MoveTo(MindXMarkerREF) xA.AddSpell(GhostAbility) xC.AddSpell(GhostAbility, false) xA.StartCombat(xC) WHILE !xA.IsDead() && iC < 60 ; Минута на бой. Utility.Wait(1.0) iC += 1 ENDWHILE iC = xA.IsDead() AS Int xC.RemoveSpell(GhostAbility) xC.MoveTo(XPlayPos) XPlayPos.Delete() xA.Disable() xA.Delete() xT.SetGhost(false) xT.BlockActivation(false) xT.EnableAI() xT.PushActorAway(xT, 0.0) IF iC Utility.Wait(0.5) xT.AddSpell(MG08ParalysisAbility) ; для НПС - после выгрузки локации маг. эффект добавленных заклинаний типа Ability перестает работать (и его скрипт тоже), но само заклинание остается. ENDIF ENDEVENT
xRg, активаторы - в фильтре "Shrine". Там же скрипт "TempleBlessingScript". Заклинания - в фильтре "altar". Открывай каждое и смотри его эффект. Предыдущее снимается потому, что в эффектах: при наложении этого эффекта снять другие (Dispel effects with these keywords), имеющие ключ. слово "MagicBlessing".
Dsion, нужно ведь запоминать референсы предметов где-то, чтобы их потом когда-нибудь возвращать обратно из локации, так? Вместо этого можно просто "узнавать" их RefID с помощью SKSE. Я это хотел сказать.
Вот этим выбираем нужную кнопку в настройках мода (см. SKI_ConfigBase.psc):
Код
; Добавить опцию. int function AddKeyMapOption(string a_text, int a_keyCode, int a_flags = 0) function AddKeyMapOptionST(string a_stateName, string a_text, int a_keyCode, int a_flags = 0)
; Отобразить новое значение опции. function SetKeyMapOptionValue(int a_option, int a_keyCode, bool a_noUpdate = false) function SetKeyMapOptionValueST(int a_keyCode, bool a_noUpdate = false, string a_stateName = "")
; a_keyCode - число, определяющее клавишу. Шестнадцатеричные значения можно посмотреть в interface.bsa\controls\pc\controlmap.txt
Вот этим откликаемся на нажание клавиши (см. Form.psc):
Код
; Регистрация клавиши. Function RegisterForKey(int keyCode) native Function UnregisterForKey(int keyCode) native Function UnregisterForAllKeys() native
; Событие нажатия клавиши. Творим заклинания (Cast() без анимации и ограничений), используем умения (более актуально) и т.д. ; Условиями нужно исключить срабатывание в неподходящих условиях - в меню, в диалогах, под водой и т.д. Event OnKeyDown(int keyCode) Event OnKeyUp(int keyCode, float holdTime)
Живые примеры можно посмотреть, раскурочив какой-нибудь мод, где это используется. Frostfall, к примеру.
Lexo, проблема в переменной akItemReference, которая не передает корректно данные, когда они есть (предмет обладает постоянным референсом / находится в алиасе / референс создан движком при крафте). Еще, GetGoldValue() возвращает только стоимость базового предмета.
; Sets whether the player knows this form ; Should only be used for Magic Effects, ; Words of Power, and Enchantments Function SetPlayerKnows(bool knows) native