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

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

1 час назад, Labadal сказал:

Как можно отследить выстрел из оружия?

1. Поставить движок OGSR.

2. Использовать в бинд_сталкере колбек on_actor_weapon_fire.

 

А скриптовый метод отлова выстрела делал много лет назад @*Shoker* (в сборочном цехе это его скрипт был) - только это по нынешним временам, люто древний костыль, который существенно грузит апдейт. Не рекомендую таким пользоваться. И полагаю, автор тоже давно не пользуется.

@aromatizer по теме есть что сказать? Или ты просто посты набиваешь.

  • Спасибо 1
  • Полезно 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

 

А можно ли "отследить" изменение переменной? 
Вот, к примеру, выполнить код, если переменная X уменьшилась, скажем, на 5. 

upd: 
Есть такой вот скрипт: 

Скрытый текст
local old_ai_id = 0
local check_ammo = false

function gun()
	local ai = db.actor:active_item()
	if ai then
		if ai:id()~=old_ai_id then
			old_ai_id = ai:id()
			if ai:section() == "оружие" then
				check_ammo = true
				on_change_wpn(ai)
			end
		end
	else
		if old_ai_id~=0 then old_ai_id=0 check_ammo=false end
	end
	if check_ammo then
		local curr_ammo = ai:get_ammo_in_magazine()
		if curr_ammo < ammo_old then
			ammo_old = curr_ammo
			if not level.main_input_receiver() then on_actor_shoot() end
		end
	end
end



function on_change_wpn( obj )
	ammo_old = obj:get_ammo_in_magazine()
end

function on_actor_shoot()
--тут что делать после выстрела
end

 

Он, в целом, работает - но проблема в том, что работает одноразово. Выстрелил  - сработало. Чтобы сработало ещё раз, нужно снять с себя оружие и повесить его обратно в слот. 

Намекните как править

God save Hatsune Miku!


Подарки

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

    upd: 

    работать перестает после перезарядки оружия
    Перезарядил, нужно вытащить из слота и поставить обратно.  печально. 

    upd: нет, дело не в перезарядке, "ломается", когда истратил все патроны, т.е. когда колво-патронов становится равно 0

    Или ,всё таки, в перезарядке

    upd: 

    разобрался

    Если вдруг кому-то понадобится в будущем данный костыль, вот: 
    *Отследить выстрел из оружия/отследить выстрел при стрельбе*

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

    1. Основная функция, вешаем на апдейт: 

    local check_ammo = false
    local old_ai_id = 0
    function gun()
    	local ai = db.actor:active_item()
    	if ai then
    		if ai:id()~=old_ai_id then
    			old_ai_id = ai:id()
    			if ai:section() == "имя секции оружия" then
    				check_ammo = true
    				ammo_old = ai:get_ammo_in_magazine()
    			end
    		end
    	else
    		if old_ai_id~=0 then old_ai_id=0 check_ammo=false end
    	end
    	if check_ammo then
    		local curr_ammo = ai:get_ammo_in_magazine()
    		if curr_ammo < ammo_old then
    			ammo_old = curr_ammo
    			if not level.main_input_receiver() then on_actor_pay() end
    		end
    	end
    end

    2. Функция on_actor_pay():

    function on_actor_pay()
    -- тут код того, что вы хотите сделать при выстреле
    this.start_timer() - запуск таймера
    end

    3. таймер: 

       function action_timer()
          old_ai_id = 0
       end
     
       function start_timer()
          local iTimer = time_global() + 1000
     
          local function check_timer()
             return time_global() > iTimer
          end
     
          level.add_call(check_timer, action_timer)
       end

    Таймер нужен, чтобы присвоить переменной old_ai_id значение 0 через секунду. (этого времени хватает для "перезарядки" оружия) если присвоить переменной old_ai_id значение 0 до того, как оружие перезарядится - функция on_actor_pay() будет срабатывать много раз, пока оружие не перезарядится. Находясь в апдейте - это действительно много раз. 

    4. функция preload(), тоже на апдейт:

    function preload()
    local ai = db.actor:active_item()
    	if ai and ai:section() == "имя секции оружия" then
    	local curr_ammo_preload = ai:get_ammo_in_magazine()
    		if curr_ammo_preload == 0 then
    		check_ammo = false
    		old_ai_id = 0
    		end
    	end
    end

    Нужна для решения бага, который возникал в случае самовольной разрядки оружия, после которого функция "gun" переставала работать. 

     

    upd: Да, костыль. Да, корявый. Да, нагружает апдейт.  Но это лучшее решение для тех, кто не хочет/не может качать, к примеру, ОГСР двиг, в котором, как сказал ранее товарищ @Zander_driver, есть для этого каллбек. 

    • Смешно 1

    God save Hatsune Miku!


    Подарки

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

    upd: 2. Функция on_actor_pay(). (та, что выше, рассчитана для оружия, в котором всего один патрон, эта - подойдет для любого) 

    function on_actor_pay()
    local curr_ammo_yes = db.actor:active_item():get_ammo_in_magazine()
    =============================================--свой код писать только ниже этой полоски
    -- тут код того, что вы хотите сделать при выстреле
    =============================================--свой код писать только выше этой полоски
    if curr_ammo_yes== 0 then
    start_timer()
    end
    end

     

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

    God save Hatsune Miku!


    Подарки

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

    Всем привет. Решил тут прикрутить-таки звуки приветствия и прощания Сахарову для ТЧ, на манер ЧН...

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

    --дописано

     yan_professor_hello                        = {min_snd = 1, max_snd = 1, rnd = 100, prior = 5, rnd_id = id(), into_id = id(), max_ids = {}},
     yan_professor_goodbye                          = {min_snd = 1, max_snd = 1, rnd = 100, prior = 5, rnd_id = id(), into_id = id(), max_ids = {}},

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

    --дописано

    [yan_professor_hello_rnd]
    yan_general_ecolog = 0,scenario\yantar\yan_sakharov_meet_

    [yan_professor_goodbye_rnd]
    yan_general_ecolog = 0,scenario\yantar\yan_sakharov_meet_bye_

    Соотв. звуки добавлены в нужную папку.

    А вот с файлом логики Сахарова у меня непонятки.

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

    [logic]
    active = walker@yan_start
    actor_dialogs = actor_dialogs
    combat_ignore = combat_ignore
    trade = misc\trade_ecolog.ltx
    inv_max_weight = 10000

    [walker@yan_start]
    path_walk = yan_ucheniy_walk_talk
    path_look = yan_ucheniy_look_talk
    combat_ignore_cond = always
    on_info = {-yantar_kruglov_phrase_2 +yantar_scientists_talk} remark@yan_professor_talk_1
    on_info2 = {+yantar_kruglov_phrase_2} walker@yan_1
    danger = danger_condition@yan_ecolog
    def_state_standing = yan_professor_wait
    def_state_moving1 = yan_professor_walk
    def_state_moving2 = yan_professor_walk
    def_state_moving3 = yan_professor_walk
    meet = no_meet

    [remark@yan_professor_talk_1]
    snd = yantar_professor_to_kruglov_1
    anim = yan_professor_wait
    target = logic@scientist_out_rest, yan_scientist
    on_timer = 5000 | %+yantar_kruglov_phrase_1%
    on_info = {+yantar_professor_phrase_2} remark@yan_professor_talk_2
    combat_ignore_cond = always
    danger = danger_condition@yan_ecolog
    meet = no_meet

    [remark@yan_professor_talk_2]
    snd = yantar_professor_to_kruglov_2
    anim = yan_professor_wait
    target = logic@scientist_out_rest, yan_scientist
    on_timer = 5000 | walker@yan_1 %+yantar_kruglov_phrase_2%
    combat_ignore_cond = always
    danger = danger_condition@yan_ecolog
    meet = no_meet

    [walker@yan_1]
    path_walk = yan_ucheniy_walk
    path_look = yan_ucheniy_look
    combat_ignore_cond = always
    on_info = {+yan_actor_talk_ucheniy} walker@yan_2
    on_info2 = {+yan_find_scientist_done} walker@scientist_quest_good    
    danger = danger_condition@yan_ecolog
    def_state_standing = yan_professor_wait
    def_state_moving1 = yan_professor_walk
    def_state_moving2 = yan_professor_walk
    def_state_moving3 = yan_professor_walk
    meet = meet@yan_general_scientist_1

    ;Дописано
    on_actor_dist_le = 2 | remark@yan_professor_hello
    on_actor_dist_ge = 4 | remark@yan_professor_goodbye

    [walker@scientist_quest_good]
    path_walk = yan_ucheniy_walk_talk
    path_look = yan_ucheniy_look_talk
    combat_ignore_cond = always
    on_info = {+yantar_scientist_talk_helmet} remark@talk_about_helmet
    danger = danger_condition@yan_ecolog
    def_state_standing = yan_professor_wait
    def_state_moving1 = yan_professor_walk
    def_state_moving2 = yan_professor_walk
    def_state_moving3 = yan_professor_walk
    meet = meet@yan_general_scientist_1

    ;Дописано
    on_actor_dist_le = 2 | remark3@yan_professor_hello
    on_actor_dist_ge = 4 | remark3@yan_professor_goodbye

    [remark@talk_about_helmet]
    snd = yantar_professor_radiation_quest_2
    anim = yan_professor_wait
    target = logic@scientist_out_rest, yan_scientist
    meet = no_meet
    combat_ignore_cond = always
    on_signal = sound_end | walker@go_to_room %-yantar_scientist_talk_helmet%
    danger = danger_condition@yan_ecolog

    [walker@go_to_room]
    path_walk = yan_general_scientist_room_walk
    path_look = yan_general_scientist_room_look
    on_signal = make_helmet | remark@make_helmet
    combat_ignore_cond = always
    danger = danger_condition@yan_ecolog
    meet = no_meet
    def_state_standing = yan_professor_wait
    def_state_moving1 = yan_professor_walk
    def_state_moving2 = yan_professor_walk
    def_state_moving3 = yan_professor_walk

    [remark@make_helmet]
    anim = mode_shlem
    target = 920
    combat_ignore_cond = always
    on_signal = action_end | walker@go_to_actor
    danger = danger_condition@yan_ecolog
    meet = no_meet

    [walker@go_to_actor]
    path_walk = yan_ucheniy_walk_talk
    path_look = yan_ucheniy_look_talk
    combat_ignore_cond = always
    on_info = {+yan_kill_brain_task_start} walker@yan_2
    danger = danger_condition@yan_ecolog
    def_state_standing = yan_professor_wait
    def_state_moving1 = yan_professor_walk
    def_state_moving2 = yan_professor_walk
    def_state_moving3 = yan_professor_walk
    meet = meet@yan_general_scientist_1

    ;Дописано
    on_actor_dist_le = 2 | remark3@yan_professor_hello
    on_actor_dist_ge = 4 | remark3@yan_professor_goodbye

    [walker@yan_2]
    path_walk = yan_ucheniy_walk_talk
    path_look = yan_ucheniy_look_talk
    combat_ignore_cond = always
    on_info = {-yan_actor_talk_ucheniy} walker@yan_1
    on_info2 = {+yantar_scientist_talk_helmet} remark@talk_about_helmet
    meet = meet@yan_general_scientist_1
    danger = danger_condition@yan_ecolog
    def_state_standing = yan_professor_wait
    def_state_moving1 = yan_professor_walk
    def_state_moving2 = yan_professor_walk
    def_state_moving3 = yan_professor_walk

    [meet@yan_general_scientist]
    meet_state     = 2 | yan_professor_wait@yantar_professor_talk_1
    meet_state_wpn     = 2 | yan_professor_wait@yantar_professor_talk_1
    victim         = 2 | actor
    victim_wpn     = nil
    use             = true
    use_wpn         = false

    [meet@yan_general_scientist_1]
    meet_state     = 1 | yan_professor_wait@yantar_professor_talk_1
    meet_state_wpn     = 1 | yan_professor_wait@yantar_professor_talk_1
    victim         = 1 | actor
    victim_wpn     = nil
    use             = true
    use_wpn         = false
    abuse = false
    precond = usability

    [meet@no_talk]
    meet_state     = 1 | yan_professor_wait@yantar_professor_talk_1
    meet_state_wpn     = 1 | yan_professor_wait@yantar_professor_talk_1
    victim         = 1 | actor
    victim_wpn     = nil
    use             = false
    use_wpn         = false
    abuse = false

    [danger_condition@yan_ecolog]
    ignore_distance = 0

    [actor_dialogs]
    id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end

    [combat_ignore]
    combat_ignore_cond = always

    ;Дописано

    [remark@yan_professor_hello]
    anim = yan_professor_wait
    snd = yan_professor_hello
    on_signal = sound_end | walker@yan_1

    [remark@yan_professor_goodbye]
    anim = yan_professor_wait
    snd = yan_professor_goodbye
    on_signal = sound_end | walker@yan_1

    [remark2@yan_professor_hello]
    anim = yan_professor_wait
    snd = yan_professor_hello
    on_signal = sound_end | walker@yan_2

    [remark2@yan_professor_goodbye]
    anim = yan_professor_wait
    snd = yan_professor_goodbye
    on_signal = sound_end | walker@yan_2

    [remark3@yan_professor_hello]
    anim = yan_professor_wait
    snd = yan_professor_hello
    on_signal = sound_end | walker@scientist_quest_good

    [remark3@yan_professor_goodbye]
    anim = yan_professor_wait
    snd = yan_professor_goodbye
    on_signal = sound_end | walker@scientist_quest_good

    В общем, при приближении ближе 2 метров по идее должен здороваться, при удалении более чем на 4 метра прощаться. Но работает только прощание изредка и то при этом, Сахарова можно поймать при подходе к столу так, что будет звучать только рандомное прощание. Где я с логикой накосячил?

    • Полезно 1

    Подарки

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

    @Colder , что-то вроде такого (если вызывать из логики)

    function some_monster_inside(actor, rest)
      local obj 
      for k,v in pairs(db.storage) do
        obj = level.object_by_id(k)
        if obj and alife():object(k) and IsMonster(obj) then
          if rest:inside(obj:position()) then
            return true
          end
        end
      end
      return false
    end
    Изменено пользователем naxac
    • Спасибо 1

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

    naxac.gif


    Подарки

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

    Подскажите, пожалуйста, есть ли способ вывести систему репутации на худ и представить её в виде шкалы, где плохая репутация окрашивается в красный, хорошая в зеленый соответственно? Возможно что-то подобное уже было реализовано, если да, то прошу оповестить.

     

    Платформа ТЧ.

     

    https://infamous.fandom.com/wiki/Karma?file=Meter.jpg

     

    540?cb=20110510160814

     

    P.S. В скриншотах показываю как в идеале должно это выглядить. Игра на скрине, если что, игра Infamous.

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

    Создал фриплейный старт игры https://yadi.sk/i/ya2rFPr8BFbS-A

     

    Пытаюсь заспавнить предметы в инвентарь так:

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

    Сама кнопка

     

    function ui_main_menu_new:novice_on_start()
        local console = get_console()
        console:execute("g_game_difficulty gd_novice")
        self:StartGame()
        start_game_novice()
    end

     

    Функция

     

    function start_game_novice()

    local spawn_items = {

        "wpn_pm",
        "medkit",
        "conserva",
        "zvezda_2",
        "bandage"

    }

        for i = 1,2 do
        table.insert(spawn_items, "ammo_9x18_fmj")
    end
        local k,v = 0,0
        for k,v in pairs(spawn_items) do
        alife():create(v,
        db.actor:position(),
        db.actor:level_vertex_id(),
        db.actor:game_vertex_id(),
        db.actor:id())
    end
    end

    Может кто подсказать как все таки заспавнить предметы.

     

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

    function start_game_novice()
        local ini = ini_file("misc\\items_link.ltx")
        if not ini then ini=system_ini() end
        if ini:section_exist("generic_list") then
        local n = ini:line_count("generic_list")
        local key = math.random(0,n-1)
        local result, item, num = ini:r_line("generic_list",key,"","")
        return item, num
    end
    end

     

    в ltx

    [generic_list]
    wpn_pm = 0.7

    Тоже не выходит


    Подарки

  • Ссылка на комментарий
    7 часов назад, Colder сказал:

    скрипт отлова мини-карты?

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

    function init_minimap()
      local wnd = get_main_window()
      minimap_static = wnd:GetStatic( "minimap" )
      back_static    = wnd:GetStatic( "minimap:background" )
      frame_static   = wnd:GetStatic( "minimap:level_frame" )
      compass_static = wnd:GetStatic( "minimap:compass" )
    end

     

    P.S Можешь посмотреть тут еще https://github.com/dsh2dsh/op2ogse/blob/master/gamedata/scripts/dsh/dsh_ui_minimap.script#L94

    Изменено пользователем I am Dead
    • Спасибо 1
    • Полезно 1

    Подарки

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

    Здравствуйте, не могу разобраться как работает модуль m_netpk от Artos'a, хочу попробовать как в примере переместить вентилятор из бункера на тумбочку в лагере новичков, но не чего не происходит.

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

    И всё-таки что за ерунда с вылетом вида:

    stack trace:

    0023:05175AF0 xrGame.dll
    [error][      87]    : Параметр задан неверно.

    Делаем квиксейв клавишей F6, при попытке загрузиться с него клавишей F7 (или другой назначенной) - вылет выше, при попытке загрузиться с него из меню - всё грузится нормально...

     


    Подарки

  • Ссылка на комментарий
    1 час назад, Капрал Хикс сказал:

    Параметр задан неверно

    Ну вот очень знакомые слова. Значит где-то встречал. Здесь видел или себя, но у себя я всегда назначаю клавиши F5/F8. Если такой вылет и был у меня, то либо вначале игры на базовых настойках, либо он возможен на моих тоже...

    Здесь могла быть ваша реклама.


    Подарки

  • 2
  • 4
  • 3
  • 2
  • Ссылка на комментарий
    7 часов назад, mole venomous сказал:

    Ну вот очень знакомые слова.

    Страница 556 этой темы, я уже сталкивался с подобным и мне помогли, а тут опять эта ерунда вылезла.

    Клавиша быстрой загрузки роли не играет, пробовал назначить F9 - та же петрушка с вылетом. Из меню грузится нормально. Ерунда какая-то...


    Подарки

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

    Может такое быть, что вылет вида: 

    stack trace:

    0023:05175AF0 xrGame.dll
    [error][      87]    : Параметр задан неверно.

    вызван тем, что какой-то из скриптов сохранён в формате UTF-8, а не ANSI? Я просто не знаю, на что подумать ещё.


    Подарки

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

    Приветствую всех! Созрело несколько вопросов, на которые (хотя бы на некоторые) хотелось бы получить ответ, либо же дельный совет.

     

    1. Подскажите как в главном меню можно изменить разрешение видео с 1024х768 на 1920х1080 без правок двига?

    2. Как можно сменить имя и иконку гг по ходу игры?

    3. Есть ли способ вывести на худ переработанную карму (репутацию) гг и представить ее в числовом виде (то есть, допустим, при обыске персонажа карма уменьшается, на худ приходит уведомление + число на худе уменьшается на 5 показателей)?

    4. Как можно вывести иконку гг на худ и сделать ее динамической (то есть настроить сменяемость картинок таким образом, чтобы получилась анимация (примерно как в 1 думе)).

    5. Есть ли способ вывода любого изображения на сам худ инвентаря? (Допустим, на место где указано имя и иконка гг)

    6. Также интересует момент с выводом абсолютно рандомной динамической картинки на карту пда, чтобы, допустим, закрасить недоступные локации, а потом эти картинки убрать.

    7. Существует ли на чистом тч нормальный пак с анимациями применения предметов из инвентаря. Интересует именно в высоком разрешении анимации, допустим, как от LADS, но на чистой ТЧ.

    8. Прошу скинуть скрипты на тч, которые не дают игроку открыть пда, инвентарь и диалоговое окно.

     

    Платформа разработки, соответственно, ТЧ.

     

    Заранее спасибо!

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

    Новые окна в интерфейсе:

    1. Позади существующих окон или в свободной области, авто-скрытие вместе с HUD: get_hud():Add/RemoveCustomStatic(имя), где имя – ссылка на XML-описание окна или хотя бы пустышки в [config\ui\ui_custom_msgs.xml].

    2. Поверх существующих окон, скрывать вручную (в катсценах по инфо-поршням или привязкой к [scripts\xr_effects.script] disable_ui, при использовании оптики через апдейт и т. д.): get_hud():Add/RemoveDialogToRender(cuiw), где cuiw – окно класса CUIWindow или любого из дочерних классов со скриптовым описанием. Вариант: level.add/remove_dialog_to_render(cuiw). Обязательно сохранять такие окна в переменные и чистить их в actor_binder:net_destroy(), если окна могут быть открытыми при перезагрузке (включая смерть при открытом инвентаре).

    3. Привязкой к движковым окнам – например, к инвентарю: инфо-поршень ui_inventory + inv = level.main_input_receiver(), затем inv:AttachChild(cuiw). При перезагрузке хотя бы закрывать дочерние окна, а лучше удалять при каждом выходе из инвентаря.

     

    Варианты анимации текстур:

    1. Цикл с запуском от случайного кадра: текстовый файл с именем текстуры, расширением SEQ и описанием "кадров/с имя имя …" Образец – анимированный указатель мыши. Можно ставить несколько одинаковых кадров для вывода дольше секунды или с долями, вроде "2 кадра в секунду + 3 копии = 1,5 секунды на кадр".

    2. Анимация с набором кадров в общей текстуре: XML-описание под заголовком <a_static> (не везде работает) или скриптовый вызов InitAnimStatic(окно, родитель). Образец – анимированные кольца и кубики в заголовках "Энциклопедии".

    3. Теги анимации light_anim и xform_anim в XML-описании – мигание с циклом 1 или 2 секунды, поворот на месте, масштаб ±. Список доступных вариантов – [gamedata\lanims.xr].

    4. Скриптовая замена текстуры окна по таймеру с привязкой к time_global() через апдейт.

     

    Способ запретить диалог или инвентарь, ЕМНИП, в чистом ТЧ только один: отследить любое окно через апдейт level.main_input_receiver() ~= nil или отдельно по инфо-поршням ui_trade / ui_inventory / ui_talk / ui_pda, после чего закрыть окно wnd = level.main_input_receiver() через level.start_stop_menu(wnd) или wnd:GetHolder():start_stop_menu(wnd). Скрипт реагирует на событие вывода окна, так что долю секунды будет и само окно, и взаимодействие с ним.

     

    Для закрашивания области карты с учетом перемещения можно, разве что, создать метку level.map_add_object_spot(id, имя, "") с непрозрачной текстурой, но это еще надо сослаться на id какого-то объекта – можно на id рестриктора, если область с логикой, вроде аномалии, тайника или зоны "убрать оружие".

    • Полезно 2
    • Сомнительно 1

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

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

    @Rod_K 

    Практически все ваши хотелки - только под правку движка, некоторые частично можно реализовать скриптовыми кривыми костылями(уже примерно написал NE). Если вы надеетесь на чудо, что кто-то вам щас вынет зайчика из шляпы - забудьте.

    • Не нравится 1
    • Согласен 4
    Ссылка на комментарий

    @Rod_K Половину списка можно сделать и без правок движка( мб и больше ),ноо,в исходя из данных вопросов,  ПОКА ЧТО не в твоём случае

    • Согласен 1

    Подарки

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

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

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

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

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

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

    Войти

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

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

    AMK-Team.ru

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