Если требуется, чтобы предмет передавался игроку только при наличии его у целевого актера (akActor), тогда так:
IF akActor.GetItemCount(MyItem) > 0 ; Проверяем наличие предметов MyItem у актера akActor akActor.RemoveItem(MyItem, 1, true, Game.GetPlayer()) ; Удаляем предмет MyItem в количестве 1 шт. у актера akActor бесшумно (true) и добавляем его игроку Game.GetPlayer() ENDIF ; Завершаем проверку
1) Актерам, кроме игрока, нельзя выдавать / удалять перки с помощью скриптов. 2) Актерам, кроме игрока, нельзя выдавать перки с помощью маг. эффектов.
Твой скрипт написан неправильно:
Event OnEquipped(Actor akActor) - отслеживает экипирование конкретного предмета, на котором висит этот скрипт. Экипирование любых других предметов отслеживаться не будет. Чтобы отслеживать экипирование абсолютно любых предметов, нужно использовать событиеEvent OnObjectEquipped(Form akBaseObject, ObjectReference akReference) в скриптах, расширяющих Actor или ReferenceAlias.
IF GetEquipped(DaedricArrowFire1||DraugrArrowFire1||DwarvenArrowFire1||...) == 1 - неверно. Как верно:
IF akActor.GetEquipped(DaedricArrowFire1) || akActor.GetEquipped(DraugrArrowFire1) || akActor.GetEquipped(DwarvenArrowFire1)
Твой скрипт выглядел бы подобным образом (но то, что он делает, можно выполнить проще - через условия в перках):
Scriptname MyScript extends Actor ; Цепляется к актеру, но работает только для игрока
Perk Property MyPerk01 Auto Perk Property MyPerk02 Auto Perk Property MyPerk03 Auto
EVENT OnObjectEquipped(Form akBaseObject, ObjectReference akReference) IF akBaseObject == MyArrow11 || akBaseObject == MyArrow12 || akBaseObject == MyArrow13 Self.AddPerk(MyPerk01) ; Цель Self означает, что функция будет применена к актеру, к которому прицеплен данный скрипт ; Self можно не писать вовсе; запись Self.AddPerk(MyPerk01) эквивалентна AddPerk(MyPerk01) ELSEIF akBaseObject == MyArrow21 || akBaseObject == MyArrow22 || akBaseObject == MyArrow23 AddPerk(MyPerk02) ELSEIF akBaseObject == MyArrow31 || akBaseObject == MyArrow32 || akBaseObject == MyArrow33 AddPerk(MyPerk03) ENDIF ENDEVENT
На мой взгляд, мод "Extra Extra Effect" не соответствует одному из положений "Оформление материала - руководство" в части:
Мы НЕ допускаем материалы, сделанные только с использованием редактора, которые в состоянии сделать каждый.
Данный мод в состоянии сделать каждый, т. к. он добавляет 1-3 простейших перка и меняет в них лишь параметр "Mod # Applied Enchantments Allowed" - "Set Value" с "2" на "3", "4" или "5".
Мы НЕ допускаем материалы (к активации), сделанные только с использованием редактора, которые в состоянии сделать каждый.
Значит, этот мод не должен был быть активирован, вне зависимости от того, кто его выложил - автор или переводчик. Даже неудобно указывать вам на столь очевидные вещи.
Но все это остается на ваше усмотрение, я лишь показал недостаток этого материала. Если однокнопочные моды приветствуются - дело ваше.
ЗЫ: Не совсем понял, зачем мне следует подавать жалобу на Нексус, если я нахожусь на форуме сайта МГ и задаю вопрос по активации материала в ленте модов сайта МГ. ЗЫЫ: Оффтоп я закончил.
Dsion, что можно? Выдавать перки? Поведай, каким образом. Подозреваю, для решения этого вопроса нужны перки _VjidachaPerkovPERK и _RazreshenijeNaVjidachuPerkovPERK.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №38
| Тема: Общение
написано: 20 августа 2014, 14:37
то, что вы выложили в интернет - считайте, вам это уже не принадлежит
Bravo! Поддерживаю - если человек хочет исключительных прав на плоды собственного интеллектуального труда, он его (труд) держит на компьютере, отключенном от сети, в подвале, запечатанном на триста тридцать три (и три десятых) амбарных замка с опознавателями отпечатков пальцев на каждом. Стоит ли говорить, что стены подвала должны быть выполнены из огнеупорного экранированного от ЭМ-импульсов покрытия, выдерживающего прямое попадание из ядерного оружия. Идеальное место - под египетскими пирамидами lol. И об этом никто не должен знать!
У кого-нибудь возникала ситуация, когда после (не)продолжительной работы в СК он перестает открывать любые сущности (заклинания, форм-листы, квесты, и т.д.)? Обычно это происходит, когда щелкаешь по сущностям, штук 100 (например) откроешь-закроешь, а потом все, СК как будто зависает. У меня одного такая фигня?
Не могу испечь пирог путешественника (или как там его). Мешу тесто (мука + вода), добавляю пасту (помидор + молоток), кладу в костер котелок и разжигаю его (костер, а не котелок). Дальше начинается непонятное: тесто и начинка (рыба? я выбрал голавля и еще какую-то рыбину) не складываются вовсе в инвентаре, а тесто не хочет попадать в котелок (обычно если что-то крафтишь, там возникает значок "шестеренок"; а у меня тесто просто выкидывается в костер). Это если просто пытаться испечь одно тесто.
FormList Property MyFLST Auto ; Создаем лист, куда кидаем Projectile нужных стрел
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked) ; Событие при применении любого воздействия на цель (не обязательно при нанесении урона). Например, игрок стреляет в цель из лука. Тогда: ; akAggressor == игрок ; akSource == оружие (лук), из которого он стреляет ; akProjectile == снаряд (стрела), которой он попадает ; Все данные о агрессоре, источнике урона, снаряде, видах атак (силовая, скрытая) и т.д. в момент применения воздействия на цель будут учтены и переданы в это событие. Эти данные можно проверить, соответствуют ли они каким-либо параметрам.
IF MyFLST.HasForm(akProjectile) ; Если лист имеет форму, которой является akProjectile, то... ... ENDIF
У нас есть пустой большой камень душ. В СК ему соответствует форма: SoulGemGreater. Мы заполняем его маленькой душой. Какая форма в СК будет соответствовать заполненному таким образом камню душ: SoulGemGreater или SoulGemGreaterFilled?
Конечно, можно и самому проверить, но может кто здесь знает.
mxac, это точная информация, что при заполнении максимальной душой он переводится из Empty в Filled, т.е. меняется сама форма? Видимо, здесь играет свою роль поле Linked To.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №47
| Тема: Вопросы по скриптам Papyrus
написано: 22 августа 2014, 14:28
| Отредактировано: Multigone - 22 августа 2014, 14:32
RiseD, есть несколько вариантов (не меньше двух), как наложить заклинание на цель, пораженную конкретной стрелой.
1) Создаем зачарование лука. В этом зачаровании указываем множество магических эффектов, которые соответствуют урону от конкретных стрел. В заклинании для каждого эффекта делаем проверку следующего вида:
По-идее, "Target" (T) указывает на источник заклинания, а "Subject" (S) - на жертву (цель) заклинания. Неясно, как это будет работать в случае с зачарованием. Нужно тестировать!
В результате при экипировании конкретных стрел будет срабатывать только одно условие (в некотором маг. эффекте), который и будет накладываться на цель при выстреле из лука с таким зачарованием.
Недостаток: если в момент между выстрелом и попаданием стрелы в цель открыть инвентарь и экипировать др. стрелы, возможно, эффект от попадания будет от последних экипированных стрел.
2) В Projectile каждой конкретной стрелы указываем свой взрыв (Explosion) с очень маленьким радиусом действия и без виз. эффектов. Для этого взрыва создаем свое зачарование типа FF - Contact (No Area). При попадании стрелы произойдет взрыв и все цели, попавшие в радиус действия (а он указан очень маленьким) также будут поражены этим зачарованием.
Добавлено (22 Августа 2014, 19:05) --------------------------------------------- Не совсем понял, как ты собираешься при помощи перков добавлять дополнительные свойства стрелам (заклинания, срабатывающие при попадании?). У перков для этих целей есть только один Entry Point - Apply Combat Hit Spell. Он работает только при ударе оружием (или кулаками?) в ближнем бою. Для стрел там нет ничего.
А, есть еще Weapon Swing Spell, работающий, когда по цели, имеющей этот перк, наносят удар в ближнем бою (опять-таки!).
Короче, как я бы это сделал, если бы мне это позарез было надо, не заботясь о нагрузке на процессор:
- Создаю маг. плащ, который раздает маг. эффект в радиусе 200 (1000) футов от игрока. - К нему цепляю скрипт:
Событие при воздействии (OnHit). Если агрессор имеет экипированные стрелы Применить к цели заклинание в зависимости от экипированных стрел ЭндЕсли ЭндСобытие
Добавлено (22 Августа 2014, 19:18) --------------------------------------------- Dsion, ну вот, мы с тобой и мыслим одинаково... Или это действительно единственный путь.
Amiball1992, меня тоже занимал этот вопрос. Специальной команды, подозреваю, для этого нет. Но я не ищу легких путей, поэтому после некоторых размышлений предлагаю свой (полностью работоспособный) вариант:
Scriptname _MySCRIPT extends ObjectReference ; Цепляем к объекту, который будем экипировать. Сделано для удобства проверки.
GlobalVariable Property TimeScale Auto ; Глобальная, определяющая скорость течения игрового времени. Будем менять скриптом. По умолчанию: 20.0 Float Property MyTime = 12.0 Auto ; Время (игровое, в часах), которое должно наступить (почти) немедленно. Пример: 11.0 (одинадцать утра) или 21.0 (девять вечера). Float Property MyShift = 5.0 Auto ; Время в секундах, за которое должно произойти смещение игрового времени суток с произвольного на заданное. Пример: за 5.0 реальных сек.
Float fTracer Bool bLock
EVENT OnEquipped(Actor akActor) ; Событие, при котором произойдет активация. Можно выбрать любым. IF akActor == Game.GetPlayer() ; Это на всякий случай, а то полчаса отлавливал баг IF !bLock ; Начало основного кода. bLock = true fTracer = TimeScale.GetValue() Float fGT = Utility.GetCurrentGameTime() Float fDelta = (MyTime / 24.0) - (fGT - Math.Floor(fGT)) IF fDelta < 0 fDelta += 1.0 ENDIF TimeScale.SetValue(86400 * fDelta / MyShift) Debug.Notification("Текущее время: " + ((Utility.GetCurrentGameTime() - Math.Floor(Utility.GetCurrentGameTime())) * 24) as string + " Ускорение: " + (TimeScale.GetValue()) as string) ; Уведомления можно отключить или удалить. Utility.Wait(MyShift) TimeScale.SetValue(fTracer) Debug.Notification("Текущее время: " + ((Utility.GetCurrentGameTime() - Math.Floor(Utility.GetCurrentGameTime())) * 24) as string + " Ускорение: " + (TimeScale.GetValue()) as string) ; Уведомления можно отключить или удалить. bLock = false ENDIF ; Конец основного кода. ENDIF ENDEVENT
Amiball1992, то же самое, но реализованное в виде функции, которую можно использовать в любом скрипте. Задаешь параметры функции, и назад, в будущее .
Scriptname ??? extends ???
Import Utility Import Math
GlobalVariable Property TimeScale Auto Bool bLock
Float FUNCTION GetGameHours() ; Простая функция, сообщающая текущий игровой час. Float fGT = GetCurrentGameTime() Return (fGT - Floor(fGT)) * 24 ENDFUNCTION
FUNCTION SetGameHours(Float fDesirableTime, Float fShift = 5.0, Bool bNotify) ; Функция установки игрового времени суток с произвольного значения к заданному. ; fDesirableTime - игровое время, которое необходимо установить (в часах). ; fShift - реальное время, за которое нужно произвести перевод (в секундах). Не устанавливать значение меньше 1.0. ; bNotify - уведомлять о значении игрового времени после перевода? По умолчанию: нет. IF !bLock && fShift >= 1.0 bLock = true Float fTracer = TimeScale.GetValue() Float fDelta = (fDesirableTime - GetGameHours()) / 24.0 IF fDelta < 0 fDelta += 1.0 ENDIF TimeScale.SetValue(86400 * fDelta / fShift) Wait(fShift) TimeScale.SetValue(fTracer) IF bNotify Debug.Notification("Время переведено к " + GetGameHours() as string + " часам.") ENDIF bLock = false ENDIF ENDFUNCTION
Sovetski, в общем, вот приблизительное содержание скрипта и сообщения:
Scriptname _MySCRIPT extends ObjectReference ; Для конкретного активатора. Нужен тест.
Message Property MyMessage Auto ; Сообщение (MessageBox). MiscObject Property Gold001 Auto ; Золото. Int Property iPayment = 10000 Auto ; Его количество.
EVENT OnActivate(ObjectReference akDovahkiin) Int iChoice = MyMessage.Show() IF iChoice == 1 (akDovahkiin as Actor).ModAV("DragonSouls", 1.0) akDovahkiin.RemoveItem(Gold001, iPayment) ENDIF ENDEVENT
Пример: см., сколько на сайте англоязычных имен пользователей, или составленных латинскими буквами. См., как называется сайт: он называется явно не "Игровые моды". И не надо думать, что это незначительные вещи.