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

[COP] и [CS] - звук и музыка

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

Звук и музыка

Поскольку вопрос попадался достаточно часто, решил завести тему. Итак, начнём....
Для работы понадобятся:
*Распакованная игра ([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

-- апдейт таблиц smile.gif не менять!
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) Он живой... :o

Ссылка на комментарий

SibireaStalker

Грамафоны и приёмники (начало) сразу допиши про редактирование xr_sound, а то схема работать не будет ;)

Не соответствует. N6260

Ссылка на комментарий

Хорошая статья Sound_Editor

Кстати не знаю как в [COP] и [CS] но в ТЧ после синхронизации эти звуки можно и послушать в СДК...

И еще, запустив ShaderEditor в конце есть вкладка Sound Evn, как ей пользоваться не знаю, нужды разбираться пока не было...

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

Мой архив

Сталкером не занимаюсь.

Ссылка на комментарий

amik по переводу строк оттуда можно уже определить что это настройки звукого окружения. Ревебрация, глушение, искажение, сила распространения и т.д. - но это настройки в заданых конфигурациях.

Конфигурации:

-в ваннне

-обычное окружение

-в лесу

-в доме

-незнаю(слегка изменное обычное окружениие)

-в коридоре

-в горах

-на открытом пространстве

-написано plant, но в приписке написано ангар

-в комнате

-во дворе ,но приписка - в лесу

 

А вообще хрен его знает - работает ли все это или нет... :P

Ссылка на комментарий

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 сразу проигрываться начинает. И по-моему, там же можно настроить что-то вроде радиуса проигрывания. Ну, посмотрю, что вам ещё можно рассказать ;) .

 

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

Выводы модмейкера:

1)Вылетает - это хорошо. Значит, работает :)

2) Если хочешь сделать что-то хорошо, делай сам!

3) Если падёшь духом, падёт и мод.

4) Он живой... :o

Ссылка на комментарий

Galil Ну перевод само собой понятен )) Непонятно где эти настройки хранятся раз и за что точно отвечают два (хотя примерно понятно env_ambient).

SibireaStalker Аудасити добавь, он бесплатен.

Мой архив

Сталкером не занимаюсь.

Ссылка на комментарий

По поводу граммафонов и приемников... спрашивал в другой теме, как прикручивать звук физ. объектам, никто не ответил. Да, в тч это было через 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 (или в инклуженом файле), как это делать - на вики статья есть.

Изменено пользователем Clayman
Ссылка на комментарий
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

Изменено пользователем SibireaStalker
  • Спасибо 1

Не соответствует. N6260

Ссылка на комментарий
ZeeK, спасибо, но мой вариант гораздо быстрее и проще :) И в ЗП рупоры именно так делаются. А вот рабочие приемники не помню есть там где... можно было еще на них логику посмотреть. Изменено пользователем Clayman
Ссылка на комментарий

Clayman, может, ты делаешь и проще, но это не всегда праильнее.

Товарищ ZeeK, доработал мою неказистую статью (я так, собственно и хотел сделать, только запутался с xr_sound.script).

Шапка обновлена, сему товарищу отдельная благодарность ;)

Выводы модмейкера:

1)Вылетает - это хорошо. Значит, работает :)

2) Если хочешь сделать что-то хорошо, делай сам!

3) Если падёшь духом, падёт и мод.

4) Он живой... :o

Ссылка на комментарий

Вопрос такой:

открываю файл .wav в Левел Эдиторе, выставляю вот такие параметры:

4327975.th.jpg

забираю готовый .ogg из gamedata\sounds.

Вставляю в СГМ 1.7 сюда: \gamedata\sounds\radio_music - как результат - играет музыка по просьбе к Бороде включить радио (и выключается когда просишь выключить). Но... она не затухает и не выключается когда отходишь не только от приемника, но и вообще уходишь от Скадовска. Играет по всей локации, где бы ни находился. Хотя в Эдиторе установлены параметры: максимальная зона звучания- 15 метров, затухание с 3 метров.

 

Кто может подсказать почему так?

Изменено пользователем Серый Волк
Ссылка на комментарий

Серый Волк, нуу прежде всего - это никак не 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) Он живой... :o

Ссылка на комментарий
MinDist = 300.0

MaxDist = 300.0 .

Это ОЧЕНЬ большая дистанция для музыки из радио! Лучше всего MinDist = 2.0 MaxDist = 15.0 и аккуратно поиграться с громкостью....

Я-то знаю. Это я как пример привёл SibireaStalker

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

Не соответствует. N6260

Ссылка на комментарий

SibireaStalker,

1. В данном случае undefined не подходит - пробовал, если поставить undefined - то в игре вкл/выкл через диалог с Бородой не работает и при загрузке игры музыка играет сразу по всей локации. Методом научного тыка проверил, вкл/выкл радио работает только при этом параметре: NPC Talking.

2. Все остальные параметры (смотри скрин) указаны как в твоем примере (ориентировался по статье на ВИКИ ) по типу Бармена.

У меня в Соунд Эдиторе установлены параметры: максимальная зона звучания (MaxDist = 15.0 ) - 15 метров, затухание с 2 метров.

 

Вопрос в том, почему в игре не воспринимается параметр максимального радиуса звука ?

Ссылка на комментарий
Серый Волк, вообще не понятно.... Я с таким впервые сталкиваюсь, признаться честно. Может, SGM сами что-то сделали? Глянь скрипты - меня настараживает даже тот факт, что undefined не подходит. А с радиусом вообще кабурда какая-то: в обычной игре что сделаешь, то и получаешь. Так что даже не знаю, чем помочь :o

Выводы модмейкера:

1)Вылетает - это хорошо. Значит, работает :)

2) Если хочешь сделать что-то хорошо, делай сам!

3) Если падёшь духом, падёт и мод.

4) Он живой... :o

Ссылка на комментарий

а скрипты тут при чем ? я в сдк выставляю параметры и конвертирую в .ogg. После, заменяю файл на оригинальный, имя файла оставляю оригинальное, т.е. должна по идее смениться мелодия, но никак не её параметры...

 

ЗЫ: пробовал открыть оригинальный .ogg из СГМ чтобы посмотреть параметры - Соунд Эдитор его не видит.

 

 

Ответ: есть такая штука в скриптах, которая называется скриптовый звук (Их было много в ТЧ-шных лабах). Насколько я знаю, они обычно активируются диалогами или прибытием в определённую точку (вспоминаем скриптовый ор контроёра в Аграпромё и Х-16). Так вот - насколько я знаю, такие звуки обычно слышны на всей локи (поэтому их делали в абах). Причём настройка звука на них не влияет. Я даже урок видел по созданию такого звука, только увы, урок пропал

Изменено пользователем SibireaStalker
Ссылка на комментарий

Потому и пользуюсь методом научного тыка... А есть другие варианты посмотреть параметры .ogg-файла назначенные в сдк ?

Без вариантов, насколько я знаю, лишь WAV-файлы доступны к просмотру. После перекадирования звук можно послушать. SS.

amik, спасибо, сейчас поробую...

-----------------

попробовал программу, она замечательно все настройки назначенные файлу в СДК показывает.

Изменено пользователем Cyclone
Объединил
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

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