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 Но при выдаче определенного инфопоршня мутант не спавнится? В чём дело? Создаю глобальный мод с новыми локациямЭ Ссылка на комментарий
AndreySol 215 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Приглянись, например, к system_ini() иль ini_file(string)Пригляделся. Да, есть основное для парсинга. Жаль, не вижу в описании класса ini_file ничего, чтоб получить\перебрать все секции ini-файла. Могло-бы пригодится. И еще - класс ini_file работает только с ltx-файлами или с xml то-же ? Ссылка на комментарий
KD87 718 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) strelok200, дык он сразу в оффлайн уводится, скорее всего. Для того, чтобы монстр заспавнился по заданным координатам с помощью spawner, ему надо поставить флажок no_move_in_offline и отключить can_switch_offline. Или в СДК, или в object_flags. Изменено 27 Ноября 2011 пользователем KD87 Ссылка на комментарий
Zander_driver 10 333 Опубликовано 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. Ссылка на комментарий
Artos 99 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) KD87, наверное для пояснение для strelok200 требуется чуть попроще: В секции спавна его объекта параметр object_flags = 0xfffffffd говорит о том, что сброшен флаг flSwitchOnline и наоборот взведен flSwitchOffline. Т.о. его объект будучи заспавненым имеет возможность быть уведенным в оффлайн и не имеет возможности появиться в онлайне. strelok200, когда откуда-то что-то копипастишь, все же нужно осмысливать то, что получается в твоем конкретном случае. AndreySol, предпочитаю на вопросы, ответ на которые может легко получить сам спрашивающий - не отвечать. Ну а то, что универсальность бывает и вредна (более ресурсоемка и медлительнее) - наверное не стОит упоминать ... Изменено 27 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
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' Что это означает ? Ссылка на комментарий
*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, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) AndreySol, это банально означает, что читая 'книгу' НЕ с начала, не стОит удивляться , что будут встречаться непрочитанные ранее куски информации ... Ну а если удивляет - поиск по указанному ненайденному куску (о чем говорит лог) должно подсказать где же написано непрочитанное. Несложно заметить, что в игре имеется т.н. корневой конфиг-файл (system.ltx) который и определяет порядок чтения и 'дочерние' конфиги. Если понадобилось читать 'из середины' - не удивляемся, что под ваш запрос не все разработчикам учтено, а засучив рукава - переписываем потребное 'под себя'. Добавлено через 10 мин.: *Shoker*: ini_file() стоит использовать только когда ты работаешь с файлами, которые не подключены к оригинальной игре через sytem.ltx Аккуратнее в таких категоричных заявлениях. Ни что не мешает использовать и подключенные файлы (их ой как немало), но с умом конечно ... т.е. подразумевая, что 'родительские' иль 'сторонние' секции в запрашиваемом файле не используются. Изменено 27 Ноября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 А кто нибудь пробовал глубоко работать с нет-пакетами игрока? Возможно ли с помощью них например заменить у игрока xml-профиль, чтобы у него сменилось имя и иконка? И какие здесь есть тонкости. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Amicron 0 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Подскажите пожалуйста, есть ли в LUA функция равносильная функции sleep(время) в С\С++? Или как сделать так, что бы какое-либо действие происходило через указанное время? Ссылка на комментарий
*Shoker* 322 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 (изменено) Ммм, в оригинале кажется нет, а может ещё осталось, пусть уточнит кто нить... Была функция wait() (описана в _G.script), которая ставила указанный скрипт\функцию (?) на "паузу" на указанное время. Но вроде бы последний раз когда я её пытался использовать - игра у меня вылетела. Вообще же можешь использовать таймеры АМК, они сейчас есть почти в любом крупном моде, обычно в скрипте amk.script Позволяют выполнять какое то действие через определённый промежуток времени (либо в секундах либо в игровом времени (минуты, дни, часы)) Ищи по ключевым словам: __do_timer_action, has_g_timer, start_timer_g (?) ... Таймеры также почти наверняка найдёшь в любом моде на спальный мешок. Изменено 27 Ноября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
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 Как правильно использовать эту функцию в ЗП? Ссылка на комментарий
AndreySol 215 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Zander_driver после получение координат иконки, как их применить для CUIStatic ? Ссылка на комментарий
RvP 1 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Amicron, так же как и везде в Lua - не в главном потоке, а в созданной тобой нити. Про работу с нитями в теме по Lua Gun12 писал AndreySol, открываем справочник и смотрим как проинитить текстуру Vita sine libertate, nihil Vita sine litteris - mors est Ссылка на комментарий
Amicron 0 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 RvP, не могли бы вы мне привести пример использования? Траффик дорогой сейчас просто. Ссылка на комментарий
Nazgool 250 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Amicron Вот тут : в "Справочнике..." и тут : где-то в "Скриптовании..." Ссылка на комментарий
*Shoker* 322 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Вот ещё что хотел уточнить: в экспортированных в LUA UI элементах можно создать "Список со вложенным списком"? Тоесть как в ТЧшной энциклопедии. Есть ListBox, и там идёт название групп, при щёлканье на группу, список раскрывается, и там появляются новые элементы. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
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 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 Artos Ну, я расчитывал на обычный save\load. Изменить параметры игрока во время загрузки уровня, или же перед этим. Да и игрок то наверно с сервером как то общается. Не зря же у GSC есть скрипт actor_proxy.script Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 27 Ноября 2011 Поделиться Опубликовано 27 Ноября 2011 *Shoker*, а взглянув в упомянутый actor_proxy.script - не следует ли вывод, что он практически только для фактов создания и уничтожения объекта 'актор' и работы с инфопоршнями. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти