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 Ссылка на комментарий
naxac 2 477 Опубликовано 11 Августа 2024 Поделиться Опубликовано 11 Августа 2024 @Капрал Хикс , все верно, ведь это не id таска, а секция в конфиге. Если тебе нужно проверить состояние конкретного цикличного квеста, нужно это делать в task_manager.script 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Капрал Хикс 542 Опубликовано 11 Августа 2024 Поделиться Опубликовано 11 Августа 2024 3 часа назад, naxac сказал: нужно это делать в task_manager.script Вот там я и завис. Ну, пока меня и такой вариант устроит. Ещё бы награду информацией (инфопоршнем) за выполнение квеста прикрутить из АМК, но опять натыкаюсь на вылеты. Когда-то бы прикрутил на раз. Наверное сюда ткнусь за помощью. Ссылка на комментарий
Это популярное сообщение. naxac 2 477 Опубликовано 12 Августа 2024 Это популярное сообщение. Поделиться Опубликовано 12 Августа 2024 (изменено) 20 часов назад, Капрал Хикс сказал: Вот там я и завис Выглядит это примерно так: local tm = task_manager.get_random_task() local status = tm.task_info["секция_квеста_из_task_manager.ltx"].status if status == "selected" then -- если это задание взято и активно в данный момент, то... end Изменено 12 Августа 2024 пользователем naxac 1 3 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Labadal 68 Опубликовано 13 Августа 2024 Поделиться Опубликовано 13 Августа 2024 Подскажите функцию, которая при вызове удалит все трупы с локации? (вообще все, и мутантов и сталкеров, и кто бы угодно там ещё не умер) God save Hatsune Miku! Ссылка на комментарий
Stalkersof 186 Опубликовано 13 Августа 2024 Поделиться Опубликовано 13 Августа 2024 Посмотри скрипт sak_off_corpses.script есть во многих модах. Ну или в браузере набери уборщик трупов. Есть разные модификации этого скрипта. 1 1 Freeplay Graphic Mod(FGM) Ссылка на комментарий
Labadal 68 Опубликовано 13 Августа 2024 Поделиться Опубликовано 13 Августа 2024 [spawner] cond = {+info_portion} При выдаче поршня спавнится нпс. Можно сделать так, чтоб при заборе поршня он деспавнился, причем чтоб при выдаче поршня обратно - появлялся снова? God save Hatsune Miku! Ссылка на комментарий
Kirgudu 1 263 Опубликовано 14 Августа 2024 Поделиться Опубликовано 14 Августа 2024 (изменено) 16 часов назад, Labadal сказал: При выдаче поршня спавнится нпс. Про OGSR не скажу; в оригинальной игре прямого способа нет, однако можно придумать обходные. 1. Маленькая поправка: он не спавнится (происходит это уже в самом начале игры), а выходит в онлайн. Соответствующая проверка на, то что ему уже можно выйти в онлайн, делается здесь: se_stalker.se_stalker:can_switch_online(). Для обеспечения обратного перехода в оффлайн можно попробовать доработать зеркальную функцию se_stalker.se_stalker:can_switch_offline() так, чтобы при отсутствии инфопорции она выдавала всегда true, но там потребуется ещё, наверное, правильное завершение текущих работ. Сам не пробовал, поэтому не могу сказать, насколько такой вариант работоспособен. 2. Есть альтернативный способ: при старте игры объект сразу удалять (именно удалять, а не оставлять в оффлайне), в нужный момент спавнить, в другой снова удалять и далее по кругу. Способ описан здесь, пояснения по использованию пару лет назад давались здесь (см. пост по ссылке и несколько следующих постов на той же и следующей страницах). Запуск спавна объекта можно при этом организовать с помощью функции, вызываемой из элемента инфопорции action (см. здесь), а запуск его удаления, скажем, в его логике по проверке отсутствия нужной инфопорции. Способов много. Изменено 14 Августа 2024 пользователем Kirgudu 1 2 1 1 Инструмент Ссылка на комментарий
Labadal 68 Опубликовано 15 Августа 2024 Поделиться Опубликовано 15 Августа 2024 (изменено) @Kirgudu всё оказалось куда проще: [spawner] cond = {+info_portion} выдаешь info_portion - нпс появляется (выходит в онлайн) забираешь info_portion - нпс исчезает (уходит в оффлайн) Изменено 15 Августа 2024 пользователем Labadal 1 God save Hatsune Miku! Ссылка на комментарий
Kirgudu 1 263 Опубликовано 16 Августа 2024 Поделиться Опубликовано 16 Августа 2024 Значит, я ошибся, и первый пункт из упомянутых выше работает без всяких изменений в коде. Хорошо, если так. 1 Инструмент Ссылка на комментарий
Labadal 68 Опубликовано 19 Августа 2024 Поделиться Опубликовано 19 Августа 2024 Возможны ли инклуды в скриптах? у меня в _g скрипте есть несколько каллбеков из XRE: callback["on_item_belt"] = 130 callback["on_item_ruck"] = 131 callback["on_item_slot"] = 132 callback["entity_alive_before_hit"] = 152 вроде как они должны хранится в _g, но я хочу вынести их в отдельный файл, и заинклудить в _g. если так можно, конечно. Подскажите, пожалуйста. В настройках есть пункт, позволяющий кушать аптечки. Для этого есть какая-то функция в скриптах, или это полностью движковая штука? В каком порядке используются аптечки? Рандомно? или есть какой-то приоритет? God save Hatsune Miku! Ссылка на комментарий
Labadal 68 Опубликовано 20 Августа 2024 Поделиться Опубликовано 20 Августа 2024 Насчёт аптечек - если юзать их с забинденой кнопки, то они используются в порядке их попадания в инвентарь. Но видимо, если сначала юзнуть некоторые в рюкзаке, этот порядок может сломаться. God save Hatsune Miku! Ссылка на комментарий
Ghilli 0 Опубликовано 20 Августа 2024 Поделиться Опубликовано 20 Августа 2024 Всем здрасьте. Возможно ли как-то проверить, установлен ли конкретный апгрейд на броне/шлеме/оружии и, при наличии его или отсутствии, произвести какое-то действие(платформа: ЗП)? Листая тему, выше уже натыкался на подобный вопрос и ответ на него с примером кода от @Norman Eisenherz, но там было перечисление/считывание апгрейдов в общем, без выделения какого-то конкретного. Также решил поискать в rx_addons и rx_utils из состава AI Additions, но ввиду своей неопытности или невнимательности не смог найти ничего подобного. Ссылка на комментарий
Norman Eisenherz 323 Опубликовано 20 Августа 2024 Поделиться Опубликовано 20 Августа 2024 Получить всю таблицу из нетпакета, сравнить "есть/нет" по имени секции нужного апгрейда… В чем именно затык? 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Ghilli 0 Опубликовано 23 Августа 2024 Поделиться Опубликовано 23 Августа 2024 @Norman Eisenherz затык возник в том, что я немного не понимаю, как это правильно сделать Скрытый текст function check_upgrades() local helm = db.actor:item_in_slot(12) if not helm then return end -- выйти, если слот пуст local up_list = {} -- предустановленные апгрейды (конфиг) if not system_ini():line_exist(helm:section(), "installed_upgrades") then return end -- выйти, если апгрейд невозможен local up_mod = system_ini():r_string(helm:section(), "installed_upgrades") if up_mod then -- строка не пуста for up_sect in string.gfind(up_mod, "[%w_]+") do -- тексты вида "буквы, цифры, _" up_list[#up_list +1] = up_sect end end -- новые апгрейды (нетпакет) local sobj = alife():object( helm:id() ) local pk = net_packet() pk:w_begin(0) -- обязательный сброс позиции sobj:STATE_Write(pk) pk:r_seek(18) pk:r_stringZ() -- custom data pk:r_advance(8) pk:r_stringZ() -- visual name pk:r_advance(5) local n = pk:r_s32() -- размер списка апгрейдов if n > 0 then for i = 1, n do up_list[#up_list +1] = pk:r_stringZ() end end -- все, что было выше - еще Ваш код, найденный в этой теме -- ниже я попытался отследить не саму секцию, а параметр в ней, так как это универсальнее if #up_list > 0 then if system_ini():line_exist(up_list, "nightvision_sect") then local nv_check = system_ini():r_string(up_list, "nightvision_sect") if nv_check == effector_nightvision_1 then messenger.gwr_messenger("gwr_remove_your_outfit", 3000) end end end end На моменте с проверкой параметра как раз затык и возник. Сначала не происходило при проверке ничего. Сообщение не вылетало, хотя на Стальном шлеме был установлен апгрейд на ПНВ первого поколения. Затем я решил убрать проверку на само наличие nightvision_sect, в результате чего при установке грейда на Стальной шлем стал получать следующий вылет: [error]Arguments : Can't find variable nightvision_sect in [up_secona_helm_hardhat] Не понимаю, как сделать, чтобы оно ссылалось при проверке параметра на секции с названиями на "up_sect_", а не просто "up_" Ссылка на комментарий
Norman Eisenherz 323 Опубликовано 23 Августа 2024 Поделиться Опубликовано 23 Августа 2024 1. В системном конфиге нет ссылок на апгрейды, хотя их копии вставлены в конфиги оружия – по аналогии с [inventory_upgrades.script], стоит читать общий файл [item_upgrades.ltx]. 2. Для поиска параметра nightvision_sect надо не подставлять весь список up_list, а перебирать отдельные секции из него. 1 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Labadal 68 Опубликовано 25 Августа 2024 Поделиться Опубликовано 25 Августа 2024 Подскажите, как удалить артефакт из инвентаря и рестриктор? и то и другое пытался удалить через alife():release(), однако безуспешно. Артефакт мне нужно забрать (без сообщения о том, что он был изъят), а в рестрикторе у меня такая логика: [logic] active = sr_particle, nil [sr_particle] name = anomaly2\oasis_way path = esc_vagon_way mode = 2 looped = true Т.е. мне партикл убрать нужно. И вот при: local se_obj = alife():object("rest_name_vagon") if se_obj then alife():release(se_obj, true) end Партикл остаётся, т.е рестриктор никуда не делся. Я даже логику пробовал менять, изменял активную секцию, и тд. Партикл не уходит. В общем, подскажите, пожалуйста. God save Hatsune Miku! Ссылка на комментарий
abramcumner 1 179 Опубликовано 26 Августа 2024 Поделиться Опубликовано 26 Августа 2024 12 часов назад, Labadal сказал: Партикл остаётся, т.е рестриктор никуда не делся. Я даже логику пробовал менять, изменял активную секцию, и тд. Партикл не уходит. В общем, подскажите, пожалуйста. Попробуй закомментировать строки: local se_obj = alife():object("rest_name_vagon") --if se_obj then alife():release(se_obj, true) --end 1 Ссылка на комментарий
Labadal 68 Опубликовано 26 Августа 2024 Поделиться Опубликовано 26 Августа 2024 (изменено) @abramcumner фигу, даже так нифига. Ничего уже не понимаю. Если в СДК удалить этот рестиктор, то при срабатывании получаю вполне ожидаемый вылет: Expression : assertion failed Function : CALifeSimulator__release File : deep deep in space Line : 666 Description : Object to release is a zero pointer Т.е. как бы сомнений нет, что он его удаляет, в случае когда он есть. Изменено 26 Августа 2024 пользователем Labadal God save Hatsune Miku! Ссылка на комментарий
abramcumner 1 179 Опубликовано 26 Августа 2024 Поделиться Опубликовано 26 Августа 2024 @Labadal похоже, что ГСЦ такого не ожидала. И рестриктор удаляется, а партиклы не отключаются. Попробуй сначала перевести рестриктор в другую секцию/nil и только потом удалять. Или можно в bind_restrictor.script в функции function restrictor_binder:net_destroy() if st.active_scheme then xr_logic.issue_event(zone, st[st.active_scheme], "deactivate") -- добавить отправку события отключения схемы перед удалением xr_logic.issue_event(zone, st[st.active_scheme], "net_destroy") end 1 Ссылка на комментарий
ARTLantist 14 Опубликовано 4 Сентября 2024 Поделиться Опубликовано 4 Сентября 2024 Знатоки ТЧ, прошу помощи. Захотелось мне добавить в циклические квесты помимо стандартного описания, прописываемого в xml (по типу "мне поступил заказ на медузу, нужно срочно достать, берёшься?"), ещё и список наград, чтобы выглядело так: Скрытый текст Слышал поверье, что зуб кровососа притягивает удачу? Будто бы того, кто на шее носит такой зуб, аномалии отпускают, и артефакты сами в руки идут? В общем, это всё фигня, но есть болваны, которые верят и готовы платить хорошие деньги. Принесешь челюсть кровососа, я тебе хорошо заплачу. За это в награду ты получишь: "иконка" Деньги: 3000 "иконка" Предметы: Дробь 20, бинт, аптечка Как всё это добавить я разобрался, и иконки и текст нормально подставляются, но я никак не могу получить id квеста (напр. tm_monster_part_1) Вот так сейчас выглядит код: Скрытый текст function CRandomTask:action_task_show_reward(npc, actor) local task_desc = self.task_info["tm_monster_part_1"] local task_texture, task_rect local message task_texture, task_rect = get_texture_info("ui_iconsTotal_found_money", "ui_iconsTotal_found_money") db.actor:give_talk_message(tostring(self.task_info[self.task_id_by_init_phrase_id[p3]]), task_texture, task_rect, "iconed_answer_item") if task_desc.reward_money ~= nil then task_texture, task_rect = get_texture_info("ui_iconsTotal_found_money", "ui_iconsTotal_found_money") message = game.translate_string("reward_list_money").." "..tostring(task_desc.reward_money) db.actor:give_talk_message(message, task_texture, task_rect, "iconed_answer_item") end if task_desc.reward_item ~= nil then task_texture, task_rect = get_texture_info("ui_iconsTotal_found_thing", "ui_iconsTotal_found_thing") message = game.translate_string("reward_list_items") for kk,vv in pairs(task_desc.reward_item) do message = message..", "..game.translate_string(news_manager.get_inv_name(vv)) end db.actor:give_talk_message(message, task_texture, task_rect, "iconed_answer_item") end end И мне нужно вместо указанного мною id "tm_monster_part_1" как-то получить id выбранного в диалоге квеста. Как это сделать? Скрипт task_manager.script стандартный. Смотрел, как получают в других функциях, пробовал разные варианты, но что-то ни один не подошёл. Вот функции добавления диалога и вызова функции выше: Скрытый текст function CRandomTask:init_task_dialog(dlg, parent) local phr = dlg:AddPhrase("tm_seek_new_job","0","",-10000) local phrase_script = phr:GetPhraseScript() phr = dlg:AddPhrase("tm_"..parent.."_list_job","1","0",-10000) phrase_script = phr:GetPhraseScript() phrase_script:AddAction("task_manager.action_task_show") phrase_script:AddPrecondition("task_manager.precondition_vendor_can_task") phr = dlg:AddPhrase("tm_"..parent.."_has_no_job","2","0",-10000) phrase_script = phr:GetPhraseScript() phrase_script:AddPrecondition("task_manager.precondition_vendor_cannot_task") for k,v in pairs(self.task_id_by_parent[parent]) do phr = dlg:AddPhrase(self.task_info[v].name, tostring(self.task_info[v].init_phrase_id), "1", -10000) phrase_script = phr:GetPhraseScript() phrase_script:AddPrecondition("task_manager.precondition_task_avail") phr = dlg:AddPhrase(self.task_info[v].text, tostring(self.task_info[v].desc_phrase_id), tostring(self.task_info[v].init_phrase_id), -10000) phrase_script = phr:GetPhraseScript() phrase_script:AddAction("task_manager.action_task_show_reward") phr = dlg:AddPhrase("tm_seek_job_yes", tostring(self.task_info[v].yes_phrase_id), tostring(self.task_info[v].desc_phrase_id), -10000) phrase_script = phr:GetPhraseScript() phrase_script:AddAction("task_manager.action_give_task") --добавил данное действие для вызова функции выше phr = dlg:AddPhrase("tm_seek_job_no", tostring(self.task_info[v].no_phrase_id), tostring(self.task_info[v].desc_phrase_id), -10000) end dlg:AddPhrase("tm_seek_job_abandon","3","1",-10000) end -- -- -- function action_task_show_reward(npc, actor) get_random_task():action_task_show_reward(npc, actor) end 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти