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

[SoC] Ковыряемся в файлах


Halford

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

@"StreloK", вполне нормальный вопрос. Проще всего поступить примерно вот так (понадобится файл-набор скриптов АМК-мода - amk.script)

Создаём монстра споновой АМК-функцией (но можно и стандартной, в примере это "нормальный" зомби), функция возвращает серверный объект, с которого в таблицу t считываем параметры, тут же в раздел "кустовой даты" объекта в таблице прописываем желаемую логику (динамическую, из ltx-файла), и тут же производим запись обновлённых данных этому серверному объекту (то есть, нашему новоиспечённому зомбарю). Готово :)!

local mob = amk.spawn_item("zombie_normal",vector():set(x,y,z),gv,lv)

local t = amk.read_monster_params(mob)

t.custom = "[logic]\ncfg = scripts\\new_zombie.ltx"

amk.write_monster_params(t, mob)

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


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

parsek123, хочешь сделать обычный тайник, ну, или именной - без разницы, они только названиями отличаются и способом наполнения шмотками? Тогда понадобится присвоить ему ("инвенторибоксу", название секции inventory_box) уникальный story_id.

Присваиваем ящику "у Сидора" уникальный story_id, например, 5025 (можно и любой другой - главное, чтобы он был уникальным - иначе будут проблемы с запуском игры). Кроме этого, нужно добавить ящику "кустодату", в которой нужно указать, что этот ящик - тайник, иначе он не будет загружаться шмотками автоматически (зато его запросто можно будет отловить по story_id, и засунуть в него в любой момент всё, что угодно):

[658]

; cse_abstract properties

section_name = inventory_box

name = level_prefix_inventory_box_0003

position = -247.503921508789,-24.7944984436035,-135.684509277344

direction = 0,2.67659902572632,0

 

; cse_alife_object properties

game_vertex_id = 0

distance = 0

level_vertex_id = 594270

object_flags = 0xffffff3f

 

custom_data = <<END

[logic]

cfg = scripts\treasure_inventory_box.ltx

END

 

story_id = 5025

 

; cse_visual properties

visual_name = physics\equipment_cache\equipment_box_01_case

 

 

Далее, прописываем свеженький тайник в game_story_ids.ltx, примерно вот так:

5025 = "esc_secret_0025"

 

Затем регистрируем его treasure_manager.ltx, вот так:

В начале файла после названия секции

esc_secret_0025

 

B конец файла добавляем его секцию:

 

[esc_secret_0025]

target = 5025 ;story_id тайника

name = esc_secret_0025_name ;имя тайника

description = esc_secret_0025_descr ;краткое описание тайника

items = conserva, 3, grenade_f1, 2 ;в тайнике по умолчанию будут спониться 3 консервы и две гранаты Ф-1

condlist = {=npc_rank(novice)} 5 ;условие выдачи тайника

community = military ;группировка непися, выдающего тайник

 

 

Всё, тайник начнёт работать в автоматическом режиме.

Если же нужно принудительно затарить этот тайник нужными шмотками - например, десятью бутылками водки, консервой и дробовиком, делаем это при помощи скрипта:

local box = alife():story_object(5025)

if box then

for a=1, 10 do

alife():create("vodka", box.position, box.m_level_vertex_id, box.m_game_vertex_id, box.id)

end

alife():create("conserva", box.position, box.m_level_vertex_id, box.m_game_vertex_id, box.id)

alife():create("wpn_bm16", box.position, box.m_level_vertex_id, box.m_game_vertex_id, box.id)

end

 

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


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

Вот, если кому надо, функция, возвращающая серверный объект ("инвенторибокс", ящик для шмоток/тайник). На входе имя локации + имя желаемого ящика (как уже неоднократно отмечалось, на одной локации (а лучше на всех) очень сильно рекомендуется использовать уникальные имена для объектов). Это для оригинала ТЧ, а для расширенных модов в таблицу нужно внести имена и параметры подключенных дополнительных локаций.

local game_vertexes={

l01_escape={0,251},

l02_garbage={252,415},

l03_agroprom={416,702},

l03u_agr_underground={703,810},

l04_darkvalley={811,1108},

l04u_labx18={1109,1167},

l05_bar={1168,1307},

l06_rostok={1308,1437},

l08_yantar={1438,1528},

l08u_brainlab={1529,1544},

l07_military={1545,1861},

l10_radar={1862,2116},

l11_pripyat={2117,2272},

l12_stancia={2273,2401},

l12u_sarcofag={2402,2466},

l12u_control_monolith={2467,2516},

l12_stancia_2={2517,2660},

l10u_bunker={2661,2791}

}

 

function get_invbox_by_level_and_name(level, name)

local jb = game_vertexes[level][1]

local ja = game_vertexes[level][2]

 

for z=1,65535 do

local obj = alife():object(z)

if obj then

if obj:clsid() == 83 then

if obj.m_game_vertex_id <= ja and obj.m_game_vertex_id >= jb then

if obj:name() == name then

amk.send_tip2(obj:name(), nil, 10)

return obj

end

end

end

end

end

end

 

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


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

Да, я об этом упомянул, что касается дополнительных локаций :)... Кстати, забыл закомментить в середине сигнальную функцию <amk.send_tip2(obj:name(), nil, 10>, модеры, исправьте этот недостаток вместе с этим постом ;)...

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


Ссылка на сообщение
(изменено)

Artos, неплохо, но я стараюсь вперёд выставлять числовые сравнения, отсеивая строковые в последнюю очередь:

cmp eax, ebx всегда быстрее, чем repe cmps str1, str2 ;)...

Изменено пользователем =VENOM=

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


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

У тебя правильно составлен конфиг. Просто загляни в файл gamedata\config\misc\zone_minefield.ltx и проверь, чтобы параметр был указан вот так: visible_by_detector = on, и всё должно заработать. Этот параметр как раз и отвечает за то, обнаруживает детектор эту аномальную зону или нет.

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


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

Поподробнее бы :)... Вообще, ГГ разговаривает с военными и при этом не хочет говорить только с этим конкретным "генералом"? Или вообще не запускаются диалоги с военными?

Во втором случае нужно править xr_meet.script - найти строку с перечислением группировок и удалить из неё вот этот фрагмент:

or npc_community == "military"

В первом случае... где прописывал диалоги этому генералу - в профиле непися или в его логике?

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


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

Просто воткни в конструктор диалога в нужную фразу action с функцией, включающей проигрывание звука, например:

 

<action>dialogs.tra_la_la</action>

 

А в файл dialogs.script добавь функцию:

 

function tra_la_la(first_speaker, second_speaker)
    local snd_obj = xr_sound.get_safe_sound_object([[monsters\poltergeist\die_2]])
    snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
end

 

Только измени путь к нужному тебе файлу.

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


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

Stalker_AleX333, у тебя второй и третий диалоги начинаются сразу с фразы "1", а должны начинаться всегда с "0", если не ошибаюсь ;)...

Whisper, насчёт притормаживания диалога никогда не задумывался даже :)... Возможно, проще сделать два последовательных диалога - первый обрывается с тем звуком, который тебе нужен, а второй активировать следом, снова "обратившись" к NPC? Игра подерживает только ogg, есть куча конвертеров, которыми легко и просто можно перегнать любой звукофайл (не только wav) в ogg. Только если это будет каким-то "мировым" звуком (выстрел, музыка из репродукторв и т.п.), тогда придётся прогонять его (wav) через SDK - это тоже очень просто.

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


Ссылка на сообщение
(изменено)

Whisper, вот ещё вариант звуковой функции с задержкой ввода (задержки вывода очередной фразы не будет, но на некоторое время отключается ввод):

function tra_la_la(first_speaker, second_speaker)
    local snd_obj = xr_sound.get_safe_sound_object([[monsters\poltergeist\die_2]])
    snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
    set_inactivate_input_time(50)
end

Или воткни action с функцией set_inactivate_input_time(хх) до или после "звуковой" фразы. Поэкспериментируй. В т.ч. и с параметром задержки ввода функции.

Изменено пользователем =VENOM=

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


Ссылка на сообщение
herurg, именно так. Каждый объект в "оллспоне" прописывается отдельно. Можно обойтись и без all.spawn - воспользоваться скриптовым споном - например, по условию или на апдейте при загрузке уровня. Или "подцепить" спон группы тушканов к какому-нибудь событию - скажем, к выбросу. Или использовать АМК-спон, там всё достаточно просто и гибко настраивается - рекомендую ;)!

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


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

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


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

strchi, выложи свой вариант скрипта, чтобы можно было просмотреть, в чём ошибка.

А чтобы приёмник был изначально, либо зарегистрируй его в all.spawn, либо создай его тем же самым скриптом, вызвав при первом запуске игры. При этом не забудь удалить вызов функции - удали строку moi_mod.spawn_patefon() из give_weapon_to_actor(trader, actor), иначе в дальнейшем жутких косяков со звуками не избежать :).

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


Ссылка на сообщение
kuzia, можно. Судя по всему, речь идёт о т.н. АМК-аномалиях. В общем случае даже не потребуется править all.spawn (вообще, это нужно только для того, чтобы очистить его от АМК-аномалий, а заодно и расширить за их счёт массив свободных сториайд, без чего можно спокойно обойтись ;)). Заново ничего создавать не нужно - т.к. "аномалии разработчиков" не удалялись из all.spawn, а просто "стираются" тем же самым скриптом, что и спонятся новые, динамические. Так что нужно всего лишь слегка поправить "фичу", спонящую/удаляющую динамические аномалии.

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


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

Обнаружил вот какую неприятность: при использовании изменённого game.graph (дополнительные "АИ-связи" локаций), на большом расстоянии от "перехода" исчезает укзатель (стрелка на миникарте) на маркер задачи, назначенной на другой локации. Что не есть гуд. Кто-нибудь решал такую проблемку?

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


Ссылка на сообщение
(изменено)

weas, попробуй в секции твоей аномалии прописать:

postprocess = postprocess_psy_zone

А ты сам пробовал? В оригинальной игре (ТЧ) такая секция [postprocess_psy_zone] отсутствует.

--/ Artos

Изменено пользователем Artos

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


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

И ещё опять же по поводу костров: заметил что к примеру на локации Припять нет освещения окружающих объектов и территорий от косторов,  Исправить этот недочёт можно только через SDK?

Можно и без SDK - я добавлял освещение для костров Припяти, банально редактируя all.spawn. Но получил в результате довольно заметное "подтормаживание" в Припяти в процессе игры. Всё же нагрузка - источники света, да ещё и анимацией. Поэтому плюнул, и вернул всё в исходное состояние.

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


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

Просто ищем сталкера по имени (не character_name, а именно name!), и снимаем с него метку (точку на (мини)карте):

local obj = alife():object("stalker_name")
if obj then
        obj:visible_for_map(false)
end

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


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

 

 

А как объяснить игроку, почему допустим на одном трупике метки нет, а на других есть?

Не думаю, что в этом есть что-то требующее объяснений - например, у зомбированных сталкеров ведь тоже нет отметок на карте.

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


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

Отвечу по-одесски, вопросом на вопрос: а что, собственно, мешает в нужный момент (к примеру, в момент выдачи квеста), снова поставить метку на труп доцента Лазарева? Вот так:

local obj = alife():object("stalker_name")
if obj then
        obj:visible_for_map(true)
end
  • Согласен 1

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


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

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

AMK-Team.ru

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