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

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


SibireaStalker

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

Звук и музыка

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

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


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

Soundpack находится в шапке. Скачивайте, вставляйте, спрашивайте.

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

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

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

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

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

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


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

Насколько я знаю, больше прог нет...

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

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

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

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

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

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


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

Kvazar, я сам работаю над подобным скриптом, на данный момент хоть чем-то помочь не могу.

Петька Анальгин, насколько помню, вариацию можно сделать разными дождевыми циклами, с соответственно разными звуками. Но это уже увы погодные правки.

 

Вспомнил о теме, теперь буду за ней приглядывать :)

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

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

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

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

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

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


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

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