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

=VENOM=

Проверенные
  • Число публикаций

    131
  • Регистрация

  • Последнее посещение

  • AMKoin

    20 [Подарить AMKoin]

Сообщения опубликованы =VENOM=

  1. Согласен с TIGER_VLAD, для себя такую проблему решал давным-давно - похоже, тем же способом, что и в ЧН на болотах (точно не помню, в ЧН не играл с момента выхода игры, наверное :) ). 2 варианта: первый попроще, если вокруг левелчейнджера есть много свободного места, "накрываем" его рестриктором, с шейпом, бОльшим, чем у левелчейнджера. В его логике выставляем условия, при которых рестриктор будет "возвращать" игрока в заданную (заданные) точки функцией set_actor_position+set_actor_direction, не давая ему "добраться" до левелчейнджера. И, может быть, даже с соответствующим сообщением, типа "дорога закрыта" :) . Второй вариант, если пространство у перехода ограничено, и рестриктором не получается надёжно перекрыть левелчейнждер - логику рестриктора, перемещающую игрока оставляем, как и в первом случае, а вот сам левелчейнджер придётся спонить/удалять уже либо из логики рестриктора (что очень удобно, в общем-то), либо где-то в другом месте, где удобнее разработчику.

    • Спасибо 1
    • Нравится 1
  2. Касательно обреза и воплей про группу Крота. Выяснилось, что кости модельки оружия в этой анимации значения не имеют. Анимация работает только с оружием класса WP_BM16, то есть этому сталкеру запросто можно всучить и ТОЗ-34, к примеру. А можно и вообще либо подменить визуал обреза, либо создать "фейковый" ствол на классе WP_BM16 с каким-нибудь визуалом - в качестве прикола:

    Сам прикол :) .

    • Нравится 1
    • Не согласен 1
    • Полезно 1
  3. 2 SWEAW. Если нужно изменить всего лишь текст, то файл локализации - ui_st_pda.xml, если изменить свойства самого окна - то в файле message_box.xml, первая же секция. Если же нужно, чтобы левелчейнджер срабатывал без запроса "Перейти на другую локацию?", тогда в свойствах самого левелчейнджера указать silent_mode = 1.

    • Полезно 2
  4. Han Sola, sr_sound поддерживает либо звуки, указываемые напрямую, либо внутренние темы sr_sound.script. Тогда лучше воспользоваться несколько иной схемой, sr_sound_act, и в рестрикторе применить вот такую логику:

    custom_data = <<END
    [logic]
    active = sr_idle

    [sr_idle]
    on_actor_inside = sr_sound_act@snd1

    [sr_sound_act@snd1]
    theme = zvuki_bara
    on_actor_outside = sr_idle
    END

    Здесь указывается именно тема, из неё случайным образом будут выбираться звуки для воспроизведения, до тех пор, пока игрок находится внутри рестриктора. Если не указать условие on_actor_outside = sr_idle, звуки будут проигрываться до посинения, даже если игрок покинет рестриктор.

  5. Han Sola - по этим двум отрывкам секций смарттеррейнов догадаться, что происходит со гулагами в принципе невозможно. Нужно как минимум смотреть, что прописано в логике первого смарта (раз уж второй работает, да ещё general_lager). Сам по себе объект smart_terrain на другой аналогичный никакого влияния не оказывает, могут конфликтовать только их логика, и, возможно, пути. Скорее всего, где-то закралась ошибка в настройках первого смарта.

    nego - чтобы вернуть всё, что нажито напосильным трудом ГГ, сначала надо где-то сохранить информацию об изъятых в ходе обыска предметах. Неплохо бы определиться, что именно будем сохранять - данные (имена секций и количество) об изъятых предметах (этот вариант больше подходит, если вернуть предметы нужно будет где-то на другой локации). Если только данные, то в базе ГГ. Если же события будут происходить в пределах одной локации, тогда гораздо проще перебросить сами объекты в какой-нибудь подходящий "инвенторибокс". Ну, в затем вернуть всё назад.

    • Согласен 1
  6. 2 Jekyll - в твоём коде с таблицей на каждую "подходящую" жертву будет по 20 раз (сколько итераций указано, если нет ни одного совпадения) срабатывать установка партикла. Проверка же набора строк вернёт всего лишь одно значение - верно/не верно. Поэтому во втором случае результат положительный.

    Кстати, строчку

    for t = 1,20 do

    лучше сразу заменить на

     for t = 1,table.getn(type) do

    чтобы потом, в случае увеличения/уменьшения значений в таблице не дёргаться и не переписывать количество циклов обработки.

    • Спасибо 1
  7. Если каждая "волна" по 20 штук мутантов (*9=180 нехило так полигонов в кадре прибавилось) то, вполне возможно, что количество мобов и есть причина просадки FPS. Попробуй каждую "волну" заменить на всего одного моба и проверь, что получится. Кстати, проще сделать цикл спона мобов, чем городить кучу одинаковых строк кода:

     for a=1, 20 do
            alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
    end

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

  8. 1 час назад, dPlayer сказал:

    Там находятся точки то ли спавна то ли перехода

    Спасибо, КО. Но у меня, например, там нет никакой точки "спавна" (которой, кстати, там никогда не было) ни точки перехода (перенесена поближе к тепловозу у второго туннеля). И да, любое изменение, хотя бы одной буковки в диалоге или описании чего-либо в игре, не говоря уже о добавлении/удалении смарттеррейнов - это уже не оригинальная игра. Так что мечты сбываются - надо только захотеть... и сделать.

     

    3 часа назад, Egor4ikModMaker сказал:

    но все же , можно более подробно? ( что и как заменить , и пр. )

    Можно (и нужно) пользоваться, например, поиском по форуму. Если же что-то всё равно непонятно (хотя обычно здесь всё разжёвано достаточно подробно), можно в личку обратиться, чтобы не засорять тему инструкциями на достаточно стандартную (и давно решённую) проблему.

  9. 6 часов назад, Egor4ikModMaker сказал:

    ...подскажите как перенаселить локации...

    Вопрос далеко не такой простой, как покажется на первый взгляд. Если просто взять и поменять коммьюнити и, соответственно, группировки населения смарттеррейнов (ЕМНИП, первый такой пример я видел в ZENOBIAN - там был на Агропроме заменён смарт военных на наёмников) то это несложно, конечно. Но в таком случае как быть с квестами, "зашитыми" в оригинальной игре? Отправит Сидорович на тот же Агропром стянуть документы у военных, а там в западном корпусе НИИ какие-нибудь долговцы-свободовцы, или, простигосподи, монолитовцы тусуются? Вопрос... Конечно, можно поменять какие-то несюжетные, маленькие смарты, вроде того костерка в лесочке на Кордоне, между двумя туннелями. Из него вполне себе можно состряпать небольшой лагерь с парой-тройкой часовых, главарём у костерка, и, может даже, отдыхающими под ближайшими ёлочками. А то ещё проще - сделать новый смарт в туннеле, из которого в оригинале ГГ прибывает из ТД после Х-18. И даже сделать квестов пару-тройку, связанных с этим лагерем... Инструменты для этого есть - кто-то пользуется SDK, кто-то по-старинке ACDC, это что касается файла all.spawn. А всё остальное в простейшем случае радактируется тем же самым Блокнотом.

  10. 2 часа назад, CRAZY_STALKER666 сказал:

    Но вдруг есть "костыли"?

    Костыли не костыли, но если в логике NPC в секции его meet в полях use и (или) use_wpn указать ключ self, то NPC самостоятельно "заведёт" разговор с ГГ, как только позволит расстояние. Например:

    [meet@balalayka]
    meet_state = 10|guard@wait
    meet_state_wpn = 10|guard@wait
    victim = 10|actor
    victim_wpn = 10|actor
    use = {=dist_to_actor_le(2)} self, false
    use_wpn = {=dist_to_actor_le(2)} self, false
    meet_dialog = dialog_balalayka

    Здесь: если расстояние между NPC и ГГ становится менее 2 метров (независимо от того, есть ли в руках ГГ оружие или нет), то автоматически запустится диалог dialog_balalayka.

    Но, возможно, понадобится дополнительно внести небольшое изменение в файл xr_meet.script (разработчики случайно или намеренно не добавили/удалили одну строчку, из-за чего ключ self не срабатывал), после этих строк:

      elseif t == "self" then
        if not is_talking then
    --      printf("MM3 %s start talk", self.npc:name())

    добавить строчку:

    self.npc:enable_talk()

    И всё должно заработать, как и было задумано.

    • Нравится 1
    • Полезно 1
  11. А если модмейкеру лень читать все эти многабукав или он их не просил, или вообще в гробу видал, но хочется создать свой рецепт варки артефакта в аномалии, то:
    1. Создать секцию нового артефакта (необязательно артефакта и необязательно нового - можно вообще любой предмет получить в результате трансмутации).
    2. Создать имя и описание нового предмета - и, если необходимо, соответствующего рецепта для трансмутации.
    3. Если не хотим, чтобы игрок сварил модификат "без рецепта", создать соответствующий инфопоршн.
    4. В таблицу afs файла amk_mod.script добавить имя секции исходного предмета (необязательно артефакта).
    5. В функцию check_af_transform(af,anom_id,anom_sect) файла amk_mod.script добавить новое условие для какой-либо аномалии.
    Всё, можно пользоваться.
    Например, мы возжелали в аномалии "Электра" сварить из пистолета ПМ гранатомёт РПГ-7 (только учтите, что полученный гранатомёт случайно может оказаться в аномалии и будет испорчен вплоть до нуля). Тогда в таблицу afs добавим имя секции пистолета ПМ - "wpn_pm", а в условие проверки аномалии "Электра" - после строки
    if string.find(anom_sect,"_galant")~=nil then
    добавим строчки:
    if af_sect=="wpn_pm" and actor:has_info("agroprom_military_case") then 
        af_flash(af)
        af_start_transform_timer(af_start_transform(100,0,af_sect,"wpn_rpg7"), pos ,0,0,10,"Гранатомёт РПГ-7")
    end
    В результате после получения задания Сидоровича на документы военных на Агропроме можно закинуть любой ПМ в любую "Электру", и через 10 игровых минут из аномалии со 100% вероятностью "выпадет" новенький РПГ-7. Но до получения задания можно сколько угодно кидаться пистолетами в аномалии - толку не будет никакого.
    Вот как-то так.

    • Нравится 2
    • Полезно 1
  12. Скрытый текст

    Как происходит в АМК-моде "трансмутация" артефактов (или как сварить артефакт в аномалии АМК-мода).
    Всё начинается с того момента, как только игрок выбросит какой-либо предмет из "рюкзака" ГГ - файл bind_stalker.script, функция amk.on_item_drop(obj). Следом срабатывает mod_call("check_for_af_drop",obj), т.е. вызов функции check_for_af_drop(obj), файл amk_mod.script. В которой первым делом определяется имя секции ("секция") выброшенного предмета. Затем секция сверяется по таблице local afs={...}. Итак, предположим, что игрок выбросил из инвентаря артефакт "Плёнка" (секция "af_dummy_pellicle"). В таблице afs такое имя есть - следовательно, этот артефакт входит в список "претендентов" на трансмутацию, поэтому далее функцией get_nearest_anomaly(obj) (файл amk_anoms.script) определяется идентификатор, позиция, радиус действия и расстояние ближайшей аномалии до выброшенного артефакта (в нашем случае "Плёнки"). Затем проверяется, попадает ли "Плёнка" в радиус действия аномалии, если да - то определяется имя секции аномалии и запускается дальнейшая проверка на доступность трансмутации функцией check_af_transform(obj,id,anom_sect) в этом же файле. Следом проверятся, является ли полученная аномалия подходящей для трансмутации выброшенного предмета (для "Плёнки" это будет аномалия "Трамплин"). Чтобы игрок не смог "сварить" артефакт в аномалии без рецепта, проверяется, установлен ли соответствующий инфопоршн. В случае с "Плёнкой" это инфопоршн info_amk_recipt_shkura, определённый в файле info_amk_recipts.xml, при получении которого, кстати, игрок и получает запись с "рецептом" трансмутации в соответствующем разделе PDA. Итак, если инфопрошн info_amk_recipt_shkura установлен, аномалия, в которую выброшен предмет - это "Трамплин", а сам выброшенный предмет - это артефакт "Плёнка", то артефакт тут же уничтожается с эффектом кратковременной засветки экрана, и вызывается функция af_start_transform_timer(af,pos,delay_d,delay_h,delay_m,af_sect) в этом же файле. Как видно, в неё первым параметром передаётся функция af_start_transform(v1,v2,af_from,af_target). На примере "Плёнки" это выглядит так: af_start_transform(70,25,af_sect,"af_armor_1"), где первый параметр - вероятность успешного процесса трансмутации (70), второй - вероятность "вырождения" (25, то есть вероятность получить "Булыжник" (бесполезный артефакт-пустышку) вместо полезного модификата), третий - имя секции выброшенного предмета (у нас это "Плёнка"), и, наконец, четвёртый - имя секции того самого модификата, ради которого всё это и затевалось (в нашем случае это "af_armor_1" - в миру он называется модификат "Шкура"). Функция может вернуть:
    1. имя секции целевого модификата (в данном случае "af_armor_1") если ГПСЧ math.random(0,100) выдаст значение менее либо равное 70 - удачная модификация,
    2. имя секции иходного предмета (в данном случае "af_dummy_pellicle") если math.random(0,100) выдаст значение более, чем 95 (70+25) - "отторжение", то есть неудачная попытка трансмутации, и вместо модификата будет получен исходный предмет ("Плёнка" в данном случае),
    3. имя секции "Булыжника" ("af_buliz") если math.random(0,100) выдаст значение более 70 и менее 95 - "вырождение", то есть вместо модификата будет получен тот самый бесполезный "Булыжник".
    Таким образом, в функцию af_start_transform_timer(af,pos,delay_d,delay_h,delay_m,af_sect), а в случае с "Плёнкой" это: af_start_transform_timer(af_start_transform(70,25,af_sect,"af_armor_1"), pos ,0,5,0,"Шкура") первым параметром фактически передаётся имя секции предмета, получаемого в результате трансмутации (либо полезный модификат, либо исходный предмет, либо "Булыжник"), вторым - сохранённая позиция выброшенного предмета (чтобы знать, где заспонить полученный результат трансмутации), третий параметр - дни процесса трансмутации (0), четвёртый - часы процесса трансмутации (5), пятый - минуты процесса трансмутации (0), шестой - имя целевого модификата (в нашем случае - "Шкура"), который в дальнейшем понадобится для получения сообщения о завершении процесса трансмутации и постановки отметки на карте. Далее функцией g_start_timer(name,delay_d,delay_h,delay_m,action), файл amk.script, в данном случае amk.g_start_timer("af_transform",delay_d,delay_h,delay_m,amk.pack_array_to_string(t)), запускается таймер процесса трансмутации, который будет отслеживаться функцией check_timers(), файл amk.script. Последним параметром "упаковываются" в строку и сохраняются имя секции результата трансмутации, позиция, гейм-вертекс, левел-вертекс, и имя целевого модификата. Процесс пошёл!
    Итак, прошли необходимые для этого 5 часов игрового времени, и срабатывает экшн "af_transform", заданный для таймера. Вызывается функция
    af_transform_end(params), файл amk_mod.script, в которую передаётся "распакованный" массив с сохранёнными ранее данными. В результате на сохранённых координатах будет заспонен один из трёх вариантов трансмутации (полезный модификат, исходный предмет, или "Булыжник"), и выдано сообщение о завершении процесса трансмутации. Несмотря на то, что на карте будет отмечено местоположение результата трансмутации с пометкой "Шкура" (в данном случае), вернувшись туда, запросто можно обнаружить не совсем то (или совсем не то), что мы ожидали :) 

     

    • Полезно 2
  13. 37 минут назад, Дизель сказал:

    А как  же Зомби дружат с мутантами?

    В файле m_stalker_zombied.ltx за это взаимное "поведение" зомбированных сталкеров и мутантов отвечает строчка:

    species  = zombie

    в отличие от файла "обычных" сталкеров m_stalker.ltx, где строчка выглядит так:

    species = human

    • Спасибо 1
    • Полезно 2
  14. В 29.06.2017 в 22:14, 5654 сказал:

    Где ты это взял  ?

    Как эти имена мне найти?

    Кстати, да - вопрос, конечно, интересный. Чтобы проще и наглядней (и прямо в самой игре) можно было получить информацию по большинству NPC-сталкеров в игре (логика которых основана на стандартных схемах), есть вот такой тестовый скрипт. Устанавливается либо копированием файлов на чистую игру ТЧ 1.0004, либо адаптируется вручную (скриптовые вставки в файлах помечены). Сделано по стандартной схеме - выходим в меню, жмём кнопку "1" на клавиатуре, возвращаемся в игру, подходим к NPC (или "подлетаем" с консольной командой demo_record), и вместо "Говорить", внизу экрана получаем некоторую информацию по NPC. Отключается режим также через меню, клавишей "2".

    2ecebf4b8317t.jpg

    • Нравится 3
    • Полезно 1
  15. Скрин говорит о том, что в оригинальной игре ТЧ отловленный тестовым скриптом NPC с именем sim_stalker_master_diador имеет активной секцию  camper@mil_lager_guard_1_walk. То есть он находится на "работе" camper, универсального гулага типа general_lager смарттеррейна mil_lager с вэйпойнтом mil_lager_guard_1_walk (а смотрит в точку mil_lager_guard_1_look) - кстати, для гулагов general_lager в файлах way_<location_name>.ltx имена вэйпойнтов нужно указывать полностью, вместе с префиксом-именем смарттеррейна. Я искренне рад, что вы "уверенны" в своей точке зрения.

    • Нравится 1
  16. Ну вот в общем, всё, что есть. Инструкция (вроде бы подробная) внутри. Для "чистого" ТЧ (и любого другого мода, не базирующегося на АМК-скриптах) дополнительно понадобится файл amk.script, из АМК-мода, как нетрудно догадаться - лучше из того самого, приснопамятного 1.4.1. Теперь можно носиться по локациям и воскрешать сталкеров, подкладывая в их трупы артефакты "Медуза". Конечно, всё это как-то сыровато выглядит. По-хорошему артефакт надо бы просто бросать на труп сталкера плюс неплохо было бы добавить эффект кратковременного затемнения или наоборот, засвета HUD'a, чтобы не видеть сам момент исчезновения трупа в никуда и появления сталкера из воздуха... но что есть, то есть, как говорится :default_smile: .

    • Нравится 1
  17. Да сделать-то не проблема, было бы желание :default_smile: . Кстати, поковырявшись в этом наборе символов, выяснил, что тут есть кое-то лишнее. Трупы-то у нас в оффлайн не переводятся, так что первая часть будет выглядеть так...

    function resurrect_npc(npc_name, health)
        local trup = get_sobj_npc_by_name(npc_name)
        if trup and not trup:alive() then
            local t = amk.read_stalker_params(trup)
            t.killerid = 65535
            for i=1,8 do
                t.game_death_time[i] = 0
            end
            if health ~= nil then
                t.health = health
                t.updhealth = health
            else
                t.health = 1
                t.updhealth = 1
            end
            t.skeleton_flags = 0
            while trup:alive() == false do
                amk.write_stalker_params(t, trup)
            end
        end
    end

    Цикл в конце - это уже явная перестраховка, на случай ядерной войны :default_wink: .

    • Нравится 1

AMK-Team.ru

×
×
  • Создать...