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

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


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

 

 

похоже что для тега active такой способ не поддерживается

Действительно, такой способ для гулагов не поддерживается ни на каком патче.

Тогда есть три варианта решения этой проблемы.

1. Менять состояние гулага по этим инфопоршням, не забывая расписывать логику всему гулагу для новых состояний.

2. Не меняя состояние гулага, выдавать логику заданному нпс в соответствии с инфопоршнями. Приблизительно вот так.
   if type == "esc_blokpost" then
        if has_alife_info("info1") then
                t = { section = "logic@esc_blockpost_patrol1",....}
        else
                t = { section = "logic@esc_blockpost_patrol2",....}

При этом надо будет добавить новые секции логики в .ltx гулага.

3. Открываем xr_gulag.script и добавляем поддержку конд листа.

В function gulag:get_job_path_name( job ), вместо строки local active_section = self.ltx:r_string( section, "active" ) пишем вот так:

    local active_section_cond = xr_logic.cfg_get_condlist(self.ltx, section, "active", self)
    local active_section = xr_logic.pick_section_from_condlist(db.actor, self, active_section_cond.condlist)

  • Спасибо 1

Вообще-то я белая и пушистая...

 

А я один раз, пока не изменил стиль и шрифт Нотепада++ не мог избавится от вылета из-за того, что было написано не look, а 1ook)))

У меня был случай, вылетало из-за того что было написано не cristall_flower, а cristаll_flower. В чем разница? во втором буква а на кириллице...
История отлова этого вылета была долгой.

  • Нравится 1

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

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Ребят, есть вопрос по поводу логики...

[logic]


active = walker@at_hule
combat_ignore = combat_ignore
inv_max_weight = 10000
danger = danger_condition@vitek_voron

[walker@at_hule]
path_walk = bill_1_walk
path_look = bill_1_look
meet = meet@at_hule

[meet@at_hule]
meet_state = 4|vitek_voron_talk_free@vitek_voron_hello
meet_state_wpn = 4|vitek_voron_talk_free@vitek_voron_hello
victim = 10|actor
victim_wpn = 10|actor
use = true
use_wpn = true

[danger_condition@vitek_voron]
ignore_distance = 0

[combat_ignore]
combat_ignore_cond = always

 

 

По этой логики он работает прекрасно, когда подходишь, приветствует фразами vitek_voron_hello_1 и vitek_voron_hello_2, рандомно...К этому вопросов нет.

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

Для примера сидорович, когда к нему подходишь он говорит фразу приветсвия, и когда отходишь он говорит тип проветришься заходи...Как через мою логику прописать чтобы к примеру если отходишь метров на 10 то он бы тоже говорил фразу?

@Wolkodav, можно попробовать так:

 

[walker@at_hule]
path_walk = bill_1_walk
path_look = bill_1_look
meet = meet@at_hule
on_actor_dist_le = 3|%+say_hello%
on_actor_dist_ge = 7|%-say_hello%
 
[meet@at_hule]
meet_state = 4|{-say_hello}vitek_voron_talk_free@vitek_voron_hello|6|{+say_hello}vitek_voron_talk_free@vitek_voron_bay
meet_state_wpn = 4|{-say_hello}vitek_voron_talk_free@vitek_voron_hello|6|{+say_hello}vitek_voron_talk_free@vitek_voron_bay
victim = 10|actor
victim_wpn = 10|actor
use = true
use_wpn = true

Но нужно тестировать.

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

@Wolkodav, если есть рандомные фразы, пиши звуковую схему (удобнее в дальнейшем юзать), если одна фраза, то можно и функцию написать, а по поводу воспроизведения вот у себя взял:

on_actor_dist_le = 10 | walker 
; когда игрок подойдет ближе 10 м.
on_actor_dist_le_nvis = 10 | walker 
; то же самое, но без проверки на видимость
on_actor_dist_ge = 10 | walker 
; когда игрок будет на расстоянии больше 10 м.
on_actor_dist_ge_nvis = 10 | walker 
; то же самое, но без проверки на видимость

Wolkodav Я бы попробовал вот так, на тест:

[walker@at_hule]
path_walk = bill_1_walk
path_look = bill_1_look
on_actor_dist_le_nvis = 9 | remark@new_wait

[remark@new_hello]
target = actor
snd_anim_synс = true
anim = hello
snd = trader_hello_what_have_you_got
on_signal = action_end | remark@new_wait

[remark@new_bye]
on_actor_dist_ge_nvis = 12 |remark@new_wait
snd_anim_synс = true
anim = hello
snd = trader_bye
on_signal = action_end | remark@new_wait

[remark@new_wait]
target = actor
anim = guard
on_actor_dist_le_nvis = 3 | {-voron_hello_played} remark@new_hello %+voron_hello_played%
on_actor_dist_ge_nvis = 5 | {-voron_bye_played +voron_hello_played} remark@new_bye %+voron_bye_played%
on_actor_dist_ge_nvis = 12 | walker@at_hule %-voron_hello_played -voron_bye_played%

 

 

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

Мой архив

Сталкером не занимаюсь.

[smart_terrain]

type = gar_ost

capacity = 1

cond = {+freeplay}

 

Ну и где этот самый freeplay выдается ?

Этот самый freeplay выдается вручную, для проверки.

 

 

путь напиши, и проверь существующие.

Написать - в каком смысле? А существующие пути вроде правильны. Или их надо в way_l03_agroprom.ltx прописывать?

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

Сталкер - наше всё!

Зачем оно вообще в смарте ?

 

А вообще, слона обычно едят по частям.

Если убрать все переключения отовсюду, крота сразу прописать эксклюзивом в смарт, он с начала игры в него пойдет ?

 

 

Зачем оно вообще в смарте ?

Крот должен пойти под этот смарт после выдачи поршня. До его выдачи он должен быть под своей сюжетной логикой.

 

 

 

Если убрать все переключения отовсюду, крота сразу прописать эксклюзивом в смарт, он с начала игры в него пойдет ?

Не проверял, поэтому не знаю.

Сталкер - наше всё!

"Крот должен пойти под этот смарт после выдачи поршня."

 

Ну так условие тогда прописывается Кроту, а не смарту.

[smart_terrains]

none = {-freeplay}

gar_ost = {+freeplay}

- вполне достаточно.

 

А для поверки вообще оставить gar_ost = true

 

Угум, сначала делаем все сразу , а потом начинаем гадать, что не работает.

 

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

  • Полезно 1
И, да, предикаты в работах прописываются тогда, когда их много, и сталкеров много. Чтобы ни кто чужую работу не занял.

А такой вот вопрос: к примеру имеем три работы с одинаковым предикатом, допустим по секции спавна. Приоритеты будут работать для этих предикатных работ ? И что главнее: предикат или приоритет ?

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

Если предикат не проходит - отлуп: пусть занимает какую-нибудь другую. Далее - по приоритету. Если приоритеты одинаковые... Теоретически - первая в таблице, на практике - там довольно странный и загадочный код переназначения.

 

Гм... Еще раз перечитал, и сам ничего не понял.

 

Если по другому сформулировать, то любой непись стремится занять свободную работу с наибольшим приоритетом. Но, если там есть предикат, и непись не прошел по условию, на эту работу его не пустят.

Пример с Кордоном: работа для Волка имеет наивысший приоритет. Поэтому, пока она свободна, на нее пытаются назначить всех подряд. Но подходит только Волк, так что он на ней в итоге и оказывается.

Если таких работ будет 3 - Волк займет одну, с максимальным приоритетом, остальные 2 останутся свободными.

 

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

 

Просто у работ с предикатами приоритеты должны быть максимальны.

И, да, я гулаговый скрипт переписал: там если есть предикат - приоритет автоматически поднимается, + альтернативный формат описания работ.

 

типа вот так:

["esc_lager"] = {    -- Лагерь новичков на Кордоне-- "logic@esc_lager_sleeper1"    -- бункер доктора-- "logic@esc_lager_sleeper2"    -- ближний бункер к Волку-- "logic@esc_lager_sleeper3"    -- ближний бункер к Волку-- "logic@esc_lager_sleeper5"    -- в развалинах-- "logic@esc_lager_sleeper6"    -- бункер доктора-- "logic@esc_lager_sleeper7"    -- дом на входе-- "logic@esc_lager_defend1"    -- напротив костра    -- занято под Фаната-- "logic@esc_lager_defend2"    -- за кустом у развалюхи-- "logic@esc_lager_defend3"    -- ХРЕНОВЫЙ. чуть дальше и правее 2. Наемники видят !-- "logic@esc_lager_defend4"    -- типа за бункером, между ним и кустом. todo: в олспавне сдвинуть чуть дальше.-- "logic@esc_lager_defend5"    -- ХРЕНОВЫЙ. Типа за бочкой.-- "logic@esc_lager_defend6"    -- ближний бункер к Волку-- "logic@esc_lager_defend7"    -- ближний бункер к Волку-- "logic@esc_lager_defend8"    -- дальний-- "logic@esc_lager_defend9"    -- дальний (Когда-то был Петруха)-- "logic@esc_lager_defend10"    -- дальний (Толик. Был.)-- "logic@esc_lager_defend11"    -- дальний-- "logic@esc_lager_defend12"    -- Фанат. И ему здесь смерть, по тому что он первый, кого видят наймы еще от дороги.-- "logic@esc_lager_defend13"    -- дальний, и таки Волк.    -- охранники    { section = "logic@esc_lager_zoneguard1", -- "logic@esc_lager_zoneguard1",    idle = 0, prior = 9, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_zoneguard2", -- "logic@esc_lager_zoneguard2",    idle = 0, prior = 9, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_walker3",    idle = 0, prior = 8, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_walker4",    idle = 0, prior = 8, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend2",    idle = 0, prior = 14, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend4",    idle = 0, prior = 12, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend6",    idle = 0, prior = 10, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend7",    idle = 0, prior = 9, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- у костра днём    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 6, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 6, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 6, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- спящие ночью    { section = "logic@esc_lager_sleeper1",    idle = 0, prior = 5, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper2",    idle = 0, prior = 5, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper3",    idle = 0, prior = 5, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend8",    idle = 0, prior = 8, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend9",    idle = 0, prior = 7, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend10",    idle = 0, prior = 7, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- спящие ночью и днём    { section = "logic@esc_lager_sleeper5",    idle = 0, prior = 4, state = {0,1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper6",    idle = 0, prior = 3, state = {0,1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper7",    idle = 0, prior = 3, state = {0,1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend11",    idle = 0, prior = 6, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },                        -- где-то тут был Толик    { section = "logic@esc_lager_defend14",    -- Волка скорее всего нет    idle = 0, prior = 5, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend15",    -- если Толик помер.    idle = 0, prior = 4, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper5",    -- если все еще не лезет.    idle = 0, prior = 3, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- Волк, собственной персоной.    { section = "logic@esc_lager_volk",    idle = 0, prior = 19, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["profile_name"] == "esc_wolf" end },    { section = "logic@esc_lager_defend13",    idle = 0, prior = 20, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["profile_name"] == "esc_wolf" end },    -- and not (has_alife_info("agroprom_military_case_have") and has_alife_info("esc_fanat_spawn") ) end },    -- Фанат    { section = "logic@esc_lager_fanat",    idle = 0, prior = 19, state = {0, 1},    in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["profile_name"] == "esc_fanat" end },    { section = "logic@esc_lager_defend12",    idle = 0, prior = 20, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["profile_name"] == "esc_fanat" end },    -- резерв на случай смерти Волкофаната.    { section = "logic@esc_lager_sleeper1",    idle = 0, prior = 2, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 2, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend5", -- ХРЕНОВЫЙ. Но резерв.    idle = 0, prior = 2, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- Шустрый    { section = "logic@esc_lager_shustryi_sleep",    idle = 0, prior = 18, state = {0, 2}, in_rest = "", out_rest = "",    predicate = function(obj_info) return ( obj_info["profile_name"] == "esc_shustryi" )        and has_alife_info( "tutorial_wounded_give_info" ) end },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 18, state = {1}, in_rest = "", out_rest = "",    predicate = function(obj_info) return ( obj_info["profile_name"] == "esc_shustryi" )        and has_alife_info( "tutorial_wounded_give_info" ) end },    { section = "logic@esc_lager_shustryi",    idle = 0, prior = 17, state = {0, 1, 2}, in_rest = "", out_rest = "",    predicate = function(obj_info) return ( obj_info["profile_name"] == "esc_shustryi" )        and has_alife_info( "tutorial_wounded_start" ) end },    { section = "logic@esc_lager_shustryi",    idle = 0, prior = 16, state = {0, 1, 2}, in_rest = "", out_rest = "", online = false,    predicate = function(obj_info) return obj_info["profile_name"] == "esc_shustryi" end },    -- резерв на случай смерти Шустрого    { section = "logic@esc_lager_sleeper2",    idle = 0, prior = 2, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 2, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend3", -- ХРЕНОВЫЙ. Но резерв.    idle = 0, prior = 2, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1", -- ну наплодили... больше некуда, кроме как к костру    idle = 0, prior = 1, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend1", -- Занято под Фаната    idle = 0, prior = 1, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend16", -- Толик. Пусть дальше спит.    idle = 0, prior = 16, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["name"] == "esc_vagon_wounded" end }},

 

- это уже со всеми фиксами типа бегающего Шустрого, вылета по нехватке работ, переключениях при дохлых неписях и т.д. - и все равно гораздо нагляднее.

Изменено пользователем Dennis_Chikin
  • Спасибо 1
как можно внимательнее выставлять предикаты и приоритеты

И это далеко не всегда помогает, вроде смотришь - все логично и хорошо, а на деле нифига не работает. По уму нужно переписывать и xr_gulag и gulag_general и вообще все, так как кривоту работы этого всего барахла не описать. А когда подходишь к финальной стадии правки этой системы перед тобой открывается нечто... Система начинает работать как задумывалось, но не как на деле, и да, при желании можно написать систему жизни как в ЗП (и даже лучше), причем без лишней муки создания кучи гулагов и кучи работ.

 

Ну, да - переписывать нафиг. Но в принципе - работает, кроме странного переназначения, в котором разрыв в приоритетах останавливает цикл. И, да, на самом деле оно не нужно. dc

 

Подскажите, как правильно передать аргументы?

Мсье знает толк...

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

На кордоне на блок посту военных спавн бочек происходит постоянно, стоит их взорвать и отойти недалеко, и они опять будут стоять, и так постоянно. И это без всякой перезагрузки, отойти до деревни новичков допустим, и обратно прийти.

Как убрать это недоразумение(читерство, а то горючка на халяву), не подскажете? 

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

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

Менял только в Bind_stalker.script

и добавил строчки

--Evil Zоne


xr_conserva.Timer_zrems_4()
xr_conserva.item_zrachka3()
xr_vodka.Timer_zrems_3()
xr_vodka. item_zrachka2()
xr_baton.Timer_zrems_2()
xr_baton.item_zrachka()
xr_giditara.item_update()
xr_garmon.item_update()
xr_smoking.item_update()
xr_smoking.Timer_s_2()
xr_smoking.sigaret_smoke()
xr_racya.item_update()
-- Новые :)
xr_kolbasa.Timer_zrems_2()
xr_kolbasa.item_zrachka()
xr_protivogaz.Timer_zrems_2()
xr_protivogaz.item_zrachka()
xr_protivogaz.hud_protivogaz()
xr_antirad.Timer_zrems_2()
xr_antirad.item_zrachka()
--Evil Zоne
end

 

(P.S - Добавлял из мода "huds update" - худы вещей,_мини-мод на анимацию еды,_в остальном все работало в норме еда работала нормально и анимация тоже.)

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

[Eger.Overkill] // Ⓐ // Eкьюалити / Uнити // ☮

 "Burn the rich // eat the rich"

О себе : Какой-то Ноунэйм с олд форума , заядлый нарушитель общественного порядка и правил , рецидивист.

Egor4ikModMaker.gif

Тот, кто сказал, что так можно делать - он Вас обманул, зачем-то.

Если не знаете, что и зачем делает какая-либо строчка - не надо ее ни куда добавлять.

 

 

--- Блин, достало уже автообъединение постов ! Хоть клона заводи...---

Сейчас будет по другому вопросу.

 

Чистил сейчас "разработку НС", и наткнулся на свой древний пост:

 

"Так, скажите кто-нибудь: эта конструкция -

on_timer = 120000 | mob_home1

on_signal = sig_attacked | mob_combat

- вообще в принципе работает ? Я вижу, что срабатывает всегда только переключение по первому условию. Вряд-ли это имеет отношение к вылету, но тем не менее."

 

Потом вспомнил, как уже позже разбирал xr_logic, и нашел там целых две засады. А потом вспомнилось еще и несколько дискуссий здесь "почему у меня не работает"...

 

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

 

Засада первая: при разборе логики в таблицы, у вас может случится так, что окажутся 2 одинаковых ключа.

Скажем, true. Или false. ;) Да, такое бывает в оригинальном скрипте.

Соответственно, в таблице окажется только одно условие.

 

Засада вторая: при проверке условий может проверяться, что они ВСЕ true или ВСЕ false.

 

Руки дойдут - может, вытащу эти куски из оригинала с подробным разбором. Не дойдут - не вытащу.

Что делать ? Оставьте в вашей логике только одно условие. И проверьте, работает ли. Потом - другое, но опять же, одно.

Если по отдельности все работает так, как надо, а вместе - неправильно - см. выше причины, и попытайтесь переписать как-то иначе.

Изменено пользователем Dennis_Chikin
on_signal = sig_attacked | mob_combat

 

Вот это дело из логики мьютов вообще лучше исключить, чтобы не заморачиваться. По идее - если мутант находится в моб_хоум, то он сам переключается на защиту и нападение при соблюдении неких условий. К чему его еще и в комбат переводить?

   УРАГАН.png

                 Краткий гид по моду Тайные Тропы 2

                                      ПАРТИКЛЫ TERRA

 

 

 

Не знал, куда написать, да и возможно, был такой вопрос (интересный ведь):

Вот слили исходники нам, так? Так. Что с ними можно/нужно сделать? Правильно, ковырять нужно.

А теперь вопрос: на движке сталкера (хоть 1.000х, хоть 1.х.хх) можно реализовать ОБЬЁМНУЮ (3D) воду? Как это сделано, например, в сруангине? Там, конечно, воде не совсем 3Д, но все-таки... Так  можно или нет?

Кгм, и вопрос: никто не пытался нормально ДХ10/11 прикрутить? Вроде как в 1.6.хх поправили 10 рендер, но вот ДХ11 в сталкере - это нечто 8(

Как зафиксировать объект рядом с моделью актора?

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

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

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

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

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

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

Войти

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

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

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