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/
strelok200 0 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Я заспавнил мутанта с логикой спавнер: [500056] ; cse_abstract properties section_name = m_controller_normal name = jup_kontrol position = 43.827217102051,23.94677734375,-175.71482849121 direction = 0,0,0 ; cse_alife_object properties game_vertex_id = 3727 distance = 0 level_vertex_id = 789591 object_flags = 0xfffffffd custom_data = <<END [smart_terrains] none = true [logic] active = mob_walker on_death = mob_death [spawner] cond = {+controler_qvest} [mob_walker] path_look = defolt_look path_walk = jup_kontra_walk [mob_death] on_info = %+kontroler_trup% END story_id = 500010 ; cse_visual properties visual_name = monsters\kontroler\kontroler ; cse_alife_creature_abstract properties g_team = 0 g_squad = 1 g_group = 2 health = 1 dynamic_out_restrictions = dynamic_in_restrictions = upd:health = 1 upd:timestamp = 0 upd:creature_flags = 0 upd:position = 43.827217102051,23.94677734375,-175.71482849121 upd:o_model = 0 upd:o_torso = 0,0,0 upd:g_team = 0 upd:g_squad = 1 upd:g_group = 2 ; cse_alife_monster_abstract properties upd:next_game_vertex_id = 65535 upd:prev_game_vertex_id = 65535 upd:distance_from_point = 0 upd:distance_to_point = 0 ; cse_ph_skeleton properties ; cse_alife_monster_base properties ; se_monster properties Но при выдаче определенного инфопоршня мутант не спавнится? В чём дело? Создаю глобальный мод с новыми локациямЭ Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647721
AndreySol 215 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Приглянись, например, к system_ini() иль ini_file(string)Пригляделся. Да, есть основное для парсинга. Жаль, не вижу в описании класса ini_file ничего, чтоб получить\перебрать все секции ini-файла. Могло-бы пригодится. И еще - класс ini_file работает только с ltx-файлами или с xml то-же ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647736
KD87 721 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) strelok200, дык он сразу в оффлайн уводится, скорее всего. Для того, чтобы монстр заспавнился по заданным координатам с помощью spawner, ему надо поставить флажок no_move_in_offline и отключить can_switch_offline. Или в СДК, или в object_flags. Изменено 27 Ноября 2011 пользователем KD87 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647738
Zander_driver 10 348 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) AndreySol А зачем искать все секции? в вышепрозвучавшем вопросе вроде бы этого не требовалось для произвольного инвентарного объекта: function get_icon_coord(obj) --- передавать клиентский объект *game_object if obj == nil then return nil end local section = obj:section() local ltx = system_ini() local x = ltx:r_float(section, "inv_grid_x") local y = ltx:r_float(section, "inv_grid_y") local xsize = ltx:r_float(section, "inv_grid_width") local ysize = ltx:r_float(section, "inv_grid_height") return {x, y, xsize, ysize} end Изменено 27 Ноября 2011 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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/166/#findComment-647751
Artos 99 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) KD87, наверное для пояснение для strelok200 требуется чуть попроще: В секции спавна его объекта параметр object_flags = 0xfffffffd говорит о том, что сброшен флаг flSwitchOnline и наоборот взведен flSwitchOffline. Т.о. его объект будучи заспавненым имеет возможность быть уведенным в оффлайн и не имеет возможности появиться в онлайне. strelok200, когда откуда-то что-то копипастишь, все же нужно осмысливать то, что получается в твоем конкретном случае. AndreySol, предпочитаю на вопросы, ответ на которые может легко получить сам спрашивающий - не отвечать. Ну а то, что универсальность бывает и вредна (более ресурсоемка и медлительнее) - наверное не стОит упоминать ... Изменено 27 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647754
AndreySol 215 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 local weapons_ini = ini_file("weapons\\weapons.ltx") на эту строку ругается так: Expression : fatal error Function : CInifile::r_section File : E:\stalker\sources\trunk\xrCore\Xr_ini.cpp Line : 342 Description : <no expression> Arguments : Can't open section 'identity_immunities' Что это означает ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647826
*Shoker* 322 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 AndreySol В файле weapons.ltx некоторые секции наследуют данные из секции [identity_immunities], которая находится в defines.ltx, но функцией ini_file("weapons\\weapons.ltx") ты по сути "отделяешь" этот файл от остальных, вот и не может игра при парсинге этого файла найти нужной секции. Для таких вещей используй system_ini() Тоесть просто: local weapons_ini = system_ini() Он вернёт тебе инфу из всех файлов, подключённых через system.ltx, в том числе и из этого. А ini_file() стоит использовать только когда ты работаешь с файлами, которые не подключены к оригинальной игре через sytem.ltx Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647829
Artos 99 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) AndreySol, это банально означает, что читая 'книгу' НЕ с начала, не стОит удивляться , что будут встречаться непрочитанные ранее куски информации ... Ну а если удивляет - поиск по указанному ненайденному куску (о чем говорит лог) должно подсказать где же написано непрочитанное. Несложно заметить, что в игре имеется т.н. корневой конфиг-файл (system.ltx) который и определяет порядок чтения и 'дочерние' конфиги. Если понадобилось читать 'из середины' - не удивляемся, что под ваш запрос не все разработчикам учтено, а засучив рукава - переписываем потребное 'под себя'. Добавлено через 10 мин.: *Shoker*: ini_file() стоит использовать только когда ты работаешь с файлами, которые не подключены к оригинальной игре через sytem.ltx Аккуратнее в таких категоричных заявлениях. Ни что не мешает использовать и подключенные файлы (их ой как немало), но с умом конечно ... т.е. подразумевая, что 'родительские' иль 'сторонние' секции в запрашиваемом файле не используются. Изменено 27 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647832
*Shoker* 322 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 А кто нибудь пробовал глубоко работать с нет-пакетами игрока? Возможно ли с помощью них например заменить у игрока xml-профиль, чтобы у него сменилось имя и иконка? И какие здесь есть тонкости. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647845
Amicron 0 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Подскажите пожалуйста, есть ли в LUA функция равносильная функции sleep(время) в С\С++? Или как сделать так, что бы какое-либо действие происходило через указанное время? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647852
*Shoker* 322 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) Ммм, в оригинале кажется нет, а может ещё осталось, пусть уточнит кто нить... Была функция wait() (описана в _G.script), которая ставила указанный скрипт\функцию (?) на "паузу" на указанное время. Но вроде бы последний раз когда я её пытался использовать - игра у меня вылетела. Вообще же можешь использовать таймеры АМК, они сейчас есть почти в любом крупном моде, обычно в скрипте amk.script Позволяют выполнять какое то действие через определённый промежуток времени (либо в секундах либо в игровом времени (минуты, дни, часы)) Ищи по ключевым словам: __do_timer_action, has_g_timer, start_timer_g (?) ... Таймеры также почти наверняка найдёшь в любом моде на спальный мешок. Изменено 27 Ноября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647854
Amicron 0 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Смотрел в AMK CoP в файле амк но ничего похожего не нашел. использовал wait(5000), вылет: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : attempt to yield across metamethod/C-call boundary Как правильно использовать эту функцию в ЗП? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647856
AndreySol 215 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Zander_driver после получение координат иконки, как их применить для CUIStatic ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647859
RvP 1 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Amicron, так же как и везде в Lua - не в главном потоке, а в созданной тобой нити. Про работу с нитями в теме по Lua Gun12 писал AndreySol, открываем справочник и смотрим как проинитить текстуру Vita sine libertate, nihil Vita sine litteris - mors est Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647862
Amicron 0 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 RvP, не могли бы вы мне привести пример использования? Траффик дорогой сейчас просто. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647864
Nazgool 251 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Amicron Вот тут : в "Справочнике..." и тут : где-то в "Скриптовании..." Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647870
*Shoker* 322 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Вот ещё что хотел уточнить: в экспортированных в LUA UI элементах можно создать "Список со вложенным списком"? Тоесть как в ТЧшной энциклопедии. Есть ListBox, и там идёт название групп, при щёлканье на группу, список раскрывается, и там появляются новые элементы. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647881
Artos 99 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) *Shoker*: А кто нибудь пробовал глубоко работать с нет-пакетами игрока? Возможно ли с помощью них например заменить у игрока xml-профиль, чтобы у него сменилось имя и иконка? И какие здесь есть тонкости. Не стОит делать из нет-пакетов некую панацею или искать глубину. Ну а тонкость тут конечно же есть. ;-) Нет-пакеты - это всего лишь упорядоченная последовательность байт, которая соответствует классу объекта и которая используется для синхронизации серверной юзердаты и клиентской объекта. Ну а так как собственно актор при его спавне в игру 'живет' именно в онлайне и именно с клиентстким объектом общается/управляет игрок - какой-либо подпитки от сервера актор не получает. Вся игра строится вокруг именно клиентского объекта актора и только в сэйвах используются сохранения. Ну а чтобы подменить некий параметр с сервера для клиентского актора - хотел бы я посмотреть как ты будешь уводить актора в оффлайн ... ;-) И что-то не первый раз вижу как всплывает упоминание _g.wait() в контексте попыток его прямого использования. Обе функции, которые имеются в _g.script: wait() и wait_game() - это куски конструктора, который может быть использован (см. выше упомянутые ссылки на coroutine), и не более. Т.е. без дополнительной 'обвязки' использование указанных функций и бессмывсленно и только фатальные ошибки вызывает. Кому интересно как можно было бы использовать -> см. спойлер:[spoiler=использование 'wait' (один из упрощенных вариантов)]Задаем где-нибудь в своем скрипте переменную периода ожидания (ms) и объявляем/создаем свою подпрограмму-таймер ожидания на базе имеющейся _g.wait: local iTimeToWait = 5000 --/ ms local CoTimeWait = coroutine.create(wait) Далее, в каком-либо апдейте (актора иль др.) вставляем код вызова своей функции таймера: function MyTimer() --/ вызов из апдейера if iTimeToWait then if not CoTimeWait then --/ если нет сопрограммы (для повторных запусков) CoTimeWait = coroutine.create(wait) --/ создаем ее end local sStatus = coroutine.status(CoTimeWait) --/ статус сопрограммы if sStatus == 'suspended' then --/ (при)остановлена? local bFlg,Result = coroutine.resume(CoTimeWait, iTimeToWait) --/ (пере)запуск сопрограммы if not bFlg then --/ нештатное завершение? log("OnUpdate:%s:[%s]", tostring(Result), "Error!") end elseif sStatus == "dead" then --/ завершена? log("OnUpdate:Done!") --/> событие окончания тайм-аута! iTimeToWait = nil CoTimeWait = nil end end end Соответственно функция wait позволяет организовать таймер на базе реального времени, а wait_game - с учетом игрового времени (+timefactor)/ Как видно (особенно для тех, кто уже знаком с таймерами) - вариант далеко не более простой, чем уже встречающиеся в кодах игры/модов, так что (ИМХО) в простейшем случае не стоит заморочек ... Изменено 27 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647887
*Shoker* 322 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Artos Ну, я расчитывал на обычный save\load. Изменить параметры игрока во время загрузки уровня, или же перед этим. Да и игрок то наверно с сервером как то общается. Не зря же у компания-разработчик (признана нежелательной)* есть скрипт actor_proxy.script Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647889
Artos 99 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 *Shoker*, а взглянув в упомянутый actor_proxy.script - не следует ли вывод, что он практически только для фактов создания и уничтожения объекта 'актор' и работы с инфопоршнями. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/166/#findComment-647895
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти