SibireaStalker 0 Опубликовано 4 Мая 2011 Поделиться Опубликовано 4 Мая 2011 Звук и музыка Поскольку вопрос попадался достаточно часто, решил завести тему. Итак, начнём....Для работы понадобятся: *Распакованная игра ([COP] или [CS]) *Звук и музыка *Последний кодек с возможностью проигрывания Ogg-звука *Редактор звука *X-Ray SDK (необязателен) *Терпение! Для этого нам понадобятся файлы ambients и sound_channels. Бежим в последнюю и создаём: [random_moans] - уникальное имя max_distance = 60.000000 min_distance = 20.000000 period0 = 1000 period1 = 20000 } PeriodX - частота проигрывания period2 = 10000 period3 = 30000 sounds = ambient\sound_channels_new\krik, ambient\sound_channels_new\krik1 [b]- путь до звука не включая папку sounds Далее, идём в ambients и видим: [day] - уникальное имя effects = effect_1, effect_2, effect_3, effect_5, effect_6, effect_7, effect_8 max_effect_period = 90.000000 min_effect_period = 40.000000 sound_channels = wind_bkg_1, bkwind_1, bkwind_2, swampwind_1, dogs_1, gunshots_1, crows_2, flies_1 - секции, проигрываемые в sound_channels. Вот и всё! А чтобы прописать звуки в СS, нужно лишь "дописать" нужные секции в LTX -файлах, расположенных в папке ambients Перегонка звука - та ещё беда. Но если хотите сделать звук тишегромче, то вам - прямая дорога сюда. Любым музыкальным редактором (например, можно использовать Sound Forge 10.0), подготавливаем наши звуковые файлы, они должны быть сохранены в следующем виде: WAV (standard) 44100Гц, Моно, 16 бит. После сохранения выбранных треков в данном виде, их необходимо перевести в формат, поддерживаемый игрой. Для этого нам понадобится X-Ray SDK – официальный пакет разработчика для игры S.T.A.L.K.E.R. Кладём подготовленные файлы в папку rawdata\sounds. Открываем любым эдитором (я предпочитаю Postprocess), там нажимаем кнопку sounds, и после этого появляется окошко: справа отражены Ваши звуки, слева - их настройка. Quality = 0.0 Ширина полосы частоты, окружающая центральную частоту (для более плавного угасания звука или его стабильности).MinDist = 300.0 Расстояние, с которого громкость звука начнет затухать (чем ниже к MaxDist, тем плавнее переход, но Quality нужно увеличить).MaxDist = 300.0 Максимальное расстояние, на котором звук будет слышен ГГ.MaxAIDist = 300.0 Максимальное расстояние, на котором звук будут слышать NPC. BaseVolume = 1.0 Громкость С выделенными параметрами стоит быть аккуратнее, иначе звук может быть оглушён или проигрываться неравномерно! А также задается, к какому типу звуков в игре он относится. Думаю, тут вы сами всё поймёте, элементарные знания английского есть у каждого. После всех настроек выходим из sound_editor, синхронизируем звуки, забираем их в gamedata/sounds На самом деле, создать "рабочий" приёмник не так сложно. Нужно лишь знать немного логики. Итак, прописываем предмет через all.spawn, в необходимых строчках задаём путь к логике (внизу предмета должна быть "подпись": [logic] cfg = scripts\music\priemnik_sultan.ltx END ), где cfg = scripts\music\priemnik_sultan.ltx - полный путь до логики, с его названием. Сама логика должна выглядеть как-то так: [logic] active = ph_sound [ph_sound] snd = music_looser looped = false min_idle = 300 max_idle = 500 random = true Далее, идём в sound theme.script: ph_snd_themes = {} ph_snd_themes["music_looser"] = { "music\\radio\\boyan", } , где ph_snd_themes["music_looser"] = { - snd-назвавние в логике, а "music\\radio\\boyan" - это проигрываемые произведения. Далее, нужо прописать наш "музыкальный предмет" нужно прописать в modules: ---------------------------------------------------------------------- -- Загрузка модулей физических объектов: ---------------------------------------------------------------------- load_scheme("ph_sound", "ph_sound", stype_item) и ---------------------------------------------------------------------- -- Загрузка модулей рестрикторов: ---------------------------------------------------------------------- load_scheme("sr_sound", "sr_sound", stype_restrictor) sr_sound берём из ТЧ, а в xr_sound.script вставляем куски кода ТЧ, что бы получилось так: --'------------------------------------------------------------------------------------------------------------------- --' Схема озвучки --' автор: Диденко Руслан (Stohe) --'-------------------------------------------------------------------------------------------------------------------- --function printf() --end sound_table = {} function set_sound_play(npc_id, sound, faction, point) --printf("SET_SOUND_PLAY. theme[%s] object[%s]", tostring(sound), npc_id) if sound == nil then return end if sound_theme.theme[sound] == nil then abort("set_sound_play. Wrong sound theme [%s], npc[%s]", tostring(sound), npc_id) return end local snd_theme = sound_theme.theme[sound] if snd_theme.class_id == "looped_sound" then abort("You trying to play sound [%s] which type is looped", sound) end if sound_table[npc_id] == nil or snd_theme.play_always == true then if sound_table[npc_id] ~= nil then --printf("sound table not nil") if(sound_table[npc_id].reset~=nil) then sound_table[npc_id]:reset(npc_id) else --printf("--------------"..type(sound_table[npc_id])) --printf("npc_id="..npc_id) --printf("sound="..sound) end end --printf("PLAY. theme[%s] object[%s]", tostring(sound), npc_id) if snd_theme:play(npc_id, faction, point) then --printf("PLAY2. theme[%s] object[%s]", tostring(sound), npc_id) --' fill table sound_table[npc_id] = snd_theme end else --printf("xr_sound: cannot play sound [%s] because i'm [%s] already play snd [%s]",tostring(sound), npc_id, sound_table[npc_id].path) return sound_table[npc_id].snd_obj end return sound_table[npc_id] and sound_table[npc_id].snd_obj end function update(npc_id) if sound_table[npc_id] then -- local t = type(sound_table[npc_id]) if not(sound_table[npc_id]:is_playing(npc_id)) then -- if(t=="string") or not(sound_table[npc_id]:is_playing(npc_id)) then -- if(t=="string") then -- sound_table[npc_id] = sound_theme.theme[sound_table[npc_id]] -- end --printf("SOUND_CALLBACK from [%s] sound_path [%s]",npc_id,sound_table[npc_id].path) sound_table[npc_id]:callback(npc_id) sound_table[npc_id] = nil end end end looped_sound = {} function play_sound_looped(npc_id, sound) local snd_theme = sound_theme.theme[sound] if snd_theme == nil then abort("play_sound_looped. Wrong sound theme [%s], npc[%s]", tostring(sound), npc_id) end if snd_theme.class_id ~= "looped_sound" then abort("You trying to play sound [%s] which type is not looped", sound) end if looped_sound[npc_id] ~= nil and looped_sound[npc_id][sound] ~= nil and looped_sound[npc_id][sound]:is_playing(npc_id) then return end if snd_theme:play(npc_id) then printf("PLAY2. looped theme[%s] object[%s]", tostring(sound), npc_id) if looped_sound[npc_id] == nil then looped_sound[npc_id] = {} end looped_sound[npc_id][sound] = snd_theme end end function stop_sound_looped(npc_id, sound) if sound then if type(looped_sound[npc_id][sound]) ~= "string" then if looped_sound[npc_id][sound] and looped_sound[npc_id][sound]:is_playing(npc_id) then printf("looped sound ["..tostring(sound).."] stop for obj [%s]",npc_id) looped_sound[npc_id][sound]:stop() looped_sound[npc_id][sound] = nil end end else if looped_sound[npc_id] then for k,v in pairs(looped_sound[npc_id]) do if v and type(v) ~= "string" and v:is_playing(npc_id) then printf("looped sound ["..tostring(k).."] stop for obj [%s]",npc_id) v:stop() end end looped_sound[npc_id] = nil end end end function set_volume_sound_looped(npc_id, sound, level) if looped_sound[npc_id] then if looped_sound[npc_id][sound] and looped_sound[npc_id][sound]:is_playing(npc_id) then printf("looped sound ["..tostring(sound).."] for obj ["..npc_id.."] set volume "..level) looped_sound[npc_id][sound]:set_volume(level) end end end function actor_save(thread) set_save_marker(thread, "save", false, "sound_actor_save") for k,v in pairs(sound_theme.theme) do v:save(thread) end local n = 0 for k,v in pairs(sound_table) do n = n + 1 end thread:w_u16(n) for k,v in pairs(sound_table) do thread:w_u16(k) --[[ if(type(v.section)~="string") then thread:w_stringZ(v) else ]] thread:w_stringZ(v.section) -- end end n = 0 for k,v in pairs(looped_sound) do n = n + 1 end thread:w_u16(n) for k,v in pairs(looped_sound) do thread:w_u16(k) n = 0 for kk,vv in pairs(looped_sound[k]) do n = n + 1 end thread:w_u16(n) for kk,vv in pairs(looped_sound[k]) do thread:w_stringZ(kk) --[[ if(type(vv.section)~="string") then thread:w_stringZ(vv) else thread:w_stringZ(vv.section) end ]] end end set_save_marker(thread, "save", true, "sound_actor_save") end function actor_load(thread) set_save_marker(thread, "load", false, "sound_actor_save") for k,v in pairs(sound_theme.theme) do v:load(thread) end sound_table = {} local n = thread:r_u16() for i = 1,n do local id = thread:r_u16() local theme = thread:r_stringZ() -- sound_table[id] = thread:r_stringZ() sound_table[id] = sound_theme.theme[theme] end looped_sound = {} n = thread:r_u16() for i = 1,n do local id = thread:r_u16() looped_sound[id] = {} n = thread:r_u16() for i = 1,n do local sound = thread:r_stringZ() -- looped_sound[id][sound] = thread:r_stringZ() looped_sound[id][sound] = sound_theme.theme[sound] end end set_save_marker(thread, "load", true, "sound_actor_save") end function save_npc(thread, npc_id) set_save_marker(thread, "save", false, "sound_npc_save") for k,v in pairs(sound_theme.theme) do v:save_npc(thread, npc_id) end set_save_marker(thread, "save", true, "sound_npc_save") end function load_npc(thread, npc_id) set_save_marker(thread, "load", false, "sound_npc_save") for k,v in pairs(sound_theme.theme) do v:load_npc(thread, npc_id) end set_save_marker(thread, "load", true, "sound_npc_save") end function start_game_callback() sound_table = {} end function stop_all_sounds() for k,v in pairs(sound_table) do if(type(v)~="string") then v:stop() end end for k,v in pairs(looped_sound) do for k,v in pairs(looped_sound[k]) do if v and v:is_playing(npc_id) then printf("looped sound ["..tostring(k).."] stopped ") v:stop() end end end end function stop_sounds_by_id(obj_id) local sound = sound_table[obj_id] if sound and sound.stop then sound:stop(obj_id) end local looped_snd = looped_sound[obj_id] if looped_snd then for k,v in pairs(looped_snd) do if v and v:is_playing(obj_id) then v:stop(obj_id) end end end end --------------------------------------------------------------------------------------------------------------------- -- Схема озвучки -- автор: Диденко Руслан (Stohe) -- update: Чугай Александр (Chugai) ---------------------------------------------------------------------------------------------------------------------- key_by_id = {} group_idle = {} --function printf() --end function get_sound(path, tt, npc) if path == nil then return nil end if path.exec == nil then -- чтение настроек темы tt.into_id = path.into_id tt.into_max = path.max_ids[npc:id()].into_max tt.into_last = nil tt.rnd_id = path.rnd_id tt.rnd_max = path.max_ids[npc:id()].rnd_max tt.rnd_last = nil tt.min_snd = path.min_snd tt.max_snd = path.max_snd tt.rnd_snd = path.rnd_snd else get_sound(path.types[path.exec(path.types, npc)], tt, npc) end end -- Формирование ключа персонажа function get_key(npc) local key -- формирование ключа local overrides = xr_logic.generic_scheme_overrides(npc) if overrides and overrides.soundgroup then key = overrides.soundgroup else key = utils.to_str(npc:id()) end -- апдейт таблиц не менять! if xr_sound.key_by_id[npc:id()] ~= key then if xr_sound.group_idle[xr_sound.key_by_id[npc:id()]] ~= nil then xr_sound.group_idle[xr_sound.key_by_id[npc:id()]].num_in_group = xr_sound.group_idle[xr_sound.key_by_id[npc:id()]].num_in_group - 1 end xr_sound.key_by_id[npc:id()] = key if xr_sound.group_idle[key] == nil then xr_sound.group_idle[key] = {num_in_group = 1} else xr_sound.group_idle[key].num_in_group = xr_sound.group_idle[key].num_in_group + 1 end end return key end ----------------------------------------------------------------------------------------------------------------------------------- -- Установка и распарсивание тем в файлы. ----------------------------------------------------------------------------------------------------------------------------------- function set_sound(npc, sound, now, into_timeout) -- printf("*SND* [%s] try to change SND to [%s]", npc:name(), tostring(sound)) local npc_id = npc:id() if (db.sound[npc_id] == nil or db.sound[npc_id].theme ~= sound) or now == true then -- if db.sound[npc_id] == nil then -- printf("*SND* change SND [_] to [%s] for [%s]", tostring(sound), npc:name()) -- else -- printf("*SND* change SND [%s] to [%s] for [%s]", tostring(db.sound[npc_id].theme), tostring(sound), npc:name()) -- end -- Туточки надобно распарсить имена тем в их id if sound == nil then sound = "" end if db.sound[npc_id] == nil then db.sound[npc_id] = {} end db.sound[npc_id].theme = sound db.sound[npc_id].snd = parse_names(sound) if db.sound[npc_id].last_snd == nil then db.sound[npc_id].last_snd = {} else local snd_table = {} local t = 0 for k,v in pairs(db.sound[npc_id].snd) do snd_table[t] = {} get_sound(sound_theme.theme[v], snd_table[t], npc) t = t + 1 end for k,v in pairs(snd_table) do if v.into_id then db.sound[npc_id].last_snd[v.into_id] = nil end if v.rnd_id then db.sound[npc_id].last_snd[v.rnd_id] = nil end end end -- Устанавливаем входную паузу local key = get_key(npc) xr_sound.group_idle[key].begin = time_global() if into_timeout then xr_sound.group_idle[key].idle = into_timeout else xr_sound.group_idle[key].idle = 0 end if now == true then stop_play_sound(npc) end end end function play_sound(npc, themes, timeout) -- нужно составить список тем local snd_table = {} local t = 0 for k,v in pairs(themes) do snd_table[t] = {} if sound_theme.theme[v] ~= nil then snd_table[t].theme = v get_sound(sound_theme.theme[v], snd_table[t], npc) else abort("ERROR: ILLEGAL PLAY SOUND!!! %s for %s", v, npc:name()) end t = t + 1 end --printf("*") --print_table(snd_table) if t == 0 then return end -- из списка тем выбираем одну. local snd = snd_table[math.random(0, t-1)] if snd ~= nil then --printf("!") --print_table(snd) if snd.min_snd == nil then return end local npc_id = npc:id() local group_table = xr_sound.group_idle[get_key(npc)] group_table.idle = math.random(snd.min_snd, snd.max_snd)*1000 if group_table.last_snd == nil then group_table.last_snd = {} end -- необходимо ли нам играть into или rnd звуки if snd.into_max ~= nil and snd.into_max > 0 then if db.sound[npc_id].last_snd[snd.into_id] == snd.into_max - 1 then if snd.into_cycled == true then db.sound[npc_id].last_snd[snd.into_id] = nil else return end end -- играем входные if db.sound[npc_id].last_snd[snd.into_id] == nil then db.sound[npc_id].last_snd[snd.into_id] = -1 end --printf("*SND* play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id]+1, npc:name()) process_tutor_on_sound(snd.theme) npc:play_sound(snd.into_id, 1, 0, 1, 0, db.sound[npc_id].last_snd[snd.into_id]+1) db.sound[npc_id].last_snd[snd.into_id] = db.sound[npc_id].last_snd[snd.into_id] + 1 --printf("*SND* play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id], npc:name()) return end if snd.rnd_max ~= nil and snd.rnd_max > 0 then -- играем рандомные local s = 0 if snd.rnd_max == 1 then s = 0 else -- Если прошлый раз проигрывался такой же набор тем -- то учитывать последний звук для группы. -- if db.sound[npc_id].last_snd[snd.rnd_id] ~= nil then if group_table.last_snd[snd.rnd_id] ~= nil then s = math.random(0, snd.rnd_max-2) if s >= group_table.last_snd[snd.rnd_id] then s = s + 1 end else s = math.random(0, snd.rnd_max-1) end end if timeout == nil then timeout = 0 end --printf("*SND* play rnd [%s] for [%s]", s, npc:name()) process_tutor_on_sound(snd.theme) npc:play_sound(snd.rnd_id, timeout+1, timeout, 1, 0, s) --db.sound[npc_id].last_snd[snd.rnd_id] = s group_table.last_snd[snd.rnd_id] = s end end end function get_last_IDS(npc, theme) local last_table = db.sound[npc:id()].last_snd local snd_table = {} if sound_theme.theme[theme] ~= nil then get_sound(sound_theme.theme[theme], snd_table, npc) end printf("LAST INTO ID for [%s] = [%s], max [%s]", theme, last_table[snd_table.into_id], snd_table.into_max) return last_table[snd_table.into_id], snd_table.into_max end function load_sound(npc) sound_theme.load_sound(npc) end function process_tutor_on_sound(theme) end --' Actor sound player local actor_sound = {} function set_actor_sound(sound) printf("*ACTOR SND* try to change SND to [%s]", tostring(sound)) if actor_sound.theme ~= sound then --' Туточки надобно распарсить имена тем в их id if sound == nil then sound = "" end actor_sound.theme = sound actor_sound.begin = nil this.set_actor_sound_factor(1) end end function set_actor_sound_factor(factor) local theme = sound_theme.actor_theme[actor_sound.theme] if theme ~= nil then actor_sound.min_snd = theme.min_snd * factor actor_sound.max_snd = theme.max_snd * factor end end function update_actor() local theme = sound_theme.actor_theme[actor_sound.theme] if theme == nil then return end if table.getn(theme.sounds) == 0 then return end if actor_sound.begin == nil or time_global() - actor_sound.begin >= actor_sound.idle then actor_sound.begin = time_global() --' Тут надо отыграть звук local sound = theme.sounds[math.random(table.getn(theme.sounds))] if sound ~= nil then sound:play(db.actor, 0, sound_object.s2d) end actor_sound.idle = math.random(actor_sound.min_snd, actor_sound.max_snd) end end --' Таблица для хранения созданных саунд обжектов. sound_object_by_theme = {} --' type = [random|seq|looped] function get_sound_object(theme, t_type) if sound_theme.ph_snd_themes[theme] == nil then abort("ph_snd_themes for theme %s", tostring(theme)) return end if sound_object_by_theme[theme] == nil then sound_object_by_theme[theme] = {} end if t_type == nil then t_type = "random" end --' Выбор следующего айдишника local play_id = -1 local table_size = table.getn(sound_theme.ph_snd_themes[theme]) if sound_object_by_theme[theme].last_id == nil then if t_type == "random" then if table_size >= 2 then play_id = math.random(1, table_size) else play_id = 1 end else play_id = 1 end else if t_type == "random" then if table_size >= 2 then play_id = math.random(1, table_size - 1) if play_id >= sound_object_by_theme[theme].last_id then play_id = play_id + 1 end else play_id = 1 end else if sound_object_by_theme[theme].last_id < table_size then play_id = sound_object_by_theme[theme].last_id + 1 else if type == "looped" then play_id = 1 end end end end printf("SOUND_OBJECT: selected id [%s] for theme [%s], type [%s], size [%s]", tostring(play_id), tostring(theme), tostring(type), table_size) if play_id == -1 then return end --' Проверяем создан ли у нас соответствующий саунд обжект или его надо создать if sound_object_by_theme[theme][play_id] == nil then if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then sound_object_by_theme[theme][play_id.."_r"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_r") sound_object_by_theme[theme][play_id.."_l"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_l") else sound_object_by_theme[theme][play_id] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id]) end end sound_object_by_theme[theme].last_id = play_id --' Возвращаем саунд обжект if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then return sound_object_by_theme[theme][play_id.."_r"], sound_object_by_theme[theme][play_id.."_l"] else return sound_object_by_theme[theme][play_id] end end local sound_object_by_path = {} --' Обертка вокруг функции, возвращающий звуковой объект. function get_safe_sound_object(path) if sound_object_by_path[path] == nil then sound_object_by_path[path] = sound_object(path) end return sound_object_by_path[path] end function stop_all_sound_object() for k,v in pairs(sound_object_by_path) do if v:playing() then v:stop() end end end function clear_all_sound_object() sound_object_by_theme = {} end А в dynamic_objects можно сделать логику предмету тоже: custom_data = scripts\sounds\music\priemnik_azot_music.ltx Некоторые сталкивались с проблемой, когда на подключенной локации не играет музыка. А "музычка" делается элементарно. Идём в game_levels_music и видим: [zaton_musics] music\zaton_day = 5, 22, 0.2, 2, 4 music\zaton_night = 22, 5, 0.3, 1, 2 [jupiter_musics] music\jupiter_day = 5, 22, 0.3, 2, 4 music\jupiter_night = 22, 5, 0.25, 1, 2 [pripyat_musics] music\pripyat_day = 5, 22, 0.2, 2, 4 music\pripyat_night = 22, 5, 0.25, 1, 2 [underground_musics] music\underground = 1, 23, 0.25, 2, 4 music\underground = 23, 1, 0.25, 2, 4 Далее, делаем такую же секцию с вашей локацией (в некоторых версиях "загатовки" уже есть), кидаем нужные файлы, прописываем в game_levels секцию На этом пока - всё. Я знаю о звуке многое, но не всё. Однако с вами мы сможем доделать тему и дополнить свои знания. Всего наилучшего! P.S. В статьях могут быть неточности, замечания приветствуются. Цитата Выводы модмейкера: 1)Вылетает - это хорошо. Значит, работает 2) Если хочешь сделать что-то хорошо, делай сам! 3) Если падёшь духом, падёт и мод. 4) Он живой... Ссылка на комментарий
ZeeK 55 Опубликовано 4 Мая 2011 Поделиться Опубликовано 4 Мая 2011 SibireaStalker Грамафоны и приёмники (начало) сразу допиши про редактирование xr_sound, а то схема работать не будет Цитата Не соответствует. N6260 Ссылка на комментарий
amik 252 Опубликовано 4 Мая 2011 Поделиться Опубликовано 4 Мая 2011 (изменено) Хорошая статья Sound_Editor Кстати не знаю как в [COP] и [CS] но в ТЧ после синхронизации эти звуки можно и послушать в СДК... И еще, запустив ShaderEditor в конце есть вкладка Sound Evn, как ей пользоваться не знаю, нужды разбираться пока не было... Изменено 4 Мая 2011 пользователем amik Цитата Мой архив Сталкером не занимаюсь. Ссылка на комментарий
Galil 18 Опубликовано 5 Мая 2011 Поделиться Опубликовано 5 Мая 2011 amik по переводу строк оттуда можно уже определить что это настройки звукого окружения. Ревебрация, глушение, искажение, сила распространения и т.д. - но это настройки в заданых конфигурациях. Конфигурации: -в ваннне -обычное окружение -в лесу -в доме -незнаю(слегка изменное обычное окружениие) -в коридоре -в горах -на открытом пространстве -написано plant, но в приписке написано ангар -в комнате -во дворе ,но приписка - в лесу А вообще хрен его знает - работает ли все это или нет... Цитата Cold Zone *** Youtube *** Стволы *** SC2TV Ссылка на комментарий
SibireaStalker 0 Опубликовано 5 Мая 2011 Автор Поделиться Опубликовано 5 Мая 2011 (изменено) ZeeK, а что там дописывать-то? Не припомню что-то Я вот вспомнил, что в недописал, что ещё sound_theme править надо: ph_snd_themes = {} ph_snd_themes["music_looser"] = { "music\\radio\\boyan", } , где ph_snd_themes["music_looser"] = { - snd-назвавние в логике, а "music\\radio\\boyan" - это проигрываемые произведения. amik, ну да, после компиляции звуки в СДК проигрываются. А с ShaderEditor вообще неочень понятно: там звук $no_sound сразу проигрываться начинает. И по-моему, там же можно настроить что-то вроде радиуса проигрывания. Ну, посмотрю, что вам ещё можно рассказать . Изменено 6 Мая 2011 пользователем SibireaStalker Цитата Выводы модмейкера: 1)Вылетает - это хорошо. Значит, работает 2) Если хочешь сделать что-то хорошо, делай сам! 3) Если падёшь духом, падёт и мод. 4) Он живой... Ссылка на комментарий
amik 252 Опубликовано 5 Мая 2011 Поделиться Опубликовано 5 Мая 2011 Galil Ну перевод само собой понятен )) Непонятно где эти настройки хранятся раз и за что точно отвечают два (хотя примерно понятно env_ambient). SibireaStalker Аудасити добавь, он бесплатен. Цитата Мой архив Сталкером не занимаюсь. Ссылка на комментарий
Clayman 103 Опубликовано 7 Мая 2011 Поделиться Опубликовано 7 Мая 2011 (изменено) По поводу граммафонов и приемников... спрашивал в другой теме, как прикручивать звук физ. объектам, никто не ответил. Да, в тч это было через ph_sound, но в ЗП в sound_theme.script ничего не прописывается. Вобщем посмотрел как в зп матюгальник матюгается (рупор) и сделал по аналогии для радиоприемника в баре: [logic] active = ph_idle@wait [ph_idle@wait] on_info = {} %=play_sound(radio_music)% Ну есс-но можно всякие условия писать для рупоров, я просто без условий сделал - играет постоянно.. Может кто знает более красивое решение. Да, конечно звук radio_music.ogg должен быть положен в нужную папку и зарегистрирован в script_sound.ltx (или в инклуженом файле), как это делать - на вики статья есть. Изменено 7 Мая 2011 пользователем Clayman Цитата Ссылка на комментарий
ZeeK 55 Опубликовано 7 Мая 2011 Поделиться Опубликовано 7 Мая 2011 (изменено) Clayman надеюсь я правильно понял твою проблему про физ. объекты: открываем алл спавн(например Затон, секция приемника Горизонт на Скадовске), дописываем [logic] cfg = scripts\music\priemnik_gorizont.ltx END создаем логику priemnik_gorizont.ltx [logic] active = ph_sound [ph_sound] snd = music_and_radio looped = false min_idle = 300 max_idle = 500 random = true открываем sound_theme.script, пишем ph_snd_themes = {} ph_snd_themes["music_and_radio"] = { "ambient\\special\\radio_comm_1", "ambient\\special\\marsh_radio_1", "ambient\\special\\garbage_bandits_radio_1" и т.д. какую музыку тебе нада потом в modules дописываешь ---------------------------------------------------------------------- -- Загрузка модулей физических объектов: ---------------------------------------------------------------------- load_scheme("ph_sound", "ph_sound", stype_item) и ---------------------------------------------------------------------- -- Загрузка модулей рестрикторов: ---------------------------------------------------------------------- load_scheme("sr_sound", "sr_sound", stype_restrictor) sr_sound тырим из ТЧ, а в xr_sound.script вставляем куски кода ТЧ, что бы получилось так: --'------------------------------------------------------------------------------------------------------------------- --' Схема озвучки --' автор: Диденко Руслан (Stohe) --'-------------------------------------------------------------------------------------------------------------------- --function printf() --end sound_table = {} function set_sound_play(npc_id, sound, faction, point) --printf("SET_SOUND_PLAY. theme[%s] object[%s]", tostring(sound), npc_id) if sound == nil then return end if sound_theme.theme[sound] == nil then abort("set_sound_play. Wrong sound theme [%s], npc[%s]", tostring(sound), npc_id) return end local snd_theme = sound_theme.theme[sound] if snd_theme.class_id == "looped_sound" then abort("You trying to play sound [%s] which type is looped", sound) end if sound_table[npc_id] == nil or snd_theme.play_always == true then if sound_table[npc_id] ~= nil then --printf("sound table not nil") if(sound_table[npc_id].reset~=nil) then sound_table[npc_id]:reset(npc_id) else --printf("--------------"..type(sound_table[npc_id])) --printf("npc_id="..npc_id) --printf("sound="..sound) end end --printf("PLAY. theme[%s] object[%s]", tostring(sound), npc_id) if snd_theme:play(npc_id, faction, point) then --printf("PLAY2. theme[%s] object[%s]", tostring(sound), npc_id) --' fill table sound_table[npc_id] = snd_theme end else --printf("xr_sound: cannot play sound [%s] because i'm [%s] already play snd [%s]",tostring(sound), npc_id, sound_table[npc_id].path) return sound_table[npc_id].snd_obj end return sound_table[npc_id] and sound_table[npc_id].snd_obj end function update(npc_id) if sound_table[npc_id] then -- local t = type(sound_table[npc_id]) if not(sound_table[npc_id]:is_playing(npc_id)) then -- if(t=="string") or not(sound_table[npc_id]:is_playing(npc_id)) then -- if(t=="string") then -- sound_table[npc_id] = sound_theme.theme[sound_table[npc_id]] -- end --printf("SOUND_CALLBACK from [%s] sound_path [%s]",npc_id,sound_table[npc_id].path) sound_table[npc_id]:callback(npc_id) sound_table[npc_id] = nil end end end looped_sound = {} function play_sound_looped(npc_id, sound) local snd_theme = sound_theme.theme[sound] if snd_theme == nil then abort("play_sound_looped. Wrong sound theme [%s], npc[%s]", tostring(sound), npc_id) end if snd_theme.class_id ~= "looped_sound" then abort("You trying to play sound [%s] which type is not looped", sound) end if looped_sound[npc_id] ~= nil and looped_sound[npc_id][sound] ~= nil and looped_sound[npc_id][sound]:is_playing(npc_id) then return end if snd_theme:play(npc_id) then printf("PLAY2. looped theme[%s] object[%s]", tostring(sound), npc_id) if looped_sound[npc_id] == nil then looped_sound[npc_id] = {} end looped_sound[npc_id][sound] = snd_theme end end function stop_sound_looped(npc_id, sound) if sound then if type(looped_sound[npc_id][sound]) ~= "string" then if looped_sound[npc_id][sound] and looped_sound[npc_id][sound]:is_playing(npc_id) then printf("looped sound ["..tostring(sound).."] stop for obj [%s]",npc_id) looped_sound[npc_id][sound]:stop() looped_sound[npc_id][sound] = nil end end else if looped_sound[npc_id] then for k,v in pairs(looped_sound[npc_id]) do if v and type(v) ~= "string" and v:is_playing(npc_id) then printf("looped sound ["..tostring(k).."] stop for obj [%s]",npc_id) v:stop() end end looped_sound[npc_id] = nil end end end function set_volume_sound_looped(npc_id, sound, level) if looped_sound[npc_id] then if looped_sound[npc_id][sound] and looped_sound[npc_id][sound]:is_playing(npc_id) then printf("looped sound ["..tostring(sound).."] for obj ["..npc_id.."] set volume "..level) looped_sound[npc_id][sound]:set_volume(level) end end end function actor_save(thread) set_save_marker(thread, "save", false, "sound_actor_save") for k,v in pairs(sound_theme.theme) do v:save(thread) end local n = 0 for k,v in pairs(sound_table) do n = n + 1 end thread:w_u16(n) for k,v in pairs(sound_table) do thread:w_u16(k) --[[ if(type(v.section)~="string") then thread:w_stringZ(v) else ]] thread:w_stringZ(v.section) -- end end n = 0 for k,v in pairs(looped_sound) do n = n + 1 end thread:w_u16(n) for k,v in pairs(looped_sound) do thread:w_u16(k) n = 0 for kk,vv in pairs(looped_sound[k]) do n = n + 1 end thread:w_u16(n) for kk,vv in pairs(looped_sound[k]) do thread:w_stringZ(kk) --[[ if(type(vv.section)~="string") then thread:w_stringZ(vv) else thread:w_stringZ(vv.section) end ]] end end set_save_marker(thread, "save", true, "sound_actor_save") end function actor_load(thread) set_save_marker(thread, "load", false, "sound_actor_save") for k,v in pairs(sound_theme.theme) do v:load(thread) end sound_table = {} local n = thread:r_u16() for i = 1,n do local id = thread:r_u16() local theme = thread:r_stringZ() -- sound_table[id] = thread:r_stringZ() sound_table[id] = sound_theme.theme[theme] end looped_sound = {} n = thread:r_u16() for i = 1,n do local id = thread:r_u16() looped_sound[id] = {} n = thread:r_u16() for i = 1,n do local sound = thread:r_stringZ() -- looped_sound[id][sound] = thread:r_stringZ() looped_sound[id][sound] = sound_theme.theme[sound] end end set_save_marker(thread, "load", true, "sound_actor_save") end function save_npc(thread, npc_id) set_save_marker(thread, "save", false, "sound_npc_save") for k,v in pairs(sound_theme.theme) do v:save_npc(thread, npc_id) end set_save_marker(thread, "save", true, "sound_npc_save") end function load_npc(thread, npc_id) set_save_marker(thread, "load", false, "sound_npc_save") for k,v in pairs(sound_theme.theme) do v:load_npc(thread, npc_id) end set_save_marker(thread, "load", true, "sound_npc_save") end function start_game_callback() sound_table = {} end function stop_all_sounds() for k,v in pairs(sound_table) do if(type(v)~="string") then v:stop() end end for k,v in pairs(looped_sound) do for k,v in pairs(looped_sound[k]) do if v and v:is_playing(npc_id) then printf("looped sound ["..tostring(k).."] stopped ") v:stop() end end end end function stop_sounds_by_id(obj_id) local sound = sound_table[obj_id] if sound and sound.stop then sound:stop(obj_id) end local looped_snd = looped_sound[obj_id] if looped_snd then for k,v in pairs(looped_snd) do if v and v:is_playing(obj_id) then v:stop(obj_id) end end end end --------------------------------------------------------------------------------------------------------------------- -- Схема озвучки -- автор: Диденко Руслан (Stohe) -- update: Чугай Александр (Chugai) ---------------------------------------------------------------------------------------------------------------------- key_by_id = {} group_idle = {} --function printf() --end function get_sound(path, tt, npc) if path == nil then return nil end if path.exec == nil then -- чтение настроек темы tt.into_id = path.into_id tt.into_max = path.max_ids[npc:id()].into_max tt.into_last = nil tt.rnd_id = path.rnd_id tt.rnd_max = path.max_ids[npc:id()].rnd_max tt.rnd_last = nil tt.min_snd = path.min_snd tt.max_snd = path.max_snd tt.rnd_snd = path.rnd_snd else get_sound(path.types[path.exec(path.types, npc)], tt, npc) end end -- Формирование ключа персонажа function get_key(npc) local key -- формирование ключа local overrides = xr_logic.generic_scheme_overrides(npc) if overrides and overrides.soundgroup then key = overrides.soundgroup else key = utils.to_str(npc:id()) end -- апдейт таблиц не менять! if xr_sound.key_by_id[npc:id()] ~= key then if xr_sound.group_idle[xr_sound.key_by_id[npc:id()]] ~= nil then xr_sound.group_idle[xr_sound.key_by_id[npc:id()]].num_in_group = xr_sound.group_idle[xr_sound.key_by_id[npc:id()]].num_in_group - 1 end xr_sound.key_by_id[npc:id()] = key if xr_sound.group_idle[key] == nil then xr_sound.group_idle[key] = {num_in_group = 1} else xr_sound.group_idle[key].num_in_group = xr_sound.group_idle[key].num_in_group + 1 end end return key end ----------------------------------------------------------------------------------------------------------------------------------- -- Установка и распарсивание тем в файлы. ----------------------------------------------------------------------------------------------------------------------------------- function set_sound(npc, sound, now, into_timeout) -- printf("*SND* [%s] try to change SND to [%s]", npc:name(), tostring(sound)) local npc_id = npc:id() if (db.sound[npc_id] == nil or db.sound[npc_id].theme ~= sound) or now == true then -- if db.sound[npc_id] == nil then -- printf("*SND* change SND [_] to [%s] for [%s]", tostring(sound), npc:name()) -- else -- printf("*SND* change SND [%s] to [%s] for [%s]", tostring(db.sound[npc_id].theme), tostring(sound), npc:name()) -- end -- Туточки надобно распарсить имена тем в их id if sound == nil then sound = "" end if db.sound[npc_id] == nil then db.sound[npc_id] = {} end db.sound[npc_id].theme = sound db.sound[npc_id].snd = parse_names(sound) if db.sound[npc_id].last_snd == nil then db.sound[npc_id].last_snd = {} else local snd_table = {} local t = 0 for k,v in pairs(db.sound[npc_id].snd) do snd_table[t] = {} get_sound(sound_theme.theme[v], snd_table[t], npc) t = t + 1 end for k,v in pairs(snd_table) do if v.into_id then db.sound[npc_id].last_snd[v.into_id] = nil end if v.rnd_id then db.sound[npc_id].last_snd[v.rnd_id] = nil end end end -- Устанавливаем входную паузу local key = get_key(npc) xr_sound.group_idle[key].begin = time_global() if into_timeout then xr_sound.group_idle[key].idle = into_timeout else xr_sound.group_idle[key].idle = 0 end if now == true then stop_play_sound(npc) end end end function play_sound(npc, themes, timeout) -- нужно составить список тем local snd_table = {} local t = 0 for k,v in pairs(themes) do snd_table[t] = {} if sound_theme.theme[v] ~= nil then snd_table[t].theme = v get_sound(sound_theme.theme[v], snd_table[t], npc) else abort("ERROR: ILLEGAL PLAY SOUND!!! %s for %s", v, npc:name()) end t = t + 1 end --printf("*") --print_table(snd_table) if t == 0 then return end -- из списка тем выбираем одну. local snd = snd_table[math.random(0, t-1)] if snd ~= nil then --printf("!") --print_table(snd) if snd.min_snd == nil then return end local npc_id = npc:id() local group_table = xr_sound.group_idle[get_key(npc)] group_table.idle = math.random(snd.min_snd, snd.max_snd)*1000 if group_table.last_snd == nil then group_table.last_snd = {} end -- необходимо ли нам играть into или rnd звуки if snd.into_max ~= nil and snd.into_max > 0 then if db.sound[npc_id].last_snd[snd.into_id] == snd.into_max - 1 then if snd.into_cycled == true then db.sound[npc_id].last_snd[snd.into_id] = nil else return end end -- играем входные if db.sound[npc_id].last_snd[snd.into_id] == nil then db.sound[npc_id].last_snd[snd.into_id] = -1 end --printf("*SND* play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id]+1, npc:name()) process_tutor_on_sound(snd.theme) npc:play_sound(snd.into_id, 1, 0, 1, 0, db.sound[npc_id].last_snd[snd.into_id]+1) db.sound[npc_id].last_snd[snd.into_id] = db.sound[npc_id].last_snd[snd.into_id] + 1 --printf("*SND* play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id], npc:name()) return end if snd.rnd_max ~= nil and snd.rnd_max > 0 then -- играем рандомные local s = 0 if snd.rnd_max == 1 then s = 0 else -- Если прошлый раз проигрывался такой же набор тем -- то учитывать последний звук для группы. -- if db.sound[npc_id].last_snd[snd.rnd_id] ~= nil then if group_table.last_snd[snd.rnd_id] ~= nil then s = math.random(0, snd.rnd_max-2) if s >= group_table.last_snd[snd.rnd_id] then s = s + 1 end else s = math.random(0, snd.rnd_max-1) end end if timeout == nil then timeout = 0 end --printf("*SND* play rnd [%s] for [%s]", s, npc:name()) process_tutor_on_sound(snd.theme) npc:play_sound(snd.rnd_id, timeout+1, timeout, 1, 0, s) --db.sound[npc_id].last_snd[snd.rnd_id] = s group_table.last_snd[snd.rnd_id] = s end end end function get_last_IDS(npc, theme) local last_table = db.sound[npc:id()].last_snd local snd_table = {} if sound_theme.theme[theme] ~= nil then get_sound(sound_theme.theme[theme], snd_table, npc) end printf("LAST INTO ID for [%s] = [%s], max [%s]", theme, last_table[snd_table.into_id], snd_table.into_max) return last_table[snd_table.into_id], snd_table.into_max end function load_sound(npc) sound_theme.load_sound(npc) end function process_tutor_on_sound(theme) end --' Actor sound player local actor_sound = {} function set_actor_sound(sound) printf("*ACTOR SND* try to change SND to [%s]", tostring(sound)) if actor_sound.theme ~= sound then --' Туточки надобно распарсить имена тем в их id if sound == nil then sound = "" end actor_sound.theme = sound actor_sound.begin = nil this.set_actor_sound_factor(1) end end function set_actor_sound_factor(factor) local theme = sound_theme.actor_theme[actor_sound.theme] if theme ~= nil then actor_sound.min_snd = theme.min_snd * factor actor_sound.max_snd = theme.max_snd * factor end end function update_actor() local theme = sound_theme.actor_theme[actor_sound.theme] if theme == nil then return end if table.getn(theme.sounds) == 0 then return end if actor_sound.begin == nil or time_global() - actor_sound.begin >= actor_sound.idle then actor_sound.begin = time_global() --' Тут надо отыграть звук local sound = theme.sounds[math.random(table.getn(theme.sounds))] if sound ~= nil then sound:play(db.actor, 0, sound_object.s2d) end actor_sound.idle = math.random(actor_sound.min_snd, actor_sound.max_snd) end end --' Таблица для хранения созданных саунд обжектов. sound_object_by_theme = {} --' type = [random|seq|looped] function get_sound_object(theme, t_type) if sound_theme.ph_snd_themes[theme] == nil then abort("ph_snd_themes for theme %s", tostring(theme)) return end if sound_object_by_theme[theme] == nil then sound_object_by_theme[theme] = {} end if t_type == nil then t_type = "random" end --' Выбор следующего айдишника local play_id = -1 local table_size = table.getn(sound_theme.ph_snd_themes[theme]) if sound_object_by_theme[theme].last_id == nil then if t_type == "random" then if table_size >= 2 then play_id = math.random(1, table_size) else play_id = 1 end else play_id = 1 end else if t_type == "random" then if table_size >= 2 then play_id = math.random(1, table_size - 1) if play_id >= sound_object_by_theme[theme].last_id then play_id = play_id + 1 end else play_id = 1 end else if sound_object_by_theme[theme].last_id < table_size then play_id = sound_object_by_theme[theme].last_id + 1 else if type == "looped" then play_id = 1 end end end end printf("SOUND_OBJECT: selected id [%s] for theme [%s], type [%s], size [%s]", tostring(play_id), tostring(theme), tostring(type), table_size) if play_id == -1 then return end --' Проверяем создан ли у нас соответствующий саунд обжект или его надо создать if sound_object_by_theme[theme][play_id] == nil then if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then sound_object_by_theme[theme][play_id.."_r"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_r") sound_object_by_theme[theme][play_id.."_l"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_l") else sound_object_by_theme[theme][play_id] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id]) end end sound_object_by_theme[theme].last_id = play_id --' Возвращаем саунд обжект if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then return sound_object_by_theme[theme][play_id.."_r"], sound_object_by_theme[theme][play_id.."_l"] else return sound_object_by_theme[theme][play_id] end end local sound_object_by_path = {} --' Обертка вокруг функции, возвращающий звуковой объект. function get_safe_sound_object(path) if sound_object_by_path[path] == nil then sound_object_by_path[path] = sound_object(path) end return sound_object_by_path[path] end function stop_all_sound_object() for k,v in pairs(sound_object_by_path) do if v:playing() then v:stop() end end end function clear_all_sound_object() sound_object_by_theme = {} end если я все правильно вспомнил в результате можно будет делать музон к физ.объектам Добавлено через 4 мин.: А в dynamic_objects можно сделать тоже логику предмету custom_data = scripts\sounds\music\priemnik_azot_music.ltx Куратор темы благодарит Вас за дорабтку урока. SibireaStalker Изменено 8 Мая 2011 пользователем SibireaStalker 1 Цитата Не соответствует. N6260 Ссылка на комментарий
Clayman 103 Опубликовано 7 Мая 2011 Поделиться Опубликовано 7 Мая 2011 (изменено) ZeeK, спасибо, но мой вариант гораздо быстрее и проще И в ЗП рупоры именно так делаются. А вот рабочие приемники не помню есть там где... можно было еще на них логику посмотреть. Изменено 7 Мая 2011 пользователем Clayman Цитата Ссылка на комментарий
ZeeK 55 Опубликовано 7 Мая 2011 Поделиться Опубликовано 7 Мая 2011 Clayman ну СибирьСталкер использует пх_соунд поэтому мой способ подходит к его версии... Цитата Не соответствует. N6260 Ссылка на комментарий
SibireaStalker 0 Опубликовано 8 Мая 2011 Автор Поделиться Опубликовано 8 Мая 2011 Clayman, может, ты делаешь и проще, но это не всегда праильнее. Товарищ ZeeK, доработал мою неказистую статью (я так, собственно и хотел сделать, только запутался с xr_sound.script). Шапка обновлена, сему товарищу отдельная благодарность Цитата Выводы модмейкера: 1)Вылетает - это хорошо. Значит, работает 2) Если хочешь сделать что-то хорошо, делай сам! 3) Если падёшь духом, падёт и мод. 4) Он живой... Ссылка на комментарий
Серый Волк 834 Опубликовано 10 Мая 2011 Поделиться Опубликовано 10 Мая 2011 (изменено) Вопрос такой: открываю файл .wav в Левел Эдиторе, выставляю вот такие параметры: забираю готовый .ogg из gamedata\sounds. Вставляю в СГМ 1.7 сюда: \gamedata\sounds\radio_music - как результат - играет музыка по просьбе к Бороде включить радио (и выключается когда просишь выключить). Но... она не затухает и не выключается когда отходишь не только от приемника, но и вообще уходишь от Скадовска. Играет по всей локации, где бы ни находился. Хотя в Эдиторе установлены параметры: максимальная зона звучания- 15 метров, затухание с 3 метров. Кто может подсказать почему так? Изменено 10 Мая 2011 пользователем Серый Волк Цитата Новое меню и интерфейс для ЗП, Наличные деньги для SGM 1.7, Новый инвентарь для ЗП, Новые меню для Солянки и Солянки+ООП+К+МА Ссылка на комментарий
SibireaStalker 0 Опубликовано 11 Мая 2011 Автор Поделиться Опубликовано 11 Мая 2011 Серый Волк, нуу прежде всего - это никак не NPC Talking. Судя по всему - это undefined. Почему? Заглянем в справочку по сему делу: undefined Неопределенный. Ставим этот тип, чтобы NPC не реагировали на музыку и прочее. Во-вторых, как я писал в шапке, с параметрами MinDist = 300.0 MaxDist = 300.0 . MaxAIDist = 300.0 надо быть аккуратней. Попробуй поставить из заготовок: (вот например, как в ТЧ играет музыка у Бармена) Quality - 1,00 Min Dist - 2 Max Dist - 19 Max AL dist0,1 Base Volume - 1 Цитата Выводы модмейкера: 1)Вылетает - это хорошо. Значит, работает 2) Если хочешь сделать что-то хорошо, делай сам! 3) Если падёшь духом, падёт и мод. 4) Он живой... Ссылка на комментарий
ZeeK 55 Опубликовано 11 Мая 2011 Поделиться Опубликовано 11 Мая 2011 (изменено) MinDist = 300.0 MaxDist = 300.0 . Это ОЧЕНЬ большая дистанция для музыки из радио! Лучше всего MinDist = 2.0 MaxDist = 15.0 и аккуратно поиграться с громкостью.... Я-то знаю. Это я как пример привёл SibireaStalker Изменено 11 Мая 2011 пользователем SibireaStalker Цитата Не соответствует. N6260 Ссылка на комментарий
Серый Волк 834 Опубликовано 11 Мая 2011 Поделиться Опубликовано 11 Мая 2011 SibireaStalker, 1. В данном случае undefined не подходит - пробовал, если поставить undefined - то в игре вкл/выкл через диалог с Бородой не работает и при загрузке игры музыка играет сразу по всей локации. Методом научного тыка проверил, вкл/выкл радио работает только при этом параметре: NPC Talking. 2. Все остальные параметры (смотри скрин) указаны как в твоем примере (ориентировался по статье на ВИКИ ) по типу Бармена. У меня в Соунд Эдиторе установлены параметры: максимальная зона звучания (MaxDist = 15.0 ) - 15 метров, затухание с 2 метров. Вопрос в том, почему в игре не воспринимается параметр максимального радиуса звука ? Цитата Новое меню и интерфейс для ЗП, Наличные деньги для SGM 1.7, Новый инвентарь для ЗП, Новые меню для Солянки и Солянки+ООП+К+МА Ссылка на комментарий
SibireaStalker 0 Опубликовано 11 Мая 2011 Автор Поделиться Опубликовано 11 Мая 2011 Серый Волк, вообще не понятно.... Я с таким впервые сталкиваюсь, признаться честно. Может, SGM сами что-то сделали? Глянь скрипты - меня настараживает даже тот факт, что undefined не подходит. А с радиусом вообще кабурда какая-то: в обычной игре что сделаешь, то и получаешь. Так что даже не знаю, чем помочь Цитата Выводы модмейкера: 1)Вылетает - это хорошо. Значит, работает 2) Если хочешь сделать что-то хорошо, делай сам! 3) Если падёшь духом, падёт и мод. 4) Он живой... Ссылка на комментарий
Серый Волк 834 Опубликовано 11 Мая 2011 Поделиться Опубликовано 11 Мая 2011 (изменено) а скрипты тут при чем ? я в сдк выставляю параметры и конвертирую в .ogg. После, заменяю файл на оригинальный, имя файла оставляю оригинальное, т.е. должна по идее смениться мелодия, но никак не её параметры... ЗЫ: пробовал открыть оригинальный .ogg из СГМ чтобы посмотреть параметры - Соунд Эдитор его не видит. Ответ: есть такая штука в скриптах, которая называется скриптовый звук (Их было много в ТЧ-шных лабах). Насколько я знаю, они обычно активируются диалогами или прибытием в определённую точку (вспоминаем скриптовый ор контроёра в Аграпромё и Х-16). Так вот - насколько я знаю, такие звуки обычно слышны на всей локи (поэтому их делали в абах). Причём настройка звука на них не влияет. Я даже урок видел по созданию такого звука, только увы, урок пропал Изменено 12 Мая 2011 пользователем SibireaStalker Цитата Новое меню и интерфейс для ЗП, Наличные деньги для SGM 1.7, Новый инвентарь для ЗП, Новые меню для Солянки и Солянки+ООП+К+МА Ссылка на комментарий
ZeeK 55 Опубликовано 11 Мая 2011 Поделиться Опубликовано 11 Мая 2011 Соунд Эдитор его не видит. Соунд Едитор и не должен видеть ogg, только wav Цитата Не соответствует. N6260 Ссылка на комментарий
amik 252 Опубликовано 11 Мая 2011 Поделиться Опубликовано 11 Мая 2011 Недавно мне скидывали StkOggCommentViewer Смотрит комментарии в ogg файле. Цитата Мой архив Сталкером не занимаюсь. Ссылка на комментарий
Серый Волк 834 Опубликовано 11 Мая 2011 Поделиться Опубликовано 11 Мая 2011 (изменено) Потому и пользуюсь методом научного тыка... А есть другие варианты посмотреть параметры .ogg-файла назначенные в сдк ? Без вариантов, насколько я знаю, лишь WAV-файлы доступны к просмотру. После перекадирования звук можно послушать. SS. amik, спасибо, сейчас поробую... ----------------- попробовал программу, она замечательно все настройки назначенные файлу в СДК показывает. Изменено 13 Мая 2011 пользователем Cyclone Объединил Цитата Новое меню и интерфейс для ЗП, Наличные деньги для SGM 1.7, Новый инвентарь для ЗП, Новые меню для Солянки и Солянки+ООП+К+МА Ссылка на комментарий
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.