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/
AndreySol 215 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 @Капрал Хикс Ну так у тебя же четко написано: попытка сравнить число с nil. Т.е. в переменной ver у тебя nil. Вот и раскапывай всю цепочку инициализации этой переменной и ищи место где она не инициализируется правильным значением. @Баба ЯГА Сделай так: wnd = nil -- объявили глобальную переменную далее wnd = ui_my_menu.menu() level.start_stop_menu(wnd, true) В переменной wnd будет объект класса твоего окна. Глобальная переменная будет доступна из любого иного места. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381723
Капрал Хикс 567 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 1 час назад, AndreySol сказал(а): Вот и раскапывай всю цепочку инициализации этой переменной и ищи место где она не инициализируется правильным значением. В том-то и дело, что эта переменная встречается только в этом скрипте и только в этой функции, с оригинала так. Где она инициализируется - непонятно. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381726
Chypakabra 987 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 10 часов назад, Капрал Хикс сказал(а): [error]Arguments : LUA error: ... of chernobyl\gamedata\scripts\dialog_manager.script:880: attempt to compare number with nil У вас LUA ругается на: 3 часа назад, AndreySol сказал(а): четко написано: попытка сравнить число с nil. Т.е. в переменной ver у тебя nil. И вместо того чтоб попытаться проверить чему-же равна ver, вы пытаетесь подменить её 10 часов назад, Капрал Хикс сказал(а): А вот при попытке поставить затычку перед строкой if ver >= 7 then -> if not ver then ver = 8 end... причём на ver = 8, хотя 10 часов назад, Капрал Хикс сказал(а): В system.ltx указан шестой патч, т.е. current_server_entity_version = 7 На что уже движок начинает ругаться 10 часов назад, Капрал Хикс сказал(а): 0023:05185AF0 xrGame.dll [error][ 87] : Параметр задан неверно. Думаю логичнее было бы затычку сделать так If ver == nil or ver == "nil" then ver = 7 end Хотя чукча е програмист и может ошибаться Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381736
Space.Marine 466 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 Приветствую ! Платформа ЗП. Попробовал перенести из мода на ТЧ скрипт на лечение раненых врагов. Собственно, вот что получилось: Скрытый текст local iTimer local npc_save function start_timer() iTimer = time_global() + 1*1000 end function timer_update() if iTimer and iTimer < time_global() then iTimer = nil npc_out_gulag(npc_save) end end function enemies_dialog_rep(first_speaker, second_speaker) local com = second_speaker:character_community() if com == "stalker" then db.actor:set_character_rank(db.actor:character_rank() + 40) elseif com == "killer" or com == "bandit" then second_speaker:set_character_community("stalker", 0, 0) db.actor:set_character_rank(db.actor:character_rank() + 30) npc_save = second_speaker start_timer() elseif second_speaker:character_community() == "dolg" then db.actor:set_character_rank(db.actor:character_rank() + 40) elseif second_speaker:character_community() == "freedom" then db.actor:set_character_rank(db.actor:character_rank() + 40) else second_speaker:set_character_community("stalker", 0, 0) db.actor:set_character_rank(db.actor:character_rank() + 30) end if second_speaker ~= nil then if com == "stalker" or com == "bandit" or com == "dolg" or com == "freedom" or com == "killer" then second_speaker:set_relation(game_object.friend, first_speaker) end end end function npc_out_gulag(second_speaker) local obj = alife():object(second_speaker:id()) local unreg_id = obj:smart_terrain_id() if unreg_id ~= 65535 and second_speaker:alive() then local unreg = alife():object(unreg_id) if unreg then unreg:unregister_npc(obj) end end npc_save = nil end meh.timer_update() - висит на апдейте в bind_stalker. enemies_dialog_rep(first_speaker, second_speaker) - вызывается из dialogs.script: Скрытый текст function transfer_medkit(first_speaker, second_speaker) if first_speaker:object("medkit") ~= nil then dialogs.relocate_item_section(second_speaker, "medkit", "out") --alife():release(alife():object(second_speaker:object("medkit"):id()), true) elseif first_speaker:object("medkit_army") ~= nil then dialogs.relocate_item_section(second_speaker, "medkit_army", "out") --alife():release(alife():object(second_speaker:object("medkit_army"):id()), true) else dialogs.relocate_item_section(second_speaker, "medkit_scientic", "out") --alife():release(alife():object(second_speaker:object("medkit_scientic"):id()), true) end alife():create("medkit_script", second_speaker:position(), second_speaker:level_vertex_id(), second_speaker:game_vertex_id(), second_speaker:id()) -- Тут надо анлочить аптечку для использования. xr_wounded.unlock_medkit(second_speaker) -- Лечение врагов if second_speaker:relation(first_speaker) == game_object.enemy then meh.enemies_dialog_rep(first_speaker, second_speaker) end first_speaker:change_character_reputation(10); end Всё, вроде, работает. Прошу проверить "грамотность" meh.script. Вопрос возник потому, что узнал, что неписей после принудительной смены community необходимо выводить из гулага. Раньше просто прям в dialogs.script было следующее: Скрытый текст if second_speaker:relation(first_speaker) == game_object.enemy then second_speaker:set_relation(game_object.friend, first_speaker) second_speaker:set_character_community("stalker", 0, 0) first_speaker:set_relation(game_object.friend, second_speaker) end first_speaker:change_character_reputation(10); end И также всё работало нормально. Просветите, пожалуйста, стоило вообще заморачиваться с meh.script или можно оставить всё как было без unregister_npc. P.S. Сам ни в коей мере не программист... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381738
Баба ЯГА 12 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 @AndreySol Помогло. Копнул дальше по твоему примеру, и оказалось, что можно и так тоже было: local MyMenu = ui_my_menu.menu() -- > type = userdata local menuIsShown = MyMenu:IsShown() -- > type = userdata local w = MyMenu:GetWidth() -- > type = number -> 1024 local mm_btn = MyMenu:GetButton("knopka"):GetWidth() -- > type = number -> 127 -- т.е. любой GET - работает отлично, и для самого меню, и для -- его елементов; если параметр был задан изначально - -- то вернёт значение, если небыло параметра изначально - то вернёт = nil -- а вот любой SET - не работает, увы... -- SET - всегда возвращает NIL и никакие параметры не меняются, а жаль... MyMenu:GetButton("knopka"):SetText( "меняю на другой" ) -- NIL жаль, думал можно получить меню, и в реальном времени менять координаты кнопок, цвет текста и т.д., но оказалось - нельзя... Хотя, возможно, я всё-же что-то делаю не так?... 1 Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... © Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381763
AndreySol 215 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 11 часов назад, Капрал Хикс сказал(а): встречается только в этом скрипте и только в этой функции Не правда. В аргументе ф-ции эта переменная - смотрите дальше, где вызывается эта ф-ция, и как передается соответствующий аргумент ф-ции. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381766
I am Dead 918 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 @Капрал Хикс Вот так твоя проблема решается: Скрытый текст function motivator_binder:load(reader) self.loaded = true printf("motivator_binder:load(): self.object:name()='%s'", self.object:name()) object_binder.load(self, reader) printf("motivator_binder:object_binder.load(): self.object:name()='%s'", self.object:name()) if reader:r_eof() then abort("[xr_motivator.script]SAVE FILE IS CORRUPT") end self.treasure_processed = reader:r_bool() xr_logic.load_obj(self.object, reader) if system_ini():r_u32("script","current_server_entity_version") > 6 then -- патч 6 self.npc_script_version = alife():object(self.object:id()).script_version dialog_manager.load(self.object, reader, self.npc_script_version) else -- патч 4 dialog_manager.load(self.object, reader) end trade_manager.load(self.object, reader) end А свои затычки из dialog_manager убери оставив лишь такой код: Скрытый текст function load(npc, reader, ver) if selected_phrase_by_id == nil then selected_phrase_by_id = { intro = {}, cool_info = {}, action_info = {} } end local flag = nil if ver >= 7 then flag = reader:r_stringZ() else flag = tostring(reader:r_s16()) end if flag ~= "-1" then selected_phrase_by_id.intro[npc:id()] = {phrase = flag, count = 0} else selected_phrase_by_id.intro[npc:id()] = nil end if ver >= 7 then flag = reader:r_stringZ() else flag = tostring(reader:r_s16()) end if flag ~= "-1" then selected_phrase_by_id.cool_info[npc:id()] = {phrase = flag, count = 0} else selected_phrase_by_id.cool_info[npc:id()] = nil end end 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381770
Капрал Хикс 567 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 1 час назад, AndreySol сказал(а): смотрите дальше, где вызывается эта ф-ция, и как передается соответствующий аргумент ф-ции. Вот он, единственный вызов в xr_motivator: dialog_manager.load(self.object, reader) Так в оригинале. dialog_manager.load(self.object, reader, self.npc_script_version) Так в RMA. Простите, для меня неочевидно, что self.npc_script_version = alife():object(self.object:id()).script_version Это ver тот самый (если это и имелось в виду). @I am Dead от души! Не думал, что аж так оно тянется. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381776
Biblia 4 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 Здравствуйте. Хотел бы задать вопросец(платформа CoP) : Поставил мод на анимированные медикаменты. Решил я добавить использование эффектов камеры при приеме медикаментов. Естественно, прописывать такое для каждого из предметов - глупо, потому я попробовал просто добавить проверку на параметра,но столкнулся с проблемой, что анимации срабатывает лишь раз, а потом все предметы используются так, как в ванильноме ЗП. Вопрос: есть ли функция для проверки использования не именно отдельного предмета, а просто? Ибо, я думаю, если сначала сделать проверку на использование, а потом на наличие параметра - все должно сработать. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381792
I am Dead 918 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 @Biblia Сделай проверку на класс предмета. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381793
Баба ЯГА 12 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 Подхожу к тайнику, открываю его, вопрос: как узнать ID именно этого рюкзака, который сейчас открыт? Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... © Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381797
I am Dead 918 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 Есть такая функция из xr_codition.script -- true если у актора одет шлем указанной секции function actor_wear_helmet(actor, npc, p) return p[1] ~= nil and actor:object( p[1] ) ~= nil and actor:item_in_slot(10) ~= nil and actor:item_in_slot(10):section() == p[1] end Как сделать тоже самое только для проверки предмета который находится на поясе? P.S почему то не получается с телефона поместить под спойлер. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381804
Biblia 4 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 @I am Dead напомните, какой функцией это задается? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381818
I am Dead 918 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 @Biblia Блин, я сейчас не у компьютера поэтому не могу наизусть пример написать. Тем более в интернета полно уроков на эту тему. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381821
Biblia 4 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 @I am Dead я гугли, но везде, увы, только проверки на наличие предмета и тому подобное, что мне сейчас не надо ( В ютубе пока не смотрел, ибо нет возможности. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381822
I am Dead 918 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 @Biblia Пример можешь поглядеть в новом арсенале 6, там есть скрипт на озвучивание подбираемого предмета по его классу( самое первое что пришло где можно подглядеть пример использования). 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381824
Norman Eisenherz 355 Опубликовано 27 Апреля 2021 Поделиться Опубликовано 27 Апреля 2021 @Баба ЯГА [bind_physic_object.script] generic_physics_binder:use_callback(obj, who) Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381884
ARTLantist 16 Опубликовано 27 Апреля 2021 Поделиться Опубликовано 27 Апреля 2021 25.04.2021 в 23:16, Biblia сказал(а): Естественно, прописывать такое для каждого из предметов - глупо С чего ты это взял?) Даже в таком сложном в функциональном плане моде, как Dead Air, сделано для каждого предмета отдельно. Вот: Скрытый текст outfit = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", [2] = "xr_effects.play_inv_repair_sewing_kit()", [378] = "actor_effects.use_helmet(0)", [379] = "xr_effects.disable_nv(db.actor, nil)", [380] = "xr_effects.disable_ui_inventory(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')", [2900] = "level.add_pp_effector('surge_fade.ppe', 8023, false)", [3020] = "level.add_cam_effector('camera_effects\\\\item_use_slow.anm', 8064, false,'')", [6000] = "level.remove_pp_effector(8023)", [7001] = "xr_effects.enable_ui_lite(db.actor, nil)", [7002] = "actor_effects.use_helmet(1)", [7003] = "xr_effects.enable_nv_and_imput(db.actor, nil)", [7004] = "actor_effects.use_weapon(1)" }, helm = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", [2] = "xr_effects.disable_nv(db.actor, nil)", [3] = "actor_effects.use_helmet(0)", [4] = "xr_effects.disable_nv(db.actor, nil)", [5] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8053, false,'')", -- [6] = "xr_effects.play_inv_repair_sewing_kit()", [7] = "level.add_cam_effector('camera_effects\\\\item_use_slow.anm', 8054, false,'')", [380] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1700] = "actor_effects.use_helmet(1)", [1701] = "xr_effects.enable_ui_lite(db.actor, nil)", [2500] = "xr_effects.enable_imput(db.actor, nil)", [2503] = "actor_effects.use_weapon(1)" }, gun_oil_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8053, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_spray_oil()", [4351] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [5450] = "actor_effects.use_helmet(1)", [6050] = "xr_effects.enable_imput(db.actor, nil)", [6650] = "actor_effects.use_weapon(1)" }, gun_oil_2_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8053, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_spray_oil()", [4351] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [5450] = "actor_effects.use_helmet(1)", [6050] = "xr_effects.enable_imput(db.actor, nil)", [6650] = "actor_effects.use_weapon(1)" }, cleaning_kit_p_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_brushes()", [3020] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8064, false,'')", [7681] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [8480] = "actor_effects.use_helmet(1)", [9080] = "xr_effects.enable_imput(db.actor, nil)", [9680] = "actor_effects.use_weapon(1)" }, cleaning_kit_p_2_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_brushes()", [3020] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8064, false,'')", [7681] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [8480] = "actor_effects.use_helmet(1)", [9080] = "xr_effects.enable_imput(db.actor, nil)", [9680] = "actor_effects.use_weapon(1)" }, cleaning_kit_p_3_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_brushes()", [3020] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8064, false,'')", [7681] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [8480] = "actor_effects.use_helmet(1)", [9080] = "xr_effects.enable_imput(db.actor, nil)", [9680] = "actor_effects.use_weapon(1)" }, --И далее для всех-всех-всех предметов, которые используют анимации Я же у себя сделал немного попроще - сделал общие скрипты анимаций для однотипных предметов - например, для всех таблеток одна анимация, для еды - другая, для воды - третья и т.д., и далее при использовании предмета отслеживаю его секцию и запускаю анимацию. У меня так сделано по большей части из-за нескольких юзаний одного типа предмета: Скрытый текст function use_item_stack(s_obj,obj) -- DRUGS USE -- caffeine x5 if(s_obj)and(s_obj:section_name()=="caffeine_5")then alife():create("caffeine_4", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="caffeine_4")then alife():create("caffeine_3", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="caffeine_3")then alife():create("caffeine_2", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="caffeine_2")then alife():create("caffeine", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="caffeine")then local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end -- DRUGS -- drug_charcoal x5 if(s_obj)and(s_obj:section_name()=="drug_charcoal_5")then alife():create("drug_charcoal_4", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="drug_charcoal_4")then alife():create("drug_charcoal_3", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="drug_charcoal_3")then alife():create("drug_charcoal_2", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="drug_charcoal_2")then alife():create("drug_charcoal", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="drug_charcoal")then items_animation.drugs_anims() end -- drug_coagulant x5 if(s_obj)and(s_obj:section_name()=="drug_coagulant_5")then alife():create("drug_coagulant_4", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end и т.д. для всех предметов. Насколько я понял, у тебя в конфигах указывается тип используемого предмета. Так в чём, собственно проблема? В колбеке на использование предмета делаешь ссылку на функцию, в которой проверяешь, чему эта секция равна, и запускаешь анимку в зависимости от результата: -- в конфиге: [kolbasa]:booster, food_base $spawn = "food and drugs\kolbasa" visual = dynamics\devices\dev_kolbasa\dev_kolbasa.ogf description = st_kolbasa_descr inv_name = st_kolbasa inv_name_short = st_kolbasa inv_weight = 0.4 inv_grid_width = 1 inv_grid_height = 1 inv_grid_x = 35 inv_grid_y = 18 cost = 960 attach_angle_offset = 0.440521, 1.378287, -0.644026 attach_position_offset = 0.104196, -0.010821, 0.076969 attach_bone_name = bip01_r_hand auto_attach = false eat_satiety = 0.646 eat_radiation = 0.0 eat_alcohol = 0.100 eat_health = -0.05 use_sound = interface\inv_eat_paperwrap anim_type = food --тип анимации --в скрипте: local anim_type = ini:r_string(obj:section(), "anim_type") if anim_type == "food" then --запускаешь камеру и всё, что нужно elseif anim_type == "drug" then ... end И в дополнение, запускать функцию на проверку типа анимации предмета надо из bind_stalker.script таким образом: --функция: function actor_binder:use_inventory_item(obj) --в конце её, перед последним end, пишешь: items_manager.use_item_stack(obj) -- твоя функция (я вставил свою для примера) end 26.04.2021 в 07:33, I am Dead сказал(а): Как сделать тоже самое только для проверки предмета который находится на поясе? Добавлять в движке итератор для пояса и с его помощью проверять наличие предмета нужной секции. Иначе никак. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381925
I am Dead 918 Опубликовано 27 Апреля 2021 Поделиться Опубликовано 27 Апреля 2021 49 минут назад, ARTLantist сказал(а): Добавлять в движке итератор для пояса и с его помощью проверять наличие предмета нужной секции. Иначе никак. Подсказали функцию которая замечательно работает. Скрытый текст function actor_has_item_on_belt(actor, npc, p) local obj = actor:object(p[1]) return obj and actor:is_on_belt(obj) end 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381927
ARTLantist 16 Опубликовано 27 Апреля 2021 Поделиться Опубликовано 27 Апреля 2021 @I am Dead а какая платформа? Просто на чистой зп ни в скриптах (_g.script), ни в движке нет такой функции Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/556/#findComment-1381928
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти