Перейти к содержанию

Рекомендуемые сообщения

Опубликовано (изменено)
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

Изменено пользователем глючныйглюк
Опубликовано
Импортировал файл в ниф, а в ниф скопе он не показан. Как тут быть?

 

Телепаты в отпуске... Как минимум, тебе нужно выложить сам ниф сюда, чтоб разбирающиеся могли посмотреть.

Опубликовано
25.11.2024 08:26:16, Nu-Hatta сказал(-а):

Телепаты в отпуске... Как минимум, тебе нужно выложить сам ниф сюда, чтоб разбирающиеся могли посмотреть.

Сорян! Все забываю об этом :crazy:

 

 

https://www.dropbox.com/scl/fi/5zge8rfgcaygit45gkuco/ABCD.nif?rlkey=ous93w78uy4b26vdb1sjqn8wv&st=sgfk72m3&dl=0

Опубликовано (изменено)

Модель без проблем загружается в нифскоп. В твоей геометрии отсутствуют материал, текстуры и бинормали. Зато там есть отображение полигонов с двух сторон - в данном случае, это не нужно, от слова совсем. Коллизия  представляет из себя детализированную копию самого объекта - так делать нельзя, нужно использовать упрощённую модель. И там, зачем-то выставлен параметр массы. В данном случае, вообще можно использовать коллизию типа ConvexVerticesShape (выпуклая форма), которую, кстати, можно сгенерить прямо в нифскопе.

Изменено пользователем Nu-Hatta
Опубликовано
26.11.2024 07:09:24, Nu-Hatta сказал(-а):

Модель без проблем загружается в нифскоп. В твоей геометрии отсутствуют материал, текстуры и бинормали. Зато там есть отображение полигонов с двух сторон - в данном случае, это не нужно, от слова совсем. Коллизия  представляет из себя детализированную копию самого объекта - так делать нельзя, нужно использовать упрощённую модель. И там, зачем-то выставлен параметр массы. В данном случае, вообще можно использовать коллизию типа ConvexVerticesShape (выпуклая форма), которую, кстати, можно сгенерить прямо в нифскопе.

Можешь подробнее рассказать про коллизию типа ConvexVerticesShape. Или мб видео\статья есть на эту тему

И касательно проблемы значит я при создании модели в блендер просто не создал материал и текстуры?

Опубликовано (изменено)
Можешь подробнее рассказать про коллизию типа ConvexVerticesShape

 

Такой тип коллизии применяется, как правило, для мелких объектов, не требующих для себя сложной формы при обработке столкновений - миск итемсы, и прочее. Но и для средних и крупных объектов подойдёт, если у них простая по контуру форма, типа бочек, ящиков, некоторых статуй, и прочее. Она, как мешок окружает целиком весь объект по общему выпуклому контуру, и является самый экономичным и оптимизированным типом коллизии. В некоторых случаях, её проще сделать в нифскопе, чем запускать ради этого 3д редактор. Главное, чтобы модель состояла только из одного куска геометрии, потому что коллизия будет генерится на основе контура этого куска. В контекстном меню NiTriStrips или NiTriShape выбирается пункт Havok->Create Convex Shape и выбирается значение её "плотности" (то есть насколько она будет полигональная - на форму, практически не влияет). Чем большее число поставишь (максимум 5), тем менее полигональной она будет. Потом нужно ещё проверить параметры в bhkRigidBody, и выставить под свои нужды тип (статик или предмет с физикой, или ещё какой), массу (для статиков - обнулить), и системы взаимодействия (правильные параметры, можно посмотреть в других, уже готовых мешах нужного типа). Нифскоп последних версий не подходит для этого - по крайней мере для Обливиона, эта функция там сломана, и при её использовании меш будет запорот (не окончательно, но всё же). Лучше использовать более старую версию нифскопа, например 1.1.0-RC5.

 

 

И касательно проблемы значит я при создании модели в блендер просто не создал материал и текстуры?

 

Очевидно, да. Возможно, ещё какие-то параметры при экспорте, были неправильно выставлены.

Изменено пользователем Nu-Hatta
Опубликовано
26.11.2024 21:21:47, Nu-Hatta сказал(-а):

Такой тип коллизии применяется, как правило, для мелких объектов, не требующих для себя сложной формы при обработке столкновений - миск итемсы, и прочее. Но и для средних и крупных объектов подойдёт, если у них простая по контуру форма, типа бочек, ящиков, некоторых статуй, и прочее. Она, как мешок окружает целиком весь объект по общему выпуклому контуру, и является самый экономичным и оптимизированным типом коллизии. В некоторых случаях, её проще сделать в нифскопе, чем запускать ради этого 3д редактор. Главное, чтобы модель состояла только из одного куска геометрии, потому что коллизия будет генерится на основе контура этого куска. В контекстном меню NiTriStrips или NiTriShape выбирается пункт Havok->Create Convex Shape и выбирается значение её "плотности" (то есть насколько она будет полигональная - на форму, практически не влияет). Чем большее число поставишь (максимум 5), тем менее полигональной она будет. Потом нужно ещё проверить параметры в bhkRigidBody, и выставить под свои нужды тип (статик или предмет с физикой, или ещё какой), массу (для статиков - обнулить), и системы взаимодействия (правильные параметры, можно посмотреть в других, уже готовых мешах нужного типа). Нифскоп последних версий не подходит для этого - по крайней мере для Обливиона, эта функция там сломана, и при её использовании меш будет запорот (не окончательно, но всё же). Лучше использовать более старую версию нифскопа, например 1.1.0-RC5.
 
 

Очевидно, да. Возможно, ещё какие-то параметры при экспорте, были неправильно выставлены.


От души за подробный ответ)))
Опубликовано

Здравствуйте, прошу прощение, я новичок в моделировании, хотел портировать при помощи 3д макса модель игрового персонажа в КС и он вылетает, возможно я просто глупенький и не совсем понял как именно идёт привязка текстур к модели что бы КС не вылетал, если вы работали с подобным, опишите пожалуйста либо подкиньте туториал работы с портированием, ибо я облазил весь Ютаб и к сожелению нашёл подобие туториала, но тот был увы на Gmax (Да, они чем то между собой схожи, но Gmax предназначен для более низкополигональных моделей) 

Я уже облазил весь нексус в поисках людей которые когда то портировали новые виды рас и увы, все они поголовно делали это до 2010 года примерно

Но не смотря на это, я встал именно в моменте конвертации текстур в нужный формат (я точно знаю что игре нужно двое вид текстур, простых и нормалей, но я не знаю какого формата и главное чем это конвертить)

Также у меня ещё есть просьба подсказать программы для работы с мимикой и создания привязки лица к эмоциям (вроде что то такое я видел кажется)

Либо же просто ткните меня как котёнка в лоток и покажите мне нужные туториалы которые обьяснять мне правильность портирования. 

Буду очень признателен за отзывчивость.  :read: 

P.s Если нужно, могу подкинуть саму модель и текстуры, возможно она сама может быть через чур тяжелой для игры и требуется полировка самой модели

Опубликовано
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.

Если не понимаете, переведите гуглом, он должен нормально перевести. Вам нужны точно те стадии, которые я выделил жирным. Это основа создания обычной текстуры и карты нормалей.

С остальным не знаком, помочь не могу.

Пοταπός ἐστιν οὗτος ὅτι καὶ οἱ ἄνεμοι καὶ ἡ θάλασ­σα αὐτῷ ὑπακούουσιν
Опубликовано
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

Я так понял, мне нужно иметь заглушку/бланк фаила с таким же расширением чтоб он мог сохранить под него? 

Опубликовано
09.12.2024 20:02:57, Nu-Hatta сказал(-а):

Может, на кириллицу в пути к файлу ругается?

Error opening F:\Albinio2.dds 
Как могли заметить, сменил путь, я открываю png и пытаюсь сохранить в dds, я знаю что я тупой, но обьясните тупому, что я собственно говоря делаю не так? Мне типо надо было скачать какую то прогу чтоб конвертнуть в DDS изначально png или tga и уже делать манипуляции над dds в GIMP'е ?

Опубликовано (изменено)
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, формат ддс является родным для него, без проблем открывает, сохраняет, ну и делает то, что нам нужно- изменить оттенок, наложить какие либо элементы, изменить размер. При сохранении нужно обратить внимание на мип-мапы. Они нужны для всех текстур игровых объектов, но их не должно быть в текстурах иконок. Однако ПайнтНет не умеет работать с нормалями, увы. Поэтому используем его для корректировки обычных текстур, а нормали берем уже готовые, обычно этого хватает.

Изменено пользователем piramis
Опубликовано (изменено)

Сразу приложу старый скрин, где именно указывать мип-мапы при сохранении текстуры

 

В моделях обычно указывается только основная текстура, в формате для персонажей например :

textures/characters/imperial/female/footfemale.dds

 

Указывать нормаль там не нужно, она должна лежать в указанной папке и подтянется в игре. 

Безымянный.jpg

Безымянный2.jpg

Изменено пользователем piramis
Опубликовано (изменено)
09.12.2024 06:39:08, Albinio сказал(-а):
C базовой инструкцией конечно благодарю, а вот у меня теперь другая проблема появилась, когда я пытаюсь нажать на экспорт дается выбор для сжатия (ставлю условно DTX1)  и mipmaps

По моим экспериментам, Обливион лучше всего пережёвывает DXT-3. Скайрим и больше - DXT-5. Пятёрку Обливион тоже берёт, но не везде и не всегда, например иконки глючат и не работает альфа-канал. Мипмапы нужны для статиков, они потом будут натягиваться на лоды. Для персонажа dds должен быть обязательно с альфа-каналом и без мипмапа.

 

06.12.2024 04:46:17, Albinio сказал(-а):
Также у меня ещё есть просьба подсказать программы для работы с мимикой и создания привязки лица к эмоциям (вроде что то такое я видел кажется)

Это делается непосредственно в конструкторе, в разделе диалогов. Когда создаётся реплика, к ней привязывается аудио-файл. Файл артикуляции при этом генерируется конструктором и сохраняется в папку автоматически вместе с аудио-файлом. После этого можно настроить эмоции всё в тех же диалогах. Эмоция устанавливается на каждую строку диалога.

Изменено пользователем Bianor
Опубликовано
16.12.2024 04:56:16, Bianor сказал(-а):

По моим экспериментам, Обливион лучше всего пережёвывает DXT-3. Скайрим и больше - DXT-5. Пятёрку Обливион тоже берёт, но не везде и не всегда, например иконки глючат и не работает альфа-канал. Мипмапы нужны для статиков, они потом будут натягиваться на лоды. Для персонажа dds должен быть обязательно с альфа-каналом и без мипмапа.

 

Это делается непосредственно в конструкторе, в разделе диалогов. Когда создаётся реплика, к ней привязывается аудио-файл. Файл артикуляции при этом генерируется конструктором и сохраняется в папку автоматически вместе с аудио-файлом. После этого можно настроить эмоции всё в тех же диалогах. Эмоция устанавливается на каждую строку диалога.

Извините, а могу ли я вам в ЛС обратится? Мне просто нужно экспертное мнение или хотя бы произвести демонстрацию экрана, чтобы я просто мог понять что от меня конкретно требуется для портирования в целом.
Может быть там Дискорд или вк или ещё что нибудь?

Опубликовано (изменено)
16.12.2024 16:02:08, Albinio сказал(-а):
Извините, а могу ли я вам в ЛС обратится?

Я бы с радостью, но сам давно не делал диалоги, придётся самому заново учиться. Если коротко, то это раздел Character -> Quests

Там делается квест, назначаются стадии - по этой части есть туториалы.

Дальше раздел Topics, там создаются реплики в диалогах.

Desktop Screenshot 2024.12.17 - 23.19.31.15.png

Двойным щелчком по выделенной строке вызывается меню, где есть опция "Emotion type", там сожно выбрать злость, радость, грусть и так далее. Цифры означают силу эмоции, от едва заметной мимики, до лютых гримас. И там же есть кнопка "Generate Lip File" - она создаст файл с артикуляцией рядом с аудиофайлом. А вот как прицеплять аудиофайл - сам уже не помню )

 

Изменено пользователем Bianor
  • Нравится 1
Опубликовано

о

 

17.12.2024 14:27:01, Bianor сказал(-а):

Я бы с радостью, но сам давно не делал диалоги, придётся самому заново учиться. Если коротко, то это раздел Character -> Quests

Там делается квест, назначаются стадии - по этой части есть туториалы.

Дальше раздел Topics, там создаются реплики в диалогах.

attachicon.gif Desktop Screenshot 2024.12.17 - 23.19.31.15.png

Двойным щелчком по выделенной строке вызывается меню, где есть опция "Emotion type", там сожно выбрать злость, радость, грусть и так далее. Цифры означают силу эмоции, от едва заметной мимики, до лютых гримас. И там же есть кнопка "Generate Lip File" - она создаст файл с артикуляцией рядом с аудиофайлом. А вот как прицеплять аудиофайл - сам уже не помню )

 

обалдеть, на каджита залип конкретно))
очень мощно!

Пοταπός ἐστιν οὗτος ὅτι καὶ οἱ ἄνεμοι καὶ ἡ θάλασ­σα αὐτῷ ὑπακούουσιν
Опубликовано (изменено)

Всем доброго дня!

Тоже подкопились вопросы, причем самого разного толка. Где-то я чую, что мог бы решить, но всё никак не пойму, в чем соль.

Как обычно, буду рад ответу на любой из вопросов, потому что они все разноплановые и разные по сложности. Собираю коллективное знание, так сказать, с миру по нитке.

Вопрос 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. Так сказать, на будущее. Если мод обновляется до новой версии, как вносят изменения с новой версии в перевод предыдущей? не переводить же один и тот же плагин заново?! Наверное должна существовать инфраструктура комфортного обновления существующего перевода?


Спасибо всем за помощь в предыдущих вопросах, поддержка форумчан это действительно чудо! Особенно когда сам не знаешь совершенно как решить поставленную задачу. И это очень вдохновляет работать дальше.
Всех с наступающим Новым Годом!

Изменено пользователем ArtemSH
  • Нравится 1
Пοταπός ἐστιν οὗτος ὅτι καὶ οἱ ἄνεμοι καὶ ἡ θάλασ­σα αὐτῷ ὑπακούουσιν
Опубликовано
23.12.2024 15:31:38, ArtemSH сказал(-а):

 

Вопрос 12. Самый легкий, но важный.

 

LowerCupTan02 - Коричневая чашка

MiddleMetalGoblet - Металлический кубок

LowerMugTan01 - Коричневая кружка

MiddleMetalTankard005 - Металлическая пивная кружка

  • Нравится 1
Опубликовано
23.12.2024 16:52:05, Kub сказал(-а):

LowerCupTan02 - Коричневая чашка

MiddleMetalGoblet - Металлический кубок

LowerMugTan01 - Коричневая кружка

MiddleMetalTankard005 - Металлическая пивная кружка

Отлично! Спасибо

Пοταπός ἐστιν οὗτος ὅτι καὶ οἱ ἄνεμοι καὶ ἡ θάλασ­σα αὐτῷ ὑπακούουσιν
Опубликовано
23.12.2024 15:31:38, ArtemSH сказал(-а):
Вопрос 1. Правильно ли я понимаю, что хорошая практика иметь шаг в 5 пунктов между стадиями квеста, иначе движок может забаговать? Или это байка? А также какое количество стадий может быть максимальным? Не сами стадии, а их "номер" беспокоит. Например, стадия 455 будет работать? А стадия 1000?

Скорее всего байка. Разрывы в нумерации стадии квестов делались для того, чтобы в случае необходимости между ними можно было вставить еще стадии. Вряд ли эта нумерация еще на что-то влияет. По крайней мере я ничего такого никогда не слышал.

По поводу максимальной - 255 точно должно быть) А вообще - стоит посмотреть, какие есть максимальные в существующих квестах и ориентироваться на это число.

  • Нравится 2

Мир друзьям - смерть врагам!

Мой новый сайт-блог: https://igorlutiy.pp.ua - как некое подведение итогов моей жизни в интернете

Мой профиль на Самиздате: http://samlib.ru/l/ljutyj_i/

  • 2 недели спустя...
Опубликовано (изменено)

Добрый вечер, вопрос вот такой, даже не пойму, по пакетам или скриптам.

 

Нужно было что-то для злодейских персонажей, чтобы именно было содержание злодейского поведения. Очевидный вариант- данж, принадлежащий империуму и населенный противниками, входящими в фракции властей империи. Проводя отыгрыш за фракцию, враждебную империуму Тамриеля, или смертным в целом (дейдра, шестой дом, Талмор) мы можем штурмовать такой данж, нанося урон силам империи.

 

Сделано. Создан форт, принадлежащий фракции имперского легиона. Врагами в данже стали обычные имперцы, оснащенные экипировкой легиона, и состоящие в фракции имперского легиона, хотя пакеты у них были оставлены от бандитов, а агрессия уменьшена до 5. Результаты же разочаровали.

 

Дверь в форт помечена красным цветом, как запрещенное ко входу место, но никаких последствий за вторжение не происходит. Нападения на врагов также не влекут за собой начисления штрафов или дурной славы, даже при нападении на одного из "легионеров" в присутствии другого. При повышении же личной ответственности они всего лишь ходят за нами и требуют уйти, а в случае нападения сбегаются из соседних помещений почти все, кто размещен в данже.

 

Возникло предположение, что для начисления штрафов и повышения дурной славы используются скрипты, в которые новосозданные объекты и персонажи не могут, естественно, входить. Также пакеты от бандитов явно не подходят, но у самих стражников, что легиона, что городской и дворцовой  стражи и нету на самом деле какого-то единого пакета "правоохранителя", у всех специфические для каждого конкретного места.

 

Варианты решения представляются такими. Первое- оставить все как есть, данж с врагами бандитами в доспехах легиона, дворцовой стражи или клинков оставить как обычный данж, но более подходящий для посещения злодейскими протагонистами. А дурную славу для себя нарабатывать на дорогах, вырезая "настоящих" стражников легиона.

 

Второй вариант- сделать своеобразный костыль. Помещения форта и его население отнести к фракции какого-либо замка. В этом случае нипам можно будет выдать пакет замковой стражи, где есть необходимые фразы и действия в виде попыток ареста, и они будут вести себя адекватнее. Но остаются опасения, что в этом случае опять они будут прибегать всей толпой, и вместо последовательного прохождения будет одна большая баталия.

==================

В итоге разных тестов все равно вывод один- за вторжение в локации в своих модах или нападения на новосозданных в модах персонажей дурная слава и штрафы не начисляются, причину так и не удалось понять

Изменено пользователем piramis

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...