глючныйглюк Опубликовано 21 ноября, 2024 Опубликовано 21 ноября, 2024 (изменено) 17.11.2024 17:45:16, Takirell сказал(-а): Приветствую. Простите, я немного не понял ситуации, для чего Вам это нужно. Можно глянуть на Ваш скрипт? Мне так будет проще сориентироваться. Приветствую и Вас. И заранее благодарю за любые советы. Код, по которому вопрос был в сообщении. Выложу и готовый скрипт, он закончен и работает, вдруг кто попользуется, не жалко. А зачем - тут все просто, я делал себе разнообразные крафтилки, идея этой взята из лежащего на сайте мода "концентратор". Скрипт должен превращать 2 слабых зелья или яда в средний, 2 средних в сильный, пробегаясь циклом по массиву. Было лень забивать около 200 предметов в массив вручную, думал что можно в редакторе сложить образцы в недоступный контейнер, забрать ссылки на содержимое оттуда 1 раз, очистить и отключить его. И еще была идея из моего предыдущего сообщения, править ссылку, редактируя ее как строку, там ид одинаковых зелий разной мощности одной буквой отличаются. scn qwe array_var array ref item string_var string begin onactivate let array := ar_Construct Array let array[0] := PotionBurdenW let item := array[0] print "1 "+$item ;слабый яд тяжелой ноши let string := $item Let string[12] := "" print "2 "+string ;слабый яд тяелой ноши(оно стерло букву в названии а я хотел PotionBurden) let item := #string print"3 "+ $item ; <no name> let array[1] := item print "4 "+ $array[1];<no name> end скрипт.txt Изменено 22 ноября, 2024 пользователем глючныйглюк
KiBes Опубликовано 25 ноября, 2024 Опубликовано 25 ноября, 2024 Всем привет! Импортировал файл в ниф, а в ниф скопе он не показан. Как тут быть?
Nu-Hatta Опубликовано 25 ноября, 2024 Опубликовано 25 ноября, 2024 Импортировал файл в ниф, а в ниф скопе он не показан. Как тут быть? Телепаты в отпуске... Как минимум, тебе нужно выложить сам ниф сюда, чтоб разбирающиеся могли посмотреть.
KiBes Опубликовано 25 ноября, 2024 Опубликовано 25 ноября, 2024 25.11.2024 08:26:16, Nu-Hatta сказал(-а): Телепаты в отпуске... Как минимум, тебе нужно выложить сам ниф сюда, чтоб разбирающиеся могли посмотреть. Сорян! Все забываю об этом :crazy: https://www.dropbox.com/scl/fi/5zge8rfgcaygit45gkuco/ABCD.nif?rlkey=ous93w78uy4b26vdb1sjqn8wv&st=sgfk72m3&dl=0
Nu-Hatta Опубликовано 26 ноября, 2024 Опубликовано 26 ноября, 2024 (изменено) Модель без проблем загружается в нифскоп. В твоей геометрии отсутствуют материал, текстуры и бинормали. Зато там есть отображение полигонов с двух сторон - в данном случае, это не нужно, от слова совсем. Коллизия представляет из себя детализированную копию самого объекта - так делать нельзя, нужно использовать упрощённую модель. И там, зачем-то выставлен параметр массы. В данном случае, вообще можно использовать коллизию типа ConvexVerticesShape (выпуклая форма), которую, кстати, можно сгенерить прямо в нифскопе. Изменено 26 ноября, 2024 пользователем Nu-Hatta
KiBes Опубликовано 26 ноября, 2024 Опубликовано 26 ноября, 2024 26.11.2024 07:09:24, Nu-Hatta сказал(-а): Модель без проблем загружается в нифскоп. В твоей геометрии отсутствуют материал, текстуры и бинормали. Зато там есть отображение полигонов с двух сторон - в данном случае, это не нужно, от слова совсем. Коллизия представляет из себя детализированную копию самого объекта - так делать нельзя, нужно использовать упрощённую модель. И там, зачем-то выставлен параметр массы. В данном случае, вообще можно использовать коллизию типа ConvexVerticesShape (выпуклая форма), которую, кстати, можно сгенерить прямо в нифскопе. Можешь подробнее рассказать про коллизию типа ConvexVerticesShape. Или мб видео\статья есть на эту тему И касательно проблемы значит я при создании модели в блендер просто не создал материал и текстуры?
Nu-Hatta Опубликовано 26 ноября, 2024 Опубликовано 26 ноября, 2024 (изменено) Можешь подробнее рассказать про коллизию типа ConvexVerticesShape Такой тип коллизии применяется, как правило, для мелких объектов, не требующих для себя сложной формы при обработке столкновений - миск итемсы, и прочее. Но и для средних и крупных объектов подойдёт, если у них простая по контуру форма, типа бочек, ящиков, некоторых статуй, и прочее. Она, как мешок окружает целиком весь объект по общему выпуклому контуру, и является самый экономичным и оптимизированным типом коллизии. В некоторых случаях, её проще сделать в нифскопе, чем запускать ради этого 3д редактор. Главное, чтобы модель состояла только из одного куска геометрии, потому что коллизия будет генерится на основе контура этого куска. В контекстном меню NiTriStrips или NiTriShape выбирается пункт Havok->Create Convex Shape и выбирается значение её "плотности" (то есть насколько она будет полигональная - на форму, практически не влияет). Чем большее число поставишь (максимум 5), тем менее полигональной она будет. Потом нужно ещё проверить параметры в bhkRigidBody, и выставить под свои нужды тип (статик или предмет с физикой, или ещё какой), массу (для статиков - обнулить), и системы взаимодействия (правильные параметры, можно посмотреть в других, уже готовых мешах нужного типа). Нифскоп последних версий не подходит для этого - по крайней мере для Обливиона, эта функция там сломана, и при её использовании меш будет запорот (не окончательно, но всё же). Лучше использовать более старую версию нифскопа, например 1.1.0-RC5. И касательно проблемы значит я при создании модели в блендер просто не создал материал и текстуры? Очевидно, да. Возможно, ещё какие-то параметры при экспорте, были неправильно выставлены. Изменено 26 ноября, 2024 пользователем Nu-Hatta
KiBes Опубликовано 27 ноября, 2024 Опубликовано 27 ноября, 2024 26.11.2024 21:21:47, Nu-Hatta сказал(-а):Такой тип коллизии применяется, как правило, для мелких объектов, не требующих для себя сложной формы при обработке столкновений - миск итемсы, и прочее. Но и для средних и крупных объектов подойдёт, если у них простая по контуру форма, типа бочек, ящиков, некоторых статуй, и прочее. Она, как мешок окружает целиком весь объект по общему выпуклому контуру, и является самый экономичным и оптимизированным типом коллизии. В некоторых случаях, её проще сделать в нифскопе, чем запускать ради этого 3д редактор. Главное, чтобы модель состояла только из одного куска геометрии, потому что коллизия будет генерится на основе контура этого куска. В контекстном меню NiTriStrips или NiTriShape выбирается пункт Havok->Create Convex Shape и выбирается значение её "плотности" (то есть насколько она будет полигональная - на форму, практически не влияет). Чем большее число поставишь (максимум 5), тем менее полигональной она будет. Потом нужно ещё проверить параметры в bhkRigidBody, и выставить под свои нужды тип (статик или предмет с физикой, или ещё какой), массу (для статиков - обнулить), и системы взаимодействия (правильные параметры, можно посмотреть в других, уже готовых мешах нужного типа). Нифскоп последних версий не подходит для этого - по крайней мере для Обливиона, эта функция там сломана, и при её использовании меш будет запорот (не окончательно, но всё же). Лучше использовать более старую версию нифскопа, например 1.1.0-RC5. Очевидно, да. Возможно, ещё какие-то параметры при экспорте, были неправильно выставлены. От души за подробный ответ)))
KiBes Опубликовано 2 декабря, 2024 Опубликовано 2 декабря, 2024 Ребят, кто в блендере создает модельки для облы? Можете подсказать как там коллизии строятся?
Albinio Опубликовано 6 декабря, 2024 Опубликовано 6 декабря, 2024 Здравствуйте, прошу прощение, я новичок в моделировании, хотел портировать при помощи 3д макса модель игрового персонажа в КС и он вылетает, возможно я просто глупенький и не совсем понял как именно идёт привязка текстур к модели что бы КС не вылетал, если вы работали с подобным, опишите пожалуйста либо подкиньте туториал работы с портированием, ибо я облазил весь Ютаб и к сожелению нашёл подобие туториала, но тот был увы на Gmax (Да, они чем то между собой схожи, но Gmax предназначен для более низкополигональных моделей) Я уже облазил весь нексус в поисках людей которые когда то портировали новые виды рас и увы, все они поголовно делали это до 2010 года примерно Но не смотря на это, я встал именно в моменте конвертации текстур в нужный формат (я точно знаю что игре нужно двое вид текстур, простых и нормалей, но я не знаю какого формата и главное чем это конвертить) Также у меня ещё есть просьба подсказать программы для работы с мимикой и создания привязки лица к эмоциям (вроде что то такое я видел кажется) Либо же просто ткните меня как котёнка в лоток и покажите мне нужные туториалы которые обьяснять мне правильность портирования. Буду очень признателен за отзывчивость. :read: P.s Если нужно, могу подкинуть саму модель и текстуры, возможно она сама может быть через чур тяжелой для игры и требуется полировка самой модели
ArtemSH Опубликовано 7 декабря, 2024 Опубликовано 7 декабря, 2024 06.12.2024 04:46:17, Albinio сказал(-а):я не знаю какого формата и главное чем это конвертить dds обе текстуры. делать это легче всего в GIMP, он бесплатный. Вот пример как работать с текстурами меша "дорожный знак" (из англосаксонского туториала "I Saw the Sign"). скорее всего с телами плюс минус то же самое. 0. Take either one of the 512×128 city sign textures from textures/clutter/signs/ and use the clone tool with a relatively small brush size (circle 5 or 7) to blot out the existing names, being careful to preserve the color of the wood if not the grain. Blotchiness isn’t critical, as most of it will be overwritten anyway. 0a. Or you can use your own base texture, which should be some multiple of 512×128. 0b. Whatever texture you use, make sure you load it WITHOUT mipmaps. 1. Using the text tool, change the options to Kingthings Petrock, size 50, color f7f3de or some shade of yellowish white. Type your text in and align it. You may wish to use an existing road sign texture as a guide. 1a. Repeat this on the other half of the sign, using the flip tool to flip it horizontally. 1b. In the layers thing on the side, use merge down to merge both text layers BUT NOT the main surface layer. 2. In the layers thing on the side, change the mode of the text layer to Difference. 3. In the layers thing on the side, right click, and create a new transparent layer between your new text layer and main surface. 4. On this new layer, using a circle 07 or 05 brush and the black color, carefully outline the text with a slight border, making sure to cover all the area under the text as well. You’ll see it change colors, so it’s obvious. 5. In the layers thing to the side, change the mode of your new layer to Overlay. 6. Right click in the layers thing, and choose Merge Visible Layers. 7. Save as DDS with DXT1 compression and generate mipmaps on. 8. Before closing the window, go to Filters/Maps/Normalmap, and create a normalmap. I used 4 samples and 2.0 scale, you might want something different. 9. Save as DDS, DXT5 compression, generate mipmaps. Putting it together in Nifskope is left as an exercise to the reader. Если не понимаете, переведите гуглом, он должен нормально перевести. Вам нужны точно те стадии, которые я выделил жирным. Это основа создания обычной текстуры и карты нормалей. С остальным не знаком, помочь не могу. Пοταπός ἐστιν οὗτος ὅτι καὶ οἱ ἄνεμοι καὶ ἡ θάλασσα αὐτῷ ὑπακούουσιν
Albinio Опубликовано 9 декабря, 2024 Опубликовано 9 декабря, 2024 07.12.2024 21:42:13, ArtemSH сказал(-а): dds обе текстуры. делать это легче всего в GIMP, он бесплатный. Вот пример как работать с текстурами меша "дорожный знак" (из англосаксонского туториала "I Saw the Sign"). скорее всего с телами плюс минус то же самое. 0. Take either one of the 512×128 city sign textures from textures/clutter/signs/ and use the clone tool with a relatively small brush size (circle 5 or 7) to blot out the existing names, being careful to preserve the color of the wood if not the grain. Blotchiness isn’t critical, as most of it will be overwritten anyway. 0a. Or you can use your own base texture, which should be some multiple of 512×128. 0b. Whatever texture you use, make sure you load it WITHOUT mipmaps. 1. Using the text tool, change the options to Kingthings Petrock, size 50, color f7f3de or some shade of yellowish white. Type your text in and align it. You may wish to use an existing road sign texture as a guide. 1a. Repeat this on the other half of the sign, using the flip tool to flip it horizontally. 1b. In the layers thing on the side, use merge down to merge both text layers BUT NOT the main surface layer. 2. In the layers thing on the side, change the mode of the text layer to Difference. 3. In the layers thing on the side, right click, and create a new transparent layer between your new text layer and main surface. 4. On this new layer, using a circle 07 or 05 brush and the black color, carefully outline the text with a slight border, making sure to cover all the area under the text as well. You’ll see it change colors, so it’s obvious. 5. In the layers thing to the side, change the mode of your new layer to Overlay. 6. Right click in the layers thing, and choose Merge Visible Layers. 7. Save as DDS with DXT1 compression and generate mipmaps on. 8. Before closing the window, go to Filters/Maps/Normalmap, and create a normalmap. I used 4 samples and 2.0 scale, you might want something different. 9. Save as DDS, DXT5 compression, generate mipmaps. Putting it together in Nifskope is left as an exercise to the reader. Если не понимаете, переведите гуглом, он должен нормально перевести. Вам нужны точно те стадии, которые я выделил жирным. Это основа создания обычной текстуры и карты нормалей. С остальным не знаком, помочь не могу. C базовой инструкцией конечно благодарю, а вот у меня теперь другая проблема появилась, когда я пытаюсь нажать на экспорт дается выбор для сжатия (ставлю условно DTX1) и mipmaps Но при всех этих настройках ловлю ошибку по типу Error opening C:\Users\Альбион\Downloads\Albinio (2).dds Я так понял, мне нужно иметь заглушку/бланк фаила с таким же расширением чтоб он мог сохранить под него?
Nu-Hatta Опубликовано 9 декабря, 2024 Опубликовано 9 декабря, 2024 Error opening C:\Users\Альбион\Downloads\Albinio (2).dds Может, на кириллицу в пути к файлу ругается?
Albinio Опубликовано 10 декабря, 2024 Опубликовано 10 декабря, 2024 09.12.2024 20:02:57, Nu-Hatta сказал(-а): Может, на кириллицу в пути к файлу ругается? Error opening F:\Albinio2.dds Как могли заметить, сменил путь, я открываю png и пытаюсь сохранить в dds, я знаю что я тупой, но обьясните тупому, что я собственно говоря делаю не так? Мне типо надо было скачать какую то прогу чтоб конвертнуть в DDS изначально png или tga и уже делать манипуляции над dds в GIMP'е ?
piramis Опубликовано 11 декабря, 2024 Опубликовано 11 декабря, 2024 (изменено) 10.12.2024 07:05:54, Albinio сказал(-а): Error opening F:\Albinio2.dds Как могли заметить, сменил путь, я открываю png и пытаюсь сохранить в dds, я знаю что я тупой, но обьясните тупому, что я собственно говоря делаю не так? Мне типо надо было скачать какую то прогу чтоб конвертнуть в DDS изначально png или tga и уже делать манипуляции над dds в GIMP'е ? Во первых можно предложить установить прогу WTV, это просмотрщик текстур в формате dds, чтобы упростить себе работу с ними, видеть, что именно используешь https://tesall.club/files/programmi-i-resursi/rabota-s-teksturami/2439-windows-texture-viewer-wtv-dds-file-viewer Далее по текстурам- их два вида, обычная и нормаль (с приставкой _n).Нормаль, такая фиолетовая, нужна для придания объема, нужна для многих предметов, и без нее игра обычно вылетает. Хотя некоторые объекты обходятся без нее.Изготавливаются нормали с помощью фотошопа и специального плагина к нему из обычных текстур, но мой опыт оказался неудачным, нормаль получилась плохая, поэтому я использую готовые. Тем более для расовой текстуры, видимо под HGEC, полно рас, можно взять любую подходящую нормаль, скажем для дефолтной расы. Специфические нормали для персонажей предназначены для особых случаев, чтобы делать людей/эльфов/дэмонов с масляным блеском кожи или скажем шерсть или чешуя зверорасам, а обычно достаточно дефолтных. Для обычной текстуры, то есть собственно картинки, используют разный софт, лично я использую графический редактор Paint Net, формат ддс является родным для него, без проблем открывает, сохраняет, ну и делает то, что нам нужно- изменить оттенок, наложить какие либо элементы, изменить размер. При сохранении нужно обратить внимание на мип-мапы. Они нужны для всех текстур игровых объектов, но их не должно быть в текстурах иконок. Однако ПайнтНет не умеет работать с нормалями, увы. Поэтому используем его для корректировки обычных текстур, а нормали берем уже готовые, обычно этого хватает. Изменено 11 декабря, 2024 пользователем piramis
piramis Опубликовано 11 декабря, 2024 Опубликовано 11 декабря, 2024 (изменено) Сразу приложу старый скрин, где именно указывать мип-мапы при сохранении текстуры В моделях обычно указывается только основная текстура, в формате для персонажей например : textures/characters/imperial/female/footfemale.dds Указывать нормаль там не нужно, она должна лежать в указанной папке и подтянется в игре. Изменено 11 декабря, 2024 пользователем piramis
Bianor Опубликовано 16 декабря, 2024 Опубликовано 16 декабря, 2024 (изменено) 09.12.2024 06:39:08, Albinio сказал(-а):C базовой инструкцией конечно благодарю, а вот у меня теперь другая проблема появилась, когда я пытаюсь нажать на экспорт дается выбор для сжатия (ставлю условно DTX1) и mipmaps По моим экспериментам, Обливион лучше всего пережёвывает DXT-3. Скайрим и больше - DXT-5. Пятёрку Обливион тоже берёт, но не везде и не всегда, например иконки глючат и не работает альфа-канал. Мипмапы нужны для статиков, они потом будут натягиваться на лоды. Для персонажа dds должен быть обязательно с альфа-каналом и без мипмапа. 06.12.2024 04:46:17, Albinio сказал(-а):Также у меня ещё есть просьба подсказать программы для работы с мимикой и создания привязки лица к эмоциям (вроде что то такое я видел кажется) Это делается непосредственно в конструкторе, в разделе диалогов. Когда создаётся реплика, к ней привязывается аудио-файл. Файл артикуляции при этом генерируется конструктором и сохраняется в папку автоматически вместе с аудио-файлом. После этого можно настроить эмоции всё в тех же диалогах. Эмоция устанавливается на каждую строку диалога. Изменено 16 декабря, 2024 пользователем Bianor
Albinio Опубликовано 16 декабря, 2024 Опубликовано 16 декабря, 2024 16.12.2024 04:56:16, Bianor сказал(-а): По моим экспериментам, Обливион лучше всего пережёвывает DXT-3. Скайрим и больше - DXT-5. Пятёрку Обливион тоже берёт, но не везде и не всегда, например иконки глючат и не работает альфа-канал. Мипмапы нужны для статиков, они потом будут натягиваться на лоды. Для персонажа dds должен быть обязательно с альфа-каналом и без мипмапа. Это делается непосредственно в конструкторе, в разделе диалогов. Когда создаётся реплика, к ней привязывается аудио-файл. Файл артикуляции при этом генерируется конструктором и сохраняется в папку автоматически вместе с аудио-файлом. После этого можно настроить эмоции всё в тех же диалогах. Эмоция устанавливается на каждую строку диалога. Извините, а могу ли я вам в ЛС обратится? Мне просто нужно экспертное мнение или хотя бы произвести демонстрацию экрана, чтобы я просто мог понять что от меня конкретно требуется для портирования в целом. Может быть там Дискорд или вк или ещё что нибудь?
Bianor Опубликовано 17 декабря, 2024 Опубликовано 17 декабря, 2024 (изменено) 16.12.2024 16:02:08, Albinio сказал(-а):Извините, а могу ли я вам в ЛС обратится? Я бы с радостью, но сам давно не делал диалоги, придётся самому заново учиться. Если коротко, то это раздел Character -> Quests Там делается квест, назначаются стадии - по этой части есть туториалы. Дальше раздел Topics, там создаются реплики в диалогах. Двойным щелчком по выделенной строке вызывается меню, где есть опция "Emotion type", там сожно выбрать злость, радость, грусть и так далее. Цифры означают силу эмоции, от едва заметной мимики, до лютых гримас. И там же есть кнопка "Generate Lip File" - она создаст файл с артикуляцией рядом с аудиофайлом. А вот как прицеплять аудиофайл - сам уже не помню ) Изменено 17 декабря, 2024 пользователем Bianor 1
ArtemSH Опубликовано 21 декабря, 2024 Опубликовано 21 декабря, 2024 о 17.12.2024 14:27:01, Bianor сказал(-а): Я бы с радостью, но сам давно не делал диалоги, придётся самому заново учиться. Если коротко, то это раздел Character -> Quests Там делается квест, назначаются стадии - по этой части есть туториалы. Дальше раздел Topics, там создаются реплики в диалогах. Desktop Screenshot 2024.12.17 - 23.19.31.15.png Двойным щелчком по выделенной строке вызывается меню, где есть опция "Emotion type", там сожно выбрать злость, радость, грусть и так далее. Цифры означают силу эмоции, от едва заметной мимики, до лютых гримас. И там же есть кнопка "Generate Lip File" - она создаст файл с артикуляцией рядом с аудиофайлом. А вот как прицеплять аудиофайл - сам уже не помню ) обалдеть, на каджита залип конкретно)) очень мощно! Пοταπός ἐστιν οὗτος ὅτι καὶ οἱ ἄνεμοι καὶ ἡ θάλασσα αὐτῷ ὑπακούουσιν
ArtemSH Опубликовано 23 декабря, 2024 Опубликовано 23 декабря, 2024 (изменено) Всем доброго дня! Тоже подкопились вопросы, причем самого разного толка. Где-то я чую, что мог бы решить, но всё никак не пойму, в чем соль. Как обычно, буду рад ответу на любой из вопросов, потому что они все разноплановые и разные по сложности. Собираю коллективное знание, так сказать, с миру по нитке. Вопрос 1. Правильно ли я понимаю, что хорошая практика иметь шаг в 5 пунктов между стадиями квеста, иначе движок может забаговать? Или это байка? А также какое количество стадий может быть максимальным? Не сами стадии, а их "номер" беспокоит. Например, стадия 455 будет работать? А стадия 1000? Вопрос 2. Как окрасить цветом текст, набранный в MessageBoxEX? Видел окрас в FormID Finder, хотел бы такой же в своем меню одном применить, но в коде Finder ногу сломишь. Интересует зеленый и красный цвета для текста (если быть совсем уж конкретным). Контекст: в менюшке для активатора "Бочонок с вином" игрок может отравить вино. Если бочонок не отравлен, текст будет зеленый; если отравлен - красный. Вопрос 3. Как отфильтровывать нужных неписей\предметы в массиве? Контекст: Мне нужно это для нескольких целей. Первая цель фильтрации: обьектный, привязанный к персонажу скрипт, который отфильтровывает его имущество в ячейке его проживания и меняет владение (ownership) на ничейное (через команду SetOwnership, естественно) чтобы сымитировать "сквоттинг" ячейки и имущества. Нет человека, значит и вещи уже ничейные, что логично. Суб-вопрос: такой скрипт должен привязываться к spell-target в нужной ячейке или можно его привязать к самому персонажу? Суб-суб-вопрос (да): Я привязал к персонажу следующий простейший скрипт, и после этого при убийстве персонажа открытие его инвентаря моментально приводит к вылету, хотя скрипт при этом рабочий, владение предметов действительно меняется. Есть идеи, что здесь не так? Или не тут лежит причина? Скрипт Владения на Неписе scn BrimBoNPCLienlornScript begin ondeath setcellownership BrimBoSmith end Вторая цель фильтрации: Я создал пользовательские функции, которые вызываются на определенных стадиях квеста. Они должны отфильтровать нужных неписей и приписать им либо пакеты поведения, либо напрямую приказать сделать то-то и то-то. Но все варианты, которые я использовал, не работают. Либо игра перегружается, и её никак не выключить, либо игра вылетает, либо просто ничего не происходит, хотя скрипт вроде что-то делает. Так что мне нужна экспертиза по тому, где я, собственно, ошибся в структуре или вызванных функциях кода. Вот следующий (нерабочий, игра вылетает) скрипт, который при стадии квеста заставляет пиратов "бежать в страхе" из той ячейки, где они находятся, в любую другую. Скрипт Массива НПС scn BrimBoUDFArrayNautaPiratesFleeScript ref PiratesNpc ref CurrentCell ; array_var PiratesArray ; int arraysize int iPirates int iLimit begin function {} ; if BrimBoNautaBooks.NautaOutcomes == 6 && getstage BrimBoNautaBooks == 70 ; let iLimit := 5 ; let CurrentCell := BrimBoShipPirateLevel1 || BrimBoShipPirateLevel2 || BrimBoShipPirateLevel3 ; ; ; let PiratesArray := GetRefsInCell CurrentCell, 35 ; ; ; ; let PiratesNpc := PiratesArray[i] ;if PiratesNpc.GetIsCreature == 0 && PiratesNpc.GetObjectType == 35 ; ; Назначаем пакет Flee ; PiratesNpc.Evp ; ; npc.StartConversation npc ; PiratesNpc.flee ; endif ; ; loop ; endif ; ; ; ; ; PrintToConsole "started array, %n", Piratesarray ; ;let PiratesArray := ar_Construct array ; ; let PiratesNpc := GetFirstRef 35 ; ; ; ; while PiratesNpc ; ; if PiratesNpc.GetInCell CurrentCell ; ; if PiratesNpc.GetInFaction BrimBoSpecPirateFac ; ; ; let PiratesArray[arraysize] := PiratesNpc ; let arraysize += 1 ; ; Назначаем пакет Flee ; ; PiratesNpc.Evp ; ; npc.StartConversation npc ; ; PiratesNpc.flee ; PrintToConsole "they should not flee" ; ; endif ; endif ; ; if arraysize >= iLimit ; break ; endif ; ; Переходим к следующему NPC ; set PiratesNpc to GetNextRef ; ; PrintToConsole "Array is here" ; loop ; call ar_erase PiratesArray ; ; ;endif ; ; ; end Второй похожий (но нерабочий, ничего не происходит) заставляет стражников выхватить мечи и в алертном состоянии бродить по поселению: Скрипт Массива НПС Второй scn BrimBoUDFArrayNautaRangersAlertScript float fQuestDelayTime Array_var RangersArrayVar ; Массив для НПС ref actor ; Переменная для хранения ссылки на текущего НПС int arraySize int iLimit ; Максимальное количество НПС в массиве ; begin function {} let fQuestDelayTime := 60 let iLimit := 5 if getstage BrimBoNautaBooks == 40 if player.IsInInterior == 0 let RangersArrayVar := ar_Construct Array let actor := getfirstref, 35 while (actor) if (actor.GetInFaction BrimboroughRangersFaction == 1) ; Добавляем НПС в массив let RangersArrayVar[arraySize] := actor set arraySize to arraySize + 1 actor.setalert 1 actor.AddScriptPackage BrimBoWanderAlert actor.evp endif ; Проверяем лимит массива if (arraySize >= iLimit) break endif ; Переходим к следующему НПС set actor to GetNextRef loop ; ForEach actor <- RangersArrayVar ; while (RangersArrayVar) ; ; loop endif endif Третья цель фильтрации: похожа на первую. Основной вопрос: как внести в фильтрацию массива условие в виде определенного радиуса от spelltarget'a? Контекст: У меня есть большая ячейка, где существует несколько разных неписей, и если игрок убьет одну группировку, то именно её вещи (и книги, и одежда, и мебель, и контейнеры, и оружие, и тд) становятся ничейными, но только в определенном радиусе. Для этого я набросал следующий скрипт: Скрипт Массива Предметов scn BrimBoCTRLOwnershipTGScript ref rMeref rItem; it definitely won't work... begin gamemode let rMe := getself if GetDeadCount BrimBoTGComes > 0 if GetDeadCount BrimBoTGHead > 0 if GetDeadCount BrimBoTGGuardian > 0 let rItem := (GetFirstRef 20) && (GetFirstRef 21) && ( GetFirstRef 22) && (GetFirstRef 23) && ( GetFirstRef 25) && ( GetFirstRef 32) && ( GetFirstRef 33) && ( GetFirstRef 34) while (rItem) if rME.GetDistance ritem < 100 ritem.SetOwnership let rItem := getnextref if ritem.getowner player break endif endif loop endif endif endif end Вопрос 4. Я писал по поводу скрипта для появляющихся и исчезающих кораблей. Я несколько раз переписал скрипт. Остановился на том, чтобы скрипт действовал в том случае, если 1) игрок неподалеку от поселения (это обьектный скрипт); 2) игрок находится в окне загрузки. Но это привело к другой проблеме: что если загрузка не попадает в нужный временной диапазон? Как прописать активацию\деактивацию моделей кораблей постфактум? Вроде ответ на поверхности, но я действительно не догоняю. Скрипт Прибытия\Отплытия begin MenuMode 1007 Set fQuestDelayTime to 7; let sHour := rand 1 23 if GetDayOfWeek == 1 if gamehour >= 10 if BBShipCom1REF.GetDisabled == 0 BBShipCom1REF.Disable endif if BBShipCom2REF.GetDisabled BBShipCom2REF.Enable endif endif elseif GetDayOfWeek == 4 if gamehour >=10 if BBShipCom1REF.GetDisabled BBShipCom1REF.Enable endif if BBShipCom2REF.GetDisabled == 0 BBShipCom2REF.Disable endif endif endif Вопрос 5. Схож с третьим. Как активировать сбор массива по временным промежуткам? Контекст: Массив отбирает случайно двух-трех НПС раз в игровой час и кидает им "приказ" активировать активатор (бочку с пивом). Скрипт прикреплен к spelltarget. Но при входе в локацию расположения spelltarget'a сол скриптом у меня вылетает игра (опять ошибка в работе массива). Лечится только полным удалением spelltargeta из локации. Скрипт Отбора Через Время scn BrimBoCTRLWineScript short sOnce ref me ref Drunky begin gamemode let me := getself if player.GetInSameCell me let drunky := GetFirstRef 35 while (drunky) if drunky.GetFactionRank BrimBoDeathClawFaction if drunky != BBArenisREF drunky.activate BBBeerActivator set drunky to GetNextRef let sOnce += 1 if sOnce >= 4 break endif endif endif loop endif Вопрос 6. Вопрос скорее про алгоритмы. Заставить неписей случайно выбирать в какой из 4 домов (interior cells) войти и после вернуться к точке в доках может быть решен несколькими путями. Вопрос в том, какими? Я набросал следующий алгоритм. Тут нужна экспертиза тех, кто работал с пакетами ИИ и может сказать, рабочий ли такой алгоритм или нет. Алгоритм следующий: На каждый маркер (по маркеру на каждую из четырех interior cells) делаем пакет ИИ. В нем условия: 25% GetRandomCount; > 10 от маркера в ячейке; время работы с 9 до 18. Таким образом, каждый пакет получает шанс в 25% быть выбранным, затем сбрасывается, когда персонаж достигает маркера, находясь меньше чем в 10 метрах от него, и пакет ВСЕГДА будет выбираться в промежуток между 9 и 18 часами дня (смотрите зачем нужно дальше). Ну и то, что это будни и так понятно! Когда пакет сбрасывается (персонаж дошел до маркера), он тут же получает классический пакет возвращения к точке А, то есть к маркеру в доках. У этого пакета так же висят условия: > 10 от маркера А; время работы с 9 до 18. То есть, после сброса одного из 4 пакетов персонаж всегда получает этот пакет, возвращается в доки, и там опять выбирает один из 4 пакетов и снова идет к маркеру во внутренней ячейке пока время не достигнет 18 часов. Верно ли я понимаю логику работы движка игры? Я часто наблюдал при тестировании, что указания на метраж от маркера может привести к вылету, если маркер находится в другой ячейке, особенно во внутренней (interior) ячейке. Вылет происходит если персонажа подвергнуть функции evp, когда он находится не во внутренней ячейке, а в пакете при этом указано, что он должен быть не менее чем N метров от предмета во внутренней ячейке. Поэтому мой вопрос про алгоритм\архитектуру действия пакетов совсем не праздный. Вопрос 7. Как работает функция обнуляющая набранный урон от падения? Точнее: она должна быть привязана к обьекту или к квесту? Если к обьекту, то этот обьеке ( triggerbox) может находиться в воздухе? Или тогда обнуления не произойдет? Контекст: Я прикрепил скрипт с этой фукнцией на triggerbox, который находится в воздухе. Хотел создать эмуляцию "прыжка веры", если игрок в прыжке проходит через триггербокс, висящий в воздухе, то игроку сбрасывают весь набранный урон от падения, и он не получит урона, когда коснется земли. Таким образом, вопрос в том, ошибка допущена в скрипте или в том, что triggerbox в таких случаях должен находиться на земле? Скрипт Прыжка Веры scn BrimBoZoneMainLeapFaithScript short sFlag short sAchievement begin ontrigger Player let sFlag := 0 if sflag == 0 if playerref.IsInAir if playerref.GetFallTimer > 1.5 ResetFallDamageTimer let sFlag := 1 endif endif endif end begin gamemodeif sflag == 1 if playerref.IsOnGround || player.IsInAir == 0 message "You've done Leap of Faith. So Gods bless you!" cast AltarNine player if sAchievement == 0 ; ; here should be an achievement let sAchievement := 1 endif if (cast AltarNine player) let sFlag := 0 return endif endif endif end Вопрос 8. Особенности включения кастомного xml-bar. После стадии квеста должна вызываться XML с дефолтным баром (полоской), уменьшающейся со временем. С тем, как это будет работать, я разберусь по идее, но вот почему она вообще не появляется, это для меня вопрос открытый. Код я пока закомментировал. Квестовый Скрипт вызывающий UDF ...здесь много кода; квестовый скрипт ; if player.IsInInterior == 1 ; if NTimerOnce == 0 ; set NautaTimer to 90 ; let NTimerOnce := 1 ; endif ;set NautaTimer to Nautatimer - GetSecondsPassed ; InsertXML "prefab\ASH\BrimBo\BrimBoSaltpeterBar.xml" 1004 ; call BrimBoSaltpeterUDF ; call BrimBoNautaPiratesFleeScript ; message "Seconds last: %g" NautaTimer ; endif Скрипт элемента HUD scn BrimBoUDFSaltpeterHUD InsertXML "prefab\ASH\BrimBo\BrimBoSaltpeterBar.xml" 1004 SetMenuFloatValue "prefabs\ASH\BrimBo\_BBSaltValue" fSec End Вопрос 9. Как соединить кастомный код с кодом оригинальной канализационной двери с анимацией открытия? Такирелль сильно помог с созданием меню (спасибо еще раз!), но почему-то дверь не воспроизводит анимацию открытия. В остальном код совершенно рабочий, я попытался добавить оригинальные условия скрипта с анимацией открытия канализационной двери, но где-то всё же ошибся. Скрипт КД scn BrimBoSewerGateScript Short sButton Short sChoice Short sOpen Short sSub Short sSys ; vanilla variables for vanilla sewer doors short next short busy float timer ref mySelf ref myParentbegin onLoad; set up ref vars set mySelf to getSelf set myParent to getParentRef ; prepare linked pathsgrid points disableLinkedPathPoints endBegin OnActivate ;Check User if (GetActionRef == PlayerRef) if (sChoice == 0) MessageBox "You hear the voice: What do you want and who you are?", "Nobody", "Who's asking?", "I've heard there is a place for a gentleman to relax" Let sSys := 1 Return Elseif (sChoice == 2) MessageBox "You hear the voice: You again! What will be at this time?", "...", "Who's speaking with me?", "I've heard there is a place for a gentleman to relax" Let sSys := 1 Return Elseif (sChoice == 3) MessageBox "You hear the voice: Welcome! Come in?", "Yes", "No" Let sSys := 1 Return Endif Else Activate Return Endifif isActionRef mySelf == 0 && busy == 0 if sOpen == 0 playgroup forward 0 set sOpen to 1 enableLinkedPathPoints else playgroup backward 0 set sOpen to 0 disableLinkedPathPoints endif set next to 1 set timer to 1 set busy to 1 endif EndBegin GameMode ;Button Control if (sSys > 0) Let sButton := GetButtonPressed ;1ST BUTTON if (sButton == 0) if (sSub == 1) ;"Imperial Legion! Open! [SPEECH 65]" if (PlayerRef.GetActorValue speechcraft >= 65) MessageBox "You hear the voice: Blessings upon Empire and all their serves! We are humble dwellers of these sewers. Please, share this gift of sea with us and be quiet about this place!" PlayerRef.AddItem Gold001 450 Let sChoice := 3 playgroup forward 0 Let sOpen := 1 Let sSub := 0 Let sSys := 0 Return Else MessageBox "And I am a new emperor! Come back when you sober up, lad!" Let sChoice := 2 Let sSub := 0 Let sSys := 0 Return Endif Elseif (sSub == 2) ;PAY if (PlayerRef.GetItemCount Gold001 >= 100) MessageBox "Right. Come in then, weirdo" ;BBCheasel.additem gold001 100 Player.RemoveItem Gold001 100 Let sChoice := 3 playgroup forward 0 Let sOpen := 1 Let sSub := 0 Let sSys := 0 Return Else MessageBox "Good! One idiot less" Let sSub := 0 Let sSys := 0 Return Endif Endif if (sChoice == 0) ;Nobody MessageBox "Than get lost! Tell yourself your stupid charades!" Let sChoice := 2 Let sSub := 0 Let sSys := 0 Return Elseif (sChoice == 2) ;... MessageBox "i assume it was wind who acts like a stupid child!" Let sSys := 0 Return Elseif (sChoice == 3) ;Yes ;Здесь должно что-то происходить, да. Let sSys := 0 Return Endif ;2ST BUTTON Elseif (sButton == 1) if (sSub == 1) ;I've heard... MessageBox "Then you find a right place to come! Welcome, weirdo!" Let sChoice := 3 playgroup forward 0 Let sOpen := 1 Let sSub := 0 Let sSys := 0 Return Elseif (sSub == 2) ;Speech if (PlayerRef.GetActorValue speechcraft >= 65) MessageBox "Mmm. Nonsense. But it sounds...solid. You're weird, but not stupid. Come in." Let sChoice := 3 playgroup forward 0 Let sOpen := 1 Let sSub := 0 Let sSys := 0 Return Else MessageBox "Oh well. Pathos only increases cringe" Let sSub := 0 Let sSys := 0 Return Endif Endif if (sChoice == 0) ;"who's asking?" MessageBox "You sound like a lizard or something! Who're you?", "Imperial Legion! Open! [SPEECH 65]", "I've heard there is a place for a gentleman to relax" Let sSub := 1 Return Elseif (sChoice == 2) ;whos speaking with me MessageBox "Empire's Queen! Pay one hundreed gold or leave. A fine for dullness", "[Pay 100 gold]", "I assume sometimes there is no need in words [SPEECH 65]", "[Leave]" Let sSub := 2 Return Elseif (sChoice == 3) ;No Let sSys := 0 Return Endif ;3ST BUTTON Elseif (sButton == 2) if (sSub == 2) ;Leave Let sSub := 0 Let sSys := 0 Return Endif if (sChoice == 0) ;I've heard... MessageBox "Then you find a right place to come! Welcome, friend!" Let sChoice := 3 playgroup forward 0 Let sOpen := 1 Let sSys := 0 Return Elseif (sChoice == 2) ;I've heard... MessageBox "Then you find a right place to come! Welcome, weirdo!" Let sChoice := 3 playgroup forward 0 Let sOpen := 1 Let sSys := 0 Return Endif Endif Endif ; daisy-chain activation if next == 1 && timer <=0 set next to 0 myParent.activate mySelf 1 endifif timer > 0 set timer to timer - getSecondsPassed endifif isAnimPlaying == 0 && busy == 1 set busy to 0 endif End Вопрос 10. Кто нибудь знает функцию или способ как вычленить FormID\EditorID топика диалога, а также условия (conditions) топика? Есть ли функция get чтобы сохранить эти данные в код? По идее мы же как-то можем обратиться к функциям, являющимися условиями диалогов, зная сам топик? Или как это должно работать? По этой теме вообще ничего не нахожу. Вопрос 11. Вопрос по активации\деактивации точек спавна. Делаю это через объектный скрипт, который крепится к самим точкам спавна. Правильно ли это? Или лучше создать отдельный скрипт, повесить его на spelltraget, который и будет контролировать включение\отключение точек? Контекст: по вечерам в поселении в некоторых местах могут заспавниться грабители, но активная точка спавна должна быть только одна из трех. Три референса спавн-точки стоят близко друг ко другу во внешних ячейках. Скрипт вроде рабочий, но есть сомнения в "правильности" самого кода. Скрипт Спавн-Точек scn BrimBoCTRLBanditMarkerSCRIPT short sOne float fTimer begin menumode 1007 if gamehour >= 18 && gamehour <= 4 if sOne == 0GetRandomPercent if GetRandomPercent <= 20 if (BrimBoEastBanditREF.GetDisabled) BrimBoEastBanditREF.enable if (BrimBoBanditDocksMarkerREF.GetDisabled == 0) BrimBoBanditDocksMarkerREF.Disable endif if (BrimBoBanditMarker2REF.GetDisabled == 0) BrimBoBanditMarker2REF.Disable endif endif elseif GetRandomPercent <= 40 if (BrimBoBanditMarker2REF.GetDisabled) BrimBoBanditMarker2REF.enable if (BrimBoEastBanditREF.GetDisabled == 0) BrimBoEastBanditREF.disable endif if (BrimBoBanditDocksMarkerREF.GetDisabled == 0) BrimBoBanditDocksMarkerREF.disable endif endif elseif GetRandomPercent <= 75 if (BrimBoBanditDocksMarkerREF.GetDisabled) BrimBoBanditDocksMarkerREF.enable if (BrimBoEastBanditREF.GetDisabled == 0) BrimBoEastBanditREF.disable endif if (BrimBoBanditMarker2REF.GetDisabled == 0) BrimBoBanditMarker2REF.disable endif endif elseif GetRandomPercent > 75if (BrimBoEastBanditREF.GetDisabled == 0) BrimBoEastBanditREF.disable endif if (BrimBoBanditMarker2REF.GetDisabled == 0) BrimBoBanditMarker2REF.disable endif if (BrimBoBanditDocksMarkerREF.GetDisabled == 0) BrimBoBanditDocksMarkerREF.disable endif let sOne := 1 return endifelse let fTimer := 86000 let fTimer -= GetSecondsPassed if fTimer <= 0 let sOne := 0 endifendif endif end Вопрос 12. Самый легкий, но важный. Напишите пожалуйста, как в Золотом Издании переведены следующие предметы (LowerCupTan02, MiddleMetalGoblet, LowerMugTan01, MiddleMetalTankard005)? Контекст: Я создал строковый массив, который проходится по инвентарю игрока, и если в нем есть предметы с соответствующими названиями, то он может налить себе в "кружку" (Goblet, Tankard, Cup or Mug) вина из бочонка. Поэтому для перевода нужна информация как эти же названия даны в русском официальном переводе. Вопрос 13. Так сказать, на будущее. Если мод обновляется до новой версии, как вносят изменения с новой версии в перевод предыдущей? не переводить же один и тот же плагин заново?! Наверное должна существовать инфраструктура комфортного обновления существующего перевода? Спасибо всем за помощь в предыдущих вопросах, поддержка форумчан это действительно чудо! Особенно когда сам не знаешь совершенно как решить поставленную задачу. И это очень вдохновляет работать дальше. Всех с наступающим Новым Годом! Изменено 23 декабря, 2024 пользователем ArtemSH 1 Пοταπός ἐστιν οὗτος ὅτι καὶ οἱ ἄνεμοι καὶ ἡ θάλασσα αὐτῷ ὑπακούουσιν
Kub Опубликовано 23 декабря, 2024 Опубликовано 23 декабря, 2024 23.12.2024 15:31:38, ArtemSH сказал(-а): Вопрос 12. Самый легкий, но важный. LowerCupTan02 - Коричневая чашка MiddleMetalGoblet - Металлический кубок LowerMugTan01 - Коричневая кружка MiddleMetalTankard005 - Металлическая пивная кружка 1
ArtemSH Опубликовано 23 декабря, 2024 Опубликовано 23 декабря, 2024 23.12.2024 16:52:05, Kub сказал(-а): LowerCupTan02 - Коричневая чашка MiddleMetalGoblet - Металлический кубок LowerMugTan01 - Коричневая кружка MiddleMetalTankard005 - Металлическая пивная кружка Отлично! Спасибо Пοταπός ἐστιν οὗτος ὅτι καὶ οἱ ἄνεμοι καὶ ἡ θάλασσα αὐτῷ ὑπακούουσιν
IgorLutiy Опубликовано 25 декабря, 2024 Опубликовано 25 декабря, 2024 23.12.2024 15:31:38, ArtemSH сказал(-а):Вопрос 1. Правильно ли я понимаю, что хорошая практика иметь шаг в 5 пунктов между стадиями квеста, иначе движок может забаговать? Или это байка? А также какое количество стадий может быть максимальным? Не сами стадии, а их "номер" беспокоит. Например, стадия 455 будет работать? А стадия 1000? Скорее всего байка. Разрывы в нумерации стадии квестов делались для того, чтобы в случае необходимости между ними можно было вставить еще стадии. Вряд ли эта нумерация еще на что-то влияет. По крайней мере я ничего такого никогда не слышал. По поводу максимальной - 255 точно должно быть) А вообще - стоит посмотреть, какие есть максимальные в существующих квестах и ориентироваться на это число. 2 Мир друзьям - смерть врагам! Мой новый сайт-блог: https://igorlutiy.pp.ua - как некое подведение итогов моей жизни в интернете Мой профиль на Самиздате: http://samlib.ru/l/ljutyj_i/
piramis Опубликовано 3 января, 2025 Опубликовано 3 января, 2025 (изменено) Добрый вечер, вопрос вот такой, даже не пойму, по пакетам или скриптам. Нужно было что-то для злодейских персонажей, чтобы именно было содержание злодейского поведения. Очевидный вариант- данж, принадлежащий империуму и населенный противниками, входящими в фракции властей империи. Проводя отыгрыш за фракцию, враждебную империуму Тамриеля, или смертным в целом (дейдра, шестой дом, Талмор) мы можем штурмовать такой данж, нанося урон силам империи. Сделано. Создан форт, принадлежащий фракции имперского легиона. Врагами в данже стали обычные имперцы, оснащенные экипировкой легиона, и состоящие в фракции имперского легиона, хотя пакеты у них были оставлены от бандитов, а агрессия уменьшена до 5. Результаты же разочаровали. Дверь в форт помечена красным цветом, как запрещенное ко входу место, но никаких последствий за вторжение не происходит. Нападения на врагов также не влекут за собой начисления штрафов или дурной славы, даже при нападении на одного из "легионеров" в присутствии другого. При повышении же личной ответственности они всего лишь ходят за нами и требуют уйти, а в случае нападения сбегаются из соседних помещений почти все, кто размещен в данже. Возникло предположение, что для начисления штрафов и повышения дурной славы используются скрипты, в которые новосозданные объекты и персонажи не могут, естественно, входить. Также пакеты от бандитов явно не подходят, но у самих стражников, что легиона, что городской и дворцовой стражи и нету на самом деле какого-то единого пакета "правоохранителя", у всех специфические для каждого конкретного места. Варианты решения представляются такими. Первое- оставить все как есть, данж с врагами бандитами в доспехах легиона, дворцовой стражи или клинков оставить как обычный данж, но более подходящий для посещения злодейскими протагонистами. А дурную славу для себя нарабатывать на дорогах, вырезая "настоящих" стражников легиона. Второй вариант- сделать своеобразный костыль. Помещения форта и его население отнести к фракции какого-либо замка. В этом случае нипам можно будет выдать пакет замковой стражи, где есть необходимые фразы и действия в виде попыток ареста, и они будут вести себя адекватнее. Но остаются опасения, что в этом случае опять они будут прибегать всей толпой, и вместо последовательного прохождения будет одна большая баталия. ================== В итоге разных тестов все равно вывод один- за вторжение в локации в своих модах или нападения на новосозданных в модах персонажей дурная слава и штрафы не начисляются, причину так и не удалось понять Изменено 11 января, 2025 пользователем piramis
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти