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/
Voland-Li 117 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 Доброго времени! Задался вопросом, чтобы ставить мины противопехотные и/или противопехотные усиленные (при наличии их в рюкзаке) по направлению взгляда спереди. За основу взял key_handlers.script из правки на установку турели "Тайфун" Стрелка по направлению взгляда без выхода в меню по ESC (если не ошибаюсь от слава70). Там присутствует следующее: Скрытый текст [DIK_keys.DIK_NUMPAD4]={ func=function() local dir = db.actor:direction() local turret_fast = db.actor:object("strelok_turret") if turret_fast then amk.remove_item(turret_fast) local ap = db.actor:position() local lv = db.actor:level_vertex_id() local gv = db.actor:game_vertex_id() local turret = create_car("turret_to_strelok",xyz(ap.x+dir.x, ap.y, ap.z+dir.z), lv, gv, "scripts\\technics\\strelok_turret.ltx") --спереди map_spot(turret.id, "red_location", "Моя туррель") else meceniy_in_hell.horror_sound() end end }, Сделал примерно следующее: (bomba_mina_n - противопехотная, bomba_mina_b - противопехотная усиленная. Тут только пока про простую речь. Допилить на оба типа потом нет проблема.) Скрытый текст [DIK_keys.DIK_NUMPAD9]={ func=function() local dir = db.actor:direction() local bomb_fast_n = db.actor:object("bomba_mina_n") if bomb_fast_n then amk.remove_item(bomb_fast_n) local ap = db.actor:position() local lv = db.actor:level_vertex_id() local gv = db.actor:game_vertex_id() local turret = create_car("bomba_mina_n",xyz(ap.x+dir.x, ap.y, ap.z+dir.z), lv, gv, "") --спереди else meceniy_in_hell.horror_sound() end end }, Так вот, что-то не фурычит... Можешь тыкнуть пальцем что не так делаю? ЗЫ: указание на файл "scripts\\technics\\strelok_turret.ltx" убрал т.к. ИМХО для бомбы оно не к чему... ЗЫЗЫ: что-то редактирование сообщения тут не нашел... Вот автор вышеупомянутой правки @слава70. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367635
Zander_driver 10 348 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 Только что, Voland-Li сказал(а): local turret = create_car Полагаю, причина где-то тут Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367636
Voland-Li 117 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 @Zander_driver мм... ну да... Упустил этот момент... Но в принципе переменная то локальная, пофигу ж как она там называется? local bomb_fast_n = create_car("bomba_mina_n",xyz(ap.x+dir.x, ap.y, ap.z+dir.z), lv, gv, "") --спереди Так чтоль? Или вы имеете в виду, что не create_car а create ? Ах, да... Реакции НОЛЬ на нажатие НУМПАД9... 1 час назад, Voland-Li сказал(а): local bomb = create_car( вот так точнее. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367637
AndreySol 215 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 @Voland-Li Вы серьезно думаете, что ф-ция create_car может заспавнить любой объект? Мины, в ТЧ к примеру - это аномалии. Соответственно, надо создать объект, затем заполнить его нет-пакет необходимыми данными. А по названию ф-ции можно догадаться, что она спавнит что-то связанное с транспортом. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367646
Voland-Li 117 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 @AndreySol понял... просто спавном не занимался ни разу... как говориться на новые грабли наступаю... За наводку спасибо. ЗЫ: а на счет нулевой реакции на клавишу не подскажете ничего? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367661
Купер 3 343 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 @Colder , а "отсечку" сделать? function take_item_from_box(box, box_story_id) local box_name = box:name() if (math.random() < 0.75) then --* вот туточки --* Вариант 1: по имени if not string.find(box_name, 'уникальная часть имени нашего рюкзака') and (math.random() < 0.75) then --* Вариант 2: по секции if box:section() ~= 'наименование секции нашего рюкзака' and (math.random() < 0.75) then axr_sounds.play_sound([[weapons\generic_checkout]]) mine_box = box mine_timer = time_global()+3000 end end end 1 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367670
Colder 12 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 @Купер Спасибо большое! Добавил так: if not string.find(box_name, "active_ruck") and not string.find(box_name, "active_box") and not string.find(box_name, "active_system") and (math.random() < 0.75) then Ещё бы добавить что бы с кусачками, снижался шанс заминировании тайника! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367682
ARTLantist 14 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 Как проверить характеристику бронежилетая надетого на гг в скрипте? Например, мне нужно проверить радиозащиту, и если она меньше то прибавлять гг радиацию. И сходу следующий вопрос: как сделать бесконечный таймер, по истечении которого прибавлялась бы эта радиация? (Из этого всего знаю только как прибавить радиацию) 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367702
Zander_driver 10 348 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 1 час назад, ARTLantist сказал(а): Как проверить характеристику бронежилетая надетого на гг в скрипте? Привет. Если я не перепутал что-нибудь, и если речь идет об оригинальном движке, то, как то так. local outfit = db.actor:item_in_slot(6) -- получаем объект комбеза, если есть if outfit then local ocond = outfit:condition() -- выясняем состояние комбеза local ltx = system_ini() local osec = outfit:section() -- выясняем секцию конфига надетого комбеза local rdef = ltx:r_float(osec, "radiation_protection") -- читаем, на сколько этот комбез защищает от радиации local real_def = rdef * ocond -- вычисляем действующую защиту с учетом износа if real_def < 0.5 then db.actor.radiation = 0.1 -- например так) end end Надеюсь, пригодится для чего-нибудь 1 час назад, ARTLantist сказал(а): как сделать бесконечный таймер, по истечении которого Бесконечный, по истечении которого... почему-то мне кажется это словосочетание, странным. В биндерах многих объектов (И актора, т.е. в bind_stalker, тоже), есть метод update. А туда передается, в качестве входящего аргумента, переменная delta. Которая численно равна, количеству миллисекунд прошедших с прошлого вызова этого update. Может быть, это будет полезно для того, что на самом деле имелось в виду... А может быть, я "угадал" неправильно. А вообще, смотри тут: https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkciyam-i-klassam/ Много полезного найдешь. 1 4 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367734
ARTLantist 14 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 (изменено) 17 минут назад, Zander_driver сказал(а): local outfit = db.actor:item_in_slot(6) -- получаем объект комбеза, если есть if outfit then local ocond = outfit:condition() -- выясняем состояние комбеза local ltx = system_ini() local osec = outfit:section() -- выясняем секцию конфига надетого комбеза local rdef = ltx:r_float(osec, "radiation_protection") -- читаем, на сколько этот комбез защищает от радиации local real_def = rdef * ocond -- вычисляем действующую защиту с учетом износа if real_def < 0.5 then db.actor.radiation = 0.1 -- например так) end end Надеюсь, пригодится для чего-нибудь Бесконечный, по истечении которого... почему-то мне кажется это словосочетание, странным. Извиняюсь, сам щас прочёл и не понял, что написал, заработался просто немного? Я хотел сказать, один таймер, длинною, например, одну секунду, по истечении которой будет происходить функция и этот таймер будет запущен заново, и так бесконечно. Как-то так. А как правильно работать с этой delta? Уже долго голову ломаю, что это за переменная такая. Во многих модах её используют, а как она используется, разобраться никак не получается. Изменено 2 Февраля 2021 пользователем ARTLantist Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367741
Это популярное сообщение. Zander_driver 10 348 Опубликовано 2 Февраля 2021 Это популярное сообщение. Поделиться Опубликовано 2 Февраля 2021 2 часа назад, ARTLantist сказал(а): А как правильно работать с этой delta? Ну например, как то так: 1) local t0 = 0 function какой_то_биндер:update(delta) ... t0 = t0 + delta if t0 > 1000 then // То, что мы напишем здесь, будет вызываться с примерной частотой 1 раз в секунду. Иногда интервал между вызовами может быть // чуть-чуть больше или чуть-чуть меньше секунды, но если мы будем считать целый час, то насчитаем 3600 вызовов. Столько секунд в одном часе. t0 = t0 - 1000 end end Или так: 2) function какой_то_биндер:update(delta) // Допустим, нам надо, чтобы у актора радиация росла на 10% за секунду. ... db.actor.radiation = (0.1 * delta / 1000) end Для реализации неких процессов, происходящих непрерывно с некоторой скоростью. Как например рост радиации, или реген здоровья, от неких условий. Удобно использовать второй подход. Он же, кстати, используется и в движке, что наверное, указывает на то, что не только я один, дурак такой, так считаю. Но и создатели движка - тоже. Для реализации же, каких-либо тяжеловесных проверок. Допустим нам надо раз в х времени, вызвать какую-то функцию, которая требует много процессорного времени, и нежелательно ее дергать на каждом апдейте, чтобы не вызывать тормоза. Но, тем не менее ее надо вызывать регулярно. То можно использовать для ее вызова первый подход. И примеры такого, в движке тоже есть Хотя помнится, @Artos лет 8 назад, спорил со мной, доказывая что так делать неправильно и вообще нельзя. Мнения разные есть, о том что правильно и что нет. Однако оно работает, вызывая надлежащий код в надлежащие интервалы времени. 1 1 5 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367780
ARTLantist 14 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 @Zander_driver, большое пребольшое спасибо, теперь понятно всё! а как реализовать объединение и разъединение двух предметов в один, например, как сделано в Мизери с контейнерами артов? Мы наводим арт на контейнер и он туда кладётся. Потом нажимаем по контейнеру с артом ПКМ и у нас высвечивается окно "извлечь", нажимаем, и арт извлекается. Мне интересен именно такой способ, по большей части - как высветит это окно "извлечь". Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367787
Colder 12 Опубликовано 3 Февраля 2021 Поделиться Опубликовано 3 Февраля 2021 "Вывести окно извлечь" Если не ошибаюсь это движковая правка. Скрытый текст function start_repair_out(cond,num) local itm = db.actor:item_in_slot(num) local kit = kits[num] local s = cond-2 local sect = obj:section() local name = tostring(system_ini():r_string(obj:section(),"inv_name_short")) if itm ~= nil then axr_effects_data.devices_anim() alife():release(alife():object(itm:id()), true) axr_sounds.play_sound([[item_sounds\inv_repair_sewing]]) send_tip("%c[d_green]"..game.translate_string("st_dis_text_7").." "..game.translate_string(tostring(name))) create_repkit(kit..s) else send_tip("[d_red]Разбор невозможен!\\nОтсутствует объект для разбора!") create_repkit(kit..cond) end end Парни помогите вывести Сообщение разобраного обьекта! Сообщение не приходит а вылетает с "attempt to index global 'obj' (a nil value)" Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367892
Chypakabra 673 Опубликовано 3 Февраля 2021 Поделиться Опубликовано 3 Февраля 2021 4 часа назад, Colder сказал(а): local sect = obj:section() local name = tostring(system_ini():r_string(obj:section(),"inv_name_short")) obj:section() Это что и откуда? мне не понятно и движку тоже, вот он и ругается Скрытый текст function start_repair_out(cond,num) local itm = db.actor:item_in_slot(num) local kit = kits[num] local s = cond-2 local sect = itm:section() local name = tostring(system_ini():r_string(sect,"inv_name_short")) if itm ~= nil then axr_effects_data.devices_anim() alife():release(alife():object(itm:id()), true) axr_sounds.play_sound([[item_sounds\inv_repair_sewing]]) send_tip("%c[d_green]"..game.translate_string("st_dis_text_7").." "..game.translate_string(tostring(name))) create_repkit(kit..s) else send_tip("[d_red]Разбор невозможен!\\nОтсутствует объект для разбора!") create_repkit(kit..cond) end так попробуй 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367942
Colder 12 Опубликовано 3 Февраля 2021 Поделиться Опубликовано 3 Февраля 2021 Да работает спасибо! @ted.80 А нет! Не работает! Скрытый текст Arguments : LUA error: ...ü ×åðíîáûëÿ\gamedata\scripts\bind_stalker_ext.script:62: attempt to index global 'axr_sewing' (a nil value) Когда обьекта в слоте нету Ругаеться на сам скрипт Ой не то вот вылет Arguments : LUA error: ... - Òåíü ×åðíîáûëÿ\gamedata\scripts\axr_sewing.script:39: attempt to index local 'itm' (a nil value) 69 строка " if itm ~= nil then " 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367944
DMT 2 Опубликовано 3 Февраля 2021 Поделиться Опубликовано 3 Февраля 2021 Можно ли при определённых условиях заспавнить заданных размеров бокс, защищающий от выброса ? Какие есть способы ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367962
Zander_driver 10 348 Опубликовано 3 Февраля 2021 Поделиться Опубликовано 3 Февраля 2021 Только что, DMT сказал(а): заданных размеров бокс, защищающий от выброса ? Вообще-то, это зависит от местной реализации выброса в "там, о чем вы спрашиваете" Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367963
DMT 2 Опубликовано 3 Февраля 2021 Поделиться Опубликовано 3 Февраля 2021 3 минуты назад, Zander_driver сказал(а): Вообще-то, это зависит от местной реализации выброса в "там, о чем вы спрашиваете" Маленькое уточнение: вопрос о том, как вкрутить спавн бокса в оригинал ЗП. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1367964
Купер 3 343 Опубликовано 5 Февраля 2021 Поделиться Опубликовано 5 Февраля 2021 К посту. И ведь не поправит никто. Все сидят, ржут мило улыбаются. Детский сад, штаны на лямках. Но... вот из принципа! Вызвали мы функцию start_repair_out(cond,num) . Отлично. А дальше... А дальше пытаемся получить секцию и инвентарное наименование для объекта... local sect = itm:section() local name = tostring(system_ini():r_string(sect,"inv_name_short")) которого в слоте нет Идеологически верное решение: Скрытый текст function start_repair_out(cond,num) local itm = db.actor:item_in_slot(num) local kit = kits[num] if itm ~= nil then local s = cond-2 local sect = itm:section() local name = tostring(system_ini():r_string(sect,"inv_name_short")) ... else ... end end 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1368262
Okichi 965 Опубликовано 5 Февраля 2021 Поделиться Опубликовано 5 Февраля 2021 3 часа назад, Купер сказал(а): И ведь не поправит никто. Все сидят Ну откуда же нам знать - может, у человека этот obj глобальный. Там еще неплохо бы убедиться, что это именно клиентский объект получен, т.к. емнип, у серверных это читается через section_name(), а :section() - для клиентских. А во-вторых, @ted.80 - как раз на один такой пример указал, там уже и ежики догадаются ) По-хорошему - неплохо бы _в начале_ функции проверять даже наличие и тип переданных в нее параметров. И на время отладки - все это в лог выводить. Мало ли - может передается совсем не то, что ожидается. 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/544/#findComment-1368286
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти