Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Firestarter 3 Опубликовано 9 Ноября 2021 Поделиться Опубликовано 9 Ноября 2021 Только что, Space.Marine сказал: Как-то так ) Ну, по порядку: Скрытый текст 1)Если я правильно понял, то первый выброс, исходя из файла surge_manager.script, это: local START_MIN_SURGE_TIME = 2*60*60 local START_MAX_SURGE_TIME = 4*60*60 т.е. это от двух до четырёх часов игрового времени? Судя по личному опыту - так и есть, первый выброс относительно быстро после старта случается. А вот уже в дальнейшем: local MIN_SURGE_TIME = 12*60*60 local MAX_SURGE_TIME = 24*60*60 Что тоже верно, исходя из игры. 2)По поводу влияния взятого квеста на шанс появления того или иного арта, скорее всего, я ошибался. Чуть погуглив, по пути: ...\gamedata\configs\scripts\zaton\anomaly можно обнаружить файлы аномалий, а в них: [anomal_zone] layers_count = 3 respawn_tries = 1 max_artefacts = 2 ;applying_force_xz = 200 ;applying_force_y = 400 artefacts = af_medusa, af_cristall_flower, af_night_star, af_vyvert, af_gravi, af_gold_fish start_artefact = af_night_star coeff = 3, 3, 2, 2, 1, 1 artefact_ways = zat_b14_af_way, zat_b14_af_way_2, zat_b14_af_way_3 field_name = zat_b14_zone_field_radioactive_weak Ну это как одна из аномалий, zaton_b14. Самое интересующее, это конечно же: coeff = 3, 3, 2, 2, 1, 1 То есть это коэффициенты, которые соответствуют артефактам (6 коэф. = 6 артов), и чем выше число, тем выше шанс выпадения арта. Но хотелось бы большего понимания - что это цифры значат? Т.е. конкретика - сколько 3 в процентах (думал, что 30, но в каждом файле по-разному есть соотношение этих коэффициентов.) 3)Пока не нашёл файла влияния выбросов на появление артов. Перерою весь сталкер по ключевым словам, надеюсь, найду...и буду признателен вам, если вспомните/поищете этот скрипт. 4)про обмен у групп сталкеров оружия на арты, если честно, слышу впервые, но, судя по скрипту, имеет место быть. Хотя, ИМХО, это совершенно бесполезная штука Отнюдь. Борода даёт максимальную цену за артефакты на заказ - от 18000 до 24000 рублей. Поэтому имеет смысл выловить вовремя группу соперников и толкнуть им хороший ствол (особенно на Затоне если такое провернуть). Также, с начала игры на Скадовске, мы ограничены детектором Медведь, который поможет нам найти малое кол-во артов из запрашиваемых Бородой Всё несколько иначе. Медведь не позволяет найти ни одного артефакта, что заказывает Борода - нужен Велес. Велес можно получить, как минимум, тремя способами: 1)От Бороды в качестве награды за уничтожение логова кровососов - и это ближайший и быстрейший путь получения Велеса. 2)Если убивать группы сталкеров, что идут к Бороде с найденным артефактом (если убить две группы, Борода прекратит выдавать задания на поиск артов, так что надо быть поаккуратнее. Да и такое это дело...мочить сталкеров.) 3)Когда есть квест "Артефакт на заказ" от Бороды, группы соперников можно будет обнаружить в различных аномалиях (чаще в тех, где теоретически может появиться искомый арт). Как минимум у главаря будет Велес. И, если я правильно понял, за убийство таких сталкеров Борода ничего не скажет (не проверял). Да и такое это дело...мочить сталкеров. (4)(возможно) Будет продавать Сыч после получения достижения "Состоятельный клиент". Точно не уверен, не понял влияния этой ачивки на шансы в торговле (там что-то связано с припиской scientific, и то ли это ачивка "Научный сотрудник" влияет, то ли выполнение квеста Сыча по доставке трёх Велесов учёным). Поясню, зачем вообще весь этот сыр-бор учинил. Т.к. шанс найти редкий артефакт - низок, а очень хочется уже сразу иметь Золотую Рыбку, ведь я любитель мародёрить всё что плохо лежит, то я предположил, что это можно будет сделать через соперников. Взял у Бороды квест на арт, и стал ждать. Предварительно я сбегал на Сгоревший хутор (вроде так локация называется), где забрал ВСС Винторез, что является тайником (он же как раз "good_gun"). В этот раз как нельзя быстро артефакт был ими найден. В таком случае, задание обновляется, и можно успеть перехватить эту группу - будет на карте указано их местоположение, и даже будет видно их передвижение. И тут уже что хочешь делай - обменяйся, убей, можно даже выкупить (ну за Светляк они просили что-то около 39000 р, офигеть). Артефакт я у них благополучно выменял, но не стал отдавать Бороде - самому нужнее, хороший реген. Вот только забавный баг произошёл - тот самый командир соперников зачем-то пришёл на баржу и постоянно там отсиживается в разных местах на корточках. Вроде бы, если отоспаться, то задание будет провалено и сталкер исчезнет, ну да и бог с ним. Таким образом можно на самом старте, если бы мне повезло, получить вожделенную рыбку. Но ничто не мешает вновь и вновь брать задания и просто ждать сталкеров. Хороших пушек, правда, раз-два и обчёлся, но! Их продажа принесёт куда меньше денег/пользы, чем деньги/польза от полученного арта. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401556
Norman Eisenherz 355 Опубликовано 9 Ноября 2021 Поделиться Опубликовано 9 Ноября 2021 @Colder Spoiler [scripts\xr_motivator.script] -- биндер NPC function motivator_binder:hit_callback(…) if amount > 0 проверить активный слот: 0 = нож 1 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401561
Labadal 68 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 (изменено) 22 часа назад, Colder сказал: Возможно ли скриптово отследить удар ножом (ТЧ) Попробуй просто отследить, что на момент получения целью урона, в руках у гг был нож. local wpn = db.actor:active_item() if wpn and wpn:section()=="wpn_knife" then *твои действия* end Вопрос касательно ТЧ. Есть у меня переменная, по умолчанию объявлена как local energia = 10 Есть предмет, использующий энергию - при каждом использовании тратится одна, то есть, без подзарядки у меня всего 10 использований. Но как только я делаю сейв-лоад, переменная снова становится равной 10, что даёт ещё 10 использований. Как "сохранить" текущее значение переменной? Спасибо Изменено 10 Ноября 2021 пользователем Labadal God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401570
Space.Marine 466 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 (изменено) 10 часов назад, Firestarter сказал: влияния выбросов на появление артов Тыц. Там для Misery, но какая разница. bind_anomaly_zone.script: if math.random(1,100) > 17 then Изменено 10 Ноября 2021 пользователем Space.Marine 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401572
Chypakabra 1 002 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 8 часов назад, Labadal сказал: Попробуй просто отследить, что на момент получения целью урона, в руках у гг был нож Очень не правильно - что-то подобное пробовал очень давно - поясню: если выстрелить из рпг или подствольника ну или гренку кинуть, и переключиться на нож - то твой скрипт покажет что урон нанесён ножом, Увы даже на костыль не тянет Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401603
Labadal 68 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 10 минут назад, ted.80 сказал: Очень не правильно - что-то подобное пробовал очень давно - поясню: если выстрелить из рпг или подствольника ну или гренку кинуть, и переключиться на нож - то твой скрипт покажет что урон нанесён ножом, Увы даже на костыль не тянет Я так упавшую звезду проходил, кидал в нпс гранатами и переключался на метательные ножи. 1 1 God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401605
Chypakabra 1 002 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 14 минут назад, Labadal сказал: Я так упавшую звезду проходил "Молодец" - что ещё сказать, только задавали вопрос ни как налюбить игру - а как отловить именно удар ножом так что твой совет весьма сомнителен Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401609
Labadal 68 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 (изменено) 1 час назад, ted.80 сказал: "Молодец" - что ещё сказать, только задавали вопрос ни как налюбить игру - а как отловить именно удар ножом так что твой совет весьма сомнителен Окей, вот тебе подробный "туториал" как это сделать. 1. подключить X-ray Extensions 2. подключить OGSE.dll 3. подключить каллбек before_hit 4. function motivator_binder:before_hit_callback(p_s_hit, p_ignore_flags) self.last_hit_data = read_hit_data(p_s_hit) local who = level.object_by_id(self.last_hit_data.who_id) if who:id() == db.actor:id() then local wpn = level.object_by_id(self.last_hit_data.weapon_id) weapon_kill = wpn:section() end end 5. Теперь переменная weapon_kill хранит себе название оружия, которым был убит нпс. То есть в ней всё равно будет храниться, допустим, grenade_f1, даже если ты кинул гранату и быстро достал нож. 6. а дальше все просто if weapon_kill=="wpn_knife" then *что-то делается* end 7. В принципе, всё довольно просто. А используя оригинальные возможности, лучше тех вариантов, которые предложил я и товарищ Norman Eisenherz не придумаешь. Изменено 10 Ноября 2021 пользователем Labadal 1 God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401620
Firestarter 3 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 12 часов назад, Space.Marine сказал: Тыц. Там для Misery, но какая разница. bind_anomaly_zone.script: if math.random(1,100) > 17 then Спасибо большое что помогли, я проверил это на своём сталкере. Но тут уже начинается моя проблема, языка Lua я не знаю, и поэтому сам бы я не допёр, что это означает процент шанса. Да и щас не понимаю, я не понимаю всех этих строчек. Обидно, конечно, что если хочешь что-то более-менее даже просто узнать, нужно изучать язык. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401649
Chypakabra 1 002 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 13 часов назад, Labadal сказал: Есть у меня переменная, по умолчанию объявлена как local energia = 10 local energia = 10 Как я понял в каком-то скрипте у тебя объявляется переменная, и она равна = 10 при использовании чего-либо она уменьшается, (тут все понятно) но при сейв/лоад - скрипт грузится поновой, и переменная опять объявляется и она = 10 (вот тут и трабла?) для сохранности надо делать по другому Скрытый текст local energia = xr_logic.pstor_retrieve(db.actor, "nrg", nil) if not energia then -- | тут энергии нет впринципе xr_logic.pstor_store(db.actor, "nrg", 10) -- | тут выдаём 10 end для использования вот так Скрытый текст local energia = xr_logic.pstor_retrieve(db.actor, "nrg", nil) if energia then -- | тут энергия есть if energia > 0 then -- | тут её больше нуля else -- | тут её меньше или равно нулю end end 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401658
Lieutenant Novikov 16 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 Здравствуйте. Столкнулся с такой проблемой. Как известно Call of Chernobyl хотя и масштабный мод, имеет несколько неприятных багов. Один из них: НПС у костра после того как их потревожит противник, возвращались к костру и молчали, застревая на одной анимации, до перезагрузки. Я решил исправить этот баг, и методом тыка вычислил файл который отвечает за поведение НПС у костра, xr_animpoint_predicates.script. Я взял файл из ЗП и заменил им COCовский, проблема исчезла, но появился побочный эффект, теперь НПС у костра всегда с одной анимацией, и разговаривают только "о жизни", не едят, не играют на гитаре, вообщем ведут себя как будто не в зоне кампа. Все попытки отредактировать файл не к чему не привели, отчасти потому что я плохо разбираюсь в скриптах. Может кто разбирается и увидит что не так? Вроде бы в этом замешаны эти фрагменты. Скрытый текст -------------------------------------------------------------------------------- -- Predicate functions for xr_animpoint actions -------------------------------- -------------------------------------------------------------------------------- function const_predicate_true(id) local npc = db.storage[id] and db.storage[id].object if (npc and db.storage[id].need_sleep) then return false end return true end function animpoint_predicate_bread(id) local npc = db.storage[id] and db.storage[id].object if (npc and not db.storage[id].need_sleep) then return true end return false end function animpoint_predicate_kolbasa(id) local npc = db.storage[id] and db.storage[id].object if (npc and not db.storage[id].need_sleep) then return true end return false end function animpoint_predicate_vodka(id) local npc = db.storage[id] and db.storage[id].object if (npc and not db.storage[id].need_sleep) then return true end return false end function animpoint_predicate_energy(id) local npc = db.storage[id] and db.storage[id].object if (npc and not db.storage[id].need_sleep) then return true end return false end function animpoint_predicate_guitar(id, camp) if not (camp) then return false end local npc = db.storage[id] and db.storage[id].object if (npc and not db.storage[id].need_sleep) then return true end return false end function animpoint_predicate_harmonica(id, camp) if not (camp) then return false end local npc = db.storage[id] and db.storage[id].object if (npc and not db.storage[id].need_sleep) then return true end return false end function animpoint_predicate_weapon(id) return true end Скрытый текст function const_predicate_true(npc_id) return true end function animpoint_predicate_bread(npc_id) if(db.storage[npc_id] and db.storage[npc_id].object and eatable_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("bread")) == true then return true end return false end function animpoint_predicate_kolbasa(npc_id) if(db.storage[npc_id] and db.storage[npc_id].object and eatable_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("kolbasa")) then return true end return false end function animpoint_predicate_vodka(npc_id) if(db.storage[npc_id] and db.storage[npc_id].object and eatable_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("vodka")) then return true end return false end function animpoint_predicate_energy(npc_id) if(db.storage[npc_id] and db.storage[npc_id].object and eatable_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("energy_drink")) then return true end return false end function animpoint_predicate_guitar(npc_id, is_in_camp) --printf(" predicate_guitar %s", npc_id) --printf(" registred_camp %s", tostring(is_in_camp)) if is_in_camp == true and db.storage[npc_id] and db.storage[npc_id].object and db.storage[npc_id].object:object("guitar_a") then --printf(" return true") return true end --printf(" return false") return false end function animpoint_predicate_harmonica(npc_id, is_in_camp) --printf(" predicate_harmonica %s", npc_id) --printf(" registred_camp %s", tostring(is_in_camp)) if is_in_camp == true and db.storage[npc_id] and db.storage[npc_id].object and harmonica_visuals[db.storage[npc_id].object:get_visual_name()] and db.storage[npc_id].object:object("harmonica_a") then --printf(" return true") return true end --printf(" return false") return false end function animpoint_predicate_weapon(npc_id) if(db.storage[npc_id] and db.storage[npc_id].object) then local smart = xr_gulag.get_npc_smart(db.storage[npc_id].object) if(smart) then for k,v in pairs(smart_table) do if smart:name() == v then return false end end end end return true end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401661
Labadal 68 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 @ted.80 чет туплю жестко, сплошные вылеты ловлю. где вставить этот кусок? Можно ли переменную сделать глобальной? (Для использования в других скриптах небоходимо) God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401672
Norman Eisenherz 355 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 @Labadal Можно привязать условную энергию к состоянию предмета: при каждом использовании менять через obj:set_condition( старое значение - 0.1 ) и отключать использование при obj:condition() < 0.1. Состояние при этом будет храниться в штатном нетпакете без дополнительных действий в скриптах. В OGSE так хранится состояние расходуемых ремкомплектов, а в NLC-7 – состояние постепенно теряющих силу артефактов. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401674
Labadal 68 Опубликовано 10 Ноября 2021 Поделиться Опубликовано 10 Ноября 2021 @Norman Eisenherz Проблема в том, что используемый предмет расходует "энергию" бронекостюма, который надет на гг. Тут уж кондишн не отнимешь. (не в том смысле, что нельзя, а в том, что задумка) God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401675
Norman Eisenherz 355 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 @Labadal Можно спавнить "аккумулятор" с невидимой иконкой и без собственного веса, считая, что предмет вставлен в броню. 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401678
Labadal 68 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 @Norman Eisenherz Вариант. Все же попробую первый способ. Не получится - сделаю так God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401694
AndreySol 215 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 @Labadal Объяви свою переменную глобально, затем сохраняй ее в pstor, а при загрузке игры читай оттуда сохраненное значение. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401704
Labadal 68 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 @AndreySol это понятно, но как сохранять? Где сохранять? God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401705
_g.script 3 670 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 1 час назад, Labadal сказал: как сохранять Скрытый текст -- Записываем переменную 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 Здесь могла быть ваша реклама. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401707
Labadal 68 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 @mole venomous Допустим, где вызывать эти функцию? God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/579/#findComment-1401708
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти