• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №571
написано: 28 ноября 2013, 12:52
| Отредактировано: LordVadim - 28 ноября 2013, 12:53
Это сработало, при загрузке модель сидит. А для разных моделей придется штук 30 алиасов запихать в квест и написать скрипт для управления/назначения/очистки. Похоже, что это единственное решение.
Я потихоньку перевожу описание функций папируса. Но мне на нравится текущий способ представления информации. Поэтому ищу более удобный. http://www.creationkit.com/Game_Script К столбцу Description претензий нет Столбец Function нужен. Берешь указанную там строку и полностью копируешь к себе в скрипт. Но из за слишком большого количества информации трудно понять что это за функция.
Я выделил тип возвращаемого значения и наименование функции в отдельные столбцы. Game Script http://yadi.sk/d/gaA4nGoLDViXG Удобнее ли работать с информацией представленной таким образом или достаточно виделения жирным шрифтом и курсивом, как на исходной странице? Может у кого-то появятся идеи более удобных вариантов.
Пока это всё в забито в эксель. Да и перевод фрагментарен и не точен.
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №573
написано: 29 ноября 2013, 08:27
| Отредактировано: LordVadim - 29 ноября 2013, 08:29
Удобнее ли работать с информацией представленной таким образом или достаточно виделения жирным шрифтом и курсивом, как на исходной странице? Может у кого-то появятся идеи более удобных вариантов
Тут на всех не угодишь. Мнения субъективны. Мое мнение: В первом варианте не сразу видно имя функции, неудобно искать. Во втором варианте дублируется информация в четвертом столбце из первого и второго и выглядит не слишком читабельно. На мой взгляд удобнее было бы организовать информацию в три столбца: Возвращаемый тип / Имя функции (с синтаксисом) / Описание функции.
В любом случае: Спасибо за создание перевода!!!
Изменение репутации для пользователя Artem13
Artem13Offline
Сообщение №574
написано: 29 ноября 2013, 09:43
| Отредактировано: Artem13 - 3 декабря 2013, 07:55
LordVadim, Kepper, есть еще вариант оформить это дело в chm-файл. Пример могу вечером скинуть - я, в своё время, начинал делать справочник по моддингу KB:The Legend
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
У автономного варианта есть свои плюсы:не нужен интернет, есть таблицы(по сравнению с форумом) и минусы: компоновать может один человек, мелкие исправления не по вносишь. Можно по пробовать.
А теперь о грусном.
Код
Scriptname LB_NoNude extends activemagiceffect
Keyword Property KeywordTopItem Auto Keyword Property KeywordBottomItem Auto FormList Property ListTopItem Auto FormList Property ListBottomItem Auto
Int Function GetEquipedSetNum(Actor TargetActor, Bool TopEquipped, Bool BottomEquipped) ;Debug.Notification("CheckEquipedSet") Int SetNum = ListTopItem.GetSize() If TopEquipped While (SetNum >0) If TargetActor.IsEquipped(ListTopItem.GetAt(SetNum )) Return SetNum EndIf SetNum -= 1 EndWhile EndIf
If BottomEquipped While SetNum >0 If TargetActor.IsEquipped(ListBottomItem.GetAt(SetNum )) Return SetNum EndIf SetNum -= 1 EndWhile EndIf Return -1 EndFunction
Function EquipSet(Int SetNum, Bool TopEquipped, Bool BottomEquipped, Actor TargetActor) If !TopEquipped TargetActor.EquipItem(ListTopItem.GetAt(SetNum)) EndIf If !BottomEquipped TargetActor.EquipItem(ListBottomItem.GetAt(SetNum)) EndIf EndFunction
Этот скрипт висит на расовой способности. Одевает нижнее бельё если снять с НПС одежду. То есть этот маг эффект висит на всех моих НПС. Иногда после раздевания НПС(тестил на мёртвых) и выхода из меню обмена мой ГГ начинает не переставая наносить силовые удары. Их можно прекратить, если самому приказать нанести силовой удар. Почему это случается не пойму.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №576
написано: 2 декабря 2013, 20:03
| Отредактировано: AleksTirex - 2 декабря 2013, 20:17
Int SetNum = ListTopItem.GetSize() If TopEquipped While (SetNum >0) SetNum -= 1 If TargetActor.IsEquipped(ListTopItem.GetAt(SetNum )) Return SetNum EndIf SetNum -= 1 EndWhile
В списках нумерация начинается с нуля "0", поэтому длина списка всегда больше на 1, чем последний номер списка. В твоём варианте проверяется несуществующий номер списка, а вот первый нулевой предмет вообще не проверяется. Поэтому SetNum -= 1 надо ставить перед командой GetAt().
Немного не понятно, зачем делать проверки "Если одето...", когда можно гораздо проще сделать - сразу одевать трусы при снятии юбки. Если я правильно понял, то надо вместо снятой шмотки с №кейвордом одеть другую шмотку? Тогда так:
Scriptname LB_NoNude extends activemagiceffect
Keyword Property KeywordTopItem Auto Keyword Property KeywordBottomItem Auto FormList Property ListTopItem Auto FormList Property ListBottomItem Auto Bool TopEquipped Bool BottomEquipped
auto state DefaultState Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) Actor TargetActor = Self.GetTargetActor() if akBaseItem as Armor if akBaseItem.HasKeyword(KeywordTopItem) TargetActor.EquipItem(ListTopItem.GetAt(Utility.RandomInt(0, ListTopItem.GetSize() - 1)) as armor, true) TopEquipped = true endif if akBaseItem.HasKeyword(KeywordBottomItem) TargetActor.EquipItem(ListBottomItem.GetAt(Utility.RandomInt(0, ListBottomItem.GetSize() - 1)) as armor, true) BottomEquipped = true endif endif if TopEquipped && BottomEquipped gotoState("DoneState") endif EndEvent EndState
state DoneState ; endState
*****************
Но и... а не проще ли было сделать свой "одетый" скин для НПС, ведь они все твои и твоей расы, и скрипт тогда вообще не нужен.
***************** ***************** Вместо события удаления лучше использовать событие снятия - OnObjectUnequipped(), это будет корректнее работать.
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №577
написано: 3 декабря 2013, 19:15
| Отредактировано: LordVadim - 3 декабря 2013, 19:23
Добавляю в Magic Effect источник света, но при касте почему то игнорируется Flicker Effect. Если просто разместить источник света через СК в мир, он мерцает, а при касте нет. Я что то не правильно делаю или это особенность движка?
Изменение репутации для пользователя Insomniac
InsomniacOffline
Сообщение №578
написано: 4 декабря 2013, 10:53
| Отредактировано: Insomniac - 4 декабря 2013, 10:54
Пытаюсь написать скрипт что бы при использовании определенного спела скрипт кастовал еще один (просто в один спелл не залазят разные маг эффекты) и он не работает
некоторые комплекты не содержат вещей замещающих тело, да и разнообразие снижается
Обнаружил критичный баг в основном моде. Хорошо хоть он вылез у меня и довольно стабильно проявляется.
Я думал что событие OnObjectUnequipped() вызывается только для скриптов висящих на актёрах. А у меня скрипт висит на магэффекте. Поэтому и не использовал. Но оно сработало. Теперь мне не понятно какие события в каких скриптах вызываются.
И не удивительно, такой команды нет. Есть команда Cast. akSpell.Cast(akCaster, akTarget)
akCaster - кто кастует akTarget - на кого кастуют (цель) akSpell - заклинание
При этой команде добавлять заклинание не обязательно, оно добавится само автоматически.
(!Game.GetPlayer().HasSpell(VampDetectLife)) - это проверка наличия данного заклинания у игрока (если нужна проверка на "воздейстие заклинания на ГГ", то команда должна быть другой). Все проверки делаются через If/elseIf/endIf if !Game.GetPlayer().HasSpell(VampDetectLife) VampDetectLife.Cast(Game.GetPlayer(), Game.GetPlayer()) endif
AleksTirex, не сталкивался с таким вопросом: Если добавить в Magic Effect источник света, при касте почему то игнорируется Flicker Effect?
Как-то такое даже не замечал. Возможно, что так оно и есть, но и... мне кажется (или не кажется), что "Свет свечи" и подобные "светящиеся шарики" не совсем равномерно светят, а как бы мерцают (но может, мне это только кажется). Как будет время, посмотрю в игре на этот эффект.
Да, это и есть Flicker-эффект. Там даже настраивается амплитуда эффекта.
В том то и дело, что все настраивается и на источниках света, установленных через СК, нормально работает. А вот в заклинаниях не работает. Тот же "Свет свечи" - не мерцает, мельтешит перед глазами летающий шарик, а сам свет светит ровно, без мерцания и никак не реагирует на параметры раздела Flicker Effect. Что бы это проверить достаточно подойти к стене и понаблюдать за светом.
Странное дело.. когда уже в тупике и не знаешь что предпринять... собираешься попросить помощи на форуме... Садишься, открываешь форму ответа, начинаешь описывать проблему так, чтоб всем стало понятно о чем идет речь... ЧИК... и ответ на свой вопрос уже оказывается как на ладони...
К чему это я? Надо четко понимать чего хочешь добиться, четко ставить вопросы, т.к. только четкие вопросы дают четкие ответы, а иногда решение проблемы находится в самом вопросе...
Лирика блин... всем чОтким модостроителям - чОтких вопросов!
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Изменение репутации для пользователя DarkVetal
DarkVetal
Сообщение №587
написано: 5 декабря 2013, 18:42
| Отредактировано: DarkVetal - 5 декабря 2013, 18:42
AleksTirex, вот ты давал мне скрипт на появление\исчезание статики: Scriptname AllActivator extends ObjectReference Event OnActivate(ObjectReference akActionRef) if GetLinkedRef().IsDisabled() GetLinkedRef().Enable() else GetLinkedRef().Disable() endif endEvent В связи с этим возникло несколько вопросов: 1. Не привязывается больше одного статика, а хотелось бы привязывать бесконечное количество - (на печке стоит казан (нерабочий), включаю газ, и вместе с ним, взамен нерабочего казана появляется рабочий, то есть с включением огня я могу готовить пищу, - то есть огонь и рабочий казан помечены галочкой InitiallyDisable, а нерабочий казан нет, при нажатии на кнопку все меняется наоборот) 2. Можно ли прикрутить к скрипту таймер автоматического отключения статики (нажимаю на слив унитаза, появляется модель воды, делает свое дело и секунды через 3-4 исчезает) 3. Можно ли вместо ручки сделать активацию по времени (кроме зажигания фонарей можно например сделать например блокировку ворот на ночь маркером коллизии, включение охранных систем, да и просто появление парочки дуболомов с мечами для охраны дома) P.S. Извиняюсь за наглость, но очень уж нужна твоя помощь, хотя бы по-первому вопросу. Очень большущее спасибо!
Изменение репутации для пользователя LordVadim
LordVadimOffline
Сообщение №588
написано: 5 декабря 2013, 20:32
| Отредактировано: LordVadim - 5 декабря 2013, 20:42
1. Не привязывается больше одного статика, а хотелось бы привязывать бесконечное количество - (на печке стоит казан (нерабочий), включаю газ, и вместе с ним, взамен нерабочего казана появляется рабочий, то есть с включением огня я могу готовить пищу, - то есть огонь и рабочий казан помечены галочкой InitiallyDisable, а нерабочий казан нет, при нажатии на кнопку все меняется наоборот) 2. Можно ли прикрутить к скрипту таймер автоматического отключения статики (нажимаю на слив унитаза, появляется модель воды, делает свое дело и секунды через 3-4 исчезает) 3. Можно ли вместо ручки сделать активацию по времени (кроме зажигания фонарей можно например сделать например блокировку ворот на ночь маркером коллизии, включение охранных систем, да и просто появление парочки дуболомов с мечами для охраны дома).
1. Привязывается. Алгоритм такой: связываешь по цепочке: Кнопка - Котел1 - Огонь - Кран - Котел2 - ... - Кнопка. Цепочку обязательно замкнуть. Далее в скрипте делаешь цикл:
2. Можно. Используй функцию RegisterForSingleUpdate( время ) - время задается в секундах. И через заданное время сработает событие:
Event OnUpdate()
Выполняешь необходимые операции...
endEvent
3. Можно. Используй функцию RegisterForUpdate( время ) событие OnUpdate() будет срабатывать с заданным интервалом. Пока не вызовешь функцию: UnregisterForUpdate()
Делаю в своем моде квест без стадий, добавляю диалоги, в диалоге добавляю следующее(в других диалогах добавляю почти тож самое, только с другими индексами):
ActorBase Property NalBase Auto FormList Property NalCombat Auto FormList Property NalPerk Auto
NalBase.SetCombatStyle(NalCombat.GetAt(0) as CombatStyle) akSpeaker.AddPerk(NalPerk.GetAt(0) as Perk) akSpeaker.AddPerk(NalPerk.GetAt(1) as Perk) akSpeaker.AddPerk(NalPerk.GetAt(2) as Perk)
Как ты уже наверняка понял, таким образом я хочу дать игроку возможность настроить стиль боя спутника(в конкретном случае, это Нал, девушка из моего мода). Я сделал(пока) 4 FormList, в первом три разных CombatStyle, в трех других перки, которые я хочу выдать НПС применительно к выбранному стилю боя.
И вроде бы все гладко и СК не ругается, но спутник вне зависимости от выбранного мной для него стиля, ведет бой так, как ему нравится. То есть, если я выбираю стиль "Магия", она у меня запросто может ломануться в бой с двуручником или отстреливать цель из лука. У самого НПС, в настройках актера, на вкладке "AI Data", в поле "Combat Style" установлен стиль такой же, как и нулевой индекс листа и по идее, если код не верный, то магия имеет приоритет перед остальными вариантами боя.. но упс и ах.. НПС сражается как ему хочется, а не как мне...
Да, я понимаю, что это SKSE и кагбэ не против его использовать... но как заставить ЭТО работать? Заранее благодарю всех, кто откликнется на вопрос.
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, я понимаю, что это SKSE и кагбэ не против его использовать... но как заставить ЭТО работать?
Кстати, стиль боя можно менять и без SKSE - пакетами. Даёшь своему алиасу три одинаковых пакета, но с разными условиями и у каждого пакета назначаешь свой стиль боя. А дальше уже понятно, что делать.
Изменение репутации для пользователя VALKNUT
VALKNUTOffline
Сообщение №592
написано: 6 декабря 2013, 03:51
| Отредактировано: VALKNUT - 6 декабря 2013, 11:01
Даёшь своему алиасу три одинаковых пакета, но с разными условиями и у каждого пакета назначаешь свой стиль боя. А дальше уже понятно, что делать.
Одинаковые пакеты? Не совсем понял... если пакеты будут одинаковые, откуда НПС узнает о другом стиле боя?
Может ты имел ввиду три одинаковых Альяса с разными пакетами? Объясни пожалуйста, что-то не ухватил суть..
Еще вопрос... а можно как-то рекурсивно добавить весь FormList и так же рекурсивно его удалить? А то разростается код сильно(отрывок): akSpeaker.RemoveSpell(myRemoveSpell.GetAt(0) as Spell) akSpeaker.RemoveSpell(myRemoveSpell.GetAt(1) as Spell) akSpeaker.RemoveSpell(myRemoveSpell.GetAt(2) as Spell) akSpeaker.RemoveSpell(myRemoveSpell.GetAt(3) as Spell)
akSpeaker.RemovePerk(myRemovePerk.GetAt(0) as Perk) akSpeaker.RemovePerk(myRemovePerk.GetAt(1) as Perk) akSpeaker.RemovePerk(myRemovePerk.GetAt(2) as Perk) akSpeaker.RemovePerk(myRemovePerk.GetAt(3) as Perk) akSpeaker.RemovePerk(myRemovePerk.GetAt(4) as Perk)
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Подскажите скрипт, чтобы одним триггером запускать другой. Смысл вот в чём: Есть старый Беседкин мод на падение космического артефакта. Он срабатывает по сигналу триггера. На триггере висит скрипт, исходников на который нет. Этот триггер явно срабатывает на всё подряд, кроме игрока. В оригинале это не важно, а мне надо поставить условие срабатывания только на главного героя. Тот оригинальный триггер можно сделать маленьким и поставить в таком месте, где его никто не побеспокоит, а запускать его надо своим триггером, чувствительным только к главному герою.
Этот триггер явно срабатывает на всё подряд, кроме игрока.
Это условие прописано в скрипте, который "На триггере висит скрипт, исходников на который нет." Вот и получается замкнутый круг...
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
VALKNUT, как раз там НЕ ПРОПИСАНО условие срабатывание только на игрока, как нужно мне. Он срабатывает на всё, что движется. А точнее, запускается, как только игрок видит триггер. Мне же нужно наложить ограничение. Это можно сделать другим триггером, который будет запускать этот "чёрный ящик". Никакого замкнутого круга, только недостаточное знание скриптов.
А точнее, запускается, как только игрок видит триггер.
Видит или входит в него? Установи XMarker, его будешь включать своим триггером, а к нему привяжи тот, другой.. Триггер можно никуда не убирать и оставить как есть. Что получится: если в ТВОЙ триггер заходит кто-то кроме ГГ(надо прописать в твоем триггере), то XMarker остается в выключенном состоянии и соответственно тот, нужный тебе триггер тоже останется выключенным. Нужному триггеру нужно указать, что он загружается выключенным. Собственно еще вопрос.. а тот артефакт падает при каждом входе в триггер или единожды?
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Дело в том, что триггер не будет запускаться вдали от игрока, не зависимо от того, кто там бегает. Но на некотором расстоянии игра начинает отслеживать триггер. Субъективно это выглядит, как будто игрок увидел триггер, хотя на самом деле, он только подошёл к триггеру на то расстояние, на котором игра начинает его обрабатывать, но игрок туда ещё не вошёл. Но так как там кто-нибудь уже шевелится, триггер срабатывает. Скрипт на оригинальном триггере должен быть не простым, так как там с десяток параметров и включается только раз. То, что ты посоветовал - тоже вариант, но может быть возможно и прямое включение одного триггера другим?
но может быть возможно и прямое включение одного триггера другим?
Нет, так не выйдет... т.к. ЧТО-ТО при помощи триггера должно изменить состояние с Disable() на Enable()... Или же.. можешь попробовать выключить СВОЙ триггер через код самого триггера. Но тут уж я не подскажу, я привык использовать XMarker'ы...
Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ <a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Изменение репутации для пользователя nine-dragon-art
Я не знаю куда писать и поэтому решил написать сюда. Чем отличается SCSE от ScriptDragon ? Я так понял они расширяют возможности для моддеров. Мне интересно, конфликтуют ли они друг с другом, что делают и что лучше ?
border="0" alt=""/
Изменение репутации для пользователя DarkVetal
DarkVetal
Сообщение №600
написано: 6 декабря 2013, 17:39
| Отредактировано: DarkVetal - 6 декабря 2013, 17:47
LordVadim, AleksTirex, спасибо вам огромное за помощь, пойду разбираться.
Добавлено (06 Декабря 2013, 21:39) --------------------------------------------- LordVadim,
3. Можно. Используй функцию RegisterForUpdate( время ) событие OnUpdate() будет срабатывать с заданным интервалом. Пока не вызовешь функцию:UnregisterForUpdate()
Куда ее прикрутить, ведь это функция действия на время, а не выключателем. К нужному предмету? Как должен выглядеть полный скрипт? Две функции RegisterForUpdate(08.00) и OnUpdate(12) выдают ошибку. Я так понял первая включает предмет в заданное время, а вторая поддерживает указанное количество часов? Первая функция прописалась в скрипте без проблем, но не работает.
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)