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. Страшно смотреть, как на жестком диске прямо на глазах уменьшается место. Но еще страшнее смотреть, когда оно прямо на глазах увеличивается. Вангую. Скоро попросят правку:"Меченый появляется на Кордоне. Телепорт к Монолиту. Загадывает Желание. THE END." Ссылка на комментарий
Zander_driver 10 331 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 Только что, Voland-Li сказал(а): local turret = create_car Полагаю, причина где-то тут Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
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( вот так точнее. Страшно смотреть, как на жестком диске прямо на глазах уменьшается место. Но еще страшнее смотреть, когда оно прямо на глазах увеличивается. Вангую. Скоро попросят правку:"Меченый появляется на Кордоне. Телепорт к Монолиту. Загадывает Желание. THE END." Ссылка на комментарий
AndreySol 215 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 @Voland-Li Вы серьезно думаете, что ф-ция create_car может заспавнить любой объект? Мины, в ТЧ к примеру - это аномалии. Соответственно, надо создать объект, затем заполнить его нет-пакет необходимыми данными. А по названию ф-ции можно догадаться, что она спавнит что-то связанное с транспортом. 1 Ссылка на комментарий
Voland-Li 117 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 @AndreySol понял... просто спавном не занимался ни разу... как говориться на новые грабли наступаю... За наводку спасибо. ЗЫ: а на счет нулевой реакции на клавишу не подскажете ничего? Страшно смотреть, как на жестком диске прямо на глазах уменьшается место. Но еще страшнее смотреть, когда оно прямо на глазах увеличивается. Вангую. Скоро попросят правку:"Меченый появляется на Кордоне. Телепорт к Монолиту. Загадывает Желание. THE END." Ссылка на комментарий
Купер 2 793 Опубликовано 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 Ссылка на комментарий
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 Ещё бы добавить что бы с кусачками, снижался шанс заминировании тайника! Ссылка на комментарий
ARTLantist 14 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 Как проверить характеристику бронежилетая надетого на гг в скрипте? Например, мне нужно проверить радиозащиту, и если она меньше то прибавлять гг радиацию. И сходу следующий вопрос: как сделать бесконечный таймер, по истечении которого прибавлялась бы эта радиация? (Из этого всего знаю только как прибавить радиацию) 1 Ссылка на комментарий
Zander_driver 10 331 Опубликовано 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 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
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 Добавлено Опричник, 2 Февраля 2021 Изучите "Правила цитирования". https://www.amk-team.ru/forum/topic/13514-obyavleniya/ Устное предупреждение. Ссылка на комментарий
Это популярное сообщение. Zander_driver 10 331 Опубликовано 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 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
ARTLantist 14 Опубликовано 2 Февраля 2021 Поделиться Опубликовано 2 Февраля 2021 @Zander_driver, большое пребольшое спасибо, теперь понятно всё! а как реализовать объединение и разъединение двух предметов в один, например, как сделано в Мизери с контейнерами артов? Мы наводим арт на контейнер и он туда кладётся. Потом нажимаем по контейнеру с артом ПКМ и у нас высвечивается окно "извлечь", нажимаем, и арт извлекается. Мне интересен именно такой способ, по большей части - как высветит это окно "извлечь". Ссылка на комментарий
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)" Ссылка на комментарий
ted.80 251 Опубликовано 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 Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
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 Ссылка на комментарий
DMT 2 Опубликовано 3 Февраля 2021 Поделиться Опубликовано 3 Февраля 2021 Можно ли при определённых условиях заспавнить заданных размеров бокс, защищающий от выброса ? Какие есть способы ? Ссылка на комментарий
Zander_driver 10 331 Опубликовано 3 Февраля 2021 Поделиться Опубликовано 3 Февраля 2021 Только что, DMT сказал(а): заданных размеров бокс, защищающий от выброса ? Вообще-то, это зависит от местной реализации выброса в "там, о чем вы спрашиваете" Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
DMT 2 Опубликовано 3 Февраля 2021 Поделиться Опубликовано 3 Февраля 2021 3 минуты назад, Zander_driver сказал(а): Вообще-то, это зависит от местной реализации выброса в "там, о чем вы спрашиваете" Маленькое уточнение: вопрос о том, как вкрутить спавн бокса в оригинал ЗП. Ссылка на комментарий
Купер 2 793 Опубликовано 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 Ссылка на комментарий
Okichi 919 Опубликовано 5 Февраля 2021 Поделиться Опубликовано 5 Февраля 2021 3 часа назад, Купер сказал(а): И ведь не поправит никто. Все сидят Ну откуда же нам знать - может, у человека этот obj глобальный. Там еще неплохо бы убедиться, что это именно клиентский объект получен, т.к. емнип, у серверных это читается через section_name(), а :section() - для клиентских. А во-вторых, @ted.80 - как раз на один такой пример указал, там уже и ежики догадаются ) По-хорошему - неплохо бы _в начале_ функции проверять даже наличие и тип переданных в нее параметров. И на время отладки - все это в лог выводить. Мало ли - может передается совсем не то, что ожидается. 2 След от кругов на воде - это тоже след (с) Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти