• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Какой маркер можно взять, самый простой такой для использования под ногами нпц для спеллкастов? Можно какой нибудь бейсик скрипт увидеть для примера, самый что ни на есть простой?)
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() можно только заклинания кастовать.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №992
написано: 20 апреля 2014, 22:04
| Отредактировано: nepewka - 20 апреля 2014, 22:08
Чтобы в этом же скрипте добавить ещё 2 маркера, достаточно будет дописать? ObjectReference akMarker = akSelf.PlaceAtMe(XMarker) ObjectReference akMarker2 = akSelf.PlaceAtMe(XMarker) ObjectReference akMarker3 = akSelf.PlaceAtMe(XMarker)
Ах да, маркеры будут работать в любых условиях или только для ГГ? Допустим если мой саммон, грозовой атронах, кастит в нпц под влиянием этой абилки
=== Ну и последнее что хотел спросить, если хочу чтобы маркер дал 3 каста подряд akSpell.Cast(akMarker, akSelf) akSpell.Cast(akMarker, akSelf) akSpell.Cast(akMarker, akSelf) ; можно ли как то заменить 3 каста одной командой? Есть ли такая в наличии? Может быть repeat какая нибудь )) Чисто для удобства, чтобы не писать 3 одинаковых строчки
===================
Проверил все в игре. С виду всё работает и выглядит прекрасно!
Даже не знаю как тебя отблагодарить! Скинь мне какой нибудь свой кошелек в лс, готов платить за каждый подобный скрипт. Ещё раз спасибо!
Ах да, маркеры будут работать в любых условиях или только для ГГ? Допустим если мой саммон, грозовой атронах, кастит в нпц под влиянием этой абилки
Этот маркер сам по себе, и кастует туда, куда ты в команде укажешь - цель. Создать его можно под ногами любого НПС. Никаких условий или зависимостей нет. Полная свобода действий.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №998
написано: 21 апреля 2014, 12:04
| Отредактировано: nepewka - 21 апреля 2014, 14:39
кстати, что нужно сделать чтобы маркер пулял по таргету, который двигается? Допустим положили мы его под своими ногами, а задача стоит чтобы он пульнул в нпс.
В onEffectStart - понятно, он определит наш akTarget и будет по нему кастовать. А если эвент onSpellCast? Надо написать ему в цели GetTargetActor?
====================
И ещё вопросик. Просто подскажи как правильно мне сделать) После складывания общей магнитуды от int numEffects = akSpell.GetNumEffects() в float magnitude = akSpell.GetNthEffectMagnitude(index) Мы получили 300 магнитуды. Цель - разделить 300 на 3 части по 100, так чтобы не разом в 300 урон наносился, а 3 раза по 100 (Упустим ту часть где высчитываем новый урон в SetNthEffectMagnitude и кастуем новый спелл в 20% от общей магнитуды. Этого щас нет)
>>>
int numEffects = akSpell.GetNumEffects() ; получили все эффекты заклинания int index = 0 While index < numEffects float magnitude = akSpell.GetNthEffectMagnitude(index) ; получили 300 магнитуды со всех эффектов aamagnitude [index]= magnitude ; сохранили дефолтный урон
While magnitude > 100 ; делим урон. ; не знаю можно ли сделать так, чтобы спелл наносил дамаг 3 раза по 100, срабатывая при этом 1 раз.(???) Поэтому сделаю 3 спелла по 100 урона magnitude = magnitude - 100 if magnitude = 100 endWhile endif akSpell.SetNthEffectMagnitude(index, magnitude) ; akSpell наносит 100 урона index += 1 endWhile
; кастуем. Эх, ещё бы я мог заставить его считать за меня, так чтобы он кастовал akSpell по 100 урона столько раз, сколько надо до полного деления, было бы идеально! akSpell.cast() akSpell.cast() akSpell.cast()
While index < numEffects akSpell.SetNthEffectMagnitude(index, aamagnitude[index]) ; вернули дефолт index += 1 endWhile
В onEffectStart - понятно, он определит наш akTarget и будет по нему кастовать. А если эвент onSpellCast? Надо написать ему в цели GetTargetActor?
Прочитай мой пост на предыдущей странице про "События"/эвенты. Ты внимательно причитай и постарайся понять, что такое "Событие". Событию ничего не надо прописывать, а это ещё и невозможно.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №1002
написано: 21 апреля 2014, 16:45
| Отредактировано: nepewka - 21 апреля 2014, 16:57
Прочитай мой пост на предыдущей странице про "События"/эвенты. Ты внимательно причитай и постарайся понять, что такое "Событие". Событию ничего не надо прописывать, а это ещё и невозможно.
Прочитал) Впринципе стало понятней. но по прежнему не понятно, как задать цель каста маркеру, если маркер лежит к примеру под нашему ногами, а кастануть ему надо в нпц.
"Маркер кастует на цель, а цель выбирает не он, а ты сам, и прописываешь эту цель в команду каста"
То есть и akTarget, и GetTargetActor подойдут? Главное чтобы в игре наш прицел был наведен на нпс?
p.s отдельное спасибо за ошибки. Бьюсь головой, даётся тяжело, но понимать это нужно
То есть и akTarget, и GetTargetActor подойдут? Главное чтобы в игре наш прицел был наведен на нпс?
Причём тут прицел? akTarget и GetTargetActor - они относятся только к маг.эффекту, который сработал/запустился на НПС. И ему абсолютно пофиг,куда ГГ или НПС направил прицел.
akTarget - это цель эффекта, а не ГГ/НПС. Т.е. на ком именно сработал данный эффект, это референс НПС, на котором висит этот эффект. GetTargetActor() - это 100% тоже самое (!).
******************* А вот боевую цель НПС (но не ГГ), на которого этот НПС нападает, можно узнать через akActor.GetCombatTarget(). Маркер - это статик, а не актёр, он не умеет думать и выбирать цели, поэтому надо заранее определить цель - референс актёра, в кого он будет стрелять.
AleksTirex, отлично! Finally, как на примере нашего скрипта сделать так, чтобы маркер пальнул в нпц?
Обьясняю: мы ставим маркер под ногами нпц, с Utility.Wait(0.3) нпц не успевает никуда убежать, поэтому получает от маркера фаерболл в лицо, НО если поставить скажем Utility.Wait(10.0) перед кастом спелла от маркера, нпц успевает недалеко уйти от места где появился наш маркер. Спустя 10 секунд фаерболл взрывается в месте появления маркера, но ни в коем случае не летит в место, где сейчас находится нпс
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
Вот только зачем надо разбивать одно заклинание на несколько частей? Смысла в этом нет никакого.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №1006
написано: 21 апреля 2014, 17:49
| Отредактировано: nepewka - 21 апреля 2014, 17:54
Согласен. Единственный смысл в знаниях. Хочу подхватить как можно больше знаний с твоего кода
Для этого лучше всего - пишешь и делаешь что-то в СК, и идёшь смотреть в игру на результат. Потом поменял/переделал - и опять провеять. Главное - запоминай, что ты делаешь и какой от этого результат. Так всему и научишься.
*********** ***********
[offtop]Я по "специализации" квестовик, мелкими модами я не занимаюсь - не интересно. Мне интереснее большое и сложное, с максимумом наворотов, нелинейности, уникальности и прочего. (те мелкие моды на MG - исключение, они сделаны исключительно по просьбе) Глобальные изменения геймплея... а зачем? Добавить к дефолтным багам ещё и свои? Перекрутить настройки и циферки в перках и настройках - много ума не надо, это не интересно. А вот создать что-то совершенно новое, чего раньше не было, так это намного интереснее, на мой взгляд.
Finally, как на примере нашего скрипта сделать так, чтобы маркер пальнул в нпц? Обьясняю: мы ставим маркер под ногами нпц, с Utility.Wait(0.3) нпц не успевает никуда убежать, поэтому получает от маркера фаерболл в лицо, НО если поставить скажем Utility.Wait(10.0) перед кастом спелла от маркера, нпц успевает недалеко уйти от места где появился наш маркер. Спустя 10 секунд фаерболл взрывается в месте появления маркера, но ни в коем случае не летит в место, где сейчас находится нпс
nepewka, а ты пробуй разные варианты. Тебе надо знать точный референс цели на момент каста. Поэтому попробуй взять этот референс непосредственно в момент каста: akSpell.Cast(akMarker, GetTargetActor())
*********** сергей007788, http://www.creationkit.com/SetPlayerTeammate_-_Actor Первый true - включает режим "компаньона", т.е. вслед за ГГ спрятаться/присесть, вынуть оружие, показать инвентарь, носить одежду из своего инвентаря и т.д. Второй true - включить статус командного актёра, т.е. он будет числится как командный актёр, типа компаньона и/или призванного НПС (в условиях эффектов, скриптах и прочем есть такие проверки).
AleksTirex, ещё раз спасибо!!! С OnHit() все получилось. Кстати, OnHit() срабатывает только на первом призраке, остальных Projectile пролетает насквозь не вызывая события OnHit(), что мне, в принципе, и было нужно.
Кстати, насчет заглушек. Если захочу повесить на этот эффект абилки ещё какой нибудь скрипт, но заглушка не даст ему работать. Можно ли что то сделать, или другие скрипты в любом случае будут блокироваться?
Кстати, насчет заглушек. Если захочу повесить на этот эффект абилки ещё какой нибудь скрипт, но заглушка не даст ему работать. Можно ли что то сделать, или другие скрипты в любом случае будут блокироваться?
Почему не даст работать? Работать не будет только то, что внутри этой проверки:
Event ...другой_эвент() if akSpell... ...Enable() endif iNext += 10 endEvent
Не работает только то, что красное, т.е. то, что отделено жёлтым. Всё зелёное будет работать. Пока переменная bDone не станет "правильной", до тех пор всё внутри этой проверки работать не будет, т.к. не выполняется условие проверки. На остальные части скрипта это никак не скажется.
************* В скрипте под спойлером есть ошибка: magnitude = magnitude / iNumCast - ошибка magnitude = magnitude / iNumCastTMP - правильно
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №1014
написано: 22 апреля 2014, 01:50
| Отредактировано: nepewka - 22 апреля 2014, 01:54
В скрипте под спойлером есть ошибка: magnitude = magnitude / iNumCast - ошибка magnitude = magnitude / iNumCastTMP - правильно
Спасибо, поправил!
===========
Можно ли как нибудь при повторении одного и того же события MGEF как то ограничить появление маркеров? Я очень хочу, чтобы после 1 моего каста в игровом мире появилось 3 маркера, но я не хочу чтобы они появлялись после каждого моего каста и делали повторые касты до окончания эффекта (Utility.Wait(60.0)). Кастанул спелл с 2 рук - получил 6 маркеров, кастанул 6 спеллов в промежутке 2-3 секунд - получил 18 маркеров. Красным выделил то, повторения каких команд я хочу избежать.
Можно ли как нибудь при повторении одного и того же события MGEF как то ограничить появление маркеров?
nepewka, Есть такая вещь, как глобальные переменные (GlobalVariable). Значения присвоенные им сохраняются вне зависимости от скриптов.
Установить значение можно через функцию .SetValueInt()
Получить значение - .GetValueInt()
Сделай переменную в СК и присвой ей значение 0. В скрипте проверяй значение, если оно равно 0 - делай маркеры и присвой значение 1. Пока опять не изменишь значение на 0 - маркеры появляться не будут.
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №1016
написано: 22 апреля 2014, 12:53
| Отредактировано: nepewka - 22 апреля 2014, 12:54
Но теперь возникла проблема в финальной части создания скрипта.
Вообщем суть:
Идея - При попадании заклинанием Fireball, на помощь к akCaster приходят 3 невидимых духа предков (Маркеры), которые с интервалом раз в 5 секунд на протяжении 20 секунд произносят свои заклинания. Через 20 секунд они пропадают и в течении следующих 180 секунд, покуда наша GlobalVariable == 1, вызывать снова мы их не можем. Не работает цикл заклинаний While. При чем до этой версии скрипта он у меня работал, но там был хаос и не удавалось заполучить контроль над ним (было слишком много заклинаний от маркеров).
Посмотрите пожалуйста, что не так?
GlobalVariable Property AAAbegemot auto Static Property XMarker auto Spell Property AAAptaxa auto
Event OnEffectStart(Actor akTarget, Actor akCaster)
float begemot = AAAbegemot.GetValue() Actor akVictim = GetTargetActor()
nepewka, ты подпиши все свои команды, что каждая конкретно делает, тогда тебе станет ясно, где ошибка. While - это цикл, он выполняется, пока верна проверка условия, в твоём случае - бесконечность, он никогда не закончится. И более того, он даже не начнётся, ведь твой "бегемот" всегда равен нулю, а в условиях он должен быть == 1. Все команды в скрипте исполняются по очереди сверху вниз, и только один раз, если нет команды повтора/цикла, а в цикле... читай выше.
И учти, событие старта маг.эффекта в скрипте может быть только одно (!), второго события в данном скрипте возникнуть не может по определению, т.к. не бывает два начала или два конца у одной вещи (слон не в счёт).
Изменение репутации для пользователя nepewka
nepewkaOffline
Сообщение №1020
написано: 22 апреля 2014, 17:47
| Отредактировано: nepewka - 22 апреля 2014, 18:21
можно поподробнее, что за команда на повтор? Может быть с ней у меня получится...
Добавлено (22 Апреля 2014, 21:47) --------------------------------------------- Можно посчитать необходимое кол-во кастов iNumCasts, как ты вчера писал и задать цикл
While iNumCasts > 0 iNumCasts -= 1 endwhile
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)