Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

Всем доброго времени суток.

 

Сделал первый в жизни скриптик к "Сталкеру ТЧ" - естественно, получил вылет :). Подскажите, что не так сделал, пожалуйста.


 

Скрытый текст

 

Задача была повысить сопротивляемость урону всех НПС из сталкеров-одиночек (ну, просто надоело их трупы находить повсеместно). Сделать через конфиги не смог - разработчики там запутали все в какую-то безумную паутину перекрестных ссылок и #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()

...

 

 

Что не так сделал? Заранее - спасибо.

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, Спасибо за "совет", конечно :(. Я уже неделю разбираюсь с конфигами, весь опус моих разбирательств подробненько 

в теме "[SoC] Ковыряемся в файлах", на 992 странице

если интересно - хотя вряд ли интересно.

А можно хотя бы подсказать, как правильно прописать проверку НПС на принадлежность к фракции :)?

 

Поделиться этим сообщением


Ссылка на сообщение

@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()

?

 

Изменено пользователем F.Constantine

Поделиться этим сообщением


Ссылка на сообщение
2 минуты назад, Dennis_Chikin сказал:

Кстати, в том примере если кого-то из перечисленных не будет в игре - тоже будет вылет.

 

Да, у меня эта функция с проверкой на живой-неживой для каждого персонажа. Я просто упрощенный вариант написал.

 

4 минуты назад, Dennis_Chikin сказал:

В вызове должен быть передан непись, с которым что-то делаете.

 

Ну, т.е. в данном случает должно быть именно test.superresistance( npc ) ? 

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, 

5 часов назад, Dennis_Chikin сказал:

Да, и Вы перед  этим должны его откуда-то взять.

 

Уф, сплошные ребусы. Вы же на совершенно непонятном мне языке разговариваете :). В моем понимании "npc" в данном случае - любой НПС, которого мы проверяем на принадлежность к фракции "сталкеры". Но я, очевидно, ахинею несу, да :)?

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, Ок, т.е. то, что требовалось сделать - поставить ( npc ) в скобочках после названия функции? В этом смысле: "должны его откуда-то взять"?

 

Ну второй-то вариант:

Скрытый текст

 

function superresistance( npc )
if npc:character_community() == "stalker" then
npc.health = 1
end

 

Прописал ее в файлик test.script. А в bind_stalker.script вставил вызов этой функции:

 

    test.superresistance( npc )

 

 

тоже дает вылеты. А в нем что не так :)?

Поделиться этим сообщением


Ссылка на сообщение

@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" - энд", типа скрипта "Для зомбированных чуваков говорим что аномалий не существует"...

Не туда вставляю? Или снова не правильно создал функцию? Или ее вызов все же еще где-то нужно прописывать, в каком-то другом файле? Сорри за тупость, уже стыдно спрашивать, но помогите :)!

Поделиться этим сообщением


Ссылка на сообщение

@naxac, Огромнейшее тебе спасибо, добрый человек :)! Все работает теперь, как часики :)!!!

Погляжу, насколько эта штука поможет против умирания сталкеров вдали от ГлавГероя, но по крайней мере на глазах у меня собаки и дешевая шпана с ПМ-мами их больше не убивает.

:good2:

Поделиться этим сообщением


Ссылка на сообщение

Доброго дня всем. Я снова с нубскими вопросами, помогите, кому не жалко :blush:.

 

Затеял отучить военных в "ТЧ" стрелять во все двуногое, что движется, сделал их нейтральными "одиночкам" и ГГ. При этом хочу сделать так, чтобы при приближении к охраняемым объектам они все же открывали огонь - что естественно. Проще всего вроде  - сделать определенные гулаги враждебными игроку.

 

Нашел простенькую функцию в файлах игры, изменил под гулаг блокпоста на Кордоне:

Скрытый текст

function killactor (actor, npc)
    xr_gulag.setGulagEnemy ("esc_blokpost", actor)
end

 

Но... Куда ее прописать правильно, чтоб она запустилась? Я куда только не вписывал, и изменять и так и сяк пытался - результата два: или солдатики в гулаге остаются нейтральными, или - вылет.

Поделиться этим сообщением


Ссылка на сообщение

@AndreySol, Ок, спасибо за ответ. Я сам как-то вначале собирался плясать от зон и рестрикторов. Но потом пришел к выводу, что это лишняя работа. Гулаги уже существуют, менять что-то в их работах мне не нужно - то, что происходит в оригинале ТЧ (актор "подошел слишком близко" - сагрил на себя гулаг), меня вполне устраивает. Опять же - нужные мне гулаги статичны и привязаны к зонам: блокпост на Кордоне и НИИ на Агропроме. Мне просто нужно объявить их враждебными актору, без всяких условий, хоть со старта игры, при том, что в целом я делаю группировку военных нейтральной к ГГ. Это вроде - проще некуда... Но у меня эта функция не работает :blink:. Я ее пробовал активировать и так, и этак, вплоть до того, что из стартового диалога с Сидоровичем пытался включить - блокпост остается нейтральным...

Поделиться этим сообщением


Ссылка на сообщение

@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,

...

 

Эффекта - ноль. Гулаг остается нейтральным. Что я не так делаю? Или необходимо создавать для этого отдельную функцию? Тогда подскажите, пожалуйста, как ее запустить.

 

В "знаменитом покраснении "Свободы" прописаны куча проверок (на враждебность актора (а я сделал актора нейтральным воякам, как и наоборот), на смерть Лукаша, на принятие квеста от Черепа, и т.д., и т.п.), заканчивается же все на этой самой функции (плюс - на объявлении ГГ врагом всей группировки, что в моем случае не нужно).

Поделиться этим сообщением


Ссылка на сообщение

@Змея, 

4 часа назад, Змея сказал:

Огонь без предупреждения открывается только при попытке прямого нападения.

Ну, да. Если не воспринимать просто как шутку - напомню, что в игре есть два квеста на "достать документы у военных". Которые при нейтралитете с военными можно выполнить, просто зайдя на базу и взяв чемоданчик - без "прямого нападения" ;). Вот ради них и танцы с бубном.

Поделиться этим сообщением


Ссылка на сообщение

@Змея, тем не менее игра позволяет стелсовое прохождение, ночью - ну, на крайняк, пристрелив одного-двух из пистолета с глушителем. Я не совсем понимаю, чем то, что ты описываешь, по результату отличается от того, что есть в оригинале - и что я хочу сохранить :). Отсутствием предупреждения и выстрелов в воздух? Ну да. Можно сделать. Но в принципе ничего не поменяется. А ГГ и так все изначально предупредили, чтоб он от вояк подальше держался. 

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, я - идиот, потому что :dash2:.

Все, вроде сделал, как надо, вроде работает, как хотел. Надо потестить на других армейских гулагах еще, но хоть в приципе дошло.

СПАСИБО!

Поделиться этим сообщением


Ссылка на сообщение

@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

…

?

Поделиться этим сообщением


Ссылка на сообщение

@Змея, тоже - P.S.

55 минут назад, Змея сказал:

ГГ должен вынести этот блокпост. А тут анриал, что остальные вояки про это не узнают.

На этот случай, как я понимаю, через game_relations.ltx можно очень просто организовать снижение relations вояк к главгерою за каждое "противоправное действие". Завалит нескольких "сапогов" - станет врагом группировки, что будет вполне естественно. Тут уж - личный выбор и его результаты: хошь сохранить нейтралитет - ползай на пузе ночью и пытайся по тихому стибрить чемоданчик, не хошь - выноси всех, но потом не обижайся.

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, ок, покумекаю еще. И протестирую полностью с новой игры. Пока - опять же с новой игры - патруль и часовые на блокпосте сразу в бинокле красненькие. Под мостом - нейтралы... 

Еще раз спасибо!

Поделиться этим сообщением


Ссылка на сообщение

@AndreySol, 

2 часа назад, AndreySol сказал:

Какой же тут нейтралитет ?

Нейтралитет всей группировки в целом. За исключением нескольких гулагов, занятых охраной секретных объектов или военных баз/блокпостов. Таких гулагов в игре всего 4 - пара на Кордоне (солдаты на блокпосту и спецназ) и пара на Агропроме (гарнизон НИИ и вояки в коллекторах). Ну, еще нужно сделать враждебными вояк, атакующих группу Крота на том же Агропроме, и спецназ у лаборатории №18. Всё, остальные меня устраивают как нейтралы - причем не только к актору, а к большинству фракций, кроме бандюков и наймов, к примеру. Ты не встречал в игре отряды солдат, просто ходящих по локациям - с одной на другую? При некоторых моих настройках респавна у меня их на Свалке получалось очень густо :). Вот они тоже, к примеру, могут себе идти и никого не трогать, вместо того, чтобы атаковать все, что шевелится.

Ну, так как проще: сделать враждебными полдюжины вполне определенных гулагов к ГГ и двух - к "одиночкам", или просчитывать и править все остальные возможные встречи вояк, причем со всеми группировками :) ?

А combat_ignore + combat_ignore_cond - да, тоже полезно может быть.

Поделиться этим сообщением


Ссылка на сообщение

Добрый вечер.

Я снова с бубном танцую вокруг relation гулагов военных. К актору разобрались, теперь бы еще к группировкам разобраться. Кому не лень, гляньте под спойлер :blush::

 

Скрытый текст

Для военных по дефолту установлен нейтралитет к "одиночкам" и актору. Задача - сделать гулаг атакующих группу Крота на Агропроме вояк враждебным - и группировке "одиночек", и актору.

 

Это - из 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
    …
 

Такое может быть? С актором для других гулагов работает - меня интересует по части группировки. Или - бред мой снова?

 

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...