Скриптование - Страница 4 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

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

 

Добавлено через 2 мин.:

Pihan13, по разному. Через скрипт легче, да и меньше шанс ошибки, а через ол.спавн тежялее, вероятность ошибки, да и лишнии "мегабайты" в МОДе

 

Добавлено через 1 мин.:

А если через алл.спавн делаю, то предмет (нпс) появится сразу после начала новой игры? или можно этим путём сделать так, чтоб он появился после выполнения мною чего-либо (прим. квеста)

:offtopic:

и ещё: к примеру у меня есть координаты:

position = -139.449829101563,-29.6908683776855,-351.492797851563

обязательно писать их такими длинными? можно к примеру написать?

position = -139.4,-29.6,-351.4

Математик блин, округление десятичных дробей не проходил в 5ом классе?

АНДРЮ}{@, Я вот про это и спрашивал. Ато я округлял, а ничего не выходило :( (но округлял правильно :)) - значит дело в скрипте Изменено пользователем Pihan13

меченый(стрелок), ccорь, но можешь еще объяснить тупому.

решил сделать респаун монстров через каждые 6 минут(для теста)

вот скрипт

local actor = db.actor

function main()
spawn_all()
end

--Спавним все аномалии
function spawn_all(respawn)
if load("spawn_anom",false)==false or respawn==true then
--test
spawn("sim_default_monolith_3",vector():set(-170.53266906738,0.67925143241882,-312.03155517578),1,135)



-- РЕСПАВН МОНСТРОВ
--== БОЛОТА
--БЮРЕРЫ   
spawn("burer_weak",vector():set(347.982788085938,1.15263211727142,362.435119628906),1,135)
spawn("burer_normal",vector():set(-181.321166992188,2.20583915710449,536.22412109375),1,135)   
spawn("burer_strong",vector():set(106.57487487793,1.11209356784821,331.199737548828),1,135)
-- ХИМЕрЫ

spawn("chimera_normal",vector():set(12.362359046936,1.20762395858765,465.655242919922),1,135)
spawn("chimera_normal",vector():set(-103.976005554199,0.348260492086411,334.711975097656),1,135)



   save("spawn_anom",true)
end
end

function create_anom(section,rad_anom,x,y,z,lv,gv,mode)
        --   con(section)
      if gv==nil then gv=db.actor:game_vertex_id() end
      if lv==nil then lv=db.actor:level_vertex_id() end
      if pos==nil then pos=db.actor:position() end

      local p_obj = alife():create(section,vector():set(x,y,z),lv,gv)

      local packet = net_packet()
      packet:w_begin(0)
      p_obj:STATE_Write(packet)
      packet:r_seek(2)

    local game_vertex_id = packet:r_u16()
    local cse_alife_object__unk1_f32 = packet:r_float()
    local cse_alife_object__unk2_u32 = packet:r_s32()
    local level_vertex_id = packet:r_s32()
    local object_flags = packet:r_s32()
    local custom_data = packet:r_stringZ()
    local story_id = packet:r_s32()
    local cse_alife_object__unk3_u32 = packet:r_s32()

    local shape_count = packet:r_u8()
    for i=1,shape_count do
        local shape_type = packet:r_u8()
        if shape_type == 0 then
            local center = packet:r_vec3()
            local radius = packet:r_float()
        else
            local box = packet:r_matrix()
        end
    end

    local restrictor_type = packet:r_u8()

    local cse_alife_custom_zone__unk1_f32 = packet:r_float()
    local cse_alife_custom_zone__unk2_u32 = packet:r_s32()
    local on_off_mode_enabled_time = packet:r_s32()
    local on_off_mode_disabled_time = packet:r_s32()
    local on_off_mode_shift_time = packet:r_s32()

    local offline_interactive_radius = packet:r_float()
    local artefact_spawn_places_count = packet:r_u16()
    local cse_alife_anomalous_zone__unk1_u32 = packet:r_s32()

    local last_spawn_time_present = packet:r_u8()

--    if packet:r_elapsed() ~= 0 then abort("left=%d", packet:r_elapsed()) end

    packet:w_u16(game_vertex_id)
    packet:w_float(cse_alife_object__unk1_f32)
    packet:w_s32(cse_alife_object__unk2_u32)
    packet:w_s32(level_vertex_id)
    packet:w_s32(object_flags)
    if mode~=nil then custom_data = mode end
    packet:w_stringZ(custom_data)
    packet:w_s32(story_id)
    packet:w_s32(cse_alife_object__unk3_u32)

    packet:w_u8(1)
    packet:w_u8(0)
    local sphere_center = vector()
    sphere_center:set(0, 0, 0)
    packet:w_vec3(sphere_center)
    radius = rad_anom
    packet:w_float(radius)

    packet:w_u8(restrictor_type)

    packet:w_float(cse_alife_custom_zone__unk1_f32)
    cse_alife_custom_zone__unk2_u32 = bit_not(0)
    packet:w_s32(cse_alife_custom_zone__unk2_u32)
    packet:w_s32(on_off_mode_enabled_time)
    packet:w_s32(on_off_mode_disabled_time)
    packet:w_s32(on_off_mode_shift_time)

    packet:w_float(offline_interactive_radius)
    packet:w_u16(artefact_spawn_places_count)
    packet:w_s32(cse_alife_anomalous_zone__unk1_u32)

if mode == nil then

    packet:w_u8(last_spawn_time_present)
end
    p_obj:STATE_Read(packet, packet:w_tell()-packet:r_tell())
  --    add_spot_on_map(p_obj.id,"red_location","Аномалия")


    return p_obj
end


-- Вывод инфы в консоль
function con(msg)
get_console():execute(msg)
end


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

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

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

-- Функция спауна объекта
function spawn(section,pos,lv,gv)

--    vector():set(x,y,z) 

      if gv==nil then gv=db.actor:game_vertex_id() end
      if lv==nil then lv=db.actor:level_vertex_id() end
      if pos==nil then pos=db.actor:position() end

      if section==nil then
      con("Не_указанная_секция")
      else
      return alife():create(section,pos,lv,gv)
      end

end

 

далее в amk_mod.script добавил строку таймера и вот что получилось:

local nrg,med,cnt,gv,lv,w


-- Эта функция вызывается первой. Онлайновые объекты недоступны! db.actor недоступен!
function on_game_start()
    math.randomseed (device ():time_global ())
end

function first_run() 
    if amk.load_variable("x_first_run",true) then
        amk.g_start_timer("main",0,0,6) -- вызов респауна!!!!!!!!!!!!
        amk.g_start_timer("gg_need_sleep",0,0,6)
        --amk.g_start_timer("show_news",0,0,10)
        amk.spawn_item_in_inv("matras")
        amk.save_variable("x_first_run",false)
    end
end 
......... а там далее спальник пошел...

 

 

потом как ты и сказал в amk.script там где надо вписал ето

--- функция респавна монстров

if select_string=="main" then
new_monsters.main()
amk.g_start_timer("main",0,0,6)    
end

 

 

Проблема в том, что тестовый монолитовец после старта и6 минут спаунится, валит там пару ребят,НО больше он не спаунится, один раз только, и все, хотя он же должен каждые 6 минут вариться,

Вопрос, я неправильно сбросил таймер, как его надо было сбрасывать???

 

Так же , прописал на всех локациях монстров людей, тоже для респауна в томже файле, но тогда вообще вылет, т.е скрипт не может спаунить предмет пока ты не на той локации где он прописан??

И можно это как нибудь поправить???

Vano_Santuri,из своего скрипта удали

if load("spawn_anom",false)==false or respawn==true then

...

...

save("spawn_anom",true)

end

end

 

Удали ,то что выделено...

Уважаемые корифеи рассуждая о системе A-Live и AI НПС игры S.T.A.L.K.E.R

я пришел к следуюшим выводам поправте если неправ.

Моды разблокирующие A-Live не решают проблему хотя и вносят разнообразие в игровой

процес.Первой мыслью было было то что не гулаги должны выбирать подходяшего

НПС а нпс гулаг примерно вот так лагерь новичков новички сидят у костра часов в 6

встают и покидают лагерь (гулаг) отправляясь охотится и.т.д тойсть переходят под

дефолтную либо свою логику а нагулявшись возврашаются назад к костру

если место в гулаге свободно либо в любой другой гулаг kamp

Но выяснилось что это невозможно без роспуска гулага .Спасибо Wawka и другим

ответившим на мои дилетанские вопросы

Wawka еше раз спасибо подсказал решение а именно использовать вот эту функцию из

фаила xr_conditions

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

-- amk function

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

function time_hours()

if level.get_time_hours() >= 5 and level.get_time_hours() <= 22 then

return true -- день

else

return false -- ночь

end

end

 

переделав ее в

 

function time_testow()

if level.get_time_hours() >= 6 and level.get_time_hours() < 8 then

return true -- отдых

else

return false --

end

end

 

создав НПС в ал спавне

 

[1]

; cse_abstract properties

section_name = stalker

name = testow

position = -209.755249,-20.444433,-153.096436

direction = 0.062321275472641,0.00316426996141672,0.0140644172206521

 

; cse_alife_trader_abstract properties

money = 5000

character_profile = amk_test_testow

 

; cse_alife_object properties

game_vertex_id = 8

distance = 2.79999995231628

level_vertex_id = 8190

object_flags = 0xffffffbf

custom_data = <<END

[logic]

cfg = scripts\testow.ltx

[smart_terrains]

none = true

[spawn]

wpn_toz34

ammo_12x76_zhekan = 4

medkit = 3

kolbasa

END

 

; cse_visual properties

visual_name = actors\soldier\soldier_bandana_3

 

; cse_alife_creature_abstract properties

g_team = 0

g_squad = 1

g_group = 5

health = 1

dynamic_out_restrictions =

dynamic_in_restrictions =

 

upd:health = 1

upd:timestamp = 0x660a0d30

upd:creature_flags = 0x69

upd:position = -209.25016784668,-20.0724010467529,-141.015487670898

upd:o_model = 0

upd:o_torso = 0.00316426996141672,0.062321275472641,0

upd:g_team = 0

upd:g_squad = 1

upd:g_group = 5

 

; cse_alife_monster_abstract properties

 

upd:next_game_vertex_id = 65535

upd:prev_game_vertex_id = 65535

upd:distance_from_point = 0

upd:distance_to_point = 0

 

; cse_alife_human_abstract properties

predicate5 = 0,0,0,0,1

predicate4 = 1,1,2,1

 

; cse_ph_skeleton properties

 

upd:start_dialog =

 

; se_stalker properties

 

прописав точки пути

 

[testow_walk]

points = p0,p1,p2,p3

p0:name = wp00

p0:flags = 0x4

p0:position = -209.755249,-20.444433,-153.096436

p0:game_vertex_id = 61

p0:level_vertex_id = 43262

p0:links = p1(1)

 

p1:name = wp01

p1:flags = 0x2

p1:position = -206.181992,-20.517683,-148.460022

p1:game_vertex_id = 61

p1:level_vertex_id = 46562

p1:links = p2(1)

 

p2:name = wp02

p2:flags = 0x1

p2:position = -191.232422,-20.038328,-148.739609

p2:game_vertex_id = 46

p2:level_vertex_id = 60449

p2:links = p3(1)

 

p3:name = wp03

p3:flags = 0x1

p3:position = -182.478073,-20.137499,-143.810410

p3:game_vertex_id = 46

p3:level_vertex_id = 68212

p3:links = p0(1)

 

прописав в scripts\testow.ltx

 

[logic]

active = kamp

[kamp]

on_info = {=time_testow} walker

center_point = esc_lager_camp_center

path_walk = esc_lager_camp_center_task

soundgroup = esc_lager

meet = meet@lager

active = walker

[walker]

on_info = {!time_testow} kamp

path_walk = testow_walk

 

точки esc_lager_camp_center и esc_lager_camp_center_task тупо взяты из путей гулага esc_lager

 

в итоге наш НПС test_testow с начала игры сидит у костра с новичками а в 6 часов отправляется патрулировать (проверенно) теперь хочу заставить его свинюшек вынести ( на которых волк квест дает ) нечего меченому ерундой заниматся ну и

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

к чему я все это понаписал ? просто как мне кажется на базе всего этого можно много чего сделать для улучшения S.T.A.L.K.E.R

Так как я не разбираюсь в скриптах может стоит создать отдельную тему в которой создав с нуля общего НПС тамогочи эдакого при помощи знающих товарищей и

их и наших идей попытатся написать ему достаточно сложную логику-расписание

хотябы для кордона ?

 

спасибо за внимание с уважением АККК1

AKKK1,

 

Это конечно интересно, и очень нужно , но тут стоит вопрос в другом, сделаем мы хотя бы 20 таких НПС с путями и логиками, а будем делать долго, ну так дня 2, а потом раз и убили их вояки или химера съест, потом пойдет респаун и все наш труд напрасен, если и делать такое, то только через скрипт, чтоб если непись, допустим: 1.5_patrul убили, то вместо нее заспаунить другую (худ,диалоги и т.д) но чтоб привязать эту же логику и пути(автоматически скриптом).

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

Но может кто и сделает.

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

Vano_Santuri

Если я правильно понимаю то создав некую универсальную логику допустим

с 23 до 5 сплю потом у костра завтракую потом делами занимаюсь наверно можно например

 

здесь

 

[logic]

active = kamp

[kamp]

on_info = {=time_testow} walker вместо walker была какая нибудь переменная или функция заставляюшая нпс рандомно выбрать какуюто схему из нескольких ?

center_point = esc_lager_camp_center

path_walk = esc_lager_camp_center_task

soundgroup = esc_lager

meet = meet@lager

active = walker

[walker]

on_info = {!time_testow} kamp

path_walk = testow_walk

 

и прикрутив ее к уже имеюшимся НПС допустим новичкам в лагере

они и респаунится будут с ней ?

 

И еше наличее в игре таких персонажей как отец диодор

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

но почемуто это не сделали

AKKK1,

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

 

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

 

ЗЫ если где-то не прав исправьте.

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

добрый день, есть задача: свой обработчик взрыва гранаты (скриптовая граната по сути)

сам момент броска гранаты отлавливаю через on_item_drop, там запоминаю gren_id=obj:id()

и потом в actor_update проверяю alife:object(gren_id), таким образом отлавливаю момент когда граната перестаёт существовать (что отличает брошеную от просто дропнутой)

но как оказывается граната перестаёт существовать как alife-обьект ещё задолго до того, как взорвётся, поэтому узнать координаты КУДА она упала - не получается.

 

Т.е. задача - узнать координаты гранаты во время взрыва. Не обязательно, чтоб она вообще взрывалась штатным образом. Пробовал болт - на него on_drop не срабатывает.

 

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

 

PS: делаю для ЧН

Мне подсказали что ответ на мой вопрос в allspaun, если повторяюсь сильно не пинайте! Что нужно менять для того чтобы прописать вещь в постоянные нычки? Точнее мне нужно прописать пару вещей в ящик в казарме на блокпосту на кордоне! Если можно в личку и подробно!) Поясню про тайники я знаю, мне надо чтобы вещ лежала там постоянно! Ну я имею ввиду без наводки!

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

Tonny,

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

Bak

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

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

 

MIXATOR

в АМК моде есть оффлайновое заполнение тайников скриптами, для ЧН есть отдельный мод для этого же самого (на этом же форуме)

MIXATOR

для ЧН тут:

http://www.amk-team.ru/forum/index.php?showtopic=1772

автор сделал вырезку из АМК для ТЧ, соответственно, есть на что ориентироваться и что искать в скриптах АМК. Совсем пальцем в конкретные строчки не покажу.

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

меченый(стрелок), а вот такой к вам вопрос: как всем хорошо известно, lua - язык, в котором функция является обычной переменной и может быть передана в аргументы другой функции. Тогда почему же в амк не используется универсальный таймер (т.е. такой таймер, в котором вызыванные функции могут быть произвольными), вызов которого будет с параметрами функций, например:

new_timer (1, myscript.myfunc, 20)

 

Добавлено:

Vano_Santuri,

на acdc_cs.pl или какой там у тебя, нажимаешь правой кнопкой -> изменить, или открыть с помощью, блокнота.

Маньяк... D:

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

IQDDD, Собственно вопрос не ко мне,а к xStream'у....

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

я представляю эту функцию примерно так

 

function new_timer(cr,func_name,min)

local begin = false

timer[cr]=game.time+min

...тут считаем

if begin then

func_name()

begin=false

end

end

собственно загвоздка в том,что нету возможности сохранить имя функции...следовательно...если будет скажем два вызова этой функции(таймера) с разными функциями(переменными),то,когда первый раз begin будет истинным ,произойдёт вызов всех функций....ИМХО...Если покажите свой способ,то попытаюсь объяснить,чем он хуже(хотя возможно и лучше)....

ЗЫ:Насчёт АМК скажу, по моим "данным" в АМК 2.0 не будет функций от xStream'a - следовательно и таймер будет другим...

попробую вопрос по-другому поставить, авось кто знает :)

может, кто подскажет как выполнить один из вариантов:

1. определить момент выстрела из оружия

2. определить точку попадения пули

3. определить координаты брошенной гранаты (перед взрывом) или болта

(дополнительно)

4. заставить кровососа в ЧН стать видимым и/или уязвимым.

5. (Кстати, невидимый кровосос является game_object?)

 

спасибо за внимание

меченый(стрелок), давайте разберёся в аргументах моей функции: new_timer (1, myscript.myfunc, 20)

Здесь первый - это номер таймера.

Второй - имя функции. Кстати, почему это его сохранить нельзя?

Третий - через сколько секунд/миллисекунд/обновлений вызывать процедуру таймера.

 

Задача состоит в том, что создать псевдообъект таймера. Можно при вызове new_timer(...):

Создать объект класса "timer" (его тоже надо создать заранее. Он будет представлять собой класс всего из четёрых свойств: number, procedure, active, interval) Свойства соответственно будут равны: number = 1. procedure = myscript.myfunc. active = true. interval = 20. Запоминаем объект этого класс в глобальную таблицу timerZ. С каждый апдейтом актора будет вызываться функция, проверяющая всю таблицу на наличие объектов класса таймер и, если надо, исполняющая функции, сохранённые в свойстве procedure объектов.

 

Добавлено через 3 мин.:

Tonny, всё это можно (кроме 2. И то можно, только приблизительно и ОЧЕНЬ сложно. Без математики нельзя). Вот только вы изучили, что такое:

1. bind_object

2. callback

3. класс

4. методы update, net_destroy, __init(...) super(...) и пр. класса "bind_object"

?

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

IQDDD

да, имею представление и использовал.

 

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

Но отловить момент выстрела кроме как в update актёра проверять количество патронов в магазине оружия в слотах - фантазии пока не хватило.

п.2. для меня не критичен, 1 и/или 3 - актуальнее (граната берестаёт быть алайф-обьектом задолго до взрыва, а на болт не реагирует on_item_drop)

а всё это нужно восновном для п.4 (раз кровосос неуязвим - сделать против него спец.оружие)

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

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

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

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

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

Войти

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

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

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