F.Constantine 0 Опубликовано 17 Января 2019 Всем доброго времени суток. Сделал первый в жизни скриптик к "Сталкеру ТЧ" - естественно, получил вылет . Подскажите, что не так сделал, пожалуйста. Скрытый текст Задача была повысить сопротивляемость урону всех НПС из сталкеров-одиночек (ну, просто надоело их трупы находить повсеместно). Сделать через конфиги не смог - разработчики там запутали все в какую-то безумную паутину перекрестных ссылок и #include-сов. Либо вообще не работают изменения, либо работают на всех НПС-людей, всех фракций сразу. Сделал маленькую функцию: function superresistance() if npc:character_community(stalker) then npc.health_hit_part = 0.1 end Параметр health_hit_part взят из конфигов сталкеров, это "процент хита, уходящий на отнимание здоровья". Прописал в файлик test.script В bind_stalker.script вставил ссылочку test.superresistance(), ну вот так: ... -- апдейт схемы детектора self.actor_detector:update() -- сверхсопротивляемость НПС test.superresistance() -- апдейт звуковой схемы актера xr_sound.update_actor() ... Что не так сделал? Заранее - спасибо. Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 17 Января 2019 @Dennis_Chikin, Спасибо за "совет", конечно . Я уже неделю разбираюсь с конфигами, весь опус моих разбирательств подробненько в теме "[SoC] Ковыряемся в файлах", на 992 странице если интересно - хотя вряд ли интересно. А можно хотя бы подсказать, как правильно прописать проверку НПС на принадлежность к фракции ? Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 17 Января 2019 (изменено) @Dennis_Chikin, Спасибо, но не помогло. Я, собственно попытался сделать все по подобию довольно известного метода (он есть где-то здесь на форуме) "как сделать НПС бессмертным" - отдельно взятого НПС по его CID: Скрытый текст Как сделать игрового НПС бессмертным Пример: function immortal() local npc = level_object_by_sid(006) --волк local npc2 = level_object_by_sid(092) --проводник local npc3 = level_object_by_sid(032)-- кузнецов local npc4= level_object_by_sid(100) --серый npc.health = 1 npc2.health = 1 npc3.health = 1 npc4.health = 1 end Вызов функции прописываем в файле bind_stalker.script : имя_файла.immortal() -- вызов нашей функции бессмертия имя файла - это имя файла куда мы положим функцию. Например, если в файл test.script - пишем test.immortal() и т.п. Я эту функцию себе в игре прописал, обессмертил с десяток важных персон, все прекрасно функционирует. Теперь, пользуясь Вашей подсказкой, сделал следующее: Скрытый текст Создал маленькую функцию: function superresistance( npc ) if npc:character_community() == "stalker" then npc.health = 1 end Прописал ее в файлик test.script. А в bind_stalker.script вставил вызов этой функции: ... -- апдейт схемы детектора self.actor_detector:update() -- сверхсопротивляемость НПС test.superresistance( npc ) -- апдейт звуковой схемы актера xr_sound.update_actor() ... В общем, снова вылеты. Кстати, в вызове нужно прописывать: test.superresistance( npc ) или test.superresistance() ? Изменено 17 Января 2019 пользователем F.Constantine Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 17 Января 2019 2 минуты назад, Dennis_Chikin сказал: Кстати, в том примере если кого-то из перечисленных не будет в игре - тоже будет вылет. Да, у меня эта функция с проверкой на живой-неживой для каждого персонажа. Я просто упрощенный вариант написал. 4 минуты назад, Dennis_Chikin сказал: В вызове должен быть передан непись, с которым что-то делаете. Ну, т.е. в данном случает должно быть именно test.superresistance( npc ) ? Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 17 Января 2019 @Dennis_Chikin, 5 часов назад, Dennis_Chikin сказал: Да, и Вы перед этим должны его откуда-то взять. Уф, сплошные ребусы. Вы же на совершенно непонятном мне языке разговариваете . В моем понимании "npc" в данном случае - любой НПС, которого мы проверяем на принадлежность к фракции "сталкеры". Но я, очевидно, ахинею несу, да ? Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 17 Января 2019 @Dennis_Chikin, Ок, т.е. то, что требовалось сделать - поставить ( npc ) в скобочках после названия функции? В этом смысле: "должны его откуда-то взять"? Ну второй-то вариант: Скрытый текст function superresistance( npc ) if npc:character_community() == "stalker" then npc.health = 1 end Прописал ее в файлик test.script. А в bind_stalker.script вставил вызов этой функции: test.superresistance( npc ) тоже дает вылеты. А в нем что не так ? Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 18 Января 2019 @naxac, Спасибо. Но я снова косячу, походу ... Я прописал в xr_motivator.script следующее: Скрытый текст --' Делаем салкеров-одиночек бессмертными function superresistance( self.object ) if self.object:character_community() == "stalker" then self.object:health = 1 end Вылетаю. Пробовал прописывать в конец файла после последней функции, пробовал в начале, после class "motivator_binder" (object_binder)… Пробовал сделать не отдельной функцией, а вставить в function motivator_binder:net_spawn(sobject) просто "проверку условия - выполнение "health = 1" - энд", типа скрипта "Для зомбированных чуваков говорим что аномалий не существует"... Не туда вставляю? Или снова не правильно создал функцию? Или ее вызов все же еще где-то нужно прописывать, в каком-то другом файле? Сорри за тупость, уже стыдно спрашивать, но помогите ! Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 18 Января 2019 @naxac, Огромнейшее тебе спасибо, добрый человек ! Все работает теперь, как часики !!! Погляжу, насколько эта штука поможет против умирания сталкеров вдали от ГлавГероя, но по крайней мере на глазах у меня собаки и дешевая шпана с ПМ-мами их больше не убивает. Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 7 Февраля 2019 Доброго дня всем. Я снова с нубскими вопросами, помогите, кому не жалко . Затеял отучить военных в "ТЧ" стрелять во все двуногое, что движется, сделал их нейтральными "одиночкам" и ГГ. При этом хочу сделать так, чтобы при приближении к охраняемым объектам они все же открывали огонь - что естественно. Проще всего вроде - сделать определенные гулаги враждебными игроку. Нашел простенькую функцию в файлах игры, изменил под гулаг блокпоста на Кордоне: Скрытый текст function killactor (actor, npc) xr_gulag.setGulagEnemy ("esc_blokpost", actor) end Но... Куда ее прописать правильно, чтоб она запустилась? Я куда только не вписывал, и изменять и так и сяк пытался - результата два: или солдатики в гулаге остаются нейтральными, или - вылет. Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @AndreySol, Ок, спасибо за ответ. Я сам как-то вначале собирался плясать от зон и рестрикторов. Но потом пришел к выводу, что это лишняя работа. Гулаги уже существуют, менять что-то в их работах мне не нужно - то, что происходит в оригинале ТЧ (актор "подошел слишком близко" - сагрил на себя гулаг), меня вполне устраивает. Опять же - нужные мне гулаги статичны и привязаны к зонам: блокпост на Кордоне и НИИ на Агропроме. Мне просто нужно объявить их враждебными актору, без всяких условий, хоть со старта игры, при том, что в целом я делаю группировку военных нейтральной к ГГ. Это вроде - проще некуда... Но у меня эта функция не работает . Я ее пробовал активировать и так, и этак, вплоть до того, что из стартового диалога с Сидоровичем пытался включить - блокпост остается нейтральным... Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @Dennis_Chikin, Я с этого и начинал. Ну вот смотрите: именно в этот gulag_escape.script я вписываю: Скрытый текст … function load_job(sj, gname, type, squad, groups) --'-------------------------------------------------------------------------- --' ESCAPE --'-------------------------------------------------------------------------- --' Escape blockpost if type == "esc_blokpost" then xr_gulag.setGulagRelation ("esc_blokpost", game_object.enemy, db.actor) end if type == "esc_blokpost" then t = { section = "logic@esc_blockpost_patrol1", idle = 0, ... Пробовал в начало, в конец, пробовал с другими функциями: xr_gulag.setGulagEnemy ("esc_blokpost", actor) или xr_gulag.setGulagGoodwill ("esc_blokpost", -5000, db.actor) пробовал так: Скрытый текст ... --' Escape blockpost if type == "esc_blokpost" then xr_gulag.setGulagRelation ("esc_blokpost", game_object.enemy, db.actor) t = { section = "logic@esc_blockpost_patrol1", idle = 0, ... Эффекта - ноль. Гулаг остается нейтральным. Что я не так делаю? Или необходимо создавать для этого отдельную функцию? Тогда подскажите, пожалуйста, как ее запустить. В "знаменитом покраснении "Свободы" прописаны куча проверок (на враждебность актора (а я сделал актора нейтральным воякам, как и наоборот), на смерть Лукаша, на принятие квеста от Черепа, и т.д., и т.п.), заканчивается же все на этой самой функции (плюс - на объявлении ГГ врагом всей группировки, что в моем случае не нужно). Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @Змея, 4 часа назад, Змея сказал: Огонь без предупреждения открывается только при попытке прямого нападения. Ну, да. Если не воспринимать просто как шутку - напомню, что в игре есть два квеста на "достать документы у военных". Которые при нейтралитете с военными можно выполнить, просто зайдя на базу и взяв чемоданчик - без "прямого нападения" . Вот ради них и танцы с бубном. Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @Dennis_Chikin, Вы о каком фрагменте? Том, куда я вставлял свои фрагменты в gulag_escape.script ? function load_job(sj, gname, type, squad, groups) Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @Змея, тем не менее игра позволяет стелсовое прохождение, ночью - ну, на крайняк, пристрелив одного-двух из пистолета с глушителем. Я не совсем понимаю, чем то, что ты описываешь, по результату отличается от того, что есть в оригинале - и что я хочу сохранить . Отсутствием предупреждения и выстрелов в воздух? Ну да. Можно сделать. Но в принципе ничего не поменяется. А ГГ и так все изначально предупредили, чтоб он от вояк подальше держался. Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @Dennis_Chikin, я - идиот, потому что . Все, вроде сделал, как надо, вроде работает, как хотел. Надо потестить на других армейских гулагах еще, но хоть в приципе дошло. СПАСИБО! Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @Dennis_Chikin, P.S. Я вот что сделал, так - это корректно: Скрытый текст function load_states(gname, type) if type == "esc_blokpost" then return function (gulag) local actor = db.actor xr_gulag.setGulagRelation ("esc_blokpost", game_object.enemy, db.actor) if not actor then return gulag.state end for k,v in pairs(gulag.Object) do if v ~= true and v:best_enemy() ~= nil then gulag.alarm_start = game.get_game_time() actor:give_info_portion("esc_blockpost_alarm") return 2 -- тревога end end if gulag.alarm_start == nil or game.get_game_time():diffSec(gulag.alarm_start) > 300 then if level.get_time_hours() >= 6 and level.get_time_hours() <= 22 then actor:give_info_portion("esc_blockpost_normal") return 0 -- день else return 1 -- ночь end else return 2 end end end … ? Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @Змея, тоже - P.S. 55 минут назад, Змея сказал: ГГ должен вынести этот блокпост. А тут анриал, что остальные вояки про это не узнают. На этот случай, как я понимаю, через game_relations.ltx можно очень просто организовать снижение relations вояк к главгерою за каждое "противоправное действие". Завалит нескольких "сапогов" - станет врагом группировки, что будет вполне естественно. Тут уж - личный выбор и его результаты: хошь сохранить нейтралитет - ползай на пузе ночью и пытайся по тихому стибрить чемоданчик, не хошь - выноси всех, но потом не обижайся. Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @Dennis_Chikin, ок, покумекаю еще. И протестирую полностью с новой игры. Пока - опять же с новой игры - патруль и часовые на блокпосте сразу в бинокле красненькие. Под мостом - нейтралы... Еще раз спасибо! Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 10 Февраля 2019 @AndreySol, 2 часа назад, AndreySol сказал: Какой же тут нейтралитет ? Нейтралитет всей группировки в целом. За исключением нескольких гулагов, занятых охраной секретных объектов или военных баз/блокпостов. Таких гулагов в игре всего 4 - пара на Кордоне (солдаты на блокпосту и спецназ) и пара на Агропроме (гарнизон НИИ и вояки в коллекторах). Ну, еще нужно сделать враждебными вояк, атакующих группу Крота на том же Агропроме, и спецназ у лаборатории №18. Всё, остальные меня устраивают как нейтралы - причем не только к актору, а к большинству фракций, кроме бандюков и наймов, к примеру. Ты не встречал в игре отряды солдат, просто ходящих по локациям - с одной на другую? При некоторых моих настройках респавна у меня их на Свалке получалось очень густо . Вот они тоже, к примеру, могут себе идти и никого не трогать, вместо того, чтобы атаковать все, что шевелится. Ну, так как проще: сделать враждебными полдюжины вполне определенных гулагов к ГГ и двух - к "одиночкам", или просчитывать и править все остальные возможные встречи вояк, причем со всеми группировками ? А combat_ignore + combat_ignore_cond - да, тоже полезно может быть. Поделиться этим сообщением Ссылка на сообщение
F.Constantine 0 Опубликовано 12 Февраля 2019 Добрый вечер. Я снова с бубном танцую вокруг relation гулагов военных. К актору разобрались, теперь бы еще к группировкам разобраться. Кому не лень, гляньте под спойлер : Скрытый текст Для военных по дефолту установлен нейтралитет к "одиночкам" и актору. Задача - сделать гулаг атакующих группу Крота на Агропроме вояк враждебным - и группировке "одиночек", и актору. Это - из gulag_agroprom.script. Выделенное жирным - мои вставки: function load_states( gname, type ) ... if type == "agr_factory_assault" then return function( gulag ) local community = self.object:character_community() if community == "stalker" then xr_gulag.setGulagRelation ("agr_factory_assault", game_object.enemy, self.object) end local actor = db.actor xr_gulag.setGulagRelation ("agr_factory_assault", game_object.enemy, db.actor) if not actor then return gulag.state end … Такое может быть? С актором для других гулагов работает - меня интересует по части группировки. Или - бред мой снова? Поделиться этим сообщением Ссылка на сообщение