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

[SoC] Ковыряемся в файлах


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

2 часа назад, god_of_war20001 сказал:

помогите у меня вылетает с ошибкой

Игра не может найти секцию mil_Monolit_master. Скопируй любую имеющуюся секцию рандомного нпс из файла локации, на которой происходит вылет, и подставь этот id. Емнип, это файл character_desc_***.xml

WurDalaK.gif

10 часов назад, Вурдалак сказал:

Игра не может найти секцию mil_Monolit_master. Скопируй любую имеющуюся секцию рандомного нпс из файла локации, на которой происходит вылет, и подставь этот id. Емнип, это файл character_desc_***.xml

я полазил по файлам игры, нашел

mil_Monolit_master

но фишка в том что именно этот файл с единицей записан:

mil_Monolit_master1

может если "1" убрать получится?

32 минуты назад, god_of_war20001 сказал:

я полазил по файлам игры, нашел

mil_Monolit_master

но фишка в том что именно этот файл с единицей записан:

mil_Monolit_master1

может если "1" убрать получится?

Лучше скопировать эту секцию с новым именем. Иначе может ругаться на то, что нет секции с единицей.

  • Согласен 1

WurDalaK.gif

Подскажите как сделать так, чтобы враждебные НПС отображались на миникарте постоянно, аналогично нейтралам, а не только попав в поле зрения ГГ.

Пробовал изменять файл map_spots_relations, удалив выделенную строку в секции:

<enemy_mini_spot width="4" height="4" stretch="1" alignment="c" xform_anim="map_spot_rel_xform" xform_anim_cyclic="0"> <texture r="255" g="0" b="0">ui_minimap_point</texture> </enemy_mini_spot>

но безрезультатно, ни новая игра, ни танцы с бубном, ни обсценная лексика эффекта не возымели.

Народ, спасите. Хотел фичу в ТЧ как в ЗП сделать, а именно: звук при использовании предмета. Сделал отдельный скрипт, где присвоил предметам их звуки, вписал в bind-stalker.script в функцию destroy колбек использования предмета,  а в функцию reinit вписал тот же колбек использования предмета. Сделал функцию actor_binder, где сослался на мой скрипт, в котором я перечислял "предмет-звук". (Пример:  function actor binder:use_object (obj)

sound.use_snd (obj)

end.)

Открываю игру, использую предмет- вылет. Пишет: Lua error: bind_stalker.script:192:attempt to call field "use_snd" (a nil value).  В чём ошибка? По инструкции вроде всё делал.

(Шаманил на чистой игре)

@юлий мунин, Привет в логе конкретно написано ошибка в bind_stalker.script:192 строка 

скинь свой скрипт и bind_stalker.script будем посмотреть

@ted.80, 

Вот bind_stalker.script:


 

Скрытый текст

 

function init    (obj)
    xr_motivator.AddToMotivator(obj)
end

function actor_init    (npc)
    npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
    [0] = "gd_novice",
    [1] = "gd_stalker",
    [2] = "gd_veteran",
    [3] = "gd_master"
    }

lasthealth  = 0
lasttime    = 0
post_process = 0
local weapon_hide = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
    self.bCheckStart = false
    self.weather_manager = level_weathers.WeatherManager()
    self.actor_detector = xr_detector.actor_detector()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
    printf("actor net spawn")        

    level.show_indicators()

    self.bCheckStart = true
    self.weapon_hide = false -- спрятано или нет оружие при разговоре.
    weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

    if object_binder.net_spawn(self,data) == false then
        return false
    end

    db.add_actor(self.object)
    
    if self.st.disable_input_time == nil then
        level.enable_input()
    end

    self.weather_manager:reset()
--    game_stats.initialize ()

    if(actor_stats.add_to_ranking~=nil)then
        actor_stats.add_to_ranking(self.object:id())
    end

    --' Загружаем настройки дропа
    death_manager.init_drop_settings()

    return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
    if(actor_stats.remove_from_ranking~=nil)then
        actor_stats.remove_from_ranking(self.object:id())
    end
--    game_stats.shutdown ()
    db.del_actor(self.object)

    sr_light.clean_up ()

    self.object:set_callback(callback.inventory_info, nil)
    self.object:set_callback(callback.article_info, nil)
    self.object:set_callback(callback.on_item_take, nil)
    self.object:set_callback(callback.on_item_drop, nil)
    self.object:set_callback(callback.use_object, nil)
    --self.object:set_callback(callback.actor_sleep, nil)
    self.object:set_callback(callback.task_state, nil)
    self.object:set_callback(callback.level_border_enter, nil)
    self.object:set_callback(callback.level_border_exit, nil)
    self.object:set_callback(callback.take_item_from_box, nil)

    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:destroy()
        sr_psy_antenna.psy_antenna = false
    end

    xr_sound.stop_all_sound_object()

    object_binder.net_destroy(self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
    object_binder.reinit(self)
    
    local npc_id = self.object:id()

    db.storage[npc_id] = { }

    self.st = db.storage[npc_id]
    self.st.pstor = nil

    self.next_restrictors_update_time = -10000

    self.object:set_callback(callback.inventory_info, self.info_callback, self)
    self.object:set_callback(callback.article_info, self.article_callback, self)
    self.object:set_callback(callback.on_item_take, self.on_item_take, self)
    self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
      self.object:set_callback(callback.use_object, self.use_object, self)
    self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
    --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
    self.object:set_callback(callback.task_state, self.task_callback, self)
    --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
    self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
    self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
    self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
    local story_id = box:story_id()
    if story_id == nil then
        return
    end

    treasure_manager.take_item_from_box(box, story_id)
--[[    
    local respawner = se_respawn.get_respawner_by_parent(story_id)
    if respawner == nil then
        return
    end
    
    --' Необходимо уменьшить счетчик в респавнере
    respawner:remove_spawned(item:id())

    local smart_terrain = db.strn_by_respawn[respawner:name()]
    if smart_terrain == nil then
        return
    end

    local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())
    if npc ~= nil then
        xr_sound.set_sound_play(npc, "reac_box")
        xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor)        
    end
]]
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_enter(npc, info_id)
    self.actor_detector:actor_enter()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_exit(npc, info_id)
    self.actor_detector:actor_exit()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
    printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
    --' Сюжет
    level_tasks.proceed(self.object)
    -- Отметки на карте
    level_tasks.process_info_portion(info_id)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
    if sell_bye == true then
       game_stats.money_trade_update (money)
    else       
       game_stats.money_trade_update (-money) 
    end   
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name)
    --printf("article_callback [%s][%s]", group, name)
    if device().precache_frame >1 then return end
    
    if group == "Diary" then
        news_manager.send_encyclopedy("diary", group)
    else
        news_manager.send_encyclopedy("encyclopedy", group)
    end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_take_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_drop_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object (obj)
sound.use_snd (obj)
end
-----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _objective, _state)
    task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)
    if _objective:get_idx() == 0 then
        if _state == task.fail then
            news_manager.send_task(db.actor, "fail", _task, _objective)
        elseif _state == task.completed then
            task_manager.reward_by_task(_task)
            news_manager.send_task(db.actor, "complete", _task, _objective)
        else
            news_manager.send_task(db.actor, "new", _task, _objective)
        end
    else
        if _task:get_objective(0):get_state() == task.in_progress then
            news_manager.send_task(db.actor, "update", _task, _objective)
        end
    end
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:map_location_added_callback(spot_type_str, object_id)
    if (false==app_ready()) or (device().precache_frame>1) then return end
    --'news_manager.send_task(db.actor, "new")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:update(delta)
    object_binder.update(self, delta)

    -- DEBUG slowdown
--    slowdown.update()

    local time = time_global()
    
    game_stats.update (delta, self.object)

    -- апдейт погоды
    self.weather_manager:update()
    
    -- апдейт схемы детектора
    self.actor_detector:update()

    -- апдейт звуковой схемы актера
    xr_sound.update_actor()
    
    --' Проверка потери жизни
--[[
    if self.object.health - lasthealth > 0.001 or
       self.object.health - lasthealth < -0.001 then
        printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)
        lasthealth = self.object.health
        lasttime = game.time()
    end
]]    
    -- Обновление отключения ввода с клавиатуры.
    if self.st.disable_input_time ~= nil and
       game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle 
    then
        level.enable_input()
        self.st.disable_input_time = nil
    end
    -- Обновление сна с переносом чувака в указанную позицию
    if self.st.sleep_relocate_time ~= nil and
       game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle 
    then
        self.object:set_actor_position(self.st.sleep_relocate_point)
        local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
        self.object:set_actor_direction(dir:getH())
        self.st.sleep_relocate_time = nil
    end

    -- Апдейт прятание оружия игрока во время диалога
    if weapon_hide == true or self.object:is_talking() then
        if self.weapon_hide == false then
            self.object:hide_weapon()
            self.weapon_hide = true
        end
    else
        if self.weapon_hide == true then
            self.object:restore_weapon()
            self.weapon_hide = false
        end
    end    

    -- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
    if self.next_restrictors_update_time < time then
        bind_restrictor.actor_update(delta)

        self.next_restrictors_update_time = time + 200

        task_manager.actor_update()
    end

    -- обновление постпроцессов
    if post_process ~= 0 then
        if post_process:update () == true then
           post_process = 0
        end
    end

    -- обновление пси-антенны
    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:update(delta)
    end

    --' Вывод сообщения о большой радиации
    if self.object.radiation >= 0.7 then
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static == nil then
            hud:AddCustomStatic("cs_radiation_danger", true)
            hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
        end
    else
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static ~= nil then
            hud:RemoveCustomStatic("cs_radiation_danger")
        end
    end

     if self.bCheckStart then
        printf("SET DEFAULT INFOS")        

        if not has_alife_info("storyline_actor_start") and
           (level.name() == "l01_escape")
        then
            self.object:give_info_portion("storyline_actor_start")
            _G.g_start_avi = true
            printf("*AVI* RUN START AVI")            
        end

--        if not has_alife_info("encyclopedy") then
--            self.object:give_info_portion("encyclopedy")
--        end

        if not has_alife_info("global_dialogs") then
            self.object:give_info_portion("global_dialogs")
        end

        if not has_alife_info("level_changer_icons") then
            self.object:give_info_portion("level_changer_icons")
        end

        level_tasks.add_lchanger_location()

        self.bCheckStart = false        
    end        
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
    
    local save_treasure_manager = true
    
    printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
    object_binder.save(self, packet)

    --' Сохраняем уровень сложности
    if save_treasure_manager == true then
        packet:w_u8(level.get_game_difficulty() + 128)
    else
        packet:w_u8(level.get_game_difficulty())
    end


    --' Сохраняем данные об отключенном вводе
    if self.st.disable_input_time == nil then
        packet:w_bool(false)
    else
        packer:w_bool(true)
        utils.w_CTime(packet, self.st.disable_input_time)
    end

    xr_logic.pstor_save_all(self.object, packet)
    self.weather_manager:save(packet)

    sr_psy_antenna.save( packet )
    
    if save_treasure_manager == true then
        treasure_manager.save(packet)      
    end                                  

    task_manager.save(packet)
    self.actor_detector:save(packet)    
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
    printf("actor_binder:load(): self.object:name()='%s'", self.object:name())
    object_binder.load(self, reader)
    printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

    --' Загружаем уровень сложности
    local game_difficulty = reader:r_u8()
    
    local load_treasure_manager = false      
    if game_difficulty >= 128 then           
        game_difficulty = game_difficulty - 128
        load_treasure_manager = true           
    end                                      

    
    get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

    if reader:r_eof() then
        abort("SAVE FILE IS CORRUPT")
    end

    local stored_input_time = reader:r_u8()
    if stored_input_time == true then
        self.st.disable_input_time = utils.r_CTime(reader)
    end

    xr_logic.pstor_load_all(self.object, reader)
    self.weather_manager:load(reader)

    sr_psy_antenna.load(reader)
    
    if load_treasure_manager == true then
        treasure_manager.load(reader)      
    end                                  

    
    task_manager.load(reader)
    self.actor_detector:load(reader)    
end
----------------------------------------------------------------------------------------------------------------------

--старт префетча звуков
--if string.find(command_line(), "-noprefetch") == nil then
--    sound_prefetch.prefetch_sounds()
--end


-- Weapon functions
function hide_weapon()
    weapon_hide = true
end
function restore_weapon()
    weapon_hide = false
end

// this is test for section iteration
/**
local function test_section_iteration(file_name, section_name)
    printf            ("file    : %s",file_name)
    printf            ("section : %s",section_name)
    
    local            file = ini_file(file_name)
    local            n = file:line_count(section_name)
    printf            ("lines   : %d",n)
    
    local            id, value = "", "", result
    for i=0,n-1 do
        result, id, value    = file:r_line(section_name,i,"","")
        printf        ("line %d : %s = %s",i,id,value)
    end
end

test_section_iteration("system.ltx","space_restrictor")
/**/

 

А вот sound.script

 

Скрытый текст

function use_snd(obj)
 
local obj_sect = obj:section()
 
local snd
 
if obj_sect == 'synth' then snd = [[mus\sinth]]
 
elseif obj_sect == 'rock_guitar' then snd = [[mus\git]]
 
elseif obj_sect == 'tamal' then snd = [[mus\new]]
  
end
 
if snd then
 
local snd_obj = xr_sound.get_safe_sound_object(snd)
 
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
 
end
 
end

   

 

 

@юлий мунин, замени код в sound 

Скрытый текст

function use_snd(obj)
local obj_sect = obj:section()
local snd
	if obj_sect == "synth" then snd = [[mus\sinth]]
	elseif obj_sect == "rock_guitar" then snd = [[mus\git]]
	elseif obj_sect == "tamal" then snd = [[mus\new]]
	end

	if snd then
		local snd_obj = xr_sound.get_safe_sound_object(snd)
		snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
	end
end

 

когда сравниваешь секцию     if obj_sect == "synth"   саму секцию пиши через "двойной апостроф"  чтобы игра понимала что это строка

 

 

эту функцию перенеси в низ файла перед  "-- Weapon functions"

Скрытый текст

----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object(obj)
	if sound then
		sound.use_snd(obj)
	else
		db.actor:give_game_news("В файле Sound ошибка или он отсутствует!!!", "ui\\ui_iconsTotal", Frect():set(913,235,83,47), 0, 30000)
	end
end
----------------------------------------------------------------------------------------------------------------------

 

 

И пробуй  :hm:

@юлий мунин вот тебе рабочая функция

Скрытый текст

-- Звуки юза шамовки, медикоментов, напитков, by Nazgool, гопыч
function use_snd(obj)
local obj_sect = obj:section()
local snd
-- Медикоменты
if obj_sect == 'medkit' then snd = [[interface\inv_medkit]]
elseif obj_sect == 'medkit_army' then snd = [[interface\inv_medkit]]
elseif obj_sect == 'medkit_scientic' then snd = [[interface\inv_medkit]]
elseif obj_sect == 'bandage' then snd = [[interface\inv_bandage]]
elseif obj_sect == 'antirad' then snd = [[interface\inv_pills]]
-- Еда
elseif obj_sect == 'bread' then snd = [[interface\inv_food]]
elseif obj_sect == 'kolbasa' then snd = [[interface\inv_food]]
elseif obj_sect == 'conserva' then snd = [[interface\inv_food]]
-- Напитки
elseif obj_sect == 'vodka' then snd = [[interface\inv_vodka]]
elseif obj_sect == 'energy_drink' then snd = [[interface\inv_softdrink]]

-- elseif obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]]
end
if snd then
local snd_obj = xr_sound.get_safe_sound_object(snd)
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
end
end

Для озвучки юза я её использую, проблем ни каких, измени только итемы и пути к звукам.

 Моя нычка, Нычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

@ted.80,  Сделал всё точно так же, как вы и сказали. Апострофами секции отметил, строку перенёс. Теперь игра воет точно так же, но только другая строка.

Lua error...bind_stalker.script:426: attempt to call field 'use_snd' (a nil value)

13 минут назад, юлий мунин сказал:

bind_stalker.script:426

что в этой строке?

погоди, а звуки вообще лежат по нужному пути?

и откуда звуки? 

Изменено пользователем ted.80

@ted.80, в строке 426 написано: sound.use_snd (obj)

Звуки лежат как положено в директории игры \gamedata\sounds\mus\(звук.ogg)

Звуки свои, отконвертированные в sdk.

@юлий мунин, синтаксическая ошибка в коде.

 

Братья - сталкеры, тут проблема возникла, пытаюсь добавить болт на худ на статик патронов, он отображается но почему то постоянно и под статиком патронов а не на нём, как прочие иконки.

Скрытый текст

local bolt = db.actor:active_slot(5)
function bolt_na_hud()
    if bolt then
        get_hud():AddCustomStatic("hud_bolt", true)
    else
        get_hud():RemoveCustomStatic("hud_bolt")
    end
end

Скрытый текст

  <hud_bolt x="921" y="711" width="38" height="38">
    <texture x="850" y="950" width="50" height="50">ui\ui_icon_equipment</texture>
  </hud_bolt>

Блин, что я упускаю?

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

 Моя нычка, Нычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

@юлий мунин, попробуй сменить имя файла, на допустим my_sound и ссылку поправь

  • Нравится 1

@ted.80, ого. Представляете: заработало! Возможно, игра сначала не понимала, что от неё хотят, думала, что sound-не имя, а действие. Буду знать теперь. 

@ted.80, а вы случайно не знаете, как присвоить несколько звуков одному предмету, например, рации? Надо отдельный фаил создавать?

  • Согласен 1

Есть мод Тайные Тропы 2 на движке OGSR Engine x64. В ём есть проблема - в подземке Агропрома в одном месте идет страшная просадка фпс:

06962670562ce995f49cea78110d2dc4b0336937

Измененные файлы уровня:

level.gct
level.graph
level.spawn
level.gct.raw
level_sectors.ai

 

Я так понимаю, что просадка происходит из-за света. НО совершенно не понимаю, куда копать.....

8a3103782eff1611b8c6a8dcc9edab32b0336937

AMD Athlon II X2 250, NVIDIA GTS 450, RAM 8.0 GB, WIN 7/64  правки Золотой Шар

12 часов назад, юлий мунин сказал:

как присвоить несколько звуков одному предмету, например, рации?

 

Скрытый текст


local Radio = {
	[[Radio_1]],
	[[Radio_2]],
	[[Radio_3]],
	[[Radio_4]]
}

if obj_sect == "radio" then snd = Radio[math.random(#Radio)]

 

 

  • Нравится 1

@ted.80, а куда эту функцию вписывать? Я сделал отдельный скрипт с этими строками-опробовал рацию-игра молчит.

@юлий мунин, Замени код в своём скрипте

 

Скрытый текст


local Radio = {
	[[characters_voice\scenario\yantar\ghost_pda]],
	[[characters_voice\scenario\yantar\vasiliev_pda]],
	[[characters_voice\scenario\yantar\professor_to_actor_pda_4]],
	[[characters_voice\scenario\yantar\professor_to_actor_pda_2]],
	[[characters_voice\scenario\yantar\professor_to_actor_pda_3]],
	[[characters_voice\scenario\yantar\professor_to_actor_pda_5]]
}

function use_snd(obj)
local obj_sect = obj:section()
local snd
	if obj_sect == "synth" then snd = [[mus\sinth]]
	elseif obj_sect == "rock_guitar" then snd = [[mus\git]]
	elseif obj_sect == "tamal" then snd = [[mus\new]]
	elseif obj_sect == "СЕКЦИЯ_РАЦИИ" then snd = Radio[math.random(#Radio)]
	end

	if snd then
		local snd_obj = xr_sound.get_safe_sound_object(snd)
		snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
	end
end

 

 

  • Нравится 1

Господа, кто мне скажет почему в ванильном аутфит лтх иммунитеты у костюмов прописаны на 0.0001, при этом все костюмы изнашиваются если этот файл не закидывать в папку с игрой. Если закинуть тогда понятно износ пропадает. Почему так происходит и как это всё работает - не могу понять. И ещё, кто нибудь знает каким образом можно у Петрухи убрать бинокль из продажи? У сталкера на свалке на кладбище такой проблемы не наблюдается.

А, и ещё, никто не знает что ли как научить неписей пользоваться автоматическими пистолетами и винтарями? Недавно спрашивал , никто не ответил.

Изменено пользователем Вася Сапля

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

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

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

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

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

Войти

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

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

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