Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
Okichi 922 Опубликовано 9 Декабря 2019 Поделиться Опубликовано 9 Декабря 2019 (изменено) 15 часов назад, mole venomous сказал: Есть ли какой скриптовый способ запретить НПСам НЕ брать конкретный предмет с земли и/или трупа/ящика? Есть, примеры можно посмотреть в репозитории по dsh-mod на Githab. Или в репозитории от Den1s'a там же ( вариант той же фишки для НЛС ). Суть в том, что объекту в конфиг прописывается новый ключ, который задает то самое "руки прочь". В ДШ-моде это watcher_act.bad_item = true Ну и соответственно: 1) в watcher_act (онлайновое воровство - трупы/земля) - добавить чтение и обработку этого ключа 2) в amk_offline_alife - аналогично. Способ проверен, все работает. Изменено 9 Декабря 2019 пользователем Okichi След от кругов на воде - это тоже след (с) Ссылка на комментарий
Капрал Хикс 542 Опубликовано 11 Декабря 2019 Поделиться Опубликовано 11 Декабря 2019 (изменено) Подскажите решение проблемы с большим количеством второстепенных квестов, когда сначала путаются их описания, а потом происходит вылет вида +165 bytes в конце - "XR_3DA.exe caused BREAKPOINT in module ""E:\GAMES\S.T.A.L.K.E.R\bin\xrCore.dll"" at 001B:00597D15, xrDebug::backend()+165 byte(s)" Изменено 11 Декабря 2019 пользователем Капрал Хикс Ссылка на комментарий
naxac 2 477 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 (изменено) @Капрал Хикс, это,вернее всего, происходит из-за превышения размера пакета сохранения клиентских данных у актера: информация о заданиях там сохраняется: см. task_manager.script Решение: для сохранения этих данных подключить , допустим, хранилище от Artos'а. Либо оптимизировать сохранение: выкинуть лишнее, для строк использовать хэши, булевы значения побитово записывать в u8, и прочие изощрения... Но хранилище, по-моему, лучший вариант. Сейчас ещё глянул - там количество записей при сохранении ограничено u8 - т.е. 255, так что если заданий в конфиге больше - будут глюки. Решение: нужно заменить в сохранении/загрузке количества записей с r(w)_u8 на r(w)_u16 - тогда лимит будет 65535. Изменено 12 Декабря 2019 пользователем naxac 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
DMT 2 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 Цитата LUA error: ...ow of chernobyl\gamedata\scripts\ogse_signals.script:269: attempt to index local 'module' (a nil value) Почему происходит этот вылет ? Кто знает, кто подскажет ? Ссылка на комментарий
Капрал Хикс 542 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 (изменено) @naxac, вах! По методу последнему и хранилище от Артоса не понадобится, верно? Изменено 12 Декабря 2019 пользователем Капрал Хикс Ссылка на комментарий
DMT 2 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 Цитата function signals_mgr:subscribe_module( module_name ) local module = _G[ module_name ] ASSERT( module, "signals_mgr:subscribe_module: Failed to subscribe module '%s'", module_name ) ASSERT( type( module ) == "table", "signals_mgr:subscribe_module: Failed to subscribe module '%s', must be a table", module_name ) ASSERT( type( module.attach ) == "function", "signals_mgr:subscribe_module: Failed to subscribe module '%s', has no 'attach' function", module_name ) module.attach( self ) end Строка 269 из скрипта выделена курсивом 1 Ссылка на комментарий
naxac 2 477 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 (изменено) @Капрал Хикс, смотря сколько у тебя тасков. Я проверял на ОП-2, там 165 квестов, на сохранение по старой схеме (но там уже строки сохранялись хэшами) данные занимали около 2kb, активных заданий при этом было всего 2, Пакет актёра - максимум 8kb, так туда обычно ещё много чего сохраняют: таймеры там всякие, переменные разные и т.д. Вот тут я переделал немного сохранение: ссылка. Места стало занимать почти в два раза меньше. А по сравнению с чистым ТЧ - разница, наверное, раза в четыре, потому что там всё строками сохранялось. @DMT, у тебя функция ASSERT не рабочая. Если бы она работала - в логе было бы написано, что в папке scripts нет подключаемого модуля (файла), и было бы написано, какого именно. Изменено 12 Декабря 2019 пользователем naxac 4 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
DMT 2 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @naxac, Я в _g.script прописал пустую функцию ASSERT Цитата function ASSERT( cond, ... ) end Вылет каким был — таким и остался. Я вырезал все вызовы ASSERT из ogse_signals.script, теперь вылет такой: Цитата LUA error: ...ow of chernobyl\gamedata\scripts\ogse_signals.script:243: attempt to index local 'module' (a nil value) Кусок кода: Цитата function signals_mgr:subscribe_module( module_name ) local module = _G[ module_name ] module.attach( self ) end Строчка 243 выделена курсивом Ссылка на комментарий
naxac 2 477 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @DMT, я ж тебе объясняю: сделай рабочей функцию ASSERT, и станет понятно, какой модуль отсутствует в скриптах. Вот тут: local module = _G[ module_name ] Определяется переменная этого самого модуля. module_name - название скрипта. Выведи его в лог, и станет понятно, чего не хватает. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
DMT 2 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @naxac, А в каком смысле функция ASSERT не является рабочей? Почему вариант Цитата function ASSERT( cond, ... ) end не является рабочим ? Ссылка на комментарий
naxac 2 477 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @DMT, потому что эта функция в огсе предназначена для проверки: если первый аргумент - это false или nil, то выводится сообщение об ошибке, заданное остальными аргументами. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Zander_driver 10 343 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 только что, DMT сказал: Почему потому что пустая функция ничего не делает. 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
DMT 2 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @naxac, @Zander_driver, а существует какой-то справочник по скриптам огсе с описанием новых функций ? Ссылка на комментарий
naxac 2 477 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @DMT, https://xray-engine.org/index.php?title=X-Ray_extensions 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
mole venomous 3 534 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 (изменено) Добрые люди, есть у кого какие соображения, отчего происходит вылет "...gamedata\scripts\amk.script:1403: attempt to perform arithmetic on local 'st' (a string value)". Я уже мозг сломал, не могу выявить причину. Недавно перешёл на таймеры из солянки (в смысле, заменил базовый АМКшный код), вылет происходит при загрузке любого сейва после сдачи вновь добавленного квеста у вновь добавленного СИДового НПС. Грешу на кривую адаптацию кода, ведь раньше вылета не было. Но не вижу взаимосвязи, потому и в тупике. При сдаче квеста ничего особенного - забираем вещь, даём ревард (в виде денег, хабара и тайника), ну и инфопорцию, конечно. Может кто сталкивался, уже не пойму, куда копать... Изменено 12 Декабря 2019 пользователем mole venomous Здесь могла быть ваша реклама. Ссылка на комментарий
_Sk8_AsTeR_ 122 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 Господа, время доброго! Прошу подсказки Имеется момент, где мы проигрываем звук: Скрытый текст snd_obj:play_no_feedback( npc, sound_object.s3d, 0, npc:position(), 1.0 ) Звук проигрывается, но строго в позиции НПС. Если НПС отойдет, то звук продолжается на том же месте, где непися уже нет. Вопрос: как скриптово заставить звук проиграться от лица НПС, будто обычная озвучка? Ссылка на комментарий
DMT 2 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 http://stalkerin.gameru.net/wiki/index.php?title=SoC._Один_из_методов_спавна Я внедрил в геймдату готовый пример от Бардака. Суть примера: имеется файл db.script, в котором две функции: одна спавнит электру, другая — вертолёт. Начинать новую игру не обязательно, НО если после спавна сделать сохранение и загрузку то получаю вылет: Цитата Line : 30 Description : Specified story object is already in the Story registry! Мои собственные догадки о причинах вылета такие: после загрузки скрипт второй раз пытается заспавнить электру и вертолёт, которые уже заспавнены. То есть скрипт пытается использовать такие story_id, которые уже использованы. Если это верное предположение, то возникает вопрос: как модифицировать скрипт Бардака, чтобы не было вылета? Самый простой способ? Несколько минут спустя: моё предположение оказалось неверным. Даже если удалить скрипт от Бардака, сейв всё равно не грузится, всё равно происходит этот вылет. Значит проблема в том, что заспавненные объекты неправильно сохраняются. Почему сейв получается битым ? Ссылка на комментарий
abramcumner 1 176 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 29 минут назад, DMT сказал: Почему сейв получается битым ? Потому, что при установки story_id через нет-пакеты, движок не проверяет дубликаты и не регистрируeт story_id. Все это происходит при следующей загрузке сейва. Собственно ошибка была при самом первом спане. Модифицировать не надо, надо следить за стори_ид: то ли использовал существующие сиды, то ли электре и вертолету задал одинаковые. Ссылка на комментарий
DMT 2 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 4 минуты назад, abramcumner сказал: Модифицировать не надо, надо следить за стори_ид В смысле ? Если что, я не вносил никаких изменений в db.script от Бардака. Ссылка на комментарий
abramcumner 1 176 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 (изменено) @DMT, добавь в db.script после строки "local story_id = packet:r_u32()" вывод story_id в лог, в функции create_anom и create_heli. Попробуй заменить "local story_id = packet:r_u32()" на "local story_id = packet:r_s32()" и "packet:w_u32(story_id)" на "packet:w_s32(story_id)", тоже в двух функциях. Меняется u32 на s32. Битый сейв удали. Изменено 13 Декабря 2019 пользователем abramcumner 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти