S.T.A.L.K.E.R.: Global War <<<>>> Инструмент - теперь и для ТЧ! <<<>>> NS OGSR: Сборка от 30.12.2023
-
Число публикаций
131 -
Регистрация
-
Последнее посещение
-
AMKoin
20 [Подарить AMKoin]
Сообщения опубликованы =VENOM=
-
-
39 минут назад, UnLoaded сказал:
Это оно ?
Действительно, оно . Ставишь значение 0 и анимация работает с любым стволом.
- 1
- 1
- 1
-
Касательно обреза и воплей про группу Крота. Выяснилось, что кости модельки оружия в этой анимации значения не имеют. Анимация работает только с оружием класса WP_BM16, то есть этому сталкеру запросто можно всучить и ТОЗ-34, к примеру. А можно и вообще либо подменить визуал обреза, либо создать "фейковый" ствол на классе WP_BM16 с каким-нибудь визуалом - в качестве прикола:
- 1
- 1
- 1
-
2 SWEAW. Если нужно изменить всего лишь текст, то файл локализации - ui_st_pda.xml, если изменить свойства самого окна - то в файле message_box.xml, первая же секция. Если же нужно, чтобы левелчейнджер срабатывал без запроса "Перейти на другую локацию?", тогда в свойствах самого левелчейнджера указать silent_mode = 1.
- 2
-
2 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, звуки будут проигрываться до посинения, даже если игрок покинет рестриктор.
-
Han Sola, попробуй заменить логику на такую:
[logic] active = sr_idle [sr_idle] on_actor_inside = sr_sound [sr_sound] snd = zvuki_bara play_at_actor = true
-
2 Han Sola - по этим двум отрывкам секций смарттеррейнов догадаться, что происходит со гулагами в принципе невозможно. Нужно как минимум смотреть, что прописано в логике первого смарта (раз уж второй работает, да ещё general_lager). Сам по себе объект smart_terrain на другой аналогичный никакого влияния не оказывает, могут конфликтовать только их логика, и, возможно, пути. Скорее всего, где-то закралась ошибка в настройках первого смарта.
2 nego - чтобы вернуть всё, что нажито напосильным трудом ГГ, сначала надо где-то сохранить информацию об изъятых в ходе обыска предметах. Неплохо бы определиться, что именно будем сохранять - данные (имена секций и количество) об изъятых предметах (этот вариант больше подходит, если вернуть предметы нужно будет где-то на другой локации). Если только данные, то в базе ГГ. Если же события будут происходить в пределах одной локации, тогда гораздо проще перебросить сами объекты в какой-нибудь подходящий "инвенторибокс". Ну, в затем вернуть всё назад.
- 1
-
2 Jekyll - в твоём коде с таблицей на каждую "подходящую" жертву будет по 20 раз (сколько итераций указано, если нет ни одного совпадения) срабатывать установка партикла. Проверка же набора строк вернёт всего лишь одно значение - верно/не верно. Поэтому во втором случае результат положительный.
Кстати, строчку
for t = 1,20 do
лучше сразу заменить на
for t = 1,table.getn(type) do
чтобы потом, в случае увеличения/уменьшения значений в таблице не дёргаться и не переписывать количество циклов обработки.
- 1
-
Ну тогда переезжаем в личку - общий контур проблемы вроде бы ясен (апдейт ГГ), а остальным всё это вряд ли будет интересно.
-
Интересно... А перезагрузка уровня (выход-вход обратно на локацию) после отстрела всей массы мутантов как-то влияет на FPS?
-
Если каждая "волна" по 20 штук мутантов (*9=180 нехило так полигонов в кадре прибавилось) то, вполне возможно, что количество мобов и есть причина просадки FPS. Попробуй каждую "волну" заменить на всего одного моба и проверь, что получится. Кстати, проще сделать цикл спона мобов, чем городить кучу одинаковых строк кода:
for a=1, 20 do alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967) end
А, только что заметил - вроде, уборщик трупов есть какой-то? Ну, тогда не знаю ...
-
1 час назад, vampirnik77 сказал:
почему бы и не вот так?)
Ну это как бы то же самое, только вид сбоку .
- 1
-
- Это популярное сообщение.
- Это популярное сообщение.
В оригинале есть проверка "на день", но она не годится для прекондишнов диалогов, поэтому можно поступить так:
Прописать в dialogs.script эту функцию:
function is_night(first_speaker, second_speaker) if level.get_time_hours() > 6 and level.get_time_hours() < 21 then return false end return true end
И использовать в диалоге такой прекондишн:
<precondition>dialogs.is_night</precondition>
Диалог будет доступен от 9 вечера до 6 утра. Время также можно выставить своё, подходящее для ситуации.
- 2
- 1
- 2
- 2
-
1 час назад, dPlayer сказал:
Там находятся точки то ли спавна то ли перехода
Спасибо, КО. Но у меня, например, там нет никакой точки "спавна" (которой, кстати, там никогда не было) ни точки перехода (перенесена поближе к тепловозу у второго туннеля). И да, любое изменение, хотя бы одной буковки в диалоге или описании чего-либо в игре, не говоря уже о добавлении/удалении смарттеррейнов - это уже не оригинальная игра. Так что мечты сбываются - надо только захотеть... и сделать.
3 часа назад, Egor4ikModMaker сказал:но все же , можно более подробно? ( что и как заменить , и пр. )
Можно (и нужно) пользоваться, например, поиском по форуму. Если же что-то всё равно непонятно (хотя обычно здесь всё разжёвано достаточно подробно), можно в личку обратиться, чтобы не засорять тему инструкциями на достаточно стандартную (и давно решённую) проблему.
-
6 часов назад, Egor4ikModMaker сказал:
...подскажите как перенаселить локации...
Вопрос далеко не такой простой, как покажется на первый взгляд. Если просто взять и поменять коммьюнити и, соответственно, группировки населения смарттеррейнов (ЕМНИП, первый такой пример я видел в ZENOBIAN - там был на Агропроме заменён смарт военных на наёмников) то это несложно, конечно. Но в таком случае как быть с квестами, "зашитыми" в оригинальной игре? Отправит Сидорович на тот же Агропром стянуть документы у военных, а там в западном корпусе НИИ какие-нибудь долговцы-свободовцы, или, простигосподи, монолитовцы тусуются? Вопрос... Конечно, можно поменять какие-то несюжетные, маленькие смарты, вроде того костерка в лесочке на Кордоне, между двумя туннелями. Из него вполне себе можно состряпать небольшой лагерь с парой-тройкой часовых, главарём у костерка, и, может даже, отдыхающими под ближайшими ёлочками. А то ещё проще - сделать новый смарт в туннеле, из которого в оригинале ГГ прибывает из ТД после Х-18. И даже сделать квестов пару-тройку, связанных с этим лагерем... Инструменты для этого есть - кто-то пользуется SDK, кто-то по-старинке ACDC, это что касается файла all.spawn. А всё остальное в простейшем случае радактируется тем же самым Блокнотом.
-
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
-
А если модмейкеру лень читать все эти многабукав или он их не просил, или вообще в гробу видал, но хочется создать свой рецепт варки артефакта в аномалии, то:
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
-
Скрытый текст
Как происходит в АМК-моде "трансмутация" артефактов (или как сварить артефакт в аномалии АМК-мода).
Всё начинается с того момента, как только игрок выбросит какой-либо предмет из "рюкзака" ГГ - файл 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
-
37 минут назад, Дизель сказал:
А как же Зомби дружат с мутантами?
В файле m_stalker_zombied.ltx за это взаимное "поведение" зомбированных сталкеров и мутантов отвечает строчка:
species = zombie
в отличие от файла "обычных" сталкеров m_stalker.ltx, где строчка выглядит так:
species = human
- 1
- 2
-
В 29.06.2017 в 22:14, 5654 сказал:
Где ты это взял ?
Как эти имена мне найти?
Кстати, да - вопрос, конечно, интересный. Чтобы проще и наглядней (и прямо в самой игре) можно было получить информацию по большинству NPC-сталкеров в игре (логика которых основана на стандартных схемах), есть вот такой тестовый скрипт. Устанавливается либо копированием файлов на чистую игру ТЧ 1.0004, либо адаптируется вручную (скриптовые вставки в файлах помечены). Сделано по стандартной схеме - выходим в меню, жмём кнопку "1" на клавиатуре, возвращаемся в игру, подходим к NPC (или "подлетаем" с консольной командой demo_record), и вместо "Говорить", внизу экрана получаем некоторую информацию по NPC. Отключается режим также через меню, клавишей "2".
- 3
- 1
-
Скрин говорит о том, что в оригинальной игре ТЧ отловленный тестовым скриптом 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
-
Да... Волк приходит туда, когда его меняет Фанат на Кордоне. Вроде, у костра сидит, но сейчас точно не помню уже...
- 1
-
-
Ну вот в общем, всё, что есть. Инструкция (вроде бы подробная) внутри. Для "чистого" ТЧ (и любого другого мода, не базирующегося на АМК-скриптах) дополнительно понадобится файл amk.script, из АМК-мода, как нетрудно догадаться - лучше из того самого, приснопамятного 1.4.1. Теперь можно носиться по локациям и воскрешать сталкеров, подкладывая в их трупы артефакты "Медуза". Конечно, всё это как-то сыровато выглядит. По-хорошему артефакт надо бы просто бросать на труп сталкера плюс неплохо было бы добавить эффект кратковременного затемнения или наоборот, засвета HUD'a, чтобы не видеть сам момент исчезновения трупа в никуда и появления сталкера из воздуха... но что есть, то есть, как говорится .
- 1
-
Да сделать-то не проблема, было бы желание . Кстати, поковырявшись в этом наборе символов, выяснил, что тут есть кое-то лишнее. Трупы-то у нас в оффлайн не переводятся, так что первая часть будет выглядеть так...
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
Цикл в конце - это уже явная перестраховка, на случай ядерной войны .
- 1
Скриптование
в Скрипты / конфиги / движок
Опубликовано · Изменено пользователем =VENOM=
Согласен с TIGER_VLAD, для себя такую проблему решал давным-давно - похоже, тем же способом, что и в ЧН на болотах (точно не помню, в ЧН не играл с момента выхода игры, наверное ). 2 варианта: первый попроще, если вокруг левелчейнджера есть много свободного места, "накрываем" его рестриктором, с шейпом, бОльшим, чем у левелчейнджера. В его логике выставляем условия, при которых рестриктор будет "возвращать" игрока в заданную (заданные) точки функцией set_actor_position+set_actor_direction, не давая ему "добраться" до левелчейнджера. И, может быть, даже с соответствующим сообщением, типа "дорога закрыта" . Второй вариант, если пространство у перехода ограничено, и рестриктором не получается надёжно перекрыть левелчейнждер - логику рестриктора, перемещающую игрока оставляем, как и в первом случае, а вот сам левелчейнджер придётся спонить/удалять уже либо из логики рестриктора (что очень удобно, в общем-то), либо где-то в другом месте, где удобнее разработчику.