Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском по разделу, ответ на него, вероятно, уже есть.
Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода.
Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа).
Благодарность выражаем в личке или же ставим плюсик в историю репутации. Подобные посты будут удаляться.
Пытаюсь тут сделать новую схему для НПС. Хочу сделать так, чтобы она срабатывала в том случае, если рядом с НПС находится какой-либо объект или мутант. В моде "Связь Времён" подсмотрел следующий код, проверяющий наличие рядом с неписем артефакта:
Цитата
function evaluator_look_for_art:check_item( v ) local obj = v:object() if isArtefact( obj ) then local s_obj = alife():object( obj:id() ) if s_obj then local parent_id = s_obj.parent_id if ( parent_id == nil or parent_id == 65535 ) then if self.object:see( obj ) then if obj:position():distance_to_sqr( self.object:position() ) < 20 * 20 then if self.object:accessible( obj:level_vertex_id() ) then self.st.target_art = obj self.st.vertex_position = obj:position() if self.object:object( "detector_elite" ) == nil then alife():create( "detector_elite", vector(), 0, 0, self.object:id() ) self.st.spawn_detector = true end return true end end end end end end return false end
Однако чуть позже меня предупредили, что парсинг всех 65535 объектов нагружает игру. Так ли это на самом деле? Есть ли альтернативные пути создания такой проверки?
Сообщение отредактировал Lektorrr - Пятница, 07.02.2020, 16:03
Lektorrr, 1. В данном коде нет проверки всего диапазона идентификаторов объектов, в этом коде объект передается в функцию из другой функции этого же скрипта, а точнее evaluator_look_for_art:evaluate проверяются объекты находившиеся в поле зрения НПС и о которых он еще "помнит":
Код
for o in self.object:memory_visible_objects() do if self:check_item( o ) then return true end end
Как видно использован движковый метод memory_visible_objects, возвращающий список таких объектов.
2. Да если заниматься проверкой всего диапазона идентификаторов объектов, тем более постоянно, то движек только этот и будет делать - нагрузка нереальная.
Сообщение отредактировал denis2000 - Пятница, 07.02.2020, 21:06
можно один раз при старте отобрать объекты, которые следует проверять в update
В оригинале разрабами специально для таких целей предусмотрен файл DB.script. Нужно внести в него свои необходимые таблицы и помещать в них ссылку на объекты при переходе объекта в онлайн. Тогда у вас всегда будет доступ как к серверной так и к клиентской части объекта. Сами ссылки на объекты помещать в таблицы из биндеров этих объектов. И удалять их оттуда же. В различных ситуациях ( а они в основном связаны с онлайновыми объектами, так как видеть игроку что творится за кадром не интересно ) достаточно будет перебрать нужную таблицу объектов. Никаких тормозов при этом в игре не будет. Например, когда я писал скрипт атаки турели, то в логику турели, можно было вписать в качестве цели не только actor или all, но и monster и stalker. В этом случае объекты брались из соответствующих таблиц из файла db.script и турель точно "валила" онлайновые объекты. Никаких переборов 65535 объектов, чтобы выбрать сталкеров или монстров, не было.
Если обозначить смарт как укрытие, то будут ли НПС задействовать в нём уже имеющиеся работы и анимпоинты во время выброса, или нужно расставлять отдельные для этого пути (_surge_1_walk...)?
Допустим у вас есть объект - труп. Хотелось бы посмотреть на код , который запретит лутать ГГ этот объект-труп, когда какой-то из, например, пяти НПС, вдруг решит его облутать.
З.Ы. Я знаю как это сделать и мне не нужно получать объект-труп, мне просто интересна ваша реализация этой хотелки через объект-труп.
Сообщение отредактировал makdm - Воскресенье, 09.02.2020, 00:15
Народ! Существует ли вариант заменить эмбиент по спейсу? Локация обьеденённая с подземкой, в подземке звук с поверхности. Задача накрыть подземку спейсом и когда ГГ в спейсе проигрывается указанный эмбиент, при выходе из спейса возвращается родной с локации...
Policai, Косвенно можно. Для этого при заходе в рестриктор подземки меняете погоду на локации на indoor и периодически проверяете, что она не изменилась на другую рандомную, а при выходе на любую для открытых локаций.
-- xr_corpse_detection.script -- в моменте когда непись начинает лутать труп дописываем utils.save_var(corpse,"corpse_loot_begin",true) -- непись залутал труп и забрал вещи utils.save_var(corpse,"corpse_loot_begin",nil)
-- actor_menu.script --если бы dead_body_search_wnd_opened() возвращал объект в виде трупа function dead_body_search_wnd_opened(obj) if obj and utils.load_var(obj,"corpse_loot_begin") then SetHudMsg(game.translate_string("st_already_looting"),8) local hud = get_hud() if (hud) then hud:HideActorMenu() end end end