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

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

@Egor4ikModMaker,  забитый диск, это еще не повод для таких действий.

Тем более что ты собираешься подменять скриптовым спавном олл_спавн без очистки последнего...

По сабжу.

zip.add_npc("uchen_10", 26.068271636963,-11.718555450439,-272.28005981445,51614,1480, "[logic]\ncfg = scripts\\terra_npc\\yantar\\yan_uchen_1.ltx", 12505

Пример спавна при помощи нет_пакетов с указанием логики и сида объекта...

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

Сид можно присвоить скриптово, но для этого нужны некоторые файлы АМК, хотя по опыту скажу, лучше его все же через all.spawn присваивать.

  • Сомнительно 1

Жизнь следует измерять поступками, а не временем...

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

 


zip.add_npc("uchen_10", 26.068271636963,-11.718555450439,-272.28005981445,51614,1480, "[logic]\ncfg = scripts\\terra_npc\\yantar\\yan_uchen_1.ltx", 12505

Интересует следущее, это скриптовая ф-ция? Подскажите Чайнику, что с этим делать? ( ну координаты свои поставлю, путь к логике тоже свой, а дальше? )

 

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

 "Burn the rich // eat the rich"

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

Egor4ikModMaker.gif

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

Не дальше, а сначала...

Поставить и подключить модули нет_пакетов.

Сделать свой скрипт(у нас это zip).

Прописать там собственно саму функцию спавна.

-- спавн НПС, возвращает серверный объект 
-- custom и sid - опциональные параметры.
-- пример вызова zip.add_npc("bar_leha", x, y, z, lv, gv, "[logic]\ncfg = scripts\\foto\\bar\\leha.ltx", 30334)
function add_npc(section, pos_x, pos_y, pos_z, lvid, gvid, custom, sid)
    local sim = alife()
    local sobj = sim:create(section, vector():set(pos_x,pos_y,pos_z), lvid, gvid)
    if sobj and (custom or sid) then
        local pk = get_netpk(sobj,1) 
        if pk:isOk() then
            local data = pk:get()
            if custom then data.custom_data:setString(custom) end
            if sid then 
                dct.store_sid(sid,sobj.id)    -- сохраним сид
            end
            pk:set(data)
        end
    end
    --printd("create %s ID = %d",section,sobj.id)
    return sobj
end

 

Ссылка на комментарий
4 часа назад, _Val_ сказал:

            if sid then

                  dct.store_sid(sid,sobj.id)    -- сохраним сид

            end

Ну тогда уж и store_sid из dct выкладывай, все равно спросят...

Да и про модули нет-пакетов стоит сразу указать что за авторством Artos'а должны быть, судя по синтаксису методов...

Изменено пользователем AndreySol
Ссылка на комментарий
1 час назад, AndreySol сказал:

тогда уж и store_sid из dct выкладывай

Думаю, это относится к -

6 часов назад, _Val_ сказал:

Поставить и подключить модули нет_пакетов

 

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

    local obj, t, cd
    for i, v in ipairs( {    -- НЕ "ОПТИМИЗИРОВАТЬ" ! Конфиги жрут, и читаются медленнее !
        { "respawn_atp_disk_bandit2", 834395, 2851,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk11\npath_look=atp_disk_bandit_look11" },
        { "respawn_atp_disk_bandit1", 838425, 2851,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk12\npath_look=atp_disk_bandit_look12" },
        { "respawn_atp_disk_bandit2", 895677, 2851,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk13\npath_look=atp_disk_bandit_look13" },
        { "respawn_atp_disk_bandit1", 897708, 2851,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk14\npath_look=atp_disk_bandit_look14" },
        { "respawn_atp_disk_bandit2", 785290, 2846,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk15\npath_look=atp_disk_bandit_look15" },
        { "respawn_atp_disk_bandit1", 782279, 2846,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk16\npath_look=atp_disk_bandit_look16" },
        { "respawn_atp_disk_bandit2", 709736, 2841,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk17\npath_look=atp_disk_bandit_look17" },
        { "respawn_atp_disk_bandit1", 936206, 2855,
            "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk18\npath_look=atp_disk_bandit_look18" },
      } ) do
        obj = sim:create( v[1], level.vertex_position( v[2] ), v[2], v[3] )
        if obj then
            obj = sim:object( obj.id )
            if obj then
                t = get_npc_data( obj )
                t.custom = t.custom .. v[4]
                set_npc_data( t, obj )
                obj.smart_none = true
        end    end
    end

ЧДЯНТ ? (С)

 

И, кстати, какая все-таки функция ставит метку по sid ?

 

upd: А вот, кстати, с использованием олспавна:

function check_spawn3()
    if actor:dont_has_info( "spawn_hospit_live" ) then
        local obj = sim:object( "hospital_muha_trup" )
        if obj then sim:release( obj, true ) end
        obj = sim:create( 10008 )
        if obj then
            local t = get_npc_data( obj )
            t.custom = "[dont_spawn_loot]\n"
            set_npc_data( t, obj )
            local p = obj.position
            p.x, p.y, p.z = -95.5, 29, 566.9
            obj.position = p
            obj.death_call = muha_up
            -- obj.death_droped = true
        end
        -- level.add_call( muha_up, dummy )

        muha_pp = particles_object( "static\\zharka_buble_idle" )
        if muha_pp then muha_pp:play_at_pos( vector():set( -95.6, 28.3, 566.6 ) ) end

        local p
        for i, v in ipairs( {
            { "anomaly2\\studen_idle_bottom000", vector():set( -94.7, 28.2, 565.5 ) },
            { "anomaly2\\studen_idle_bottom000", vector():set( -94.7, 28.3, 566.4 ) },
            { "anomaly2\\studen_idle_bottom000", vector():set( -95.1, 28.4, 566.6 ) },
            { "anomaly2\\studen_idle_bottom000", vector():set( -95.0, 28.4, 567.4 ) }
        } ) do
            p = particles_object( v[1] )
            if p then
                p:play_at_pos( v[2] )
                table_insert( t_muha_pp, p )
            end
        end

        if actor:dont_has_info( "spawn_kamen_udachy" ) then
            for i, v in ipairs( {
                { "anomaly2\\studen_idle_bottom000", vector():set( -95.5, 32.5, 613.7 ) },
                { "anomaly2\\studen_idle_bottom000", vector():set( -96.0, 32.6, 614.6 ) },
                { "anomaly2\\studen_idle_bottom000", vector():set( -95.5, 32.6, 615.5 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -94.1, 32.5, 615.6 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -93.6, 32.4, 614.9 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -92.8, 32.3, 614.2 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -92.3, 32.3, 614.8 ) },
                -- { "anomaly2\\studen_idle_bottom000", vector():set( -91.7, 32.3, 615.7 ) }
            } ) do
                p = particles_object( v[1] )
                if p then
                    p:play_at_pos( v[2] )
                    table_insert( t_stone_pp, p )
                end
        end    end
    end

    if actor:dont_has_info( "father_pant_say_start" ) then
        if not sim:object( "hospital_pantera_girl" ) then sim:create( 9998 ) end
        if actor:has_info( "real_dok_and_father_spawn" ) then
            if not sim:object( "hosp_father" ) then sim:create( 9980 ) end
    end    end

    if actor:has_info( "real_dok_and_father_spawn" ) then
        add_ports( "real_dok_and_father_spawn", true )
        if not sim:object( "hosp_real_bl_dok" ) then sim:create( 9979 ) end
        if sim:object( "hospital_bl_dok" ) then _util.release_npc( "hospital_bl_dok" ) end
    elseif not sim:object( "hospital_bl_dok" ) then sim:create( 9978 )
    end

    for k, v in pairs( {
        ["hos_no_gulag_verh_black2"] = 9982,
        ["hos_no_gulag_verh_black3"] = 9983,
        ["hos_no_gulag_nad_black4"] = 9986,
        ["hospital_black_stalk3"] = 9989,
        ["hospital_black_stalk1"] = 9990,
        ["hospital_black_stalk2"] = 9991,
        ["hospital_sapsan"] = 9993,
        ["hos_black_niz_rayt"] = 9996,
        ["hos_black_niz_left"] = 9997,
    } ) do
        if not sim:object( k ) then sim:create( v ) end
    end

    if actor:dont_has_info( "prodaznay_tvar" ) and actor:dont_has_info( "spawn_hospit_live" ) then
        add_ports( "spawnim_3otsek", true )
    end
end

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

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

Поставить и подключить модули нет_пакетов И как их подключить? (Upd:можно как нибудь по проще , сделать что-то для установки метки на НПс ? )

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

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

 "Burn the rich // eat the rich"

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

Egor4ikModMaker.gif

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

Немного попроще, сделать спецметку в \ui\map_spots.xml,

 

<green_location_store store="1">
    <level_map spot="green_spot" pointer="quest_pointer"/>
    <mini_map spot="green_mini_spot" pointer="quest_pointer"/>
</green_location_store>

 

store="1" - сохранять ли отметку при сохранении игры (если не задано, не сохраняется), может отсутствовать.
ttl="3" - время жизни отметки (например подсветить на несколько секунд объект, и не заботиться о том, чтобы потом снять), может отсутствовать.
no_offline="1" - не показывать отметку, если объект в offline (если не задано, показывается), может отсутствовать.
hint="general_wounded" - подсказка, при наведении, может отсутствовать.


Ставить метку через map_add_object_spot(number, string, string), но нужна функция, чтобы получить секцию / профиль нпс и передать полученное в number.

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

"чтобы получить секцию / профиль нпс и передать полученное в number."

А-ааа ! Зачем ???

 

Если мы его сами создаем - ид мы получаем при создании.

Если мы знаем имя - мы получаем объект, и из него - ид.

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

 

Секцию и профиль - это надо перебирать все от 1 до 65534, и проверять для каждого существующего, но, зачем ???

  • Согласен 2
Ссылка на комментарий
20 часов назад, h0N0r сказал:

Ставить метку через map_add_object_spot(number, string, string), но нужна функция, чтобы получить секцию / профиль нпс и передать полученное в number.

А можно полную ф-цию , я в скриптах не шарю , так что прошу помощи у вас.

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

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

 "Burn the rich // eat the rich"

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

Egor4ikModMaker.gif

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

Прошу помощи у опытных скриптеров. Хочу слегка разнообразить игровой процесс Теней Чернобыля и поставить на чистую игру мод на случайные награды за задания. Как конфиг отредактировать под измененные награды за задания, я знаю, но тогда все равно буду знать, что именно дадут за выполненное задание. Пытался в обычный скрипт "task_manager" адаптировать коды, взятые из АМК или Симбиона, но все безуспешно. Может кто-нибудь подсказать, как правильно написать коды в нужных массивах или дать ссылку на готовый скрипт под чистый Stalker: SOC? 

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

Короче, по обоим постам: "стол заказов" - "сделайте мне мод" - не здесь.

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

Тем более, что вполне конретные примеры по обоим вопросам как раз были на последних страницах, но полностью проигнорированы.

 

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

 

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

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

@Egor4ikModMaker, загляни в тему "Уроки по модостроению", не-поленись, пролистай всю, там есть и то что тебе нужно.

Цитата

где же стоит этот нпс

Для квестов, которые прописаны в xml-описаниях, используется пара(сет) "число=строка", которые прописаны в game_story_ids.ltx(лежит в корне папки config). Смотри как это сделано в оригинале, и делай по подобию.

Выложи код, который ты наваял, и сообщи что ты хотел от него. Кто нить подскажет\направит\научит. А на простые заказы в стиле "хочу чтоб было вот так..." товарищ DC уже изъяснил политику партии...

 

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

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

Изходя из поста Хикса ( пост ниже) 

https://www.amk-team.ru/forum/topic/6458-uroki-po-modostroeniyu/?page=3&amp;tab=comments#comment-630233

 

Я пытаюсь понять : ( может я просто глупый и не нашел спойлер, но мне было бы привычно делать раскрывающимся текстом. ) 

Так что простите за километровое сообщение .

function add_lchanger_location()
    local sim = alife()
    if sim then
        -- escape - здесь идет вроде как пояснение , какая локация
        local obj = sim:story_object(91) - сюда надо записать присвоенный стори_ид
        if obj then
            level.map_add_object_spot(obj.id, "level_changer", "to_garbage") - конкретно эта часть вроде как отвечает за постановку метки, на карте. 
(Собственно здесь я немного путаюсь , т.к - автор ( Хикс) сперва пишет что типы меток пишутся в первые кавычки (т.е надпись level_changer) (им же указанные - crlc_big – большой белый круг;
crlc_mdl – средних размеров круг; crlc_small – маленький кружок. ) Но , позже я запутался, потому что он написал - Теперь можно тип метки указывать ”primary_object”. 
Куда это указывать , я так и не понял , если второе слово в кавычках , это вроде как название (здесь to_garbage это дословно - переход к свалке.)
Меня интересует следущее - можно без ковыряния алл.спавн-а , указать координаты, и сделать все эти махинации через скрипты? Да , для меня это правда сложно. Только на вас надеюсь. 
        end

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

 "Burn the rich // eat the rich"

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

Egor4ikModMaker.gif

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

Повторюсь еще раз: если мы знаем sid объекта, то уж его имя мы тем более знаем.

Если не знаем ни того, ни другого - на этом приплыли.

 

Дальше получаем собственно объект - ради его ид.

Как здесь - local obj = sim:story_object(91)

Кстати, совершенно лишние манипуляци:

    local sim = alife()     if sim then, поскольку запускать нечто подобное до запуска собственно alife() - занятие в высшей степени странное.

Или, по имени local obj = sim:object( "как_он_там_называется" )

 

Далее, собственно, ставится метка: level.map_add_object_spot(obj.id, "level_changer", "to_garbage")

Первое - ид, ради которого городился весь предшествующий огород. Тип метки - из того, что прописано в gamedata\config\ui\map_spots.xml  - то есть, всякие синие, желтые, и зеленые и прочие кракозябры, которые будут рисоваться на карте. Ну и произвольный текст, который будет выводиться при тыкании в кракозябры мышой.

 

Никаких координат для метки задать нельзя. Ставится ТОЛЬКО на что-то существующее.

 

 

Есть вариант с перебором всего-всего, и установкой меток на все, что кажется подходящим. Типа такого:

function set_spots()
    -- local obj = sim:object( "old_doc_4" )
    -- if obj then
    --    level.map_add_object_spot( obj.id, "artefact_location", obj:name() .. " y:" .. obj.position.y )
    -- end

    local c_af = clsid.artefact    -- clsid.artefact_s == electric_ball
    local c_ibox = clsid.inventory_box

    local obj, gvid, cls_id
    for i = 1, 65534 do
        obj = sim:object( i )
        if obj then
            cls_id = obj:clsid()
            if cls_id == c_af then
                if obj.parent_id == 65535 then    -- арты
                    gvid = obj.m_game_vertex_id
                    if gg:valid_vertex_id( gvid ) then
                        if gg:vertex( gvid ):level_id() == level_id then
                            log( "info", "found art: %s ( %.02f, %.02f, %.02f )", obj:name(),
                                obj.position.x, obj.position.y, obj.position.z )
                            level.map_add_object_spot( i, "artefact_location",
                                obj:name() .. " y:" .. obj.position.y )
                end    end    end

            elseif cls_id == c_ibox    -- and not онлайновый_ящик:is_inv_box_empty()
                and ( string_sub( obj:section_name(), 1, 1 ) == "m" or string_sub( obj:section_name(), 1, 1 ) == "e" )
                -- and string_sub( obj:section_name(), 1, 1 ) ~= "m"

                and obj.position.y >= -290    -- ящики Бака
              then    -- тайники
                gvid = obj.m_game_vertex_id
                if gg:valid_vertex_id( gvid ) then
                    if gg:vertex( gvid ):level_id() == level_id then
                        -- log( "info", "found treasure: %s", obj:name() )
                        local ini = obj:spawn_ini()
                        if ini and ini:section_exist( "logic" )
                          and ini:line_exist( "logic", "actor_item" ) then
                            level.map_add_object_spot( i, "habar_location",
                                obj:name() .. " y:" .. obj.position.y )
                        else level.map_add_object_spot( i, "habar_clear_location", --"treasure"
                            obj:name() .. " y:" .. obj.position.y )
                        end

                        --local item = level.object_by_id( i )
                        --if item then amk_particle.amk_particle( {
                        --    ["obj"] = item, ["looped"] = true,
                        --    ["particle"] = "explosions\\campfire_grill" } )
                        --end
                end    end

            elseif cls_id == 89 then
                gvid = obj.m_game_vertex_id
                if gg:valid_vertex_id( gvid ) then
                    if gg:vertex( gvid ):level_id() == level_id then
                        local ini = obj:spawn_ini()
                        if ini and ini:section_exist( "drop_box" ) then
                            -- log( "info", "found drop_box: %s", obj:name() )
                            level.map_add_object_spot( i, "green_location", obj:name() )
                end    end    end

            -- elseif c_anoms[cls_id] then
            --    gvid = obj.m_game_vertex_id
            --    if gg:valid_vertex_id( gvid ) then
            --        if gg:vertex( gvid ):level_id() == level_id then
            --            level.map_add_object_spot( i, "alife_combat_attack", obj:name() )
            --    end    end
            -- elseif cls_id == clsid.controller_s then
            --    gvid = obj.m_game_vertex_id
            --    if gg:valid_vertex_id( gvid ) then
            --        if gg:vertex( gvid ):level_id() == level_id then
            --            level.map_add_object_spot( i, "defend_lager_location", obj:name() )
            --            log( "info", "found: %s ( %.02f, %.02f, %.02f )", obj:name(),
            --                obj.position.x, obj.position.y, obj.position.z )
            --    end    end
            elseif string.sub( obj:section_name(), 6, 10 ) == "ameba" then
                gvid = obj.m_game_vertex_id
                if gg:valid_vertex_id( gvid ) then
                    if gg:vertex( gvid ):level_id() == level_id then
                        level.map_add_object_spot( i, "alife_combat_attack", obj:name() )
                        log( "info", "found: %s ( %.02f, %.02f, %.02f )", obj:name(),
                            obj.position.x, obj.position.y, obj.position.z )
                end    end
            -- elseif obj:section_name() == "lights_hanging_lamp" then
            --    gvid = obj.m_game_vertex_id
            --    if gg:valid_vertex_id( gvid ) then
            --        if gg:vertex( gvid ):level_id() == level_id then
            --            level.map_add_object_spot( i, "defend_lager_location", obj:name() )
            --            log( "info", "found: %s ( %.02f, %.02f, %.02f )", obj:name(),
            --                obj.position.x, obj.position.y, obj.position.z )
            --    end    end
            -- elseif obj:name() == "muha_hosp_live" then    -- вписать ненужное
            --    log( "info", "found: %s ( %.02f, %.02f, %.02f ), lv: %s", obj:name(),
            --        obj.position.x, obj.position.y, obj.position.z,
            --        ( gg:valid_vertex_id( obj.m_game_vertex_id )
            --          and gg:vertex(sobj_gv):level_id() ) or "n/a" )
            --    level.map_add_object_spot( i, "defend_lager_location", obj:name() )
    end    end    end
end

Далее - тему "справочник по функциям и классам" в руки, и разбираемся с тем, что непонятно. Дублировать все посты оттуда сюда, вместе с руководством по LUA - уже перебор.

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

Собственно если я правильно понял, получается что ф-ция должна принимать следующий вид: (поправьте если не так) 

function add_lchanger_location()
        local obj = sim:object("es_andrew") - по имени , как пояснили (Указал из профиля, нпс)
        if obj then
            level.map_add_object_spot(obj.id, "12000", "Андрюха") (если все правильно понял , то первое это ид - из game_story_ids, а второе - это то , что появится на карте если навести на отметку.
        end
Изменено пользователем Egor4ikModMaker

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

 "Burn the rich // eat the rich"

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

Egor4ikModMaker.gif

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

Я может совсем дегенерат , но я собственно ловлю вылет

(но по мимо этого я добавил в диалог экш на вызов этой ф-ции (  <action>level_tasks.andrew_at_map</action> ) 

 по этой ф-ции, (Прописал ее как было указано в level_tasks.script)

Ф-ция

function andrew_at_map()
        local obj = sim:object("es_andrew")
        if obj then
            level.map_add_object_spot(obj.id, "12000", "Андрюха")
        end

Log:

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...- Èñòèííûé ïóòü\gamedata\scripts\bind_stalker.script:194: attempt to index global 'level_tasks' (a nil value)

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

 "Burn the rich // eat the rich"

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

Egor4ikModMaker.gif

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

@Egor4ikModMaker

function andrew_at_map()
	local obj = alife():object("es_andrew")
	if obj then
		level.map_add_object_spot(obj.id, "green_location", "Андрюха")
	end
end

 

Изменено пользователем WinCap
  • Согласен 2

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

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

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

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

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

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

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

Войти

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

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

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