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