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

Выбрасываемый рюкзак


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

Создал для сейго безобразия инвентарь, чуток сыроват, http://4put.ru/pictures/max/85/263491.jpg, только одна проблема объем переместился и в инвентаре и при обыске трупов и при торговле, возможно ли это как-то исправить?

Изменено пользователем Леня Баньши
アレクセイ 高い
Arekusei takai
Ссылка на комментарий

Леня Баньши

Тебе сюда: function Bag:Init(Wnd,info_id) (файл xr_bag.script)

local iPosX, iPosY=200, 236  -- позиция по X, Y  статика для открытого окна инвентаря ГГ
        if info_id=="ui_car_body"  then
   --// позиция если открыто  окна  инвентаря трупа
        iPosY=iPosY+27
        iPosX=iPosX-7
--// позиция если открыто окно торговли
        elseif info_id=="ui_trade" then
        iPosY=iPosY+14
        iPosX=iPosX-7
        end

 

тебе нужно сместить влево - значит уменьшить значение по X для окна инвентаря ГГ на 5- 10 пискелей. Для остальных окон смотри сам.

А для кнопки сброса - сюда:ui_new_slots.script

function UISlotWnd:InitControls()

...............

self.btn_drop:Init("ui\\ui_btn_01_h", 230,735, 120, 30) -- опять же координаты по X, Y

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

В связи с тем, что Kirag выпустил новый патч(который я проглядел) для магазинов - совмещение придется делать заново ohmy.gif

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

Garry_Galler, а можно уточнить когда это будет и будет ли вообще?

А то разрядка магазинов серьезно барахлит, берем разряжаем магазин, все появляются патроны в рюкзаке, пустая обойма, но при нажатии бинокля в руках пустой магазин, который, если зарядить, там и остается.

アレクセイ 高い
Arekusei takai
Ссылка на комментарий

Garry_Galler в связи с личной заинтересованностью в развитии вашей идеи предлагаю следующие опции на реализацию :

1 Ограничение на количество ячеек инвентаря, по факту заполнения которых в инвентарь невозможно взять вещь. Зависит от вида рюкзака.

"Износ" рюкзака - поставить учетную функцию на время и частоту ходьбы/бега/прыжков (каждое из действий прибавляет свой коэффицент к счетчику) гг с перегрузкой + общее время ходьбы гг с рюкзаком на плечах. По факту накопления н-ого числа рюкзак "рвется" т.е блокируется а все вещи из инвентаря оказываются на земле. Решается покупкой нового рюкзака, который тут же активируется при покупке или подборе. Дальнейшую судьбу мысли решать вам.

Замедляю полураспад души стержнями музыки

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

Леня Баньши

У меня подобные вещи и на чистой игре(+только магазины) иногда и происходили.

Под новый фикс я делал адаптацию, но она у меня, увы, почему то не заработала. Пока руки не дошли разобраться в чем там дело - в общем непростое это дело совмещать подобные разработки :-)

 

Ирбис

Я подумаю над предложением.

-----------------------------------------------------------------------------------------------

PS: Мне тут Geoset сделал новые модельки для пары рюкзаков - немного попозже выложу.

Изменено пользователем Garry_Galler
Ссылка на комментарий
5) Патроны вешаются на пояс.

А тут нету такой проблемы?:

Дело в том что скрипт мода запрещает использовать патроны из рюгзака не только ГГ, но и всем НПС.

Так что когда НПС отстреливает обойму, убирает оружие и бегает по местности с криками "Я без оружия!"

Из мода аммуниция на поясе.

Изменено пользователем Septimus
Ссылка на комментарий
Septimus, это было в старой версии "Аммуниции...", которая была еще правленым .dll'ом. Тут скриптовая версия.
Моё новое оружие здесь.

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

goroskob, тут нет этого бага получается,хорошо.Очень хорошо

Garry_Galler, Прошу разрешения использовать твой мод в Своем дополнении для FSM.Этот мод это то что мне нужно.Со слотами я разобрался сам,а вот с аммуницией нет.Дай разрешение,пожалуйста.

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

Septimus

У меня патроны вешаются на пояс простой правкой одной строчки в файле weapons.ltx и к реалиазции аммуниции на поясе моя разработка отношения не имеет. Там идет запрет на перезарядку, если патроны отсутствуют на поясе, у меня же ничего подобного нет, так как это не имело отношения к тому что я реализовывал. И патроны вешаются на пояс просто для удобства(чтобы при сбросе рюкзака не остаться без боеприпасов - предметы на поясе у меня не сбрасываются), но перезаряжаться (при активном рюкзаке) можно и при отсутствии патронов на поясе.

Так что ты немного ошибся - если хотел именно реалиазции запрета на перезарядку.

Все это реализовано, как я понял, в последней скриптовой версии "Аммуниции на поясе" (без багов с NPC).

Недавно мне предложили совместить ее с моими рюкзаками (а в придачу еще и магазины kirag'a - что из этого выйдет, пока не знаю :-)

Вердикт относительно возможности совмещения магазинов kirag'a и скриптового варианта "аммуниции на поясе": несовместимы.

Впрочем оно и не нужно: данные разработки - это альтернативы, которые делают почти одно и тоже в плане геймплея, только в магазинном питании это сделано более продвинуто в плане приближения к реалистичности. Однако нужно отдать должное автору скриптового варианта "аммуниции на поясе" kstn - сделано гениально просто. Причем настолько просто, что сразу даже не понял в чем фокус :).

В общем вывод такой: по отдельности каждую из этих разработок можно совместить с моими рюкзаками, причем "аммуниция на поясе" совмещается проще. Там всего то нужно перенести из bind_stalker.script вызов функции мода в мой bind_stalker.script и сделать кой какие мелкие правки в конфиг-файлах в виде добавления инклуда #include "ammo_fake.ltx" в weapons.ltx и одной секции предмета(separator) из items.ltx в bag.ltx, а также не забыть добавить _g.script.

-----------------------------------

---------------------------------------------------------------------------------------------------

Насчет использования моей разработки в своих модах: ограничений нет (разве что для Осознания).

------------------------------------------------------------------------------------------

Барсуков Герман

Отпишусь в личку.

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

Уважаемый Garry_Galler, подскажите как убрать возможность вешать патроны на пояс?

П.С:А фэйковые предметы обязательны или можно найти другой вариант.

 

  ▲

▲ ▲

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

Garry_Galler , какую версию мода не установлю, когда я пытаюсь запустить сталкер, у меня появляется маленькое окошко(ну которое при запуске), а потом тут же исчезает. Что делать?

Дурак знает как затеять драку, умный знает как победить в драке, мудрец знает как избежать драки.

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

Gandifil

Для начала - лог вылета приложить. И что за мод указать.

dragunof

Закомментировать строчку ;belt = true

в файле weapons.ltx - в оригинале она и так была закомментирована - я просто убрал точку с запятой перед строчкой .

Для тех кто не в курсе - ; - это обычный символ комментирования строк в файлах конфигурации (родом он из асссемблера), - после данного символа любые данные при чтении файла игнорируются.

Фейковые предметы обязательны - так как именно на них и строится технология использования предметов в новых слотах.

Ссылка на комментарий
Snork_7171, Адаптации нету, просто скопируй файл config\ui\inventory_new и назови его inventory_new_16. Должно помочь.
アレクセイ 高い
Arekusei takai
Ссылка на комментарий

Здраствуйте, есть вопрос. Совмещаю этот мод с магазинным модом и замечаю что рюкзаки используют обьекты dark_matter_container1 и dark_matter_container2. Если я правильно понимаю, то они используются в магазинном моде. Можно ли сделать так, что бы рюкзаки их вообще не трогали? ТО есть не замечали вообще.

Дурак знает как затеять драку, умный знает как победить в драке, мудрец знает как избежать драки.

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

Здравствуйте. Я тут попробовал вставить в свою сборку рюкзаки, и файл 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.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)
    --*******************************************
    --// дизаблим каллбек
    self.object:set_callback(callback.use_object, 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.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)
    --*******************************************
    --// добавим наконец ГГ каллбек на юзание
    self.object:set_callback(callback.use_object, self.use_callback, self)
    --*******************************************
end
--*******************************************
--// ну и метод канешно
function actor_binder:use_callback(obj, who)
bag.OnActorUse(obj)
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)
  --*******************************************
   bag.OnActorInfo(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)
--*******************************************
    bag.OnActorTake(obj)
    --*******************************************
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)

    -- Vergas ogg-player
    player_ogg.lose_item(obj)
     -- Vergas ogg-player

    level_tasks.proceed(self.object)
    --game_stats.update_drop_item (obj, self.object)
    --*******************************************
    bag.OnActorDrop(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        
    --*******************************************
    bag.OnActorUpdate()
    --*******************************************

    
    end
   if check_16 then check_16.main(delta) 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)

    --*******************************************
    bag.OnActorSave(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)
    
    --*******************************************
    bag.OnActorLoad(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")
/**/

 

 

Но инвентарь без рюкзака не блокируется, и при последующем закрытии происходит вылет

FATAL ERROR

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...mes\s.t.a.l.k.e.r. - mod\gamedata\scripts\bag.script:470: attempt to index field 'tBeltItemById' (a nil value)

 

 

Это одна беда, другая - если рюкзак сбросить и закрыть инвентарь, то потом он уже не открывается, даже если рюкзак поднять или купить новый.

Вобщем похоже перемудрил со скриптом, вот только что не знаю. Прошу помощи.

 

Почемуто кнопки нет редактировать прошлое сообщение. Вобщем по предыдущему вопросу уже сам всё решил. Но вот ещё один небольшой вопросик:

 

336495.jpg

 

Как перенести надпись, никак найти не могу.

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

Хотелось бы сделать такое замечание: помимо объема у любого предмета, есть такое понятие как его габариты. Скажем, лист фанеры может иметь одинаковый объем с футбольным мячом, но по габаритам его значительно превосходить. Отсюда - футбольный мяч мы легко поместим в рюкзак, а вот с листом фанеры такого номера не пройдет.=)

 

С ув.

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

Knight

Предложишь вариант \скрипт для выяснения подходит ли предмет рюкзаку по габаритам?

И еще: у меня там табличка объемов предметов имеется, которая настроена от балды. Каждый может ее подправить под себя ориентируясь на примерный объем предмета в жизни и его габариты.

...Игра, товарищи, требует условностей - не все можно сделать как в жизни.

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

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

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

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

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

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

Войти

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

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

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