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 605 Опубликовано 13 Августа 2025 Поделиться Опубликовано 13 Августа 2025 @mmindwork , если объекты из all.spawn, то у них есть уникальное имя, тогда можно получить объект: local obj = alife():object("object_name") А потом вертексы: local lv, gv = obj.m_level_vertex_id, obj.m_game_vertex_id Если есть story_id, то объект можно получить: local obj = alife():story_object(story_id) А затем и вертексы: см. выше. Перемещается он или нет, роли не играет. 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1507953
phalcor 60 Опубликовано 30 Августа 2025 Поделиться Опубликовано 30 Августа 2025 Привет всем живым! Если я запускаю любой партикл (к примеру так: p = particles_object( "путь"); p:play_at_pos(npc:position()), НУЖНО ЛИ как-то удалять? Я не про p:stop(), а про то, чтобы он не сохранился у меня в сейве. Т.е. ещё проще: сохраняется ли запущенный партикл в сейве, или после load его как ни бывало? Спасибо! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1508549
RayTwitty 587 Опубликовано 31 Августа 2025 Поделиться Опубликовано 31 Августа 2025 @phalcor в сейве точно ничего не сохраняется. Чтобы партикл удалился сам, достаточно просто не оставить ссылку на него, сборщик мусора lua затрет. При выгрузке уровня, очевидно, все ссылки затираются. Хотя наверняка там грохаются и все партиклы отдельно, не дожидаясь никаких GC, ведь есть и еще всякие движковые партиклы, типа аномалий. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1508621
Pavel_2000 6 Опубликовано 11 Сентября 2025 Поделиться Опубликовано 11 Сентября 2025 Здравствуйте помогите пожалуйста вот в этот скрипт добавить таблицу: function actor_binder:key_hold(key) if has_alife_info("item_id_used") then if not has_alife_info("test_work_start") and key == DIK_keys.DIK_W then test_script.test_func() end end end что бы key == DIK_keys.DIK_W перебирал значения т.е DIK_S, DIK_A, DIK_D, DIK_W «Если долго мучиться, что-нибудь получится» Охотник за артефактами|Crow Game Killer Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1509171
Kirgudu 1 370 Опубликовано 12 Сентября 2025 Поделиться Опубликовано 12 Сентября 2025 @Pavel_2000 local keys = { [DIK_keys.DIK_W] = true, [DIK_keys.DIK_A] = true, [DIK_keys.DIK_S] = true, [DIK_keys.DIK_D] = true } function actor_binder:key_hold(key) if has_alife_info("item_id_used") then if not has_alife_info("test_work_start") and keys[key] == true then test_script.test_func() end end end 1 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1509175
Pavel_2000 6 Опубликовано 12 Сентября 2025 Поделиться Опубликовано 12 Сентября 2025 (изменено) Спасибо большое. А как сделать что бы функция 4 часа назад, Kirgudu сказал: test_script.test_func() выполнилась только один раз т.е если например нажал одну из кнопок и неотпуская нажал другую - нужно что бы функция не вызывалась повторно пока одна из кнопок нажата скрипт который вызывается когда отпускаешь кнопку ну и тут получается что нужно что бы скрипт не вызывался при отпускании кнопки пока одна из кнопок зажата в скрипте который ловит что кнопка нажата и зажата function actor_binder:key_release(key) if has_alife_info("item_id_used") then if has_alife_info("test_work_start") and keys[key] == true then test_script.test_func_release_key() end end end в скрипте test_script.test_func() который вызывается при нажатии выдаётся test_work_start в скрипте test_script.test_func_release_key() который вызывается при отпускании стоит таймер по истечению которого забирается test_work_start инфопорции возможно и не нужны, просто без них у меня не получалось вообще то что мне нужно Изменено 12 Сентября 2025 пользователем Pavel_2000 «Если долго мучиться, что-нибудь получится» Охотник за артефактами|Crow Game Killer Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1509182
RayTwitty 587 Опубликовано 13 Сентября 2025 Поделиться Опубликовано 13 Сентября 2025 @Pavel_2000 если тебе надо что-то делать во время движения ГГ, то лучше отслеживать не кнопки, а стейт ГГ. Все подобные вещи в движке висят на апдейте. 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1509214
Pavel_2000 6 Опубликовано 13 Сентября 2025 Поделиться Опубликовано 13 Сентября 2025 @RayTwitty попытался понять как у движка узнать state гг. не получилось. зато нашёл как у движка узнать скорость гг и повесил на апдейт ту функцию local vec = db.actor:get_movement_speed() local cur_speed = math.sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z) if has_alife_info("item_id_used") and cur_speed>0 then if not has_alife_info("test_work_start") then test_script.test_func_on_run() --news_manager.send_tip(db.actor, "moving", nil, "information_dealer", 50) db.actor:give_info_portion("test_work_start") end end if has_alife_info("item_id_used") and cur_speed==0 then if has_alife_info("test_work_start") then test_script.test_func_on_stay() --news_manager.send_tip(db.actor, "staying", nil, "information_dealer", 50) db.actor:disable_info_portion("test_work_start") end end и всё заработало как я хотел «Если долго мучиться, что-нибудь получится» Охотник за артефактами|Crow Game Killer Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1509220
RayTwitty 587 Опубликовано 13 Сентября 2025 Поделиться Опубликовано 13 Сентября 2025 @Pavel_2000 эта тема скорее всего не прокатит, так как функция сработает при пинках ГГ другими объектами (аномалии, монстры и т.д.). У тебя в движке есть коллбеки на события клавиатуры, значит почти наверняка есть метод получения стейта ГГ - какой-нибудь db.actor:actor_body_state(). Смотри документацию по движку. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1509221
khyor 26 Опубликовано 13 Сентября 2025 Поделиться Опубликовано 13 Сентября 2025 @Pavel_2000 если хочешь, чтобы нормально подсказали - нормально спрашивай. С указанием движка и его версии/своих добавленных методов. На ап-про проверял у всех навыки телепатии - теперь сюда пришел. 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1509223
VVV32768 304 Опубликовано 9 Декабря 2025 Поделиться Опубликовано 9 Декабря 2025 (изменено) Всем доброго здравия. Нужен совет, как не убить ГГ. В двух словах - в xr_effects есть function kill_actor(actor, npc). Она убивает ГГ по любому поводу. Мне нужно её изменить так, что бы например, если в рюкзаке ГГ есть предмет N, то он оставался бессмертен. Если его нет, тогда функция работает в обычном режиме. Что то подобное делал давно(по моему через ельсе - выбор или), но подзабыл. И можно ли его применить на основной функции, тоже не знаю. П.С, ЧН 1.5.10 Движок не трогал, кроме рамок авто-захвата. Chypakabra Точно ! Вот пинка то мне и не хватало. Благодарю. Изменено 10 Декабря 2025 пользователем VVV32768 1 Безглючная работа компа и модов, зависит от присутствия у юзера драйверов mozgi.sys и pryami_hands.vxd. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513466
Chypakabra 987 Опубликовано 9 Декабря 2025 Поделиться Опубликовано 9 Декабря 2025 @VVV32768, простая проверка на присутствие предмета. if db.actor:object(N) then -- предмет есть гг живой else -- тут предмета нет - гг нужно убить end 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513467
Гость Опубликовано 10 Декабря 2025 Поделиться Опубликовано 10 Декабря 2025 Всем доброго! Вопрос такой - как отследить, что предмет выбросили в аномалию? К биндеру аномалии как-то подрубиться? Платформа ЧН. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513526
Гость Опубликовано 12 Декабря 2025 Поделиться Опубликовано 12 Декабря 2025 Всем доброго! К вопросу выше, попытался через item_pos:distance_to(anomaly_pos) определить, но если выбросить\поднять предмет отойти от аномалии и снова выбросить код все равно считает что предмет рядом с аномалией, я так понимаю это связано с клиентским\серверным объектом? Собственно вопрос рабочий ли вариант? И как правильно получить позицию итема который выбросили на землю? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513593
Kirgudu 1 370 Опубликовано 12 Декабря 2025 Поделиться Опубликовано 12 Декабря 2025 @Chizha нет, это связано с нахождением определяемого объекта в контейнере. Если ты подобрал предмет и пытаешься определить его координаты - они будут такими, какими были непосредственно перед взятием в инвентарь, на какое бы расстояние ты ни отошёл после этого. Соответственно, для того, чтобы получить истинные координаты объекта, необходимо понимать, где он находится в этот момент времени: - сам по себе: берём координаты самого объекта obj; - внутри любого контейнера, в том числе в инвентаре ГГ: берём родительский объект по свойству серверного объекта obj.parent_id, и уже у него берём координаты. Ну и не забываем, что для того, чтобы свойства серверного объекта обновились. Например, если пытаться брать координаты сразу в том участке кода, в котором выбросили предмет из инвентаря, то они будут ещё такими, как будто бы предмет до сих пор в инвентаре. Нужно пропустить апдейт. 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513613
Неравнодушный сталкер vampirnik77 126 Опубликовано 12 Декабря 2025 Неравнодушный сталкер Поделиться Опубликовано 12 Декабря 2025 (изменено) @Kirgudu Отвечу со своего истинного аккаунта(Chizha в топку). Да я разобрался уже походу, еще были проблемы в принципе определить что предмет именно выбросили, а не съели\переложили\продали\зарядили. Накидал вот такое Скрытый текст DROPPED_ITEMS = {} TIME_UPDATE = nil function on_item_drop_to_level(obj) -- чета делаем end function on_item_drop(obj) if not db.actor or not db.actor:alive() then return false end table.insert(DROPPED_ITEMS, obj:id()) TIME_UPDATE = time_global() + 200 end function check_drop_to_level() if not db.actor or not db.actor:alive() then return false end if TIME_UPDATE~=nil and #DROPPED_ITEMS > 0 and TIME_UPDATE < time_global() then TIME_UPDATE = nil for key, value in pairs(DROPPED_ITEMS) do local obj = level.object_by_id(value) if obj and not obj:parent() then on_item_drop_to_level(obj) end DROPPED_ITEMS[key] = nil end end end Скрытый текст function actor_binder:on_item_drop (obj) --code _slm_drop_to_level.on_item_drop(obj) --code end function actor_binder:update(delta) --code _slm_drop_to_level.check_drop_to_level() --code end Ну а дальше уже через item_pos:distance_to(anomaly_pos) Изменено 12 Декабря 2025 пользователем vampirnik77 1 1 Вернулся получается... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513617
Kirgudu 1 370 Опубликовано 12 Декабря 2025 Поделиться Опубликовано 12 Декабря 2025 @vampirnik77 вот это уже знакомый ник. ) Всё правильно, это возможный вариант реализации того, что я описал многими буквами. Остальное детали и нюансы. Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513618
Неравнодушный сталкер vampirnik77 126 Опубликовано 12 Декабря 2025 Неравнодушный сталкер Поделиться Опубликовано 12 Декабря 2025 (изменено) Что касается "выбросили в аномалию" в дополнение к моему предыдущему посту, вдруг кому полезно будет. Добавляем биндер для [base_zone] Скрытый текст [zone_base] idle_light_volumetric = false idle_light_shadow = true effective_radius = 0.75 pick_dof_effector = true idle_light_r1 = true ;bolt_entrance_particles = anomaly2\anomaly_entrance script_binding = bind_anomaly.bind [zone_base_noshadow]:zone_base idle_light_shadow = false idle_light_r1 = true Скрытый текст ANOMALIES = {} function check_drop_to_anomaly(obj) if not db.actor or not db.actor:alive() or not obj then return false end local nearest local dist_nearest for key, value in pairs(ANOMALIES) do local anomaly_pos, item_pos, find_dist = value.object:position(), obj:position(), 2.5 local dist_to_anomaly = item_pos:distance_to(anomaly_pos) --Если рядом с предметом есть аномалии находим самую близкую if dist_to_anomaly <= find_dist then if not nearest or dist_to_anomaly < dist_nearest then nearest = value dist_nearest = dist_to_anomaly end end end -- и считаем что бросили в нёё if nearest then nearest:on_drop_to_anomaly(obj) end return true end function bind(obj) obj:bind_object(anomaly_binder(obj)) end class "anomaly_binder" (object_binder) function anomaly_binder:__init(obj) super(obj) end function anomaly_binder:net_spawn(server_object) if not object_binder.net_spawn(self, server_object) then return false end ANOMALIES[self.object:id()] = self return true end function anomaly_binder:update(delta) object_binder.update(self, delta) end function anomaly_binder:on_drop_to_anomaly(obj) --чета делаем end Ну и check_drop_to_anomaly вызывается в on_item_drop_to_level. Это всё для ЧН(в ЗП думаю тоже примерно так, насчёт ТЧ не уверен) Изменено 12 Декабря 2025 пользователем vampirnik77 Вернулся получается... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513619
Неравнодушный сталкер vampirnik77 126 Опубликовано 14 Декабря 2025 Неравнодушный сталкер Поделиться Опубликовано 14 Декабря 2025 Всем доброго! Нужен совет\подсказка, можно ли как-то заспавнить в оффлайне(на другой локации например) рюкзак(аля стационарный тайник) по координатам и наполнить его предметами? UPD. И еще вопрос как можно определить что нпс торговец или техник? Торговца вроде через clsid можно определить, а с техником как быть... Вернулся получается... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513695
Kirgudu 1 370 Опубликовано 18 Декабря 2025 Поделиться Опубликовано 18 Декабря 2025 14.12.2025 в 07:08, vampirnik77 сказал: как можно определить что нпс торговец или техник? Торговца вроде через clsid можно определить, а с техником как быть... Прямого свойства или свойства нет-пакета не припомню. Но можно попробовать зайти через текущую логику и отображение в зависимости от неё точки на миникарте: для ЧН см. подсказки в stalker_generic.reset_show_spot(). Я бы так попробовал. Что же касается спавна на другой локации и наполнения контейнера, то проблем тут на первый взгляд не видно. Сначала нужные координаты и вертексы, затем спавн по id. 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/637/#findComment-1513922
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти