• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
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
DsionOffline
Сообщение №2522
написано: 13 августа 2017, 17:08
| Отредактировано: Dsion - 13 августа 2017, 17:13
Multigone, ничо я не неправ) Я думал снаряд именно отдельным объектом сделать, имеющим вес. Информацию в нем можно любую сохранить. Но с SetAngle, может, даже интереснее. Если не считать часть про размещение триггера. Интересно, что будет, если создать projectile через функцию PlaceAtMe. Появится ли он и полетит ли куда-то? И кто будет считаться его творцом.
Dsion, так я управляю любым снарядом, выпущенным игроком. А триггер нужен как самый простой способ получить его реф. А ты предлагаешь спавнить MovableStatic (?), не умеющий втыкаться в актеров, как ледяная стрела, или взрываться с наложением маг. эффекта, не оставляющий попаданий в поверхность. А если не статик, то что?
Добавлено (13 Августа 2017, 20:30) --------------------------------------------- Dsion, когда спавнишь, по умолчанию применяется matchRotation, как для объекта-источника спавна. На какой угол он повернут, туда и полетит. Наверное. Во всяком случае, реф. снаряда применимы некоторые (если не большинство) функции ObjectReference - Disable, Delete, MoveTo и пр.
Multigone, на мой взгляд, ловить снаряд триггером - абсолютно неприемлемо. И предлагаю я от этого избавиться любой ценой. Если найдется простой способ, то хорошо. А если нет, то да, спавнить какой-нибудь Clutter и добавлять к нему взрыв. Весело же! А если и это не получится, то вообще забить на идею. Но не оставлять триггер.
Добавлено (13 Августа 2017, 22:06) --------------------------------------------- Надо будет осенью попробовать прицепить скрипт на projectile. Не в CK, а в hex редакторе. Вдруг выйдет.
Dsion, а что не так с триггером? Он находится в своей локации, перемещается по требованию и уезжает в закат, когда необходимость отпадает. Есть что-то, чего я не знаю?
Цитата Dsion
попробовать прицепить скрипт
А что там вообще можно сделать? Единственное, получить Self. А если реф. известен извне, не проще запихнуть в алиас.
Всем трям! Помогите пожалуйста создать скрипт, который позволит менять создаваемому НПС одежду во время сна на нужную мне? Беседка во вкладке Актор предусмотрела комплект одежды для сна, но он почему-то не работает.
А есть ли возможность получить ссылку на ближайшую квестовую цель? ObjectReference цели? Ведь если ясновидение показывает путь до цели значит как-то возможно получить ссылку на саму цель. Да и в консольных командах есть команда на перемещение к цели квеста. Очень нужно
Изменение репутации для пользователя sansuli
sansuliOffline
Сообщение №2528
написано: 5 сентября 2017, 06:43
| Отредактировано: sansuli - 5 сентября 2017, 06:46
Так друзья, напиши пожалуйста скрипт вот такой, прост я уже забыл все и тем более нет прог и скайрима для теста. Скрипт для заклинания, которое типа вы перемещаетесь в голову/сознание противника и убиваете его там, и в реале он погибает, плюсы в том что если по замыслу вы его убиваете, то штраф за его убийство не будет наложен, если замысл будет в том что он станет овощем, то он станет овощем):
Кастуем на цель, запоминаем его, его экипировку и местоположение ГГ убираем его АИ и устанавливаем SetGhost, чтобы он не шевелился и не с чем не контактировал создаем клона жертвы с такой же экипировкой, удаляем из всех фракций, выдаем ему эффекты призрака и выдаем эффект призрака ГГ перемещаем ГГ и клона в специальную локацию (типа локация разума, здесь можем атаковать жертву) ждем пока клон умрет и удаляем его, перемещаем ГГ обратно в ту локацию на ту позицию при смерти клона жертвы, жертва падает и превращается в овощ (Pushactoraway 0 and paralysis = 1) (ну или умирает kill)
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
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
Изменение репутации для пользователя Нарада
НарадаOffline
Сообщение №2530
написано: 11 сентября 2017, 07:47
| Отредактировано: Нарада - 11 сентября 2017, 07:50
Добрые сутки, друзья! У меня появился вопрос: можно ли программно, используя меню Message, открыть контейнер? Что-то я не нашел соответствующих функций.
Добрый день. У меня может несколько странный вопрос. В папирусе есть функции обработки строк? Такие как Чтение вхождения строки, это значит например прочитать строку со 2 по 5 символ Перезаписать строку/часть строки с такогото по такойто символ.
Можно ли создавать многоуровневые массивы? Это значит массив в массиве. Ну или сделать такой массив, чтобы его элементы были массивами?
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №2533
написано: 17 сентября 2017, 07:50
| Отредактировано: Dsion - 17 сентября 2017, 07:52
Многомерные массивы - нормального способа нету. Можно симулировать многомерный массив с помощью одномерного или использовать объекты. Вот тут написано: https://www.creationkit.com/index.php?title=Arrays_(Papyrus) (в разделе "Multi-Dimensional Arrays")
Иногда еще подходит решение c массивом из FormList.
Изменение репутации для пользователя maxcad
maxcadOffline
Сообщение №2534
написано: 17 сентября 2017, 17:16
| Отредактировано: maxcad - 17 сентября 2017, 17:17
maxcad, Слоты, по-моему, определяются СКСЕ... попробуй тут поискать...
Добавлено (20 Октября 2017, 19:11) --------------------------------------------- Давно я сюда не обращался с просьбами... но у меня один вопрос, который я не могу решить... не могли бы вы подсказать?
Как заставить контейнер выкинуть всё его содержимое? Есть заклинание, которое складывает предметы в этот контейнер, и есть заклинание, которое должно заставлять этот контейнер всё это выблевать...
просто так у меня не получилось... попробовал сделать с помощью формлиста - заклинание, которое убирает предметы, добавляет их и в сундук и в формлист (ясень пень, что туда добавляются не рефы, а формы, от того он и ФОРМлист). Скрипт высвобождения ящика запускает формлист и каждый раз заставляет ящик выкидывать предмет... но ничего не выкидывается... что я делаю не так?
Что интересно, всё компилируется, как ни странно... но не работает
Код который поглощает предметы и засовывает их в ящик
Код
ObjectReference property _LEXO_Container auto SPELL property _LEXO_Spell auto FormList property _LEXO_FRMLST auto
ObjectReference Tresh = Self.GetReference() ;ObjectReference _LEXO_ContainerRef = _LEXO_Container.GetReference() If akSource == _LEXO_Spell as spell _LEXO_Container.AddItem(Trash , 1, true) _LEXO_FRMLST.AddForm(Trash) Endif
Trash.Disable() Trash.Delete()
EndEvent
Код на активаторе, призываемом заклинанием, что бы переместить ящик и заставить его выгрузить всё
Код
ObjectReference property Container1 auto FormList property _LEXO_FRMLST auto Form Item
Container1.MoveTo(Self)
Int iIndex = _LEXO_FRMLST.GetSize() While iIndex > 0 iIndex -= 1 Item = _LEXO_FRMLST.GetAt(iIndex) Debug.Notification(Item) Container1.PlaceAtMe(Item) Container1.DropObject(Item) ; на всякий случай проверил обе команды - ничего не работает EndWhile _LEXO_FRMLST.Revert()
Помогите, пожалуйста...
Добавлено (20 Октября 2017, 20:21) --------------------------------------------- Может, использовать невидимого персонажа, вместо контейнера?
Добавлено (21 Октября 2017, 20:08) --------------------------------------------- Актёр не помог....
Lexo, сундуку обязательно быть именно контейнером? Можно создать отдельную локацию (Cell) и телепортировать туда вещи. А потом телепортировать их к сундуку. Потому что если их складировать в настоящий контейнер, то референсы потеряются.
А если я одновременно несколько предметов? Скрипт сможет десятки разных предметов (книги, камни душ, доспехи) складывать в одном месте, а потом телепортировать в другое?
Multigone, воще не понял, о чем ты и причем тут я... Если бы Lexo объяснил, как именно хочет отправлять вещи "в сундук", можно было бы что-то подумать... А так... Будем тут месяц обсуждать, а потом окажется, что ему обычное RemoveAllItems подходит...
Dsion, нужно ведь запоминать референсы предметов где-то, чтобы их потом когда-нибудь возвращать обратно из локации, так? Вместо этого можно просто "узнавать" их RefID с помощью SKSE. Я это хотел сказать.
В ящик они перемещаются заклинанием... RemoveAllItems подходит только для того, что бы в другой ящик перекладывать (ну или персонажу)... а как заставить этот самый ящик потом выкинуть всё своё содержимое наружу? Я такой функции не нашёл... видимо, нельзя... жаль... спасибо за помощь!
Добавлено (23 Октября 2017, 19:15) --------------------------------------------- А может знаете способ нормально скриптом проходить через дверь, которая ведёт в другую локацию? OnActivate работает, но как-то не всегда так, как надо... активацию дверей делал через квест...
Lexo, каким, блин, заклинанием? Заклинания не накладываются на неживые предметы. Если объяснишь, как оно у тебя работает, придумаем, как сделать выплевываение.
ObjectReference Tresh = Self.GetReference() ;ObjectReference _LEXO_ContainerRef = _LEXO_Container.GetReference() If akSource == _LEXO_Spell as spell _LEXO_Container.AddItem(Trash , 1, true) _LEXO_FRMLST.AddForm(Trash) Endif
Trash.Disable() Trash.Delete()
EndEvent
он переносит предмет, в который попало моё заклинание, в мешок. Всё работает, уже неделю балуюсь... Из этого мешка я легко переношу все предметы в другой контейнер... но хотел, что бы не в контейнер переносилось, а наружу выкидывалось... я такой функции не нашёл... полагаю, что вы тоже... так что, простите, если что-то не так написал - в голове-то всегда понятнее, чем снаружи... и спасибо за помощь...
Lexo, мне три варианта на ум приходит: 1. Телепортировать вещи на маркер в отдельную локацию. Игрок туда никогда не зайдет, физика не включится. А потом можно телепортировать обратно. 2. Складывать вещи в контейнер и повесить на него ивент OnItemRemoved. Когда нужно выплюнуть вещи, вызываем на контейнере RemoveAllItems. Для каждого предмета (или стака) будет вызываться OnItemRemoved. А в OnItemRemoved можно создавать такие же предметы вокруг сундука. Но тут проблема в том, что это будут именно копии базового предмета. Не сохранятся улучшения, заряды камней душ итп. 3. Можно засовывать вещи в алиас перед помещением в сундук. Будет ограничение на количество предметов (по количеству алиасов), но остальные проблемы решатся.