Добавлено (04 Апреля 2020, 06:37) --------------------------------------------- Может ли кто привести пример мода, где персонажи раздеваются, когда плывут в воде? Кроме Мелиссы.
Есть желание сделать переодевание персонажей, когда они плавают. Ведь довольно странно плавать в стальной броне. Для этого мне надо в скрипте определить процесс плавания. Свойство IsSwimming в SKSE есть, т.е. проверить состояние персонажа я могу. Но как найти событие, в которое можно поставить проверку? По идее можно попытаться через магические эффекты с проверкой IsSwimming, но уж больно громоздко получается. Нет ли способа покрасивее?
blΔck, спасибо! Мне нужно только расковырять, как они идентифицируют состояние плавания.
Добавлено (05 Апреля 2020, 01:20) --------------------------------------------- Увы, пролёт. Там нет исходников скриптов. Раз автор их не даёт, значит, он не хочет, чтобы кто-то смотрел, как это работает.
blΔck, спасибо! Нужно по простой причине: не гоже персонажам плавать в стальных доспехах. Если бы была возможность, я бы встроил раздевание при плавании в свой мод. Кристина в скриптах слаба, там копать не стоит. Тут проблема не в переодевании (это я легко сделаю), а в том, чтобы засечь, что персонаж плавает. Есть даже функция, позволяющая опросить персонажа, чтобы узнать плавает он или нет, но нет события в которое можно встроить эту функцию. Возможны некрасивые варианты, вроде опрашивания всех видимых персонажей каждую секунду, но хотелось бы найти что-то поизящнее. В принципе, такой мод, где это реализовано, существует, это Мелисса (ещё и от отечественного разработчика). Но там очень много всего наворочено через магические эффекты. Возможно, что это и есть единственный возможный вариант, но его я оставил на потом, слишком для меня сложно (не люблю я магические эффекты, хотя и использую). Насчёт зарубежных сайтов. Я ведь не ставлю себе задач, которые обязательно должен решить. Просто держу в уме несколько разных задач и решаю из них ту, которая сама пойдёт с наименьшим сопротивлением
Добавлено (05 Апреля 2020, 11:59) --------------------------------------------- Вот по последней ссылке как раз то, что нужно. Автор либерально относится к возможности использования и даёт все исходники, так что я смогу разобраться как это надо делать и тогда уже решить, как можно использовать.
Multigone, Спасибо большое! yakor77, обычно это делают ставя на бассейн триггер. Персонаж пересекает его границы - переодевается. Моя задача намного сложнее. Мне нужно чтобы любой персонаж (хотя бы любой из спутников) переодевался при любом плавании. И да, такие моды есть. Первый, который я давно знал, это Мелисса. Там бездна скриптов и квестов и он для меня слишком сложно устроен (всё же я не люблю скрипты, а к квестам у меня вообще отвращение ), всё же его механизм я понял, там это делается через магические эффекты. Есть ещё 2 - в одном ДЛЛ-ка и всего пара скриптов дез исходников - не годится, в другом через магические эффекты и довольно не сложно. Вот вместе с подсказкой Multigone, у меня уже много пищи для ума.
Tanek, говорил я о Creation Kit. Это редактор созданный разработчиками Скайрима для создания и редактирования дополнений к этой игре. Учить работать с ним человека, который ещё его не видел, я не могу. Когда изучите его по другим руководствам, я смогу отвечать на отдельные вопросы.
emelya8307, Dsion, а может так: завести квест, сделать в нём алиасы на всех таких персонажей и уже на них повесить скрипты? Т.е. не на самих персонажей, а на их алиасы? Тогда персонаж вроде как не затронут непосредственно, а скрипт на нём висит
RUSсиянин, возможны 2 варианта: 1.) Глюки мода. Тогда надо спрашивать об этом автора мода. Если это глюки мода, то они происходят в определённых местах и при определённых обстоятельствах. Это надо выяснить и сообщить автору мода, иначе он тоже ничего не сможет исправить. 2.) Глюки компьютера. Тогда, чтобы вам помогли, надо рассказать о конфигурации компьютера.
Изменение репутации для пользователя Myprism
MyprismOffline
Сообщение №1509
| Тема: Вопросы по скриптам Papyrus
написано: 17 апреля 2020, 02:48
| Отредактировано: Multigone - 21 апреля 2020, 18:55
To all В Скайриме есть возможность локализовать моды, вынося строковые переменные в стринговые файлы (по 3 на каждый мод и на каждый язык). Собственно говоря, так сам Скайрим и устроен. Моды с вынесенными стрингами легко локализовать. Достаточно перевести на любой язык только стринговые файлы, не трогая сам мод. Если положить в архив стринговые файлы для многих языков, то мод автоматически становится мультиязычным. А вопрос у меня в том, как выносить в стринговые файлы сообщения из скриптов, чтобы можно было локализовать их в общем процессе?
Dsion, нет, я о скриптах зарубежных мододелов. Они ведь не знают проблем с локализацией. Просто я сейчас копаюсь в моде на спутников Amazing Follower Tweaks. Довольно сложный мод. Он переведён на русский язык. Но переводчик жалуется на то, что некоторые вещи в скриптах не может перевести, так как они тогда теряют работоспособность. Всё, что находится в Message, прекрасно выносится в стринги и они прекрасно переводятся, это я уже проверил. Видимо там есть что-то что сделано иначе и что я пока ещё не откопал.
Multigone, Dsion, всё понял. Локализуемых строк в скрипте быть не должно. Английские - сколько угодно, но не выводить их пользователю. В общем то не гоже лазить по всем скриптам (в моём случае, их несколько десятков), чтобы искать, что там можно безопасно перевести. Я почему занялся этим модом. Я же раньше спрашивал, как сделать переодевание, когда персонаж залезает в воду. Вот ГГ я это сделал (заодно и переодевание дома и в городе), но правильно сделать это и для компаньонов. Но тогда надо модифицировать управление ими. Но если я что-то в этом направлении сделаю, то сразу же получу несовместимость как минимум с тремя популярными модами на компаньонов. Да и работа делать такое (хороший мод на управление компаньонами) с нуля - очень велика. Вот и выбрал я тот мод, автор которого не возражает против модификаций, а его продукт вызывает наименьшее количество нареканий у пользователей. Вот сюда всё и встраиваю. А чем больше разбираюсь, тем больше он мне нравится. Приятно смотреть на хорошо выполненную работу. Вот только первый раз такое вижу у него
Код
if (0 == MyInt)...
как думаете откуда ноги растут у такой манеры записи, когда константа стоит слева?
Multigone, буквально нашёл в коде мода, с которым сейчас разбираюсь вот такие штуки (именно то, о чём ты говорил):
Код
String n = ((self as ReferenceAlias) As TweakSettings).originalName if (n == "Erik") invCode=10 elseif (n == "Iona") invCode=1 elseif (n == "Calder") invCode=1 ..............................
И если переводчик пытался эти строки переводить, то, естественно, получал неработающий код. Иногда этот код поражает меня своим объёмом и аккуратностью, но иногда натыкаюсь вот на такую фигню...
Добавлено (26 Апреля 2020, 07:59) --------------------------------------------- Как скриптом изменить Outfit? Нет, не заменить у персонажа один Outfit на другой, а именно изменить имеющийся или создать новый. Outfit является расширением Form. Из описания следует, что это специальная разновидность FormList, которая принимает только объекты Armor. Есть команда getoutfit(), в SKSE есть команды: getnumparts() и GetNthPart(Int n), т.е. получить этот список легко, можно получить и его компоненты. Но как решить обратную задачу, т.е. закинуть туда свой объект? Приведение FormList, Form[], Armor[] к(as) Outfit не работает, сообщается о несовместимости типов.
Добавлено (26 Апреля 2020, 13:11) --------------------------------------------- Нет ли способа принудительно по ID (как по указателю в других языках) подсунуть туда данные, не объявляя типа в явном виде?
Dsion, вот в том то и дело, что мне хочется, чтобы отпущенный на волю персонаж оставался с новым оутфитом, который создал для него игрок.
Цитата Dsion
Разве что действительно создавать специальные аутфиты из LeveledItem. Там есть функции AddForm() и Revert().
А вот это мне нравится! Ведь тогда я могу менять не аутфит, а левельный список который в нём лежит! Только надо продумать, как это сделать не для всех персонажей, а только для тех, кого игрок захочет переодевать в первую очередь. Или сделать пару десятков таких аутфитов и выдавать их последним нанятым и освобождённым спутникам и когда запас подготовленных аутфитов закончится, освобождать их с конца. Надо думать. Multigone, похоже, надо просто заменять аутфит у отпущенного персонажа на тот, что содержит только один левельный список.
Dsion, Буду всё пробовать. Сейчас игра ставит стандартный аутфит при смене интеллектуального пакета. Но если в обработчик события смены пакета поставить добавление персонажу некоторой шмотки (лук спутника, например) и тут же отобрать её обратно, то на время действия пакета игра ставит персонажу наилучший комплект из имеющихся у персонажа шмоток, вместо стандартного аутфита. Это я уже проверил.
emelya8307, присоединяюсь к вопросу. Я попробовал сделать это позавчера и так же не получилось. Только у меня это не первоочередная задача, поэтому я отложил её. Что-то мы одно и то же пропускаем сделать.
Как определить, каких случаях передаются данные, а в каких указатель на них. Так у меня есть скрипт:
Код
FormList Property TweakInv3 Auto FormList Property TweakInv4 Auto
Function InventorySnapshot() ............................ TweakInv4 = TweakInv3 ........................... endFunction
В игре обнаруживается, что любые изменения в TweakInv3 приводят к таким же изменениям TweakInv4. Т.е. в данном случае передался указатель на формлист. Как копировать именно содержимое, а самое главное: как различать, когда копируются данные, а когда только указатель?
И у них есть преимущество: в них можно записывать одинаковые объекты, в то время, как в формлист только разные.
В скрипте, с которым я сейчас разбираюсь, объявлено довольно много переменных вот таким образом:
Код
Form Property lastLeftWeapon Auto Form property lastRightWeapon Auto int property lastLeftCharge Auto int property lastRightCharge Auto
Т.е. предусмотрено заполнение их как свойств извне. Но извне они никак не заполняются. Таким образом, автор скрипта использует их как обычные переменные скрипта. Одновременно, в скрипте нет других обычных переменных не объявленных свойствами. Правильно ли это? В чём сермяжная правда - объявлять все переменные свойствами, даже те, что в моде не заполняются?
Изменение репутации для пользователя Myprism
MyprismOffline
Сообщение №1519
| Тема: Вопросы по скриптам Papyrus
написано: 4 мая 2020, 10:13
| Отредактировано: Myprism - 4 мая 2020, 10:14
Multigone, т.е. единственное оправдание - возможность менять переменную из другого скрипта? Dsion, сейчас есть временный клон формы TempClone(), например:
Код
Actor npc0 = npc.TempClone() as Actor
вроде работает.
Добавлено (06 Мая 2020, 11:15) --------------------------------------------- Попал в очередную засаду. Вот фрагмент кода:
Весь код очень большой, поэтому я вычленил только значимый фрагмент. Дело в том, что если я размещаю в коде отладочное сообщение Debug.MessageBox( "Stop" ) вот в том месте, где оно стоит сейчас, то всё работает так, как мне нужно (это ещё не значит, что правильно ) Если это сообщение закоментарить, нужной мне работы не будет. Это же сообщение поставленное там, где оно сейчас закоментарено (ниже по коду), нужной мне работы не даёт (не действует). 1. Почему код с отладочным сообщением работает иначе, чем без него? Понятно, что это сообщение вызывает остановку (задержку) выполнения кода. Но когда я вместо него ставлю просто заведомо большую задержку (она сейчас закоментарена), то это не помогает. 2. Почему отладочное сообщение поставленное до строки Armor TItem = SleepOutfit.getNthPart( CN ) as Armor действует иначе, чем после неё. Переменная TItem только обозначена, заполнена, но больше нигде не используется (для поиска разгадки я всё остальное отрубил).
Dsion, да вроде в Скайриме всё с 0 начинается... Вот пример:
Код
Actor property Ralof Auto int NumPart
Function Outfit() NumPart = Ralof.GetActorBase().getoutfit().getnumparts() while NumPart Numpart -= 1 Form Clothing = Ralof.GetActorBase().GetOutfit().getNthPart(NumPart) If (Clothing.IsCuirass()) ;Checks for the Cuirass Keyword. Debug.Trace("Index " + NumPart + " is a Cuirass.") EndIf EndWhile EndFunction
Цикл выполняется пока NumPart на его входе больше 0. Т.е. от общего числа уменьшается до 1, которая тут же уменьшается до 0. Т.е. младшим членом является нулевой.
Мольфар, Либо дело в устройстве брони, либо вы поставили какой-то мод на управление напарниками, который не работает с этой бронёй. Да, а напарники то ванильные?
Vittru1986, вообще то имеет значение не название файла текстуры, а полный путь до неё. Если она лежит в новой папке, даже имея старое название, то она никогда не встанет на место старой. А что касается данной проблемы, то текстура может задаваться не только в меше. Кроме того, TextureSet может быть задан в редакторе независимо от того, что указано в меше. Таким образом разработчики получают цветовые разновидности одежды. Там используется один и тот же меш, но для него установлены разные текстуры через разные TextureSet. Кстати, если вы использовали ту же самую модель, что была и раньше и только хотите заменить текстуры, то это можно сделать как раз через TextureSet (вкладка Miscellaneous).
Vittru1986, для свечения используется отдельная модель. Там ещё стоят дополнительные блоки контроллера, так как это свечение обычно двигается. И всё это делается как раз в нифскопе. Зачем понадобилось менять текстуру свечения? Просто ретекстур я использовал довольно широко и доспехи со свечением тоже, но мне никогда не приходилось делать ретекстур свечения и поэтому я не знаю какие там могут быть подводные камни.
С использованием TextureSet есть одна засада. Он не работает в виде от первого лица для женских персонажей. Вот такой вот глюк Скайрима. И половая дискриминация - для мужиков работает, для женщин - нет. Обходится это так - вообще выкидываем вид от первого лица. Тогда для брони игра будет для первого лица рисовать основную модель, а там всё работает нормально. Но надо проверять, там есть ещё нюансы зависящие от использованных слотов брони.
Vittru1986, несколько лет назад я устанавливал музыку для интерьеров. Всё что помню, так там была регулировка громкости в окошке в Редакторе и я её там регулировал. Но, может быть, музыка ставится иначе. С другой озвучкой я дел не имел.
Vittru1986, вообще то скрипты лучше обсуждать в специальной теме скриптов. А по теме, посмотрите, например, ванильный скрипт ScriptName AnimalTrainerSystemScript как там объявляется свойство Gold
GlobalVariable Property AnimalGold Auto MiscObject Property Gold Auto Quest Property pDialogueFollower Auto
Function BuyAnimal(Actor AnimalTrainer)
Game.GetPlayer().RemoveItem(Gold, AnimalGold.value as int) AnimalTrainer.GetLinkedRef().SetActorOwner(Game.GetPlayer().GetActorBase()) ;AnimalTrainer.SetActorValue("Variable04", 1) (pDialogueFollower as DialogueFollowerScript).SetAnimal(AnimalTrainer.GetLinkedRef())
Vittru1986, редактор сам делает бэкапы они лежат в C:\Program Files (x86)\Steam\steamapps\common\Skyrim\Backup Надо взять там тот, что ещё грузится и сравнить с тем, что не грузится. Сравнивать лучше всего в TESVEdit. Вылеты редактора (и игры) чаще всего происходят из-за ошибки в модели. Обычно отсутствие какой-либо кости, к которой привязана броня или неправильная привязка.
Vittru1986, Раз при удалении мода глюки остаются, значит, он не до конца удаляется. Видно где-то остались ещё его следы, причём, как раз те, которые глючат. Я бы переименовал папку Data с удалённым модом, заново поставил бы Скайрим и сравнил содержимое папок.
Vittru1986, ни в коем случае не удалять! Надо скопировать или переименовать папку Data. Всё, что относится к моду, находится там. Затем поставить Скайрим по-новой и удалить из сохранённой папки Data всё, что есть в новой. Я такие вещи делаю прогой CloneSpy. После этого в сохранённой папке Data останется мод и то, что мешало ему работать. А вот это уже перебирать вручную. Задача - выделить только мод и убрать мусор.
Смущают меня задержки установленные в чужом коде. Прежде всего тем, что я не всегда могу понять назначения некоторых из них и поэтому не могу их разумно расставлять. Вот пример самого конца одной функции:
Дальше в функции ничего нет. Я бы ещё понял эту задержку, если бы её значение превышало 0.6 секунд задержки обновления, но зачем нужна задержка 0.15 секунд, если потом всё равно надо ждать 0.6?