Перейти к контенту

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

  Информация (Показать)

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

  Читать рекомендуется. (Показать)

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

*Shoker*, ты хотел сохранять в файл(текстовый и тп) свои переменные, и делать название файла таким же, как и название сейва?

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

ЗЫ я думал так сделать, но порассуждав, пришел к выводу, что через чур много таких файлов будет(будут захламлять папку с сейвами и тп.)...

Изменено пользователем Viнt@rь
Ссылка на комментарий

Viнt@rь, там проблема не с сохранением и последующим чтением имени доп. файла, а с тем, как определить это имя. Есть 2 категории сэйвов, для которых сделать это затруднительно - квиксэйвы пользователя и автосэйвы, которые происходят при переходе на другую локацию (после диалога "вы уверены, что хотите перейти?..").

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

Ссылка на комментарий

Kirgudu, нет никакой проблемы, если, как и говорит Viнt@rь, при создании сохранения запоминать эксклюзивное имя для "своего" доп.файла и, при загрузке считывать это имя, и соответственно из него все необходимое.

Однако, пора прекращать мусолить эту тему, тем более сам автор вопроса уже пошел по правильному пути (ИМХО), т.е. избрав путь хранить все в одном файле - самом сэйве игры.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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

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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

Ссылка на комментарий

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

 

P.S.

Учитывая, что все же для некоторых вопрос остался открытым, о чем говорят слова из ЛС:

  Kirgudu писал(а):
...никто так и не привёл в теме ни одного примера, как можно отделить друг от друга всего два из общего количества типов сэйвов: квик по клавише F6 и автосэйв после отрабатывания диалога смены локации (в отличие от любого другого автосэйва, он так же, как и квиксэйв, не запускается из доступных скриптов консольной командой. ... Только общие слова. Тоже своего рода шоры, только с другой стороны, не находишь? А в результате обменялись в теме недоказанными мнениями.
Попробуем все же досказать недосказанное или недочитанное ;-)
  Пояснения по сэйвам: (Показать)
Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Очередное напоминание очередному 'нечитателю', но "писателю":

  [b (Показать)
Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Прошу не пинать за нубские вопросы, скриптинг только осваиваю.

Вопрос по level.map_add_object_spot() и level.map_add_object_spot_ser(). Собственно исходя из справочной инфы все понятно, но такие нюансы:

В ЗП для отображения меток на объектах используется именно level.map_add_object_spot в pda.script (функция fill_primary_objects()), которая берет список объектов из таблицы и как я понял, апдейтится постоянно. Собственно почему нельзя было один раз в начале игры проставить все метки level.map_add_object_spot_ser? Это связано с ресурсами и производительностью?

Просто с заполнением новых локаций что будет экономней для ресурсов - проставить те-же 10-20 меток один раз вызвав level.map_add_object_spot_ser() или раздувать таблицу в pda.script?

Ссылка на комментарий

Clayman, все же прежде чем задавать подобный вопросы стОит получше освоить "скриптинг", дабы не задавать преждевременных вопросов по вырванным кускам из контекста алгоритмов...

  Пояснения: (Показать)
Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Вот кусок кода из ТЧ(1.004)

local ini = system_ini()

local weather = level.get_weather() -- тип погоды
local weather_sect = ini:r_string("weathers", weather) -- секция погоды, соответствующая типу

В ЧН работать не хочет, вылет...

Попробовал заменить на такой код:

local ini = ini_file("game.ltx")
local weather = utils.cfg_get_string(ini, level.name(), "weathers", db.actor, false, "", "[default]")
local weather_sect = ini:r_string("weathers", weather) -- секция погоды, соответствующая типу

Тоже будет вылет(через раз), иногда загружается игра.

Вот лог вылета:

  Лог (Показать)
Ссылка на комментарий

Старлей,

1. В ТЧ нет упомянутых тобою строк, по крайней мере в level_weathers.script, на котором и построен погодный менеджер. Очевидно у тебя некий "погодный" мод под ТЧ и, ты просто напросто пытаешься "сшить" абсолютно несовместимые строки.

2. Строка: local weather = utils.cfg_get_string(ini, level.name(), "weathers", db.actor, false, "", "[default]")

вычитывает из погодных конфигов погодную секцию типа: sect_default_weather (ТЧ) иль sect_marsh (ЧН), т.е. возвращает именно из секции [weathers] запрошенную секцию для конкретного уровня.

Исходя из логики, можно предположить, что эта секция и будет запрашиваемой в 3-ей строке weather_sect.

Твоя же строка: local weather_sect = ini:r_string("weathers", weather). по сути пытается запросить повторно из той же самой секции (weathers) нечто, но уже не по имени уровня, а по ... некоей полученной из игры погоде - результат очевиден.

 

Не буду далее гадать, т.к. нет информации.

Даже если в 3-ей строке простое присвоение: local weather_sect = weather , позволит тебе избавиться от текущего вылета этого куска кода - скорее всего ты далее опять получишь ошибку, но по другой причине/строке.

Тебе требуется разбираться с твоим "погодным" модом и адаптировать его под ЧН, т.к. погодные конфиги ТЧ и ЧН (да и сами менеджеры) все же различны.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

malandrinus, к сожалению, твой способ для сталкеров и мутантов не подойдет, чтобы скрывать кости. При скрытии кости, матрицы полигонов кости будут scale в 0, т.е. все координаты полигонов кости будут иметь нулевое значение, поэтому кажется, что кость пропала, а на самом деле она просто смялась в ничего. Для оружия это срабатывает потому что кости глушителей, прицелов и гранатометов являются отдельными мешами и не соединены с другими мешами. В случае с моделью сталкера кости имеют общий меш, и при скрытии кости, между двумя костями (фэйсы) будут тянуться в нулевые координаты, т.е. между ног будет тянуться вниз такая полоска от парента скрываемой кости. Для реализации этого я могу посоветовать создать новую функцию (вместо set_bone_visible) и после того, как полигоны окажутся нулевых координатах, взять позицию из матрицы парента этой кости и назначить позиции матрицы самой кости. Тогда все выглядит нормально, и дырок никаких не будет.


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

Изменено пользователем SkyLoader
  • Не нравится 1
Ссылка на комментарий

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

 

Мне что-то казалось, что бокс от кости тоже скрывается. Впрочем, я не проверял.

  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus, я уже пробовал так делать. Если будет мягкая привязка у модели, то все равно будет стяжка фейсов к нулевым координатам. Если же грубая привязка, то будет видна щель между костями. Я много как пробовал, но выход нашел только этот. Хотя он и не до конца хорош, скорее как прототип.

 

LL_SetBoneVisible, к сожалению, действует только на визуальную составляющую, на коллизийный бокс никакого влияния не оказывает.

Ссылка на комментарий

SkyLoader,

  Показать

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

За'use'в поиск в данной теме нашел, что данный вылет:

  Вылет (Показать)
Ссылка на комментарий

Старлей, в приведенной тобою функции спавна вертушки function heli(...) уже все есть, т.е. строка

cse_alife_helicopter__unk1_sz = "idle"

как раз и задает(изменяет) в нет-пакете значение параметра startup_animation = idle, просто для переменной использовано иное имя, которое ты можешь заменить своим более понятным.

Примечание: При спавне вертолетов желательно объекту задавать и параметр engine_sound (он у тебя также задается), в котором прописан звук двигателей (или '$no_sound'). Путь к звуковому файлу зависит от версии игры (ТЧ или ЧН) или от мода. У тебя прописан "для ЧН".

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Не совсем. С одной стороны, причина была в изменениях, внесенных в скрипт респавнеров. Баг "вылечил" тем, что сделал наличие db.actor обязательным условием, что исключило слишком ранний скриптовый спавн, а именно - ДО той стадии, на которой метод on_register будет вызван для всех обЪектов, загруженных из all.spawn.

С другой стороны, любой скрипт, в котором до этой стадии будет вызван скриптовый спавн какого-либо обЪекта, вернёт проявление бага.

Изменено пользователем Полтергейст
Ссылка на комментарий

Когда-то давно в НС появился "ПДА" для хранения переменных, не лезущих в pstor актору (netpacket_pda_binder.script)

в числе прочего там есть такое:

  Показать

 

При переходе в онлайн этого самого netpacket_pda дергаются последовательно *:__init(), init(), *:reload, ну и далее по тексту.

Но КАК ? В смысле, netpacket_pda_binder.init() кем вызывается вот в таком-то вот порядке ?

Ссылка на комментарий

Dennis_Chikin, объектом к которому "прикручен" биндер. Нет, вызываются методы конечно движком, но, так сказать, виновник этого - объект. В общем вот здесь всё весьма подробно расписано: >>ClicK Me<<.

Ссылка на комментарий

Dennis_Chikin, функция netpacket_pda_binder.init() вызывается в том случае, если в конфиге секции объекта (например для device_pda) будет прописан параметр:

script_binding = netpacket_pda_binder.init

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

Ну а далее, последовательность вызова движком методов самого биндера можно подсмотреть в xr_motivator.script, где сами разрабы оставили нам комменты:

  Цитата
порядок вызова методов биндера:

reload

reinit

load

net_spawn

Примечание: Метод 'load' будет вызываться только для объекта(ов) уже сохранявшегося в игре (если был save), т.е. при первом спавне объекта в игру этот метод не вызывается.

 

Примечание 2: ИМХО, метод с хранением "излишних" данных в КПК или "флешке" устарел и имеет больше недостатков, чем преимуществ по сравнению с уже известным методом хранения в специальном технологическом серверном объекте (se_custom_storage). Подробности такого метода (by malandrinus) и наработки по скриптам были рассмотрены около года назад в теме "Язык Lua. Общие вопросы программирования".

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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

Комментарии могут оставлять только зарегистрированные пользователи

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

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

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...