• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Эх.. а счастье было так близко... не сработало щясте
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
- скомпилировал скрипт. - добавил его к точильному камню, который скинул в окно рендера. - запустил игру и побежал в Ривервуд. - мой модный НПС начал пользоваться этой фурнитурой (у него пакет Сэндбокс). - пока НПС пользовался им, периодически выводилось уведомление (я его добавил). - когда НПС слез, вывелось Off. - проверил с игроком, все то же самое.
Да, у меня тоже работает.. сам напортачил... Вот теперь щясте Благодарю однако!
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
У меня не работает следующее событие в скрипте на квесте:
EVENT OnStoryRemoveFromPlayer(ObjectReference akOwner, ObjectReference akItem, Location akLocation, Form akItemBase, int aiRemoveType) Debug.Notification("Удалено!") ENDEVENT
Я так понимаю, событие должно срабатывать при удалении любого предмета из инвентаря игрока. Однако, это не работает. У кого-нибудь есть какие-нибудь идеи-нибудь?
Добавлено (30 Сентября 2014, 23:02) --------------------------------------------- Оно-то работает, но не вижу особого смысла... Можно же просто сделать алиас игрока с ивентом OnItemRemoved. Но эти StoryManager ивенты чуть больше информации получают об ивенте.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1238
написано: 30 сентября 2014, 19:06
| Отредактировано: Multigone - 30 сентября 2014, 19:11
Dsion, что-то я первый раз с этим сталкиваюсь. Спасибо, буду разбираться ИЛИ попробую пока обойтись событием
EVENT OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
на алиасе игрока.
------------------
Вот-вот, о чем я и говорю. Но у квеста есть возможность отследить, как именно был удален предмет, для меня это достаточно важно. Понятное дело, что в алиасе это будет выглядеть примерно так (я сейчас это и использую):
IF !akDestContainer && !akItemReference ; предмет удаляется бесследно.
IF akDestContainer ; В контейнер.
IF !akDestContainer && akItemReference ; В мир.
А мне нужно еще отследить, когда он удаляется движком (это камни душ), скриптом (у меня несколько скриптов удаляют их), а также для того, чтобы при удалении скриптами др. модов (если таковые будут) это тоже можно было определить.
В SM Event Node список ивентов, а в каждом ивенте список квестов, которые он может запускать... Если там будет твой квест и в квесте тоже прописан запуск по этому ивенту, то он запустится и выскочит OnStory...
Если верить вики, то из свитка(scroll) заклинание вытащить нельзя. Максимум что можно, это скастовать его в игре или получить параметру при помощи SKSE/
А тем временем ещё вопросик задам: Кто то пробовал делать квест, запускающийся по событию "Craft Item" ? Хочется словить эвент OnStoryCraftItem() и по нему определить, что создано в кузнице. Но вот в Вики написано что эта функция неработоспособна, а сам я пока не смог проверить т .к "SM Event Node" вчера не нашёл.
И ещё, нужно ли удалять референсы обьектов типа Explosion, или они сами пропадают из мира Игры ?
Event OnUnequipped(Actor akActor) IF akActor.GetEquippedSpell(0) akActor.UnequipSpell(MySpell, 0) ENDIF IF akActor.GetEquippedSpell(1) akActor.UnequipSpell(MySpell, 1) ENDIF akActor.RemoveSpell(MySpell) endEvent
anton,
По поводу крафта:
1) Можно попробовать действовать через скрипт др. квеста:
ScriptName MyScript extends Quest
Quest Property MyQuest Auto MiscObject Property MyItem Auto ; Указать соотв. тип своего предмета.
Event OnStoryAddToPlayer(ObjectReference akOwner, ObjectReference akContainer, Location akLocation, Form akItemBase, int aiAcquireType) IF akItemBase == MyItem IF aiAcquireType == 0 IF !(MyQuest.IsRunning()) && !(MyQuest.IsCompleted()) MyQuest.Start() ENDIF ENDIF ENDIF ENDEVENT
2) Через скрипт алиаса игрока:
ScriptName MyScript extends ReferenceAlias
Quest Property MyQuest Auto MiscObject Property MyItem Auto ; Указать соотв. тип своего предмета.
EVENT OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) IF akBaseItem == MyItem IF UI.IsMenuOpen("Crafting Menu") ; Функция требует SKSE, к сожалению. ; Crafting Menu - любое меню крафта. ; Если предмет создастся в любом месте для крафта (алхимия, кузница, топка, чары и т.д.), то... ; ... UI.IsMenuOpen("Crafting Menu") - проверка будет выполнена. IF !(MyQuest.IsRunning()) && !(MyQuest.IsCompleted()) MyQuest.Start() ENDIF ENDIF ENDIF ENDEVENT
Коллеги у меня два вопроса, как сделать так что бы вызванный мной персонаж убивал моих врагов сразу добиванием ! и дайте пожалуйста ссылку на информацию в которой описано как можно добавить персонажа который бы давал записку в игре нам, как это можно сделать ) устали искать ) думаю мои вопросы так или иначе все равно относятся к скриптам поэтому написал здесь.
Multigone, спасибо за примеры, второй мне больше нравится, т.к. через OnStoryAddToPlayer() я так понял не получится узнать, что предмет появился именно из кузницы.
Myprism, если проверять попадание инвентарь, то проблема будет узнать что предмет попал именно из кузницы, а не подобран с земли например. Ведь через событие OnItemAdded() нельзя это узнать. Хотя если делать как подсказал Multigone во втором примере, то может получится.
Теперь хочу поделится результатами своих экспериментов: Квест с типом запуска "Craft Item" запустить через SM Event Node у меня получилось, но проблема в том, что он не способен выполнять обычные скрипты висящие на нём (происходят CTD), а выполняет только скрипты-фрагменты. Из чего следует, что событие OnStoryCraftItem() поймать таким квестом не получится. Но зато для запуска этого квеста можно прописать условие в SM Event Node, и тогда квест можно запустить при создании только определённого предмета, а это уже почти то, что мне нужно.
Ещё хочу уточнить одну вещь, есть ли консольная команда для запуска квеста ? (я попробовал player.SetStage _MyQuest 0 , но скрипт-фрагмент висящий на этом нулевом состоянии не отработал)
Квест с типом запуска "Craft Item" запустить через SM Event Node у меня получилось, но проблема в том, что он не способен выполнять обычные скрипты висящие на нём (происходят CTD),
А если перед этим запускать квест отслежывающий, что ГГ находится с меню крафта
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1251
написано: 2 октября 2014, 10:09
| Отредактировано: Multigone - 2 октября 2014, 14:17
- пост. обновление на игроке. - в малом радиусе ищется ближайший реф. с типом нужной фурнитуры. - при нахождении - этот реф. добавляется в алиас (Optional), на котором есть скрипт и событие ПриАктивации(). - когда игрок активирует его, переводит булевую переменную (или глобальную на значения 0 и 1) на true, когда уходит с фурнитуры - на false. - событие добавления предмета на алиасе игрока. - если при добавлении предмета переменная = true, запустить квест.
Kepper, "квест.start()" в скрипте можно, а в консоли по моему так нельзя. Отслеживающий квест сегодня попробую, а то вчера весь вечер на глючные скрипты-фрагменты потратил.
Multigone, да тут и правда сложновато.
Dsion, вооот в этом и есть вся суть моей задумки ! сделать такую себе защиту от читера, чтобы игрок не смог получить нужные предметы просто введя их в консоли.
Точнее если ГГ получит их таким образом, мод перестанет правильно работать и начинает насылать на ГГ всякие болячки Те эксперименты, что я провёл, подтверждают что всё должно работать. Единственное, что меня смущает, так это то, что квест запускаемый через "SM Event Node" можно запустить и вручную. Хотя на данный момент мне самому это не удалось, чему я очень рад, но вдруг всё таки как то можно.
А то я такой многоуровневый крафт замутил, будет печально если пользователи не захотят его оценить
Multigone, точно, вариант очень хороший и понятный.
Потому что когда он увидит условия создания предметов, руки сами потянутся в консоль (у меня бы точно потянулись )
Ведь крафт будет не совсем обычный: - сначала ГГ должен собрать в игре всякий хлам, - потом в кузнице "разобрать" его на "запчасти", - потом из запчастей собрать базовые компоненты - из которых уже сложить необходимое устройство. Вот такой вот многоуровневый крафт получится. И как бы платой за все эти старания будет некий "летательный аппарат". Мне такая идея кажется интересной и оправданной. Как бы мини-игра. У пользователя должно сложится ощущение, что он хорошо постарался и заслужил новую "игрушку".
Всё это только для того, чтоб защититься от читера? Чтоб предмет нельзя было добавить через консоль? Не думаю, что можно сделать надежную защиту. Всегда найдется какая-то серия консольных команд, которая таки даст игроку этот предмет.
Но если хочешь хоть какую-то примитивную защитку от AddItem... Можно прицепить скрипт на сам предмет. При появление предмет будет проверять, выполнены ли все условия квеста. А если не выполнены, будет самоудаляться... И убивать игрока (на всякий случай).
Dsion, да, именно для защиты мода Тут не всё так просто, ведь условие - это создание в кузнице, а никакая команда в скрипте на предмете не позволяет это определить, нужен только запуск квеста типа "Craft Item" через "SM Event Node". Вот когда этот квест стартует, выполняется мой скрипт, заполняющий спец. переменную, которая в дальнейшем и позволяет определить был ли реально крафт именно этой вещицы или нет.
Вот если бы при этом на таком квесте работал обычный скрипт ловящий событие OnStoryCraftItem(), то всё вообще было бы идеально. Но увы, там работают только скрипты-фрагменты, которые писать то ещё удовольствие.
Но даже в таком виде, оно подходит для выполнения моей задачи, т.к. нет команды, запускающей квест через консоль (что позволило бы выполнить скрипт-фрагмент в таком квесте). player.SetStage на сколько я понял только переключает состояния уже запущенного квеста, но стартовать сам квест не может.
Всё там есть: startquest, stopquest, setstage (тоже выполняет фрагмент). Многие переменные (даже скриптовые) также можно менять через консоль. Предложение было не в том, чтоб легальность предмета подтверждалась фактом крафта в кузне, а чтоб подтверждалась прохождением всех субквестов: 1. Игрок нашел чертеж - поставилась переменная "игрокНашелЧертеж" 2. Игрок собрал ресурсы - поставилась переменная "игрокСобралРесурсы" 3. Игрок выслушал занудную болтовню какого-то скелета, предостерегающего от крафта - поставилась переменная. А потом это всё проверяется.
Или другой вариант. Особый крафт через скрипт, а не стандартными методами. Когда игрок всё собрал и всё выполнил, он активирует кузню (обычную или особую) и ему выскакивает выбор: "обычный крафт" или "скрафтить адскую хрень". Такое можно, например, через временный перк сделать.
Но если кто-то моё мнение спросит, мне идея защиты от читерства вообще не нравится...
Изменение репутации для пользователя anton
antonOffline
Сообщение №1260
написано: 3 октября 2014, 12:02
| Отредактировано: anton - 3 октября 2014, 12:06
Dsion, я тоже подозреваю, что мало кто мне за это спасибо скажет но всё равно интересно как это будет, ведь я ещё нигде не видел ничего подобного. В крайнем случае отключить всё это хозяйство много времени не займёт.
Ещё раз посмотрел Вики, нету startquest и stopquest но я проверю в игре мало ли... , а setstage однозначно мой квест не запускает (по крайней мере скрипт-фрагмент точно не срабатывает)
А особый крафт (через скрипт) это как ? : - подходим к любой стандартной кузне - активируем её и получаем МесседжБокс про "скрафтить адскую хрень" - нажимаем ОК и при наличии ресурсов получает предмет ? (а временный перк - это перк на событие Activate со своим скриптом-фрагментом вызывающим этот МесседжБокс ?) Просто интересно, как такое делается.
В моём моде есть что то похожее, но в качестве кузницы используется обычный активатор и по событию OnActivate() он создаёт предмет.