Overf1rst 1 498 Опубликовано 1 июля, 2020 Тема посвящена моддингу на платформе Тень Чернобыля. Правила темы: Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском, ответ на него, вероятно, уже есть. Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода. Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа). Благодарность выражаем в личке или же ставим реакцию. Посты с благодарностями в теме будут удаляться. 6 4 1 3 1 3 6 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Alex Kireev 18 Опубликовано 30 мая, 2021 На одном сайте нашел Цитата свойства: bleeding (кровотечение), satiety (сытость) и alcohol (алкоголь), скриптовому воздействию не поддаются поэтому изменять их нужно посредством соответствующих движковых параметров в конфигах предметов. То есть эти параметры нельзя менять через скрипт? Дополнено 34 минуты спустя Askar да, список продуктов и рандом из этого списка Дополнено 44 минуты спустя Хотя можно попробовать и без списка, чисто на проверке что есть в рюкзаке Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 30 мая, 2021 (изменено) 6 часов назад, Alex Kireev сказал: То есть эти параметры нельзя менять через скрипт? да, только получать значение. Кровотечение по крайней мере (в зп можно), а вот про алкоголь не видел, чем его в тч считать скриптом? Изменено 30 мая, 2021 пользователем vader_33 В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Alex Kireev 18 Опубликовано 30 мая, 2021 1 час назад, vader_33 сказал: его в тч считать скриптом? Так то да, я планировал считывать эти знания и при определенных условиях их менять. Но похоже что без правок движка не что не выйдет Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 30 мая, 2021 (изменено) Alex Kireev я наверно не так выразился, спрашивал, каким методом или свойством считать алкоголь скриптом. Не видел такого в тч. Знаю только, что алкоголь и сытость можно менять с ogsr движком, но не знаю насчет кровотечения. Попробуйте этот движок, может править в движке ничего не надо будет Изменено 30 мая, 2021 пользователем vader_33 В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Alex Kireev 18 Опубликовано 30 мая, 2021 26 минут назад, vader_33 сказал: спрашивал, каким методом или свойством считать алкоголь скриптом А, понятно 27 минут назад, vader_33 сказал: алкоголь и сытость можно менять с ogsr движком Ох, до движка я ещё не дошел, далеко, только начал изучать скрипты 28 минут назад, vader_33 сказал: Дополнено 0 минут спустя Как виджеты, цитаты удалять из комментариев с мобильной версией сайта? Дополнено 2 минуты спустя Про алкоголь так и не понял вопроса Алкоголь ГГ какой скрипт должен обратывать или какое свойство? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Askar 0 Опубликовано 31 мая, 2021 ребята подскажите пожалуйста как сделать чтобы гг после пробуждения сам что то случайным образом ел? Еда есть в рюкзаке и выбирается случайным образом из того что в нем есть Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ian98 243 Опубликовано 31 мая, 2021 Артефакты в игре спавнятся с самого начала. Часть из них прописана в файле all.spawn, но только часть. Так вот, интересно мне, а где же прописаны остальные? Знает кто? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BashyOne 301 Опубликовано 31 мая, 2021 2 минуты назад, ian98 сказал: но только часть Интересно, как ты это вообще определил? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ian98 243 Опубликовано 31 мая, 2021 Nick Proxy вскрыл аллспавн Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BashyOne 301 Опубликовано 31 мая, 2021 Бред какой-то. Все арты спавнятся только через спавн. Однако, они могу отличаться по координатам (в ТЧ куча проблем с аи-сеткой, из-за чего, при компиляции спавна, некоторые спавн-элементы могу съехать). 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ian98 243 Опубликовано 31 мая, 2021 Nick Proxy Ну, вот у меня спавн, файл alife_l03_agroprom, где целые поля этих артов, ничего нет по запросу section_name = af Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BashyOne 301 Опубликовано 31 мая, 2021 Самый лёгкий способ проверить наличие какого-то спавн объекта на локации - просмотр level.spawn (в папке с уровнем) У меня сразу нашёлся этот: af_dummy_battery agr_af_dummy_battery Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ian98 243 Опубликовано 31 мая, 2021 Nick Proxy НО он единственный, а там целые поля. Ночные звезды, медузы и каменные цветки, но где они? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BashyOne 301 Опубликовано 31 мая, 2021 Блин, реально. Самому аж интересно стало... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ian98 243 Опубликовано 31 мая, 2021 (изменено) Nick Proxy получается аномалии рожают)? Если да, то как управлять этим? Как я понял, вот аномальная зона, тут вроде радиация, а снизу что-то про количество артефактов, а что такое position_ofset могу только предположить по первому слову. Для меня это кракозябры. Я давно слышал, что арты из аномалий, но также давно я слышал, что это миф... ; cse_abstract properties section_name = zone_radioactive_average name = val_zone_radioactive_average_0001 position = -58.2888565063477, -1.92057704925537, -131.032012939453 direction = 0, 0, 0 id = 65535 version = 118 script_version = 6 spawn_id = 2536 ; cse_alife_object properties game_vertex_id = 880 distance = 23.799999 level_vertex_id = 108660 object_flags = 0xffffff3e ; cse_shape properties shapes = 1 shape_0:type = sphere shape_0:offset = 0,0,0 shape_0:radius = 4.41640090942383 ; cse_alife_space_restrictor properties restrictor_type = 3 ; cse_alife_custom_zone properties max_power = 0.0099999998 ; cse_alife_anomalous_zone properties offline_interactive_radius = 30 artefact_spawn_count = 32 artefact_position_offset = 0x3c32 Изменено 31 мая, 2021 пользователем ian98 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Alex Kireev 18 Опубликовано 31 мая, 2021 ian98 да, где то что аномалий рандомно поражают артефакты, некоторые артефакты прописаны в аллспавне, некоторые на карте. Так же можно сделать свои артефакты и их положение надо будет прописать в скрипте, указав функцию вызова, а в самой функции указать название артефакта и вектор его положения Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ian98 243 Опубликовано 31 мая, 2021 Alex Kireev Не понял, на какой карте? Аномалии рандомно все-таки рожают артефакты? И как этим управлять можно? Дополнено 30 минуты спустя Спойлер [zone_mosquito_bald] GroupControlSection = spawn_group_zone $spawn = "zones\mosquito bald" $prefetch = 16 class = ZS_MBALD hit_impulse_scale = 0.3;0.5 ;0.1 effective_radius = 0.85 ;размер радиуса в процентах от оригинального, где действует зона actor_blowout_radius_percent = 0.75 ef_anomaly_type = 1 ef_weapon_type = 13 sound = zone_mosquito_bald postprocess = mosquito_bald BirthProbability = 0.1 hit_type = strike ;----------- Anomaly settings ----------------------- min_start_power = 0.99 max_start_power = 1.00 attenuation = 1 period = 1 min_artefact_count = 0 max_artefact_count = 0 idle_particles = anomaly2\bold_idle blowout_particles = anomaly2\gravity_blast_01 hit_small_particles = hit_fx\hit_metal_02 hit_big_particles = anomaly2\gravity_damage_02_blood2 idle_small_particles = anomaly2\gravity_damage_01_smoke idle_big_particles = anomaly2\gravity_damage_02_smoke entrance_small_particles = anomaly2\gravity_entrance_small entrance_big_particles = anomaly2\gravity_entrance_big ;anomaly2\gravity_entrance_big idle_sound = anomaly\gravi_rumble1; ambient\fx2 ;постоянный звук blowout_sound = anomaly\anomaly_gravy_blast1; anomaly_gravy_blast01 ;во время выброса(удара) в центре аномалии hit_sound = anomaly\anomaly_gravy_hit1 ;на персонаже, когда тот получает хит entrance_sound = anomaly\anomaly_gravy_hit1 ;при попадании объекта в аномалию awaking_time = 50;100 blowout_time = 500 accamulate_time = 1000 ;10;200 blowout_light_time = 200 blowout_explosion_time = 200 blowout_particles_time = 200 blowout_sound_time = 100 disable_time = 5000 ;время игнорирования неживого объекта в зоне (-1 если не нужно) disable_time_small = 5000 ;время игнорирования маленького неживого объекта в зоне (-1 если не нужно) disable_idle_time = 100 ;время отключения idle партиклов ignore_nonalive = false ignore_small = true ignore_artefacts = true blowout_light = on light_color = 0.5,0.4,0.3 light_range = 30.0 light_time = 0.9;0.35 light_height = 1.5 ;подъем источника света на высоту idle_light = off visible_by_detector = on ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;рождение артефактов artefacts = af_medusa,0.7, af_cristall_flower, 0.25,af_night_star, 0.05 ;;во время срабатывания в online spawn_blowout_artefacts = on artefact_spawn_probability = 0.09 ;вероятность, что во время срабатывания аномалии будет рожден артефакт artefact_spawn_particles = anomaly2\pux_blast ;партиклы, которые отыграются на месте рождения артефакта (опционально) artefact_born_sound = anomaly\pux_blast ;звук, который отыграются на месте рождения артефакта (опционально) throw_out_power = 50 ;импульс с которым артефакт будет выброшен из зоны в произвольном направлении artefact_spawn_height = 3 ;(м) высота на центром зоны где будет рожден артефакт ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ветер blowout_wind = on blowout_wind_time_start = 0 blowout_wind_time_peak = 300 blowout_wind_time_end = 501; 899 blowout_wind_power = 0.5 ;сила поднимаего ветра (от 0 до 1), в момент blowout_wind_time_peak [zone_mosquito_bald_weak]:zone_mosquito_bald $spawn = "zones\mosquito bald_weak" awaking_time = 80;100 blowout_time = 500 hit_impulse_scale = 0.1 effective_radius = 0.65 actor_blowout_radius_percent= 0.6 artefacts = af_medusa,0.8, af_cristall_flower, 0.2,af_night_star, 0.0 BirthProbability = 0.1 spawn_blowout_artefacts = on ;----------- Anomaly settings ----------------------- min_start_power = 0.49 max_start_power = 0.5 attenuation = 1 period = 1 min_artefact_count = 0 max_artefact_count = 1 artefact_spawn_idle = 24 ;насколько часто спонить артефакты в офлайне, в часах artefact_spawn_rnd = 50 ;вероятность заспавнить артефакт в процентах. accamulate_time = 1000 ;10;200 ignore_nonalive = false ignore_small = false ignore_artefacts = true blowout_wind_power = 0.2 ; Не производящая артефактов слабая аномалия [zone_mosquito_bald_weak_noart]:zone_mosquito_bald_weak $spawn = "zones\mosquito bald_weak_noart" spawn_blowout_artefacts = off min_artefact_count = 0 max_artefact_count = 0 artefact_spawn_idle = 24 ;насколько часто спонить артефакты в офлайне, в часах [zone_mosquito_bald_average]:zone_mosquito_bald $spawn = "zones\mosquito bald_average" awaking_time = 50 blowout_time = 500 hit_impulse_scale = 0.2 effective_radius = 0.75 actor_blowout_radius_percent= 0.8 artefacts = af_medusa,0.6, af_cristall_flower, 0.4,af_night_star, 0.0 BirthProbability = 0.1 spawn_blowout_artefacts = on ;----------- Anomaly settings ----------------------- min_start_power = 1.19 max_start_power = 1.20 attenuation = 1 period = 1 min_artefact_count = 1 max_artefact_count = 1 artefact_spawn_idle = 24 ;насколько часто спонить артефакты в офлайне, в часах artefact_spawn_rnd = 70 ;вероятность заспавнить артефакт в процентах. accamulate_time = 1000 ;10;200 ignore_nonalive = false ignore_small = false ignore_artefacts = true blowout_wind_power = 0.5 [zone_mosquito_bald_strong]:zone_mosquito_bald $spawn = "zones\mosquito bald_strong" awaking_time = 30 blowout_time = 500 accamulate_time = 49 hit_impulse_scale = 0.2 effective_radius = 0.8 actor_blowout_radius_percent= 0.85 artefacts = af_medusa,0.2, af_cristall_flower, 0.6,af_night_star, 0.2 BirthProbability = 0.1 spawn_blowout_artefacts = on ;----------- Anomaly settings ----------------------- min_start_power = 1.99 max_start_power = 2.00 attenuation = 1 period = 1 min_artefact_count = 1 max_artefact_count = 2 artefact_spawn_idle = 24 ;насколько часто спонить артефакты в офлайне, в часах artefact_spawn_rnd = 90 ;вероятность заспавнить артефакт в процентах. accamulate_time = 1000 ;10;200 blowout_wind_power = 1 ; Не производящая артефактов слабая аномалия [zone_mosquito_bald_strong_noart]:zone_mosquito_bald_strong $spawn = "zones\mosquito_bald_strong_noart" spawn_blowout_artefacts = off min_artefact_count = 0 max_artefact_count = 0 artefact_spawn_idle = 24 ;насколько часто спонить артефакты в офлайне, в часах [zone_sarcofag] GroupControlSection = spawn_group_zone $spawn = "zones\sarcofag zone" $prefetch = 16 class = Z_MBALD hit_impulse_scale = 0.3;0.5 ;0.1 effective_radius = 0.85 ;размер радиуса в процентах от оригинального, где действует зона actor_blowout_radius_percent = 0.75 ef_anomaly_type = 1 ef_weapon_type = 13 sound = zone_mosquito_bald postprocess = mosquito_bald ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;рождение артефактов artefacts = BirthProbability = 0.0 spawn_blowout_artefacts = off hit_type = strike ;----------- Anomaly settings ----------------------- min_start_power = 1.69 max_start_power = 1.70 attenuation = 1 period = 1 min_artefact_count = 0 max_artefact_count = 0 idle_particles = anomaly2\bold_idle_sarkofag blowout_particles = anomaly2\bold_sarkofag_blast hit_small_particles = hit_fx\hit_metal_02 hit_big_particles = anomaly2\gravity_damage_02_blood2 idle_small_particles = anomaly2\gravity_damage_01_smoke idle_big_particles = anomaly2\gravity_damage_02_smoke entrance_small_particles = anomaly2\gravity_entrance_small entrance_big_particles = anomaly2\gravity_entrance_big ;anomaly2\gravity_entrance_big idle_sound = anomaly\gravi_rumble1; ambient\fx2 ;постоянный звук blowout_sound = anomaly\anomaly_gravy_blast1; anomaly_gravy_blast01 ;во время выброса(удара) в центре аномалии hit_sound = anomaly\anomaly_gravy_hit1 ;на персонаже, когда тот получает хит entrance_sound = anomaly\anomaly_gravy_hit1 ;при попадании объекта в аномалию awaking_time = 50;100 blowout_time = 500 accamulate_time = 1000 ;10;200 blowout_light_time = 200 blowout_explosion_time = 200 blowout_particles_time = 200 blowout_sound_time = 100 disable_time = 5000 ;время игнорирования неживого объекта в зоне (-1 если не нужно) disable_time_small = 5000 ;время игнорирования маленького неживого объекта в зоне (-1 если не нужно) disable_idle_time = 100 ;время отключения idle партиклов ignore_nonalive = false ignore_small = true ignore_artefacts = true blowout_light = on light_color = 0.5,0.4,0.3 light_range = 30.0 light_time = 0.9;0.35 light_height = 1.5 ;подъем источника света на высоту idle_light = off visible_by_detector = on artefact_spawn_probability = 0.00 ;вероятность, что во время срабатывания аномалии будет рожден артефакт artefact_spawn_particles = anomaly2\pux_blast ;партиклы, которые отыграются на месте рождения артефакта (опционально) artefact_born_sound = anomaly\pux_blast ;звук, который отыграются на месте рождения артефакта (опционально) throw_out_power = 50 ;импульс с которым артефакт будет выброшен из зоны в произвольном направлении artefact_spawn_height = 3 ;(м) высота на центром зоны где будет рожден артефакт ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ветер blowout_wind = off blowout_wind_time_start = 0 blowout_wind_time_peak = 300 blowout_wind_time_end = 501; 899 blowout_wind_power = 0.5 ;сила поднимаего ветра (от 0 до 1), в момент blowout_wind_time_peak Походу рождается часть артов через них. Если кто знает работают они или нет, отпишите, может их нет смысла ковырять и они не работают. Я просто четко слышал много раз, что в тч все арты через спавн Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 31 мая, 2021 (изменено) ian98 при распаковке оллспавна, есть такой файл section2.bin. Там прописаны координаты спавна артов (не сами арты), и по этим координатам уже спавнятся арты (в начале игры разовый спавн). Вроде редактируется только через sdk. Если память не изменяет, вот это в оллспавне у аномалий относится как раз к этому файлу 12 часов назад, ian98 сказал: artefact_spawn_count = 32 artefact_position_offset = 0x3c32 Это относительно полей артов на агро, не про респавн Дополнено 2 минуты спустя 13 часов назад, Askar сказал: как сделать чтобы гг после пробуждения сам что то случайным образом ел? Еда есть в рюкзаке и выбирается случайным образом из того что в нем есть в смысле, написать, куда надо что-то добавить, чтобы что-то сработало после пробуждения, и функция рандомного поедания уже есть, или именно функцию рандомного поедания еды? Изменено 31 мая, 2021 пользователем vader_33 1 В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Askar 0 Опубликовано 31 мая, 2021 43 минуты назад, vader_33 сказал: или именно функцию рандомного поедания еды? Да, не могу разобраться как её сделать, у меня есть таблица со списком продуктов, но что то не работает function to_eat() local medik_table = { [1] = "bread", [2] = "conserva", [3] = "kolbasa" } for k, v in pairs(medik_table) do local item = db.actor.object(v) if medic then db.actor:eat(item) return end end end Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 31 мая, 2021 (изменено) Askar без рандома просто поесть? Ошибки небольшие, надо так: Спойлер local medik_table = { [1] = "bread", [2] = "conserva", [3] = "kolbasa" } for k, v in pairs(medik_table) do local item = db.actor:object(v) if item then db.actor:eat(item) break end end можно в таблице не заморачиваться и не писать номера, вот так будет то же самое: local medik_table = { "bread", "conserva", "kolbasa" } то же, что и 1= bread, 2 = conserva А если нужно рандомное поедание - можно приспособить вот эту функцию https://ap-pro.ru/forums/topic/93-soc-modostroy-voprosnica/?do=findComment&comment=82734 Изменено 31 мая, 2021 пользователем vader_33 1 В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Askar 0 Опубликовано 31 мая, 2021 28 минут назад, vader_33 сказал: можно в таблице не заморачиваться и не писать номера Я это делал для рандома Спасибо попробую Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Alex Kireev 18 Опубликовано 1 июня, 2021 ian98 уже vader_33 ответил, по поводу координат. Я могу только добавить что часть артефактов рандомно образуются в аномалиях в момент перехода актера на новую локацию, а затем выбрасываются оттуда. На некоторых модах артефакты в момент ухода с локации удаляются с карт. 14 часов назад, ian98 сказал: Не понял, на какой карте? Я имел ввиду что в модах иногда используется так называемая карта артефактов. Это файл где вручную прописаны положения определенных артефактов. Его можно открыть блокнотом, но это только в модах, в игре сложнее и vader_33 уже ответил как и где это прописано 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Alex Kireev 18 Опубликовано 1 июня, 2021 Ребята профаны в lua подскажите пожалуйста Есть 3 функции: 1я срабатывает при достижении актера определенного порога здоровья и вызывает 2я функцию, 2я функции проверяет есть ли у актера медикаменты, если есть несколько типов медикаментов то вызывает 3ю функцию рандомного выбора медикаментов. 3я функция принимает 2 параметра 1й это секция предметов (в будущем будут не только медикаменты), 2й список пронумерованых аптечек и генерирует случайную аптечку, которую актер принимает вот как это я представляю function eat_rand() local medik_table = { [1] = "bread", [2] = "conserva", [3] = "kolbasa" } for k, v in pairs(medik_table) do local item = db.actor:object(v) if item then db.actor:eat(randome (medik_table)) end end end function randome() local section = medik_table local variable = medik_table local rnd = section [math.random(variable)] return rnd end Делал на примере выше, функция eat_rand() вызывается из файла бинд Сталкер. Дополнено 9 минуты спустя Забыл после db.actor:eat(randome (medik_table)) Стоит возврат результата То есть вот так должно быть db.actor:eat(randome (medik_table)) return Дополнено 11 минуты спустя Функции рандом принимает 2 параметра 1й это название секции, артефакты, еда, медикаменты, 2й колличество Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 1 июня, 2021 Alex Kireev нужно сначала перебрать предметы в инвентаре, потом уже рандомом выбирать (ссылку я скидывал). Иначе случится такая ситуация: рандомом выберется, например, консерва, а у актора её не будет, и игра вылетит. Поэтому через iterate_inventory сначала составить таблицу нужных предметов, которые есть у актора, и уже из неё рандомом выбирать. У вас в коде вот что происходит: есть просто таблица medik_table, в которой секции предметов, которые могут не быть у актора. Дальше идёт перебор таблицы, секции проверяются на наличие у актора. Вот попалась секция, которая есть у актора-и вызывается функция с рандомом, которая может вернуть секцию, которой нет у актора. То есть, в переборе таблицы нашлась существующая секция, а потом рандомно выбирается что-то другое. Тут или без рандома есть то, что попалось в переборе, или через iterate inventory делать рабочий рандом. Return нужен или если надо вернуть какую-то переменную или значение или оборвать исполнение функции, но у вас это конец функции, и обрывать нечего. Надо использовать break. Насчёт функции рандома в коде. В math.random должно быть число, а в коде variable - это таблица. Это на первый взгляд, с телефона вообще неудобно Дополнено 1 минуту спустя 2 часа назад, Alex Kireev сказал: Ребята профаны в lua подскажите Не, я, конечно, не скриптер, но за профана обидно немного) В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Alex Kireev 18 Опубликовано 1 июня, 2021 4 часа назад, vader_33 сказал: за профана обидно немного) Извини, не хотел обидеть, просто мои знания по сравнению с вашими на нуле. Спасибо за ответ на днях попробуй разобраться Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты