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

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


SibireaStalker

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

SibireaStalker

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

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

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


Ссылка на сообщение
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

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


Ссылка на сообщение
Clayman ну СибирьСталкер использует пх_соунд поэтому мой способ подходит к его версии...

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

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


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

MaxDist = 300.0 .

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

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

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

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

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


Ссылка на сообщение
Соунд Эдитор его не видит.
Соунд Едитор и не должен видеть ogg, только wav

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

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


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

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