=VENOM= 50 Опубликовано 24 Февраля 2011 @"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) Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 16 Марта 2011 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 Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 16 Марта 2011 Вот, если кому надо, функция, возвращающая серверный объект ("инвенторибокс", ящик для шмоток/тайник). На входе имя локации + имя желаемого ящика (как уже неоднократно отмечалось, на одной локации (а лучше на всех) очень сильно рекомендуется использовать уникальные имена для объектов). Это для оригинала ТЧ, а для расширенных модов в таблицу нужно внести имена и параметры подключенных дополнительных локаций. 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 Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 16 Марта 2011 Да, я об этом упомянул, что касается дополнительных локаций ... Кстати, забыл закомментить в середине сигнальную функцию <amk.send_tip2(obj:name(), nil, 10>, модеры, исправьте этот недостаток вместе с этим постом ... Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 16 Марта 2011 (изменено) Artos, неплохо, но я стараюсь вперёд выставлять числовые сравнения, отсеивая строковые в последнюю очередь: cmp eax, ebx всегда быстрее, чем repe cmps str1, str2 ... Изменено 16 Марта 2011 пользователем =VENOM= Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 19 Марта 2011 У тебя правильно составлен конфиг. Просто загляни в файл gamedata\config\misc\zone_minefield.ltx и проверь, чтобы параметр был указан вот так: visible_by_detector = on, и всё должно заработать. Этот параметр как раз и отвечает за то, обнаруживает детектор эту аномальную зону или нет. Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 8 Апреля 2011 Поподробнее бы ... Вообще, ГГ разговаривает с военными и при этом не хочет говорить только с этим конкретным "генералом"? Или вообще не запускаются диалоги с военными? Во втором случае нужно править xr_meet.script - найти строку с перечислением группировок и удалить из неё вот этот фрагмент: or npc_community == "military" В первом случае... где прописывал диалоги этому генералу - в профиле непися или в его логике? Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 9 Апреля 2011 Просто воткни в конструктор диалога в нужную фразу 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 Только измени путь к нужному тебе файлу. Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 9 Апреля 2011 Stalker_AleX333, у тебя второй и третий диалоги начинаются сразу с фразы "1", а должны начинаться всегда с "0", если не ошибаюсь ... Whisper, насчёт притормаживания диалога никогда не задумывался даже ... Возможно, проще сделать два последовательных диалога - первый обрывается с тем звуком, который тебе нужен, а второй активировать следом, снова "обратившись" к NPC? Игра подерживает только ogg, есть куча конвертеров, которыми легко и просто можно перегнать любой звукофайл (не только wav) в ogg. Только если это будет каким-то "мировым" звуком (выстрел, музыка из репродукторв и т.п.), тогда придётся прогонять его (wav) через SDK - это тоже очень просто. Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 10 Апреля 2011 (изменено) 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(хх) до или после "звуковой" фразы. Поэкспериментируй. В т.ч. и с параметром задержки ввода функции. Изменено 10 Апреля 2011 пользователем =VENOM= Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 21 Мая 2011 herurg, именно так. Каждый объект в "оллспоне" прописывается отдельно. Можно обойтись и без all.spawn - воспользоваться скриптовым споном - например, по условию или на апдейте при загрузке уровня. Или "подцепить" спон группы тушканов к какому-нибудь событию - скажем, к выбросу. Или использовать АМК-спон, там всё достаточно просто и гибко настраивается - рекомендую ! Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 5 Июля 2011 TheDoktor, возможно, в этом месте ГГ приближается к какому-либо объекту (NPC, например), который в этот момент переходит в онлайн, и, по причине ошибок в скриптах или конфигах, даёт вылет. Советую "пощупать" NPC, к которым, воможно, в этом месте приближается игрок, вызывая их переход в онлайн - особенно если проводилась какя-либо работа с этими NPC (или вообще какими-то новыми, или модифицированными старыми объектами). Раз уж вылет без лога. Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 21 Июля 2011 strchi, выложи свой вариант скрипта, чтобы можно было просмотреть, в чём ошибка. А чтобы приёмник был изначально, либо зарегистрируй его в all.spawn, либо создай его тем же самым скриптом, вызвав при первом запуске игры. При этом не забудь удалить вызов функции - удали строку moi_mod.spawn_patefon() из give_weapon_to_actor(trader, actor), иначе в дальнейшем жутких косяков со звуками не избежать . Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 3 Августа 2011 kuzia, можно. Судя по всему, речь идёт о т.н. АМК-аномалиях. В общем случае даже не потребуется править all.spawn (вообще, это нужно только для того, чтобы очистить его от АМК-аномалий, а заодно и расширить за их счёт массив свободных сториайд, без чего можно спокойно обойтись ). Заново ничего создавать не нужно - т.к. "аномалии разработчиков" не удалялись из all.spawn, а просто "стираются" тем же самым скриптом, что и спонятся новые, динамические. Так что нужно всего лишь слегка поправить "фичу", спонящую/удаляющую динамические аномалии. Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 5 Сентября 2011 Обнаружил вот какую неприятность: при использовании изменённого game.graph (дополнительные "АИ-связи" локаций), на большом расстоянии от "перехода" исчезает укзатель (стрелка на миникарте) на маркер задачи, назначенной на другой локации. Что не есть гуд. Кто-нибудь решал такую проблемку? Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 15 Сентября 2011 (изменено) weas, попробуй в секции твоей аномалии прописать: postprocess = postprocess_psy_zone А ты сам пробовал? В оригинальной игре (ТЧ) такая секция [postprocess_psy_zone] отсутствует. --/ Artos Изменено 15 Сентября 2011 пользователем Artos Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 30 Марта 2016 И ещё опять же по поводу костров: заметил что к примеру на локации Припять нет освещения окружающих объектов и территорий от косторов, Исправить этот недочёт можно только через SDK? Можно и без SDK - я добавлял освещение для костров Припяти, банально редактируя all.spawn. Но получил в результате довольно заметное "подтормаживание" в Припяти в процессе игры. Всё же нагрузка - источники света, да ещё и анимацией. Поэтому плюнул, и вернул всё в исходное состояние. Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 9 Апреля 2016 Просто ищем сталкера по имени (не character_name, а именно name!), и снимаем с него метку (точку на (мини)карте): local obj = alife():object("stalker_name") if obj then obj:visible_for_map(false) end Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 9 Апреля 2016 А как объяснить игроку, почему допустим на одном трупике метки нет, а на других есть? Не думаю, что в этом есть что-то требующее объяснений - например, у зомбированных сталкеров ведь тоже нет отметок на карте. Поделиться этим сообщением Ссылка на сообщение
=VENOM= 50 Опубликовано 9 Апреля 2016 Отвечу по-одесски, вопросом на вопрос: а что, собственно, мешает в нужный момент (к примеру, в момент выдачи квеста), снова поставить метку на труп доцента Лазарева? Вот так: local obj = alife():object("stalker_name") if obj then obj:visible_for_map(true) end 1 Поделиться этим сообщением Ссылка на сообщение