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 Ссылка на комментарий
DibokDibokin 1 Опубликовано 29 Января 2021 Поделиться Опубликовано 29 Января 2021 Здравствуйте. Есть ли способ держать принудительно в онлайне нпс с указанными story_id и нпс, которые находятся в указанном смарт_террейне? Ссылка на комментарий
AndreySol 215 Опубликовано 29 Января 2021 Поделиться Опубликовано 29 Января 2021 (изменено) @DibokDibokin Конечно есть. Выставить флаг flSwitchOffline в false, что запретит объекту переход в оффлайн. Для одиночного непися способов два: - в all.spawn выставить для object_flags соответствующее значение(в СДК просто, в разобранном ACDC спавне - сложнее); - скриптово, с помощью ф-ции set_switch_offline(int id, bool v) класса alife_simulator, вторым параметром false. Для гулагов, в настройках работ есть такой параметр, который вроде может запрещать офф\он лайн. Но там точно не помню, давно там не ковырялся. Изменено 29 Января 2021 пользователем AndreySol 1 2 3 Ссылка на комментарий
Colder 12 Опубликовано 30 Января 2021 Поделиться Опубликовано 30 Января 2021 @AndreySol Сделал так : Скрытый текст function radiation_anomaly_binder:update(delta) object_binder.update(self, delta) local actor = db.actor if actor then local dist = actor:position():distance_to(self.object:position()) if dist <= 10 then local hud = get_hud() hud:AddCustomStatic("radiation_hud_static", true) else local hud = get_hud() hud:RemoveCustomStatic("radiation_hud_static", false) end end end Но она почему то не горит а маргает Скрытый текст local actor = db.actor if actor then local dist = actor:position():distance_to(self.object:position()) if dist <= 15 then local hud = get_hud() hud:AddCustomStatic("radiation_hud_static", true) elseif dist <= 25 then local hud = get_hud() hud:RemoveCustomStatic("radiation_hud_static", false) Вот так нормально, можно даже наверно попроще! Ссылка на комментарий
naxac 2 547 Опубликовано 30 Января 2021 Поделиться Опубликовано 30 Января 2021 @Colder Скрытый текст function radiation_anomaly_binder:update(delta) object_binder.update(self, delta) local actor = db.actor if actor then local dist = actor:position():distance_to(self.object:position()) local st = get_hud():GetCustomStatic("radiation_hud_static") if dist <= 10 then if not st then get_hud():AddCustomStatic("radiation_hud_static"), true) end else if st then get_hud():RemoveCustomStatic("radiation_hud_static") end end end end 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Colder 12 Опубликовано 30 Января 2021 Поделиться Опубликовано 30 Января 2021 @naxac не работает И не вылетает Ссылка на комментарий
Zander_driver 10 348 Опубликовано 30 Января 2021 Поделиться Опубликовано 30 Января 2021 2 часа назад, Colder сказал(а): она почему то не горит а маргает Наверное, потому что аномалий на локации много? Одни ближе 10 метров, другие дальше. Одни статик включают, а другие выключают. По несколько раз за апдейт. 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
AndreySol 215 Опубликовано 31 Января 2021 Поделиться Опубликовано 31 Января 2021 Спрошу тута: в мультиплеере ЗП, скриптовая подсистема не работает совсем, или работает, но ограниченно? К примеру рестриктор можно поставить и прописать ему логику? Или дверь, соответственно, то же с логикой? И есть ли где нибудь, на репозиториях, сборки движка с попытками оживить скрипты в мультике? Ссылка на комментарий
Colder 12 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 Скрытый текст function treasure_take_item() local veroyatnos_podriva = 0.2 --// вероятность подрыва по умолчанию local location = level.name() local sila_podriva = 0.3 --// сила подрыва по умолчанию local be_or_not_to_be --// не трогать if location == "l01_escape" then veroyatnos_podriva = 0.1 sila_podriva = 0.4 end if location == "l02_garbage" then veroyatnos_podriva = 0.15 sila_podriva = 0.4 end if location == "l03_agroprom" then veroyatnos_podriva = 0.15 sila_podriva = 0.4 end if location == "l03u_agr_underground" then veroyatnos_podriva = 0.35 sila_podriva = 0.6 end if location == "l04_darkvalley" then veroyatnos_podriva = 0.25 sila_podriva = 0.4 end if location == "l04u_LabX18" then veroyatnos_podriva = 0.25 sila_podriva = 0.6 end if location == "05_bar" then veroyatnos_podriva = 0.25 sila_podriva = 0.4 end if location == "l06_rostok" then veroyatnos_podriva = 0.35 sila_podriva = 0.4 end if location == "l08_yantar" then veroyatnos_podriva = 0.35 sila_podriva = 0.4 end if location == "l08u_brainlab" then veroyatnos_podriva = 0.3 sila_podriva = 0.5 end if location == "l07_military" then veroyatnos_podriva = 0.35 sila_podriva = 0.4 end if location == "l10_radar" then veroyatnos_podriva = 0.3 sila_podriva = 0.4 end if location == "l11_pripyat" then veroyatnos_podriva = 0.35 sila_podriva = 0.4 end if location == "l12_stancia" then veroyatnos_podriva = 0.1 sila_podriva = 0.4 end if location == "l12_stancia_2" then veroyatnos_podriva = 0.1 sila_podriva = 0.4 end if location == "l12u_control_monolith" then veroyatnos_podriva = 0.1 sila_podriva = 0.4 end if location == "l12u_sarcofag" then veroyatnos_podriva = 0.1 sila_podriva = 0.4 end --// Снижаем шанс подрыва если есть кусачки if db.actor:object("kysazki") ~= nil then veroyatnos_podriva = veroyatnos_podriva - 0.1 end be_or_not_to_be = math.random(0,100) if be_or_not_to_be < veroyatnos_podriva * 100 then local lv,gv local a = vector() local radius = math.random(0,4) a = db.actor:position() a.x = a.x + radius a.z = a.z + radius a.y = a.y + math.random(0,1) lv = db.actor:level_vertex_id() gv = db.actor:game_vertex_id() local h2 = hit() h2.power = sila_podriva h2.direction = vector():set(0,0,0) h2.type = hit.explosion h2.impulse = 1 h2.draftsman = db.actor db.actor:hit(h2) sound_object("weapons\\mine_1"):play_at_pos(db.actor,vector():set(0,0,0),0,sound_object.s2d) particles_object("explosions\\explosion_mine"):play_at_pos(vector():set(a.x,a.y,a.z),lv,gv,65535) end end Всем привет! Есть функция на заминирование тайников! Проблема в том что, минируються не только тайники но и РЮКЗАК ДЛЯ ЗАКЛАДКИ СВОЕГО ТАЙНИКА! Можно ли как то заблочить функцию что бы она работала только с уже имеющими тайниками а не которые делает гг сам! Заранее спасибо! Ссылка на комментарий
AndreySol 215 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 @Colder Смотреть, естественно, надо там, откуда эта ф-ция вызывается, а сама она только хит формирует. Ссылка на комментарий
gam 118 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 1 час назад, AndreySol сказал(а): там, откуда эта ф-ция вызывается Имхо это хит-саллбек. А как сделанно не ведаю. Если есть возможность в виде любой модификации - либо отдельно, дайте ссылку на рабочий файл. К сожалению, на данный момент я могу использовать для скачивания майл и ограниченно народ Ссылка на комментарий
Colder 12 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 (изменено) @AndreySol Вызываеться из treasure_manager function take_item_from_box(box, box_story_id) printf("!!! take item from box %s", tostring(box:is_inv_box_empty())) if box:is_inv_box_empty() == true then get_treasure_manager():treasure_empty(box, box_story_id) end axr_treasure.treasure_take_item() --// сама функция end Скрытый текст function take_item_from_box(box, box_story_id) printf("!!! take item from box %s", tostring(box:is_inv_box_empty())) if box:is_inv_box_empty() == true then get_treasure_manager():treasure_empty(box, box_story_id) local box_name = box:name() printf("-"..box_name) if (math.random() < 0.75) then axr_sounds.play_sound([[weapons\generic_checkout]]) mine_box = box mine_timer = time_global()+3000 end end end function actor_on_update() if (mine_timer) and (mine_timer < time_global()) then local blow_particle = particles_object("explosions\\explosion_mine") blow_particle:play_at_pos(mine_box:position()) local h = hit() h.type = hit.explosion h:bone("bip01_spine") h.power = 1 h.impulse = 2 h.direction = vector():set(0,0,1) h.draftsman = db.actor if db.actor:position():distance_to(mine_box:position()) < 3 then db.actor:hit(h) end mine_timer = nil mine_box = nil end end Сделал проще! Все это влежит в treasure_manager. Но эффект тот же. Закладываю свой тайник И ОН ТОЖЕ БАХАЕТ! Изменено 1 Февраля 2021 пользователем Colder Ссылка на комментарий
gam 118 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 40 минут назад, Colder сказал(а): function take_item_from_box(box, box_story_id) printf("!!! take item from box %s", tostring(box:is_inv_box_empty())) if box:is_inv_box_empty() == true then get_treasure_manager():treasure_empty(box, box_story_id) local box_name = box:name() printf("-"..box_name) if (math.random() < 0.75) then axr_sounds.play_sound([[weapons\generic_checkout]]) mine_box = box mine_timer = time_global()+3000 end end end function actor_on_update() if (mine_timer) and (mine_timer < time_global()) then local blow_particle = particles_object("explosions\\explosion_mine") blow_particle:play_at_pos(mine_box:position()) local h = hit() h.type = hit.explosion h:bone("bip01_spine") h.power = 1 h.impulse = 2 h.direction = vector():set(0,0,1) h.draftsman = db.actor if db.actor:position():distance_to(mine_box:position()) < 3 then db.actor:hit(h) end mine_timer = nil mine_box = nil end end Жалкий кусок кода. Как нить Вашу конверсию плиз. Ссылка на комментарий
Colder 12 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 Можно ещё раз? Ссылка на комментарий
gam 118 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 Только что, gam сказал(а): axr_sounds.play_sound([[weapons\generic_checkout]]) хоть отселя. Ссылка на комментарий
Colder 12 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 Я не понимаю что ты пишешь. Ссылка на комментарий
gam 118 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 @Colder Я попробовал сказать выше. Нет возможности полноценно использовать интернет. Поделитесь тем, что Вы использовали в своих наработках. Ссылка на комментарий
Colder 12 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 (изменено) сейчас https://yadi.sk/d/KSdvyhfZwD7I7Q Изменено 1 Февраля 2021 пользователем Colder Ссылка на комментарий
ARTLantist 14 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 Не знаю, в ту ли тему я обращаюсь, поэтому заранее извините. Как сделать черный экран вначале игры и постепенно убрать его (типо гг открывает глаза). Всю катсцену сделал, всё работает идеально, но на счёт затемнения нигде не могу найти инфу Ссылка на комментарий
gam 118 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 @ColderЖелательно скрипт\ конфиг папки с которыми Вы работаете. @Colder function CTreasure:__init() local community = parse_names(utils.cfg_get_string(self.ini, id, "community", nil, false, "", "stalker, bandit, dolg, freedom")) К сожалению нечем оперировать, но возможно некой фракции не хватает? Ссылка на комментарий
Colder 12 Опубликовано 1 Февраля 2021 Поделиться Опубликовано 1 Февраля 2021 Это оригинальный файл! Там только функция добавлена и все! Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти