Перейти к контенту
Mechanic.92

New Sleep Mod

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

Спроси в ищу файлы, может есть у кого. Я его так-то много раз выкладывал тут.

 

Или сам побегай поснимай координаты. Можешь даже на стульях сделать чтоб спать можно было, короче в любом месте где тебе понравиться, хоть не дереве :D;)
Или скачай мою сборку на PG, только смотри ту что с New Sleep Mod, правда 800 мб качать из-за одного файлика...

Хотя я НС качал как-то из-за одного файлика :D

 

 

Изменено пользователем alex5773
Ссылка на комментарий

На 6-ой версии (чистая игра) всё работает нормально - звук не исчезает, всё отображается, матрасы на месте... кроме одного - время во сне идет неправильно. Ложишься спать в 5. 45 утра на 4 часа, встаешь в пол четвертого ночи, тут же на 2 часа лег, проснулся  в пол второго ночи на след. день (спал 22 часа). Если авторам добавить нужду во сне и поправить ход времени, то мод будет отличный. А на данный момент придется его удалить, жаль...

З.Ы. Окно, которое появляется перед сном, не всегда одинаковое - то последняя в шкале двойка (спать 2 часа), то четверка, ещё что-то было, не запомнил... Что-то мне подсказывает, что так быть не должно...

 

 

 

Ссылка на комментарий

время во сне идет неправильно. Ложишься спать в 5. 45 утра на 4 часа, встаешь в пол четвертого ночи

Читал описание мода?

Реализация сна, приближенная к Зову Припяти.

Играл в Зов Припяти?

Там сделано так: жмешь 4 - значит ложишься спать не на 4 часа, а до 4-х часов. Положение шкалы меняется в зависимости от текущего времени.

Изменено пользователем naxac
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

@naxac, точно! Что-то я затупил конкретно :D . В Зов Припяти играл последний раз, когда он вышел... :az1000106: Установлю заново...

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

 

 

 

Ссылка на комментарий

Ребята, помогите разобраться. SoC 1.0004, установлен New Sleep Mod. Все работает. Но при убийстве псевдособаки на Дикой территории происходит вылет вот с таким логом:

 

FATAL ERROR

[error]Expression : fatal error
[error]Function : CScriptEngine::lua_error
[error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line : 73
[error]Description :
[error]Arguments : LUA error: ...w of chernobyl\gamedata\scripts\sleep_manager.script:111: attempt to index local 'ph_element' (a nil value)

 

 

При удалении массива от NewSleepMod из bind_stalker.script вылет исчезает. Кто подскажет как можно исправить?

Ссылка на комментарий

Доброго времени суток.

 

Вопрос такой: Версия 1.0004

Захожу на кордоне в подвал и ловлю вылет:

 

Expression    : xml_doc.NavigateToNode(path,index)
Function      : CUIXmlInit::InitStatic
File          : E:\stalker\patch_1_0004\xr_3da\xrGame\ui\UIXmlInit.cpp
Line          : 172
Description   : XML node not found
Arguments     : hud_mattress

31 минуту назад, EGER.OVERKILL WF сказал:

вылет:

upd: Уже решил. 

Ссылка на комментарий

Вот скрип sleep_manager, может кому пригодится.

Почти на всех матрасах в игре можно спать.

На тех которые ровно лежат.

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

--=======================================================--
-- Скрипт cна                                            --
-- Авторы: Mechanic, Shoker, Z.E.N., Ab@dDon             --
-- Может кого не указал, но скрипт брал из Zenoban Mod'а --
--=======================================================--

local table_sleep_zone =
    {
    -- Кордон:
    
    -- Матрас на чердаке в доме возле Лиса
    {"l01_escape", "m", nil, 140.09, 3.5, 336.91, 444961, 232, nil}, 

    -- Матрасы в подвале в деревне новичков
    {"l01_escape", "m", "no_icon_1", -210.73, -22.9, -122.30, 42632, 59, nil},
    {"l01_escape", "m", "icon_1", -210.34, -22.9, -125.75, 42632, 59, nil}, 
    -- Матрас в доме в лагере новичков
    {"l01_escape", "m", "1", -223.6, -19.4, -168, 32807, 47, nil}, 
    {"l01_escape", "m", "2", -222.6, -19.4, -161.07, 32807, 47, nil},
    {"l01_escape", "m", "3", -185.54, -19.42, -134.87, 65608, 56, nil},
    {"l01_escape", "m", "4", -222.56, -19.84, -164.02, 32807, 47, nil},
    {"l01_escape", "m", nil, -214.63, -22.84, -126.40, 39266, 59, nil},
    {"l01_escape", "m", nil, -217.15, -19.68, -168.81, 34087, 47, nil},
    -- У вояк
    {"l01_escape", "m", nil, -139.94, -25.01, -355.95, 116593, 19, nil},
    {"l01_escape", "m", "5", -167.71, -29.60, -352.58, 81740, 32, nil},
    {"l01_escape", "m", "6", -168.02, -29.60, -357.01, 81730, 28, nil},
    {"l01_escape", "m", "7", -115.80, -29.97, -387.15, 139308, 27, nil},
    {"l01_escape", "m", "8", -125.39, -29.52, -380.23, 126768, 26, nil},
    {"l01_escape", "m", "9", -166.50, -24.90, -356.87, 83083, 31, nil},
    {"l01_escape", "m", "10", 111.51, -2.30, 2.78, 413043, 117, nil},
    {"l01_escape", "m", "11", 111.24, -2.75, 1.52, 413041, 117, nil}, 
    

    -- Свалка:
    
    -- Матрас в ангаре возле группы Серого
    {"l02_garbage", "m", nil, -70.34, -1.60, 19.88, 131025, 329, nil},

    -- Матрас в вагончике возле заставы долга
    {"l02_garbage", "m", nil, 46.73, 1.56, 243.93, 218601, 359, nil},
    {"l02_garbage", "m", nil, 74.01, -1.88, 17.08, 136601, 330, nil},
    -- У бандитов
    {"l02_garbage", "m", nil, -223.98, -7.67, -129.76, 17000, 281, nil},

    -- Агропром:
    
    -- Матрасы в конце ж/д тунеля с аномалиями
    {"l03_agroprom", "m", "icon_2", 254.96, 0.15, 74.44, 428649, 498, nil},
    {"l03_agroprom", "m", "no_icon_2", 257.46, 0.15, 73.50, 429416, 498, nil},
    {"l03_agroprom", "m", nil, -156.96, 1.66, -153.59, 96184, 668, nil},
    {"l03_agroprom", "m", nil, 0.20, 7.83, 15.46, 239682, 682, nil},
    {"l03_agroprom", "m", nil, 33.16, 7.83, -17.72, 271738, 664, nil},
    {"l03_agroprom", "m", nil, -156.19, 1.43, -162.03, 82783, 669, nil},
    
    -- Подземелья Агропрома:
    
    -- Матрас в тайнике Стрелка
    {"l03u_agr_underground", "b", nil, -69.74, -6.87, -74.45, 3439, 717},
    {"l03u_agr_underground", "m", nil, -69.74, -6.35, -74.45, 3439, 717, "allways"},
    
    -- Бар:
    
    -- Матрасы на базе Долга
    {"l05_bar", "m", "icon_3", 232.28, -4.9, 131.44, 59301, 1200, nil},
    {"l05_bar", "m", "no_icon_3", 232.08, -4.9, 135.36, 59301, 1200, nil},
    
    -- Матрас в комнате Бармена (за барной стойкой)
    {"l05_bar", "b", nil, 115.85, -5.3, 12.0, 33756, 1239},
    {"l05_bar", "m", nil, 115.85, -4.6, 12.0, 33756, 1239, "allways"},
    {"l05_bar", "m", nil, 212.74, -1.45, -17.93, 52216, 1264, nil},
    {"l05_bar", "m", nil, 113.99, -4.96, 14.21, 33614, 1239, nil},
    {"l05_bar", "m", "12", 132.35, 0.20, 61.42, 36350, 1227, nil},
    {"l05_bar", "m", "13", 128.92, 0.20, 57.59, 35885, 1227, nil},
    {"l05_bar", "m", "14", 115.37, 0.06, 119.94, 33881, 1213, nil},
    {"l05_bar", "m", "15", 117.85, 0.06, 125.40, 34298, 1213, nil},
    {"l05_bar", "m", nil, 209.24, 0.76, 58.99, 50944, 1203, nil},
    {"l05_bar", "m", "16", 218.39, -5.33, 123.42, 54151, 1198, nil},
    {"l05_bar", "m", nil, 149.98, 0.76, 67.63, 40034, 1180, nil},
    {"l05_bar", "m", nil, 109.92, 0.43, 74.03, 33034, 1225, nil},
    {"l05_bar", "m", "17", 98.66, 0.20, 89.43, 31514, 1223, nil},
    {"l05_bar", "m", "18", 101.54, 0.20, 93.02, 32074, 1222, nil},
    {"l05_bar", "m", "19", 98.64, 0.20, 98.08, 31521, 1222, nil},

    -- Янтарь:
    
    -- Матрасы в бункере ученых на Янтаре
    {"l08_yantar", "m", "no_icon_4", 30.36, -10.98, -280.2, 54978, 1480, "allways"},
    {"l08_yantar", "m", "icon_4", 27.68, -10.98, -280.2, 54978, 1480, "allways"},

    -- Армейские склады:

    -- Матрасы на базе Свободы в казармах
    {"l07_military", "m", "no_icon_5", 14.07, -6.82, 13.1, 319840, 1582, nil},
    {"l07_military", "m", "icon_5", 11.18, -6.82, 13.27, 317158, 1582, nil},

    -- Матрас в комнате напротив Скряги
    {"l07_military", "m", nil, -25.39, -6.82, -26.74, 281271, 1593, nil},
    {"l07_military", "m", "20", -194.30, -12.67, 39.50, 131936, 1657, nil},
    {"l07_military", "m", nil, -229.46, -21.44, 200.10, 101673, 1765, nil},
    {"l07_military", "m", nil, 90.08, -0.21, 304.43, 391261, 1775, nil},
    {"l07_military", "m", nil, -18.61, -3.77, -21.31, 288157, 1593, nil},
    {"l07_military", "m", nil, -25.76, -3.78, -21.26, 281276, 1593, nil},
    {"l07_military", "m", "21", -18.72, -7.02, -22.93, 288152, 1593, nil},
    {"l07_military", "m", nil, -342.87, -13.56, 396.61, 10000, 1847, nil},


    {"l10_radar", "m", "22", 629.62, -43.76, 193.78, 224853, 1909, nil},
    {"l10_radar", "m", "23", 635.35, -43.76, 192.82, 225745, 1909, nil},
    {"l10_radar", "m", nil, 60.06, -4.27, -50.48, 30685, 1987, nil},
    {"l10_radar", "m", "24", 392.07, -34.03, 155.42, 119814, 1865, nil},
    {"l10_radar", "m", nil, 392.17, -34.14, 153.54, 119812, 1865, nil},


    {"l11_pripyat", "m", nil, -3.25, -4.75, 198.76, 96184, 2195, nil},
    {"l11_pripyat", "m", nil, 102.84, 4.33, 124.23, 73868, 2117, nil},


    {"l04_darkvalley", "m", nil, 147.22, 0.56, -244.83, 345204, 958, nil},
    {"l04_darkvalley", "m", nil, 145.47, 0.50, -248.65, 344406, 959, nil},
    {"l04_darkvalley", "m", nil, 38.61, 4.87, -81.97, 223240, 1100, nil},
    {"l04_darkvalley", "m", nil, 25.69, 4.87, -85.53, 205994, 1099, nil},
    {"l04_darkvalley", "m", "25", 33.44, 4.63, -59.72, 215692, 1074, nil},
    {"l04_darkvalley", "m", "26", 33.61, 4.63, -57.70, 215702, 1074, nil},
    {"l04_darkvalley", "m", "27", 46.05, 1.10, -59.38, 232784, 1083, nil},
    {"l04_darkvalley", "m", "28", 102.84, 1.10, -59.03, 235536, 1083, nil}

    
    --[[
    -- Это места, где можно поспать (требует начало новой игры)
    {"1", "2", "3", 4, 5, 6, 7, 8, "9", "10"}
    1 - название уровня
    2 - m или b (m - невидимый объект, при клике на который мы спим, b - кровать, для декорации)
    3 - если написать что-нибудь в "" и !добавить! эту запись в таблицу ниже, то на глобальной/мини карте для этого матраса не будет иконки сна (только для невидимого объекта)
    4,5,6 - координаты x,y,z соответственно
    7,8 - level_vertex и game_vertex соответственно
    9 - если стоит "allways" значит можно спать независимо от наличия рядом врагов (только для невидимого объекта)
    ]]
    }
 
-- таблица матрасов, при использовании которых никогда не ставить метки
local table_non_spot_sleep_zone =
    {
    ["no_icon_1"]    = true,
    ["no_icon_2"]    = true,
    ["no_icon_3"]    = true,
    ["no_icon_4"]    = true,
    ["no_icon_5"]    = true,
    ["1"]    = true,
    ["2"]    = true,
    ["3"]    = true,
    ["4"]    = true,
    ["5"]    = true,
    ["6"]    = true,
    ["7"]    = true,
    ["8"]    = true,
    ["9"]    = true,
    ["10"]    = true,
    ["11"]    = true,
    ["12"]    = true,
    ["13"]    = true,
    ["14"]    = true,
    ["15"]    = true,
    ["16"]    = true,
    ["17"]    = true,
    ["18"]    = true,
    ["19"]    = true,
    ["20"]    = true,
    ["21"]    = true,
    ["22"]    = true,
    ["23"]    = true,
    ["24"]    = true,
    ["25"]    = true,
    ["26"]    = true,
    ["27"]    = true,
    ["28"]    = true
    }

local mattress_id = {}
local mattress_count = 0
local mattress_processed = 0
local first_scaling
local left_scaling
local last_health
local ENEMY_RADIUS = 15 -- радиус врагов

-- Обычный апдейт
function update(delta)

    local mcnt = load_variable("matras_cnt", 0)

    for i=1, mcnt do
        local obj = level.object_by_id(load_variable(i.."_matras", 65000))
        if obj then
            ---------------------
            --get_console():execute("THIS_IS_SPARTA!")
            --get_console():execute(obj:name())
            local bone_name = get_ltx(obj:section(), "fixed_bone", "str")
            local ph_shell = obj:get_physics_shell()
            if not ph_shell then
                --get_console():execute("NO_PH_SHELL")
                return
            end
            local ph_element = ph_shell:get_element_by_bone_name(bone_name)
            if ph_element:is_fixed() then
                --get_console():execute("ART_FIXED")
            else
                --get_console():execute("FIXING_OBJECT")
                ph_element:fix()
            end
            ---------------------
        end
    end

    if db.actor == nil  then
        return 
    end

    if not db.actor:alive() then
        local hud = get_hud()

        local custom_static = hud:GetCustomStatic("hud_mattress")
        if custom_static ~= nil then
            hud:RemoveCustomStatic("hud_mattress")
        end
    end

    local actor = db.actor
    local pos = actor:position()
    local zn = actor_in_sleep_zone(pos)

    if load_variable("bed_spawned", false) == false then
        spawn_mattress()
        save_variable("bed_spawned", true)
    end

    if zn == "m" then
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("hud_mattress")
        if custom_static == nil then
            hud:AddCustomStatic("hud_mattress", true)
        end
    else
        local hud = get_hud()

        local custom_static = hud:GetCustomStatic("hud_mattress")
        if custom_static ~= nil then
            hud:RemoveCustomStatic("hud_mattress")
        end
    end
end

-- Update матраса(вешаем колбек если ещё не повесили)
function mattress_update(obj)
    if mattress_count ~= mattress_processed then
        for kk,vv in pairs(mattress_id) do
            if vv[1] == obj:id() and vv[2] == false then
                vv[2] = true
                obj:set_callback(callback.use_object, this.mattress_use)
                obj:set_tip_text("tip_sleep")
                mattress_processed = mattress_processed + 1
            end
        end
    end
end

-- Отлавливаем спавн матрасов и запоминаем их id
function mattress_spawn(obj)
    mattress_count = mattress_count + 1
    local m = {obj:id(), false}
    table.insert(mattress_id, m)
end

-- Юзаем матрас
function mattress_use(obj, who)
    if test_for_can_sleep(obj) then
    -------------------------------
        local hud = get_hud()
        local spwn = ui_sleep.sleep(hud)
        local frst
        local scnd
        level.start_stop_menu(spwn,true)
        
        -- можно ли ставить спот
        local valid = true
            
        for name, val in pairs(db.storage[db.actor:id()].pstor) do
            if table_non_spot_sleep_zone[name] and load_variable(name, -1) == obj:id() then
                valid = false
            end
        end
        if valid then
            if not level.map_add_object_spot_ser(obj:id(), "sleep_pointer", "Место для сна") then
                level.map_add_object_spot_ser(obj:id(), "sleep_pointer", "Место для сна")
            end
        end
        
        for i = 1, 5 do
            frst = load_variable("no_icon_"..i, -1)
            scnd = load_variable("icon_"..i, -1)
            if frst == obj:id() and not level.map_add_object_spot_ser(scnd, "sleep_pointer", "Место для сна") then
            level.map_add_object_spot_ser(scnd, "sleep_pointer", "Место для сна")
            end
        end
    -------------------------------
    end
end
    
-- Игрок в зоне сна
function actor_in_sleep_zone(pos)
    for i,z in pairs(table_sleep_zone) do
        if z[1] == level.name() and z[2] == "m" and actor_in_zone(z[4], z[5], z[6], 2, pos) then
            return z[2]
        end
    end
    return ""
end

-- Спавним всё, что нужно
function spawn_mattress()
    for kk,vv in pairs(table_sleep_zone) do
        if vv[2] == "m" then
            local obj = alife():create("mattress", vector():set(vv[4], vv[5], vv[6]), vv[7], vv[8])
             if vv[9] == "allways" then
                save_variable(obj:name().."_allways_sleep", true)
            end
            if vv[3] then
                save_variable(vv[3], obj.id)
            end
        end
        if vv[2] == "b" then
            local obj = alife():create("bed_matras", vector():set(vv[4], vv[5], vv[6]), vv[7], vv[8])
            local i = load_variable("matras_cnt", 1)
            save_variable(i.."_matras", obj.id)
            save_variable("matras_cnt", i+1)
        end
    end
end

-- Проверка, можно ли спать
function test_for_can_sleep(matras)
    local allways = load_variable(matras:name().."_allways_sleep", false)

    -- проверка на врагов
    if not allways then
        for a=1,65535 do
            local obj = level.object_by_id(a)
            if obj then
                if ((IsStalker(obj) and get_npc_relation(obj,db.actor)=="enemy") or IsMonster(obj)) and obj:position():distance_to(db.actor:position())<ENEMY_RADIUS then
                    news_manager.send_tip(db.actor, "sleep_warning_enemy", nil, "default", 5000)
                    return false
                end
            end
        end
    end

    -- проверка на радиацию
    if db.actor.radiation > 0 then
        news_manager.send_tip(db.actor, "sleep_warning_radiation", nil, "default", 5000)
        return false
    end

    return true
end

-- Спать
function sleep(h)
    sleep_manager.start_sleep(h)
end

function start_sleep(scale)
    local sleep_ltx = ini_file ("scripts\\actorsleep.ltx")
    schemes["ar_sleep"] = "ar_sleep"
    ar_sleep.set_scheme(db.actor, sleep_ltx, "ar_sleep", logic)
    db.actor:stop_talk()
    db.actor:hide_weapon()
    level.disable_input()
    sleep_manager.starter (scale)
end

function starter(scale)
    last_health = db.actor.health    
    left_scaling = scale
    first_scaling = scale

    _G.mus_vol = get_console():get_float("snd_volume_music")
    _G.amb_vol = get_console():get_float("snd_volume_eff")
    get_console():execute("snd_volume_music 0")
    get_console():execute("snd_volume_eff 0")

    game.start_tutorial("time_scaling")
    level.set_time_factor(3460)
end

-- Вызывается каждый час сна
function stop_scaling()
    left_scaling = left_scaling - 1
    if left_scaling + 1 == first_scaling and last_health > db.actor.health then
        sleep_manager.dreamer()
        news_manager.send_tip(db.actor, "sleep_warning_satiety_or_bleeding", nil, "default", 5000)
    elseif left_scaling > 0 and last_health <= db.actor.health  then
        sleep_manager.hp_corrector(2)
        last_health = db.actor.health
          game.start_tutorial("time_scaling")
    elseif left_scaling > 0 and last_health > db.actor.health  then
        sleep_manager.hp_corrector(12)
        last_health = db.actor.health
        game.start_tutorial("time_scaling")
    elseif left_scaling <= 0 and last_health > db.actor.health  then
        sleep_manager.hp_corrector(12)
        db.actor.power = 1
        last_health = db.actor.health
        sleep_manager.dreamer()
    elseif left_scaling <= 0 and last_health <= db.actor.health then
        db.actor.power = 1
        sleep_manager.dreamer()
    end    
end

function dreamer()
    level.set_time_factor(system_ini():r_float("alife","time_factor"))
    if sleep_manager.is_sleep_active() then
        get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
        get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
        _G.amb_vol = 0
        _G.mus_vol = 0
        sleep_manager.stopper()
    end
end

function stopper()
    level.set_time_factor(system_ini():r_float("alife","time_factor"))
    ar_sleep.disable_scheme()
    if not db.actor:alive() then
        sleep_manager.onliner()
    else 
        db.actor:restore_weapon()
    end
    level.enable_input()    
end

-- Игрок умер во время сна 
function onliner()
    get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
    get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
    _G.amb_vol = 0
    _G.mus_vol = 0
end

function hp_corrector(fr)
    db.actor.health = fr/12
end

function is_sleep_active()
    if db.storage[db.actor:id()].active_scheme == "ar_sleep" then 
        return true 
    end
    return false
end

-----------------------------------------------------
-------------- Вспомогательные функции --------------
-----------------------------------------------------

-- Записываем переменную
function save_variable(variable_name, value)
    xr_logic.pstor_store(db.actor, variable_name, value)
end

-- Загружаем переменную
function load_variable(variable_name, value_if_not_found)
    return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

-- Удаляем переменную
function del_variable(variable_name)
    if db.storage[db.actor:id()].pstor[variable_name] then
        db.storage[db.actor:id()].pstor[variable_name] = nil
    end
end

-- Проверка на наличие актора в области
function actor_in_zone(x, y, z, r, pos)
    if math.pow(x-pos.x,2) + math.pow(y-pos.y,2) + math.pow(z-pos.z,2) <= math.pow(r,2) then
        return true
    else
        return false
    end
end

-- Узнаём отношения (взято из AMK)
function get_npc_relation(obj,target)
    local rel = obj:relation(target)
    local relation
    if rel == game_object.neutral then
        relation = "neutral"
    elseif rel == game_object.friend then
        relation = "friend"
    elseif rel == game_object.enemy then
        relation = "enemy"
    else
        return false
    end
    return relation
end

-- Получаем строку из LTX файла
function get_ltx(l_name,l_string,type)
    if system_ini():section_exist(l_name) and system_ini():line_exist(l_name, l_string) then
        if type=="bol" then
            return system_ini():r_bool(l_name, l_string)
        end
        if type=="num" then   -- целое число
            return tonumber(system_ini():r_u32(l_name, l_string))
        end
        if type=="num_float" then   -- число с запятой
            return tonumber(system_ini():r_float(l_name, l_string))
        end
        if type=="str" then
            return tostring(system_ini():r_string(l_name, l_string))
        end
        if type==nil then
            return system_ini():r_u32(l_name, l_string)
        end
    end
    return nil
end

 

Забыл написать, что можно спать на всех диванах в игре))) 

  • Спасибо 1
  • Нравится 1
  • Полезно 1
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

×
×
  • Создать...