ZeeK 57 Опубликовано 4 Мая 2011 SibireaStalker Грамафоны и приёмники (начало) сразу допиши про редактирование xr_sound, а то схема работать не будет Не соответствует. N6260 Поделиться этим сообщением Ссылка на сообщение
ZeeK 57 Опубликовано 7 Мая 2011 (изменено) Clayman надеюсь я правильно понял твою проблему про физ. объекты: открываем алл спавн(например Затон, секция приемника Горизонт на Скадовске), дописываем [logic] cfg = scripts\music\priemnik_gorizont.ltx END создаем логику priemnik_gorizont.ltx [logic] active = ph_sound [ph_sound] snd = music_and_radio looped = false min_idle = 300 max_idle = 500 random = true открываем sound_theme.script, пишем ph_snd_themes = {} ph_snd_themes["music_and_radio"] = { "ambient\\special\\radio_comm_1", "ambient\\special\\marsh_radio_1", "ambient\\special\\garbage_bandits_radio_1" и т.д. какую музыку тебе нада потом в modules дописываешь ---------------------------------------------------------------------- -- Загрузка модулей физических объектов: ---------------------------------------------------------------------- load_scheme("ph_sound", "ph_sound", stype_item) и ---------------------------------------------------------------------- -- Загрузка модулей рестрикторов: ---------------------------------------------------------------------- load_scheme("sr_sound", "sr_sound", stype_restrictor) sr_sound тырим из ТЧ, а в xr_sound.script вставляем куски кода ТЧ, что бы получилось так: --'------------------------------------------------------------------------------------------------------------------- --' Схема озвучки --' автор: Диденко Руслан (Stohe) --'-------------------------------------------------------------------------------------------------------------------- --function printf() --end sound_table = {} function set_sound_play(npc_id, sound, faction, point) --printf("SET_SOUND_PLAY. theme[%s] object[%s]", tostring(sound), npc_id) if sound == nil then return end if sound_theme.theme[sound] == nil then abort("set_sound_play. Wrong sound theme [%s], npc[%s]", tostring(sound), npc_id) return end local snd_theme = sound_theme.theme[sound] if snd_theme.class_id == "looped_sound" then abort("You trying to play sound [%s] which type is looped", sound) end if sound_table[npc_id] == nil or snd_theme.play_always == true then if sound_table[npc_id] ~= nil then --printf("sound table not nil") if(sound_table[npc_id].reset~=nil) then sound_table[npc_id]:reset(npc_id) else --printf("--------------"..type(sound_table[npc_id])) --printf("npc_id="..npc_id) --printf("sound="..sound) end end --printf("PLAY. theme[%s] object[%s]", tostring(sound), npc_id) if snd_theme:play(npc_id, faction, point) then --printf("PLAY2. theme[%s] object[%s]", tostring(sound), npc_id) --' fill table sound_table[npc_id] = snd_theme end else --printf("xr_sound: cannot play sound [%s] because i'm [%s] already play snd [%s]",tostring(sound), npc_id, sound_table[npc_id].path) return sound_table[npc_id].snd_obj end return sound_table[npc_id] and sound_table[npc_id].snd_obj end function update(npc_id) if sound_table[npc_id] then -- local t = type(sound_table[npc_id]) if not(sound_table[npc_id]:is_playing(npc_id)) then -- if(t=="string") or not(sound_table[npc_id]:is_playing(npc_id)) then -- if(t=="string") then -- sound_table[npc_id] = sound_theme.theme[sound_table[npc_id]] -- end --printf("SOUND_CALLBACK from [%s] sound_path [%s]",npc_id,sound_table[npc_id].path) sound_table[npc_id]:callback(npc_id) sound_table[npc_id] = nil end end end looped_sound = {} function play_sound_looped(npc_id, sound) local snd_theme = sound_theme.theme[sound] if snd_theme == nil then abort("play_sound_looped. Wrong sound theme [%s], npc[%s]", tostring(sound), npc_id) end if snd_theme.class_id ~= "looped_sound" then abort("You trying to play sound [%s] which type is not looped", sound) end if looped_sound[npc_id] ~= nil and looped_sound[npc_id][sound] ~= nil and looped_sound[npc_id][sound]:is_playing(npc_id) then return end if snd_theme:play(npc_id) then printf("PLAY2. looped theme[%s] object[%s]", tostring(sound), npc_id) if looped_sound[npc_id] == nil then looped_sound[npc_id] = {} end looped_sound[npc_id][sound] = snd_theme end end function stop_sound_looped(npc_id, sound) if sound then if type(looped_sound[npc_id][sound]) ~= "string" then if looped_sound[npc_id][sound] and looped_sound[npc_id][sound]:is_playing(npc_id) then printf("looped sound ["..tostring(sound).."] stop for obj [%s]",npc_id) looped_sound[npc_id][sound]:stop() looped_sound[npc_id][sound] = nil end end else if looped_sound[npc_id] then for k,v in pairs(looped_sound[npc_id]) do if v and type(v) ~= "string" and v:is_playing(npc_id) then printf("looped sound ["..tostring(k).."] stop for obj [%s]",npc_id) v:stop() end end looped_sound[npc_id] = nil end end end function set_volume_sound_looped(npc_id, sound, level) if looped_sound[npc_id] then if looped_sound[npc_id][sound] and looped_sound[npc_id][sound]:is_playing(npc_id) then printf("looped sound ["..tostring(sound).."] for obj ["..npc_id.."] set volume "..level) looped_sound[npc_id][sound]:set_volume(level) end end end function actor_save(thread) set_save_marker(thread, "save", false, "sound_actor_save") for k,v in pairs(sound_theme.theme) do v:save(thread) end local n = 0 for k,v in pairs(sound_table) do n = n + 1 end thread:w_u16(n) for k,v in pairs(sound_table) do thread:w_u16(k) --[[ if(type(v.section)~="string") then thread:w_stringZ(v) else ]] thread:w_stringZ(v.section) -- end end n = 0 for k,v in pairs(looped_sound) do n = n + 1 end thread:w_u16(n) for k,v in pairs(looped_sound) do thread:w_u16(k) n = 0 for kk,vv in pairs(looped_sound[k]) do n = n + 1 end thread:w_u16(n) for kk,vv in pairs(looped_sound[k]) do thread:w_stringZ(kk) --[[ if(type(vv.section)~="string") then thread:w_stringZ(vv) else thread:w_stringZ(vv.section) end ]] end end set_save_marker(thread, "save", true, "sound_actor_save") end function actor_load(thread) set_save_marker(thread, "load", false, "sound_actor_save") for k,v in pairs(sound_theme.theme) do v:load(thread) end sound_table = {} local n = thread:r_u16() for i = 1,n do local id = thread:r_u16() local theme = thread:r_stringZ() -- sound_table[id] = thread:r_stringZ() sound_table[id] = sound_theme.theme[theme] end looped_sound = {} n = thread:r_u16() for i = 1,n do local id = thread:r_u16() looped_sound[id] = {} n = thread:r_u16() for i = 1,n do local sound = thread:r_stringZ() -- looped_sound[id][sound] = thread:r_stringZ() looped_sound[id][sound] = sound_theme.theme[sound] end end set_save_marker(thread, "load", true, "sound_actor_save") end function save_npc(thread, npc_id) set_save_marker(thread, "save", false, "sound_npc_save") for k,v in pairs(sound_theme.theme) do v:save_npc(thread, npc_id) end set_save_marker(thread, "save", true, "sound_npc_save") end function load_npc(thread, npc_id) set_save_marker(thread, "load", false, "sound_npc_save") for k,v in pairs(sound_theme.theme) do v:load_npc(thread, npc_id) end set_save_marker(thread, "load", true, "sound_npc_save") end function start_game_callback() sound_table = {} end function stop_all_sounds() for k,v in pairs(sound_table) do if(type(v)~="string") then v:stop() end end for k,v in pairs(looped_sound) do for k,v in pairs(looped_sound[k]) do if v and v:is_playing(npc_id) then printf("looped sound ["..tostring(k).."] stopped ") v:stop() end end end end function stop_sounds_by_id(obj_id) local sound = sound_table[obj_id] if sound and sound.stop then sound:stop(obj_id) end local looped_snd = looped_sound[obj_id] if looped_snd then for k,v in pairs(looped_snd) do if v and v:is_playing(obj_id) then v:stop(obj_id) end end end end --------------------------------------------------------------------------------------------------------------------- -- Схема озвучки -- автор: Диденко Руслан (Stohe) -- update: Чугай Александр (Chugai) ---------------------------------------------------------------------------------------------------------------------- key_by_id = {} group_idle = {} --function printf() --end function get_sound(path, tt, npc) if path == nil then return nil end if path.exec == nil then -- чтение настроек темы tt.into_id = path.into_id tt.into_max = path.max_ids[npc:id()].into_max tt.into_last = nil tt.rnd_id = path.rnd_id tt.rnd_max = path.max_ids[npc:id()].rnd_max tt.rnd_last = nil tt.min_snd = path.min_snd tt.max_snd = path.max_snd tt.rnd_snd = path.rnd_snd else get_sound(path.types[path.exec(path.types, npc)], tt, npc) end end -- Формирование ключа персонажа function get_key(npc) local key -- формирование ключа local overrides = xr_logic.generic_scheme_overrides(npc) if overrides and overrides.soundgroup then key = overrides.soundgroup else key = utils.to_str(npc:id()) end -- апдейт таблиц не менять! if xr_sound.key_by_id[npc:id()] ~= key then if xr_sound.group_idle[xr_sound.key_by_id[npc:id()]] ~= nil then xr_sound.group_idle[xr_sound.key_by_id[npc:id()]].num_in_group = xr_sound.group_idle[xr_sound.key_by_id[npc:id()]].num_in_group - 1 end xr_sound.key_by_id[npc:id()] = key if xr_sound.group_idle[key] == nil then xr_sound.group_idle[key] = {num_in_group = 1} else xr_sound.group_idle[key].num_in_group = xr_sound.group_idle[key].num_in_group + 1 end end return key end ----------------------------------------------------------------------------------------------------------------------------------- -- Установка и распарсивание тем в файлы. ----------------------------------------------------------------------------------------------------------------------------------- function set_sound(npc, sound, now, into_timeout) -- printf("*SND* [%s] try to change SND to [%s]", npc:name(), tostring(sound)) local npc_id = npc:id() if (db.sound[npc_id] == nil or db.sound[npc_id].theme ~= sound) or now == true then -- if db.sound[npc_id] == nil then -- printf("*SND* change SND [_] to [%s] for [%s]", tostring(sound), npc:name()) -- else -- printf("*SND* change SND [%s] to [%s] for [%s]", tostring(db.sound[npc_id].theme), tostring(sound), npc:name()) -- end -- Туточки надобно распарсить имена тем в их id if sound == nil then sound = "" end if db.sound[npc_id] == nil then db.sound[npc_id] = {} end db.sound[npc_id].theme = sound db.sound[npc_id].snd = parse_names(sound) if db.sound[npc_id].last_snd == nil then db.sound[npc_id].last_snd = {} else local snd_table = {} local t = 0 for k,v in pairs(db.sound[npc_id].snd) do snd_table[t] = {} get_sound(sound_theme.theme[v], snd_table[t], npc) t = t + 1 end for k,v in pairs(snd_table) do if v.into_id then db.sound[npc_id].last_snd[v.into_id] = nil end if v.rnd_id then db.sound[npc_id].last_snd[v.rnd_id] = nil end end end -- Устанавливаем входную паузу local key = get_key(npc) xr_sound.group_idle[key].begin = time_global() if into_timeout then xr_sound.group_idle[key].idle = into_timeout else xr_sound.group_idle[key].idle = 0 end if now == true then stop_play_sound(npc) end end end function play_sound(npc, themes, timeout) -- нужно составить список тем local snd_table = {} local t = 0 for k,v in pairs(themes) do snd_table[t] = {} if sound_theme.theme[v] ~= nil then snd_table[t].theme = v get_sound(sound_theme.theme[v], snd_table[t], npc) else abort("ERROR: ILLEGAL PLAY SOUND!!! %s for %s", v, npc:name()) end t = t + 1 end --printf("*") --print_table(snd_table) if t == 0 then return end -- из списка тем выбираем одну. local snd = snd_table[math.random(0, t-1)] if snd ~= nil then --printf("!") --print_table(snd) if snd.min_snd == nil then return end local npc_id = npc:id() local group_table = xr_sound.group_idle[get_key(npc)] group_table.idle = math.random(snd.min_snd, snd.max_snd)*1000 if group_table.last_snd == nil then group_table.last_snd = {} end -- необходимо ли нам играть into или rnd звуки if snd.into_max ~= nil and snd.into_max > 0 then if db.sound[npc_id].last_snd[snd.into_id] == snd.into_max - 1 then if snd.into_cycled == true then db.sound[npc_id].last_snd[snd.into_id] = nil else return end end -- играем входные if db.sound[npc_id].last_snd[snd.into_id] == nil then db.sound[npc_id].last_snd[snd.into_id] = -1 end --printf("*SND* play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id]+1, npc:name()) process_tutor_on_sound(snd.theme) npc:play_sound(snd.into_id, 1, 0, 1, 0, db.sound[npc_id].last_snd[snd.into_id]+1) db.sound[npc_id].last_snd[snd.into_id] = db.sound[npc_id].last_snd[snd.into_id] + 1 --printf("*SND* play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id], npc:name()) return end if snd.rnd_max ~= nil and snd.rnd_max > 0 then -- играем рандомные local s = 0 if snd.rnd_max == 1 then s = 0 else -- Если прошлый раз проигрывался такой же набор тем -- то учитывать последний звук для группы. -- if db.sound[npc_id].last_snd[snd.rnd_id] ~= nil then if group_table.last_snd[snd.rnd_id] ~= nil then s = math.random(0, snd.rnd_max-2) if s >= group_table.last_snd[snd.rnd_id] then s = s + 1 end else s = math.random(0, snd.rnd_max-1) end end if timeout == nil then timeout = 0 end --printf("*SND* play rnd [%s] for [%s]", s, npc:name()) process_tutor_on_sound(snd.theme) npc:play_sound(snd.rnd_id, timeout+1, timeout, 1, 0, s) --db.sound[npc_id].last_snd[snd.rnd_id] = s group_table.last_snd[snd.rnd_id] = s end end end function get_last_IDS(npc, theme) local last_table = db.sound[npc:id()].last_snd local snd_table = {} if sound_theme.theme[theme] ~= nil then get_sound(sound_theme.theme[theme], snd_table, npc) end printf("LAST INTO ID for [%s] = [%s], max [%s]", theme, last_table[snd_table.into_id], snd_table.into_max) return last_table[snd_table.into_id], snd_table.into_max end function load_sound(npc) sound_theme.load_sound(npc) end function process_tutor_on_sound(theme) end --' Actor sound player local actor_sound = {} function set_actor_sound(sound) printf("*ACTOR SND* try to change SND to [%s]", tostring(sound)) if actor_sound.theme ~= sound then --' Туточки надобно распарсить имена тем в их id if sound == nil then sound = "" end actor_sound.theme = sound actor_sound.begin = nil this.set_actor_sound_factor(1) end end function set_actor_sound_factor(factor) local theme = sound_theme.actor_theme[actor_sound.theme] if theme ~= nil then actor_sound.min_snd = theme.min_snd * factor actor_sound.max_snd = theme.max_snd * factor end end function update_actor() local theme = sound_theme.actor_theme[actor_sound.theme] if theme == nil then return end if table.getn(theme.sounds) == 0 then return end if actor_sound.begin == nil or time_global() - actor_sound.begin >= actor_sound.idle then actor_sound.begin = time_global() --' Тут надо отыграть звук local sound = theme.sounds[math.random(table.getn(theme.sounds))] if sound ~= nil then sound:play(db.actor, 0, sound_object.s2d) end actor_sound.idle = math.random(actor_sound.min_snd, actor_sound.max_snd) end end --' Таблица для хранения созданных саунд обжектов. sound_object_by_theme = {} --' type = [random|seq|looped] function get_sound_object(theme, t_type) if sound_theme.ph_snd_themes[theme] == nil then abort("ph_snd_themes for theme %s", tostring(theme)) return end if sound_object_by_theme[theme] == nil then sound_object_by_theme[theme] = {} end if t_type == nil then t_type = "random" end --' Выбор следующего айдишника local play_id = -1 local table_size = table.getn(sound_theme.ph_snd_themes[theme]) if sound_object_by_theme[theme].last_id == nil then if t_type == "random" then if table_size >= 2 then play_id = math.random(1, table_size) else play_id = 1 end else play_id = 1 end else if t_type == "random" then if table_size >= 2 then play_id = math.random(1, table_size - 1) if play_id >= sound_object_by_theme[theme].last_id then play_id = play_id + 1 end else play_id = 1 end else if sound_object_by_theme[theme].last_id < table_size then play_id = sound_object_by_theme[theme].last_id + 1 else if type == "looped" then play_id = 1 end end end end printf("SOUND_OBJECT: selected id [%s] for theme [%s], type [%s], size [%s]", tostring(play_id), tostring(theme), tostring(type), table_size) if play_id == -1 then return end --' Проверяем создан ли у нас соответствующий саунд обжект или его надо создать if sound_object_by_theme[theme][play_id] == nil then if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then sound_object_by_theme[theme][play_id.."_r"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_r") sound_object_by_theme[theme][play_id.."_l"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_l") else sound_object_by_theme[theme][play_id] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id]) end end sound_object_by_theme[theme].last_id = play_id --' Возвращаем саунд обжект if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then return sound_object_by_theme[theme][play_id.."_r"], sound_object_by_theme[theme][play_id.."_l"] else return sound_object_by_theme[theme][play_id] end end local sound_object_by_path = {} --' Обертка вокруг функции, возвращающий звуковой объект. function get_safe_sound_object(path) if sound_object_by_path[path] == nil then sound_object_by_path[path] = sound_object(path) end return sound_object_by_path[path] end function stop_all_sound_object() for k,v in pairs(sound_object_by_path) do if v:playing() then v:stop() end end end function clear_all_sound_object() sound_object_by_theme = {} end если я все правильно вспомнил в результате можно будет делать музон к физ.объектам Добавлено через 4 мин.: А в dynamic_objects можно сделать тоже логику предмету custom_data = scripts\sounds\music\priemnik_azot_music.ltx Куратор темы благодарит Вас за дорабтку урока. SibireaStalker Изменено 8 Мая 2011 пользователем SibireaStalker 1 Не соответствует. N6260 Поделиться этим сообщением Ссылка на сообщение
ZeeK 57 Опубликовано 7 Мая 2011 Clayman ну СибирьСталкер использует пх_соунд поэтому мой способ подходит к его версии... Не соответствует. N6260 Поделиться этим сообщением Ссылка на сообщение
ZeeK 57 Опубликовано 11 Мая 2011 (изменено) MinDist = 300.0 MaxDist = 300.0 . Это ОЧЕНЬ большая дистанция для музыки из радио! Лучше всего MinDist = 2.0 MaxDist = 15.0 и аккуратно поиграться с громкостью.... Я-то знаю. Это я как пример привёл SibireaStalker Изменено 11 Мая 2011 пользователем SibireaStalker Не соответствует. N6260 Поделиться этим сообщением Ссылка на сообщение
ZeeK 57 Опубликовано 11 Мая 2011 Соунд Эдитор его не видит. Соунд Едитор и не должен видеть ogg, только wav Не соответствует. N6260 Поделиться этим сообщением Ссылка на сообщение