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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
naxac 2 595 Опубликовано 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/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302377
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) Почему происходит этот вылет ? Кто знает, кто подскажет ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302389
Капрал Хикс 564 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 (изменено) @naxac, вах! По методу последнему и хранилище от Артоса не понадобится, верно? Изменено 12 Декабря 2019 пользователем Капрал Хикс Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302390
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302391
naxac 2 595 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 (изменено) @Капрал Хикс, смотря сколько у тебя тасков. Я проверял на ОП-2, там 165 квестов, на сохранение по старой схеме (но там уже строки сохранялись хэшами) данные занимали около 2kb, активных заданий при этом было всего 2, Пакет актёра - максимум 8kb, так туда обычно ещё много чего сохраняют: таймеры там всякие, переменные разные и т.д. Вот тут я переделал немного сохранение: ссылка. Места стало занимать почти в два раза меньше. А по сравнению с чистым ТЧ - разница, наверное, раза в четыре, потому что там всё строками сохранялось. @DMT, у тебя функция ASSERT не рабочая. Если бы она работала - в логе было бы написано, что в папке scripts нет подключаемого модуля (файла), и было бы написано, какого именно. Изменено 12 Декабря 2019 пользователем naxac 4 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302400
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 выделена курсивом Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302421
naxac 2 595 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @DMT, я ж тебе объясняю: сделай рабочей функцию ASSERT, и станет понятно, какой модуль отсутствует в скриптах. Вот тут: local module = _G[ module_name ] Определяется переменная этого самого модуля. module_name - название скрипта. Выведи его в лог, и станет понятно, чего не хватает. Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302437
DMT 2 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @naxac, А в каком смысле функция ASSERT не является рабочей? Почему вариант Цитата function ASSERT( cond, ... ) end не является рабочим ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302456
naxac 2 595 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @DMT, потому что эта функция в огсе предназначена для проверки: если первый аргумент - это false или nil, то выводится сообщение об ошибке, заданное остальными аргументами. Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302457
Zander_driver 10 348 Опубликовано 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. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302458
DMT 2 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @naxac, @Zander_driver, а существует какой-то справочник по скриптам огсе с описанием новых функций ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302460
naxac 2 595 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 @DMT, https://xray-engine.org/index.php?title=X-Ray_extensions 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302464
_g.script 3 669 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 (изменено) Добрые люди, есть у кого какие соображения, отчего происходит вылет "...gamedata\scripts\amk.script:1403: attempt to perform arithmetic on local 'st' (a string value)". Я уже мозг сломал, не могу выявить причину. Недавно перешёл на таймеры из солянки (в смысле, заменил базовый АМКшный код), вылет происходит при загрузке любого сейва после сдачи вновь добавленного квеста у вновь добавленного СИДового НПС. Грешу на кривую адаптацию кода, ведь раньше вылета не было. Но не вижу взаимосвязи, потому и в тупике. При сдаче квеста ничего особенного - забираем вещь, даём ревард (в виде денег, хабара и тайника), ну и инфопорцию, конечно. Может кто сталкивался, уже не пойму, куда копать... Изменено 12 Декабря 2019 пользователем mole venomous Здесь могла быть ваша реклама. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302504
_Sk8_AsTeR_ 122 Опубликовано 12 Декабря 2019 Поделиться Опубликовано 12 Декабря 2019 Господа, время доброго! Прошу подсказки Имеется момент, где мы проигрываем звук: Скрытый текст snd_obj:play_no_feedback( npc, sound_object.s3d, 0, npc:position(), 1.0 ) Звук проигрывается, но строго в позиции НПС. Если НПС отойдет, то звук продолжается на том же месте, где непися уже нет. Вопрос: как скриптово заставить звук проиграться от лица НПС, будто обычная озвучка? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302506
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, которые уже использованы. Если это верное предположение, то возникает вопрос: как модифицировать скрипт Бардака, чтобы не было вылета? Самый простой способ? Несколько минут спустя: моё предположение оказалось неверным. Даже если удалить скрипт от Бардака, сейв всё равно не грузится, всё равно происходит этот вылет. Значит проблема в том, что заспавненные объекты неправильно сохраняются. Почему сейв получается битым ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302547
abramcumner 1 230 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 29 минут назад, DMT сказал: Почему сейв получается битым ? Потому, что при установки story_id через нет-пакеты, движок не проверяет дубликаты и не регистрируeт story_id. Все это происходит при следующей загрузке сейва. Собственно ошибка была при самом первом спане. Модифицировать не надо, надо следить за стори_ид: то ли использовал существующие сиды, то ли электре и вертолету задал одинаковые. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302551
DMT 2 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 4 минуты назад, abramcumner сказал: Модифицировать не надо, надо следить за стори_ид В смысле ? Если что, я не вносил никаких изменений в db.script от Бардака. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302554
abramcumner 1 230 Опубликовано 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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302563
DMT 2 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 24 минуты назад, abramcumner сказал: Попробуй заменить "local story_id = packet:r_u32()" на "local story_id = packet:r_s32()" и "packet:w_u32(story_id)" на "packet:w_s32(story_id)", тоже в двух функциях. Меняется u32 на s32. Битый сейв удали. Спасибо, сработало! Интересный момент: при каждом сохранении-загрузке спавнится ещё одна аномалия и ещё один вертолёт помимо тех, которые уже были заспавнены в прошлые разы. Так можно делать сколько угодно или после некоторого критического количества спавнов начнутся вылеты? А есть какие-то уроки с детальным разбором нет-пакетов и как ими пользоваться? Да, я читал коммент Malandrinus в справочнике по функциям и классам https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkciyam-i-klassam/?do=findComment&comment=258470 и даже кое-что понял, но этот коммент всё же вряд ли можно назвать уроком. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302570
abramcumner 1 230 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 4 минуты назад, DMT сказал: при каждом сохранении-загрузке спавнится ещё одна аномалия и ещё один вертолёт помимо тех, которые уже были заспавнены в прошлые разы. Это плохо. Игроки начинают часто загружаться, когда игра уже слишком сложная. А ты спавном вертолоетов и аномалия делаешь ее еще сложнее. Лучше перенеси вызов спавна в другое место или добавь каких-нибудь условий. 7 минут назад, DMT сказал: Так можно делать сколько угодно или после некоторого критического количества спавнов начнутся вылеты? Если объектов станет больше 65535. 8 минут назад, DMT сказал: А есть какие-то уроки с детальным разбором нет-пакетов и как ими пользоваться? По ссылке разбор класса net-packet, он простой. Тебе же нужно, что входит в нет-пакеты разных классов. Уроков не знаю, все нет-пакеты есть в acdc. Возможно в модулях Artos`a расписано какое поле, что значит. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/502/#findComment-1302572
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти