LordVadim, если НПС твои, то всё упрощается - вешай скрипт с хит прямо на НПС.
*********************
nepewka, добавлять актёрам перки нельзя, замени действие перков маг.эффектами с похожими результатами. Мне сейчас совсем нет времени заняться вопросом перков, возможно, потом займусь.
**********************
AveDarkness, сделай свойство-массив, назначь в нём все свои яблоки, и рендомно включай одно из них:
ObjectReference[] Property akAple auto ; при создании свойства ставишь галочку Array и назначаешь все свои яблоки
В теле/окне стадии квеста пишешь эти команды:
int irandom = Utility.RandomInt(0, akAple.Length - 1) akAple[irandom].Enable()
При срабатывании стадии включится одно произвольное яблоко.
Shefdus, если накосячил в ESP и сохранил, то ничего страшного - возьми резервную копию своего ESP и замени порченный этим (расширение bak сотри). В папке ...\Skyrim\Backup находятся 10 последних сохранений ESP. Но а если ты уже после косяка более 10 раз сохранил свой ESP, то чистить/отменять сделанное можно в СК. Для этого при запуске СК когда ставишь галочку Active File, то после этого не нажимай ОК, а нажми Detalies... Откроется окно, в котором будут написаны объекты, которые ты в ESP изменял и создавал. Для отмены этих изменений выделяешь порченный объект и жмёшь Delete, потом уже ОК, СК загрузит твой ESP, сохрани.
Shefdus, это надо настраивать погоду - Weather. Но это довольно много позиций перекручивать. Проще использовать ENB. Вот лично я, использую только дефолтные файлы, без "рукоблудства" модмейкеров, только 3 файла: d3d9.dll, d3d9.fx, d3d9_SFX.dll, которые лежат в папке с игрой (Skyrim, не Data). Так получается не сильное затемнение, т.к. практически все (см. выше) стараются делать очень тёмными все помещения, типа "чем темнее, тем круче".
************************
sppassword, для начала отметь/выставь в своей расе в первой вкладке две позиции: в Morph Race выставь DefaultRace или NordRace, а в Armor Race выставь DefaultRace.
Принцип: при попадании заклинания на НПС срабатывает OnHit(), в котором проверяется: попало именно заклинание, кастовал не сам НПС, враждебное, школа разрушения. Далее считывается кол-во эффектов и записывается магнитуда каждого эффекта в массив (10 - этого хватит, т.к. больше 10 эффектов не бывает). Далее каждый такой эффект получает магнитуду 20% от номинала. Когда все эффекты изменены НПС кастует этим спеллом сам на себя, т.к. после попадания на НПС заклинания его уже бесполезно изменять, а тут НПС кастует уже изменённым заклинанием. Потом все эффекты этого спелла взвращаем в исходное значение.
Получается второй каст заклинания с силой в 20% от исходного, что и требовалось. Работает только на заклинания и оружие (посохи), зачарование, яды не действуют.
float[] aamagnitude
Event OnEffectStart(Actor akTarget, Actor akCaster) aamagnitude = new float[10] endEvent
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) Actor akSelf = GetTargetActor() if akSource as Spell && akAggressor as Actor != akSelf Spell akSpell = akSource as Spell if akSpell.IsHostile() int numEffects = akSpell.GetNumEffects() int index = 0 While index < numEffects MagicEffect effect = akSpell.GetNthEffectMagicEffect(index) if effect.GetAssociatedSkill() == "Destruction" float magnitude = akSpell.GetNthEffectMagnitude(index) aamagnitude [index]= magnitude magnitude = magnitude * 0.2 ; ==20% akSpell.SetNthEffectMagnitude(index, magnitude) endif index += 1 endWhile akSpell.Cast(akSelf, akSelf) Utility.Wait(0.2) index = 0 While index < numEffects MagicEffect Reffect = akSpell.GetNthEffectMagicEffect(index) if Reffect.GetAssociatedSkill() == "Destruction" akSpell.SetNthEffectMagnitude(index, aamagnitude[index]) endif index += 1 endWhile endif endif endEvent
******************* В игре не проверял, но компилиться должно. (нужен SKSE)
nepewka, возврат значений работает. Этот скрипт - шаблон для создания своего скрипта. Т.е. показан сам принцип, а дорабатывать его тебе надо самому.
При попадании в цель заклинания могут срабатывать несколько OnHit(), и поэтому второй просто переписывает значения в массиве на уже изменённые (маленькие). Для подобных обработок надо вводить "заглушку", или переменной, или статусом, чтобы пока полностью не отработает один блок, второй бы не смог работать/обрабатывать. Если введёшь такую заглушку, то всё будет правильно с магнитудой.
Далее думай над кастом. Возможно, попробуй создать под ногами НПС временный маркер и пусть он кастонёт по НПС. После каста сразу удаляешь этот маркер.
*************************
Вариант, как сделать простое "Уязвимость к магии" я не предлагаю, ведь если я правильно тебя понял, то тебе нужен процесс создания, а не сам результат. Поэтому играйся с новыми идеями, я лишь подскажу сами идеи, а уж реализовывать их надо тебе самому.
nepewka, так это было год назад. Скорее всего, я говорил об архитектуре эффекта Cloak, вот в этом варианте я добавляю нужный спелл, который надо повесть на близкого актёра, т.е. делаю как бы пассивный мониторинг близкого окружения НПС/ГГ. В том втором спелле свой эффект и свой скрипт (если надо), в моём варианте тот эффект отдавал референс актёра, который подходил ближе 170 ед. Это хорошо тем, что нет скриптовых поисков, OnUpdate(), циклов и прочего, всё работает в дефолтном режиме.
Какой маркер можно взять, самый простой такой для использования под ногами нпц для спеллкастов? Можно какой нибудь бейсик скрипт увидеть для примера, самый что ни на есть простой?)
Static Property XMarker auto
float[] aamagnitude bool bDone
Event OnEffectStart(Actor akTarget, Actor akCaster) aamagnitude = new float[10] endEvent
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) if akSource as Spell && akAggressor as Actor && !bDone Spell akSpell = akSource as Spell Actor akSelf = GetTargetActor() bDone = true if akSpell.IsHostile() int numEffects = akSpell.GetNumEffects() int index = 0 While index < numEffects float magnitude = akSpell.GetNthEffectMagnitude(index) aamagnitude [index]= magnitude if akSpell.GetNthEffectMagicEffect(index).GetAssociatedSkill() == "Destruction" magnitude = magnitude * 1.2 ; +=20% else magnitude = 0.0 ; endif akSpell.SetNthEffectMagnitude(index, magnitude) index += 1 endWhile ObjectReference akMarker = akSelf.PlaceAtMe(XMarker) akSpell.Cast(akMarker, akSelf) Utility.Wait(0.3) index = 0 While index < numEffects akSpell.SetNthEffectMagnitude(index, aamagnitude[index]) index += 1 endWhile akMarker.DisableNoWait() akMarker.Delete() endif bDone = false endif endEvent
Жирным отмечено создание маркера под ногами цели и потом его удаление (чтобы не захламлять игровой мир).
Маркер кастует на цель, а цель выбирает не он, а ты сам, и прописываешь эту цель в команду каста.
************************
Перк "на всех" создать можно, но его ведь ещё и добавить надо всем, а вот с этим и есть сложность.
************************ В Settings много чего есть, надо искать и проверять. Воспользуйся фильтром, начни с magick, damade и т.д. Сами названия переменных говорят о их применении/назначении. Меняй значения и проверяй реакцию в игре.
************************
DoCombatSpellApply() работает только на актёрах, Cast() на любом объекте. DoCombatSpellApply() добавляет спелл актёру, Cast() не добавляет спелл. DoCombatSpellApply() и Cast() кастуют спелл на цель. Через DoCombatSpellApply() можно заражать и отравлять актёра, через Cast() можно только заклинания кастовать.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №339
| Тема: Вопросы по скриптам Papyrus
написано: 20 апреля 2014, 22:13
| Отредактировано: AleksTirex - 20 апреля 2014, 22:15
Ах да, маркеры будут работать в любых условиях или только для ГГ? Допустим если мой саммон, грозовой атронах, кастит в нпц под влиянием этой абилки
Этот маркер сам по себе, и кастует туда, куда ты в команде укажешь - цель. Создать его можно под ногами любого НПС. Никаких условий или зависимостей нет. Полная свобода действий.
В onEffectStart - понятно, он определит наш akTarget и будет по нему кастовать. А если эвент onSpellCast? Надо написать ему в цели GetTargetActor?
Прочитай мой пост на предыдущей странице про "События"/эвенты. Ты внимательно причитай и постарайся понять, что такое "Событие". Событию ничего не надо прописывать, а это ещё и невозможно.
То есть и akTarget, и GetTargetActor подойдут? Главное чтобы в игре наш прицел был наведен на нпс?
Причём тут прицел? akTarget и GetTargetActor - они относятся только к маг.эффекту, который сработал/запустился на НПС. И ему абсолютно пофиг,куда ГГ или НПС направил прицел.
akTarget - это цель эффекта, а не ГГ/НПС. Т.е. на ком именно сработал данный эффект, это референс НПС, на котором висит этот эффект. GetTargetActor() - это 100% тоже самое (!).
******************* А вот боевую цель НПС (но не ГГ), на которого этот НПС нападает, можно узнать через akActor.GetCombatTarget(). Маркер - это статик, а не актёр, он не умеет думать и выбирать цели, поэтому надо заранее определить цель - референс актёра, в кого он будет стрелять.
int numEffects = akSpell.GetNumEffects() ; получили кол-во эффектов int index = 0 float magnitude int iNumCast = 1 While index < numEffects magnitude = akSpell.GetNthEffectMagnitude(index) ; получили магнитуду эффекта aamagnitude [index]= magnitude ; сохранили дефолтную магнитуду ; делим магнитуду пока она не будет меньше 100 и считаем сколько надо будет кастов int iNumCastTMP = 1 float fTMPmagnitude = magnitude While magnitude > 100 iNumCastTMP += 1 magnitude = fTMPmagnitude magnitude = magnitude / iNumCast endWhile if iNumCastTMP > iNumCast ; вычисляем максимальный коэфиициент / кол-во кастов iNumCast = iNumCastTMP endif index += 1 endWhile
; изменяем магнитуду в эффектах index = 0 While index < numEffects magnitude = aamagnitude [index]/ iNumCast akSpell.SetNthEffectMagnitude(index, magnitude) index += 1 endWhile
; кастуем столько раз, сколько насчитали необходимых кастов ранее While iNumCast > 0 iNumCast -= 1 akSpell.cast(кто, в_кого) endWhile ; возврат магнитуды в дефолт
index = 0 While index < numEffects akSpell.SetNthEffectMagnitude(index, aamagnitude[index]) ; вернули дефолт index += 1 endWhile
Вот только зачем надо разбивать одно заклинание на несколько частей? Смысла в этом нет никакого.
Согласен. Единственный смысл в знаниях. Хочу подхватить как можно больше знаний с твоего кода
Для этого лучше всего - пишешь и делаешь что-то в СК, и идёшь смотреть в игру на результат. Потом поменял/переделал - и опять провеять. Главное - запоминай, что ты делаешь и какой от этого результат. Так всему и научишься.
*********** ***********
[offtop]Я по "специализации" квестовик, мелкими модами я не занимаюсь - не интересно. Мне интереснее большое и сложное, с максимумом наворотов, нелинейности, уникальности и прочего. (те мелкие моды на MG - исключение, они сделаны исключительно по просьбе) Глобальные изменения геймплея... а зачем? Добавить к дефолтным багам ещё и свои? Перекрутить настройки и циферки в перках и настройках - много ума не надо, это не интересно. А вот создать что-то совершенно новое, чего раньше не было, так это намного интереснее, на мой взгляд.
nepewka, а ты пробуй разные варианты. Тебе надо знать точный референс цели на момент каста. Поэтому попробуй взять этот референс непосредственно в момент каста: akSpell.Cast(akMarker, GetTargetActor())
*********** сергей007788, http://www.creationkit.com/SetPlayerTeammate_-_Actor Первый true - включает режим "компаньона", т.е. вслед за ГГ спрятаться/присесть, вынуть оружие, показать инвентарь, носить одежду из своего инвентаря и т.д. Второй true - включить статус командного актёра, т.е. он будет числится как командный актёр, типа компаньона и/или призванного НПС (в условиях эффектов, скриптах и прочем есть такие проверки).
Кстати, насчет заглушек. Если захочу повесить на этот эффект абилки ещё какой нибудь скрипт, но заглушка не даст ему работать. Можно ли что то сделать, или другие скрипты в любом случае будут блокироваться?
Почему не даст работать? Работать не будет только то, что внутри этой проверки:
Event ...другой_эвент() if akSpell... ...Enable() endif iNext += 10 endEvent
Не работает только то, что красное, т.е. то, что отделено жёлтым. Всё зелёное будет работать. Пока переменная bDone не станет "правильной", до тех пор всё внутри этой проверки работать не будет, т.к. не выполняется условие проверки. На остальные части скрипта это никак не скажется.
************* В скрипте под спойлером есть ошибка: magnitude = magnitude / iNumCast - ошибка magnitude = magnitude / iNumCastTMP - правильно
nepewka, ты подпиши все свои команды, что каждая конкретно делает, тогда тебе станет ясно, где ошибка. While - это цикл, он выполняется, пока верна проверка условия, в твоём случае - бесконечность, он никогда не закончится. И более того, он даже не начнётся, ведь твой "бегемот" всегда равен нулю, а в условиях он должен быть == 1. Все команды в скрипте исполняются по очереди сверху вниз, и только один раз, если нет команды повтора/цикла, а в цикле... читай выше.
И учти, событие старта маг.эффекта в скрипте может быть только одно (!), второго события в данном скрипте возникнуть не может по определению, т.к. не бывает два начала или два конца у одной вещи (слон не в счёт).
Как получить предмет:Только с помощью консоли "player.addspell xx000D62" (где "хх" - номер мода в вашем списке загрузки). (номер мода можно легко определить, набрав в консоли "help Animated", и найти объект SPEL с названием "Animated Dragon Wings") Снять его можно дугой командой: "player.removespell xx000D62".
(Примечание: знаю, не всем консоль нравится, но зато мод получился без скриптов и его можно без последствий устанавливать/удалять когда угодно)
Есть простой способ добавления спеллов и предметов без скриптов: Делаешь простой одноразовый квест с автозапуском, делаешь там алиас, назначаешь на него ГГ, и добавляешь туда свой спелл (так же можно и предметы добавлять). И не надо никакой консоли и скриптов.
anton, у перка есть только одно событие - это срабатывание самого перка (это точно так же, как в топиках, сценах и стадиях квеста). В скрипте перка пишутся команды прямо в теле, без всяких функций и событий. Это событие возникает при активации чего-либо носителем перка, т.е. когда хозяин перка что-то активирует (естественно, если активация удовлетворяет условиям перка).
Это очень удобно для отслеживания действий ГГ - что он трогает/берёт/нажимает и т.д. Т.к. при этом не надо вешать на все потенциальные предметы свои скрипты, достаточно одного в перке.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №351
| Тема: Вопросы по скриптам Papyrus
написано: 8 мая 2014, 19:11
| Отредактировано: AleksTirex - 8 мая 2014, 20:11
;END FRAGMENT CODE - Do not edit anything between this and the begin comment
А должно быть так. Разницу заметил?
(!!!) Скрипты перков, топиков, стадий, сцен, пакетов и всех тех, где есть окно для написания команд без применения событий и функций, сами такие скрипты вручную править и компилировать не надо, а надо писать команды именно в этих окошках, а не открывать редактором эти служебные скрытые скрипты, тогда скрипт правильно будет создан и скомпилирован. Иначе будет результат описанный в предыдущем посте Антона.
******* В данном типе скриптов точки с запятой ";" не работают как в обычных скриптах, и всё то, что после них тоже скрипту необходимо, он этим пользуется. Поэтому там ничего нельзя менять и удалять (!). ******* Добавлять кнопкой Add такие скрипты нельзя, их надо создавать: в окне для кода ставишь точку с запятой ";" и компилируешь, закрываешь объект, опять открываешь и желательно переименовать на своё название/ID (кнопка Rename), закрываешь,опять открываешь свой перк/топик/сцену и т.д. и уже можешь писать команды и назначать свойства (если свойства назначить раньше,то они потеряются). Иначе скрипт не "привяжется" к объекту.
Добавлять кнопкой Add такие скрипты нельзя, их надо создавать: в окне для кода ставишь точку с запятой ";" и компилируешь, закрываешь объект, опять открываешь и желательно переименовать на своё название/ID (кнопка Rename), закрываешь,опять открываешь свой перк/топик/сцену и т.д. и уже можешь писать команды и назначать свойства (если свойства назначить раньше,то они потеряются). Иначе скрипт не "привяжется" к объекту.
Добавлено (09 Мая 2014, 00:36) --------------------------------------------- anton, я сослепу и не заметил, что ты пытаешься повесить скрипт на "обычный" Entry Point, а скрипты в перке можно вешать только наEntry Point Activate. На других типах перков скрипт по определению не сможет работать, ведь события то они не "хавают", так и самой возможности работы такого скрипта попросту нет, не говоря уже об остальном.
anton, судя по всему, ты хотел сделать условия "если надеты крылья"? Тогда замени HasKeyword на WornHasKeyword. Это будет == "Если на ГГ надета шмотка с кейвордом крыльев". (иначе ты проверял "есть ли у ГГ такой кейворд", а откуда же он возьмётся у самого ГГ?)
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №354
| Тема: Анимация
написано: 8 мая 2014, 22:16
в конструкторе ... каждая раса имеет список используемых анимаций - берите и прописывайте, заменяйте, удаляйте и т.д. Словом - делается все в рамках конструктора и не нужен никакой лишний геморрой со сторонними модами содержащими в себе кучу кривых скриптов.
Мда... и где же ты нашла такую "кнопочку" в СК? В самом СК в разделе Race можно только смотреть на установленные файлы анимации, а вот "берите и прописывайте, заменяйте, удаляйте и т.д. " это по определению невозможно, не морочь людям голову. Там можно только указать новый бехавиор файл, а уже в самом этом файле надо менять пути к базовому "половому" бехавиор файлу. А в том файле надо прописать всю используемую анимацию НПС данной расы, все файлы и пути к ним. И так же всё это надо внести в бехавиор мастер-файл.
Сам СК этого не может делать (!). Без FNIS по любому не обойтись, если только сможешь вручную "вскрыть" данные файлы и поменять там все пути, а потом правильно обратно "запаковать" эти файлы. (в теории это возможно, хоть и не так просто)
И более того, без FNIS можно только сменить файлы анимации на другие такие же файлы. Добавлять новую анимацию без FNIS нельзя вообще (!). Ведь для запуска файла анимации необходимо сперва назначить этому файлу именное событие (ID), иначе его просто нечем будет запускать. Далее это событие надо прописать в бехавиор мастер-файле. И ещё это событие надо привязать к нужному действию.
СК не умеет добавлять и изменять эти события, а равно он не умеет изменять какие либо файлы вообще, кроме ESP. (файлы скриптов тоже не сам СК делает/изменяет, хоть управление идёт и из него тоже)
Т.е. как либо менять анимацию только через СК нельзя, об этом можно забыть.
****************** Пы.Сы. Последующие посты похожи на вариант Соловьёва - "Зверь, именуемый кот."
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №355
| Тема: Вопросы по скриптам Papyrus
написано: 9 мая 2014, 12:14
| Отредактировано: AleksTirex - 9 мая 2014, 12:18
есть ли способ поменять игровую переменную "fJumpHeightMin" без скрипта (например как в перке, где некоторые параметры можно умножать на число) ?
Если не ошибаюсь, то в СК вообще нет доступа к этим настройкам, кроме прямого их изменения в соответствующем разделе.
А чем скрипт плох? Можно сделать имитацию перка через абилку на ГГ. В абилке (но не на эффекте) ставишь условия "Если одеты крылья". И на эффекте скрипт:
Event OnEffectStart(Actor akTarget, Actor akCaster) Game.SetGameSettingFloat("fJumpHeightMin", fNewValue) endEvent
Event OnEffectFinish(Actor akTarget, Actor akCaster) Game.SetGameSettingFloat("fJumpHeightMin", fdefaultValue) endEvent
Добавлено (09 Мая 2014, 16:14) --------------------------------------------- anton, и даже больше можно сделать - добавить второй эффект (в абилке на нём добавить условие "если бежит") с новым скриптом, тогда при беге можно будет прыгать ещё выше, нежели при прыжке с места. (этот параметр ещё больше увеличить).
-> Как правильно сделать это заклинание переключатель, между этими 2-мя маг-эффектами, чтобы кастуя один и то же спелл Крылья то появлялись, то исчезали ?
Ты хочешь сделать всё на одном заклинании, без второго уничтожающего?
Крылья ты добавляешь скриптом? Тогда сделай добавление "по инверсу":
Event OnEffectStart(Actor akTarget, Actor akCaster) if akTarget.IsEquipped(крылья) akTarget.UnequipItem(крылья, true, true) else akTarget.EquipItem(крылья, true, true) endif endEvent
Event OnEffectFinish(Actor akTarget, Actor akCaster) Utility.Wait(1.0) if akTarget.IsEquipped(крылья) && !akTarget.HasEffectKeyword(Keyword_эффекта_зелья) akTarget.UnequipItem(крылья, true, true) endif endEvent
anton, так сделай имитацию экипировки - вместо одевания используй добавление/удаление абилки, на которой и будет этот арт-эффект. Т.е. твоё заклинание будет включать и выключать (добавлять/удалять) абилку с арт-эффектом. Скрипт, в принципе, останется таким же, только изменятся команды (одеть на добавить и т.д.).
К сожалению, не всё и не всегда можно сделать только на дефолте, иногда без скриптов не обойтись.
А как сделать, что бы неписи не реагировали на атаки спутника? Допустим, делаю спутника, владеющего криком БС. Спутник кричит, задевает квестового или случайного NPC (животное в том числе), и начинается драка, которая решается только перезагрузкой последнего сохранения. Есть способы заставить NPC не реагировать на такие случайные атаки? На друг друга ведь они не реагируют.
Дай своему спутнику свои заклинания и крики, а не дефолтные. Задублируй нужные заклинания и крики ( и естественно, их эффекты), во всех маг.эффектах в условия добавь (на самый низ), и дай эти заклинания/крики своему спутнику вместо дефолтных:
Проблема в следующем, создал квест, протестировал все в порядке все работает, сделал второй квест, решил протестировать, загрузил чистый сэйв, и тут почему то у первого квеста не появляется стартовый диалог хотя он ни как не связан со вторым, ф5 ф9 не помогает, создавал SEQ файл реакций ноль.
Не правильно сделан квест. Скорее всего, проблема в алиасах, если они есть, то какой-то из них (или несколько) сделан неправильно - он не может заполниться при старте квеста, вот сам квест и не стартует.
Можно завести специальный квест, начинающийся вместе с игрой и туда внести все эти изменения. Но тут я где-то видел соображения о нежелательности квестов, начинающихся с игрой. Кто что посоветует?
Квесты с автозапуском не дают работать своим топикам/диалогам без перезагрузки игры. В остальном у них всё в порядке и на работу скриптов никак не влияет тип запуска квеста. Скрипт для имитации автозапуска простой:
Event OnInit() if !IsRunning() Start() endif endEvent
************************* Для наложения на назгула статуса "враг всем" можно и не трогать фракции вообще, достаточно установить всем девяти назгулам флаг "враг". Для этого на них вешается простой скрипт (тип скрипта Actor):
Event OnInit() SetAttackActorOnSight() endEvent
Event OnLoad() SetAttackActorOnSight() endEvent
Тогда назгул всегда будет восприниматься любым НПС с любой фракцией как враг. Несовместимостей нет ни с чем.