nuklia 0 Опубликовано 12 Февраля 2010 (изменено) Подскажите. как в логике эксклюзива сменить анимацию по мере приближения к нему Г.Г. (в ЗП) [logic@zat_a2_stalker_drunk] suitable = {=check_npc_name(zat_a2_stalker_drunk)} true trade = misc\trade\trade_zat_a2_barmen.ltx ;если не прописать - в руке водки не будет prior = 200 active = animpoint@drunk [animpoint@drunk] cover_name = zat_a2_sc_drunk reach_distance = 2 avail_animations = animpoint_stay_wall_drink_vodka ;бухает опершись на стену ;on_info = use_camp = false meet = meet out_restr = zat_a2_sr_noweap combat_ignore_cond = true combat_ignore_keep_when_attacked = true invulnerable = true gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false [meet] close_snd_hello = nil close_snd_bye = nil close_anim = nil close_victim = nil far_anim = nil far_victim = nil close_distance = 0 far_distance = 0 close_snd_distance = 3 abuse = false use = {=actor_enemy} false, true ;trade_enable = false allow_break = false meet_on_talking = false И еще чисто теоретический вопрос - можно-ли под ЗП запустить анимации от ЧН типа пьяного спящего на столе, блюющего опершись на стену или стреляющего лежа или из-за укрытия Если кого интересуют тачки - на плейграунде мод от Колмогора (подправили xr_game.dll) - теперь можно прокатиться. Изменено 12 Февраля 2010 пользователем nuklia Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 15 Февраля 2010 Если в олл_спавне его спавнить - то в кастомдату ему пихнуть чтото типа custom_data = <<END [spawner] [smart_terrains] none = true [logic] active = camper [camper] path_walk = wind_blokpost_camper1_walk path_look = wind_blokpost_camper1_look radius = 5 sniper = true END лучше логику написать отдельным файлом config\scripts\zaton\mu_nps_logic.ltx , а файл указать в секции чувака в олл_спавн - чтобы не перепаковывать для правки [logic] cfg = scripts\zaton\mu_nps_logic.ltx END Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 17 Февраля 2010 Посмотри логику ограбления на земснаряде [remark@robbery_artefact] ;Диалог ограбления target = story | actor anim = threat_na snd_anim_sync = true meet = meet@robbery on_info = {+zat_b14_robbery_give_artefact} walker@item on_info2 = {+zat_b14_robbery_not_give_artefact} remark@punch in_restr = zat_b14_not_give_item_zone wounded = wounded combat_ignore_cond = {!actor_enemy} true danger = danger_condition@go [remark@punch] ;Удар по морде и еще словесный плевок в морду или когда за Вано долг отдает. Два варианта развития событий по инфопоршням из диалога(больше не скажу - сам дуб) Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 20 Февраля 2010 (изменено) Vano_Santuri. У тебя нормальный АСДС. Если оригинальный алл.спавн туда-сюда компилится без этого лога то все ОК. перепакованный в СДК алл.спавн так-же себя ведет. но на работу не влияет. В американском моде то-же видел - они добавляли смарт-террейны - такие-же логи в течение распаковки. Пример спавна эксклюзивного чувака в смарт-террейне(ранее спрашивал - ответа не получил) может кому-нибудь интересно. Пример логики изменения анимации по дистанции от Г.Г и эксперименты с анимациями на разных скелетах (ТЧ и ЗП) Скрин здесь http://img705.imageshack.us/img705/7430/34zaton.jpg http://img42.imageshack.us/img42/9182/51zaton.jpg Файлы здесь http://www.sendspace.com/file/x67k8f Изменено 20 Февраля 2010 пользователем nuklia Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 20 Февраля 2010 XR_SOUNDS.SCRIPT в нем эти наборы собраны, a звуки в sounds/character_voise/human_nn/states/idle Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 22 Февраля 2010 Вопрос на засыпку! Кто нибудь пытался оживить Сидорыча в ЗП ? Я попытался - заспавнил только в виде скомканного мешка - а анимацию никак не могу запустить. В логику прописал anim_global = анимацию из скрипта mob_trader и скрипт соответственно сунул из ЧН. Свой файл логики в ЧН пробовал - работает. Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 24 Февраля 2010 Smart_terrain - это место создания гулага - стоянки сталкегов, базы и т.п. Smart_cover - определенная работа в гулаге с начальной анимацией - типа avail animation = sit_low - сидеть низко, stay_wall - стоя опереться на стену и т.п. Поищи в гугле статьи - Смартеррейны и гулаги — S.T.A.L.K.E.R. Inside Wiki Настройка логики. Часть 1 — S.T.A.L.K.E.R. Inside Wiki WETER Попробуй так [logic] active = sr_crow_spawner [sr_crow_spawner] max_crows_on_level = 2 spawn_path = jup_crow_spawn_1 А если уж совсем достанут то удали эту секцию из олл_спавна, а для развода пропиши несколько ворон по типу олл.спавна ТЧ. Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 26 Февраля 2010 Выше выкладывал пример спавна эксклюзивного чувака в смарттеррейне стр 54 от 20.2 2010 г. Там файлы - необходимые для создания нового чувака - 20 метров. Одним росчерком пера это не получится - надо читать статьи, рыть и смотреть как это у других сделано. Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 1 Марта 2010 (изменено) Сбегай до блокпоста и обратно - появятся. Укрытия от выброса - surge_hide. А вообще немного потерпи - выложу доработанную штуку в теме по добавлению локаций - там и будем практиковаться заселять, кому интересно. Строгое предупреждение от модератора Halford Все же лучше удержатся. Изменено 1 Марта 2010 пользователем Halford Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 4 Марта 2010 (изменено) зомбакам присвоить текстуры доместоса Cамый простой способ - открыть модель в НЕХ-редакторе, notepad++ к примеру stalker_zombied_1.ogf, найти там имя текстуры - в этой модели act_stalker_neutral_1 - и изменить имя текстуры не нарушая колличество букв (neutral ->naadral) a уже самой текстуре, которую надо напялить, присвоить это имя. Можно еще через СДК в Actor_editor переназначить текстуру модели, предварительно конвертировав ее в формат OBJECT, а затем опять в OGF. прописать неписю безопасный путь прохождения Прописать ему логику [logic] active = walker [walker] path_walk = имя точек пути через минное поле Точки пути записать в распакованном all.spawn в файле way_локация.ltx почитать статью - Логика НПС. Изменено 4 Марта 2010 пользователем nuklia Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 5 Марта 2010 Спавн НПС через All.spawn Перед сборкой удалите комментарии [7152] ; cse_abstract properties section_name = stalker name = gamer position = 243.661834716797,16.4937133789063,506.856964111328 direction = 0,0,0 version = 0x7c script_version = 8 ; cse_alife_trader_abstract properties money = 5000 character_profile = sim_default_stalker_4 ; профиль описан в character_desc_general.xml cse_alife_trader_abstract__unk1_u8 = 6 ; cse_alife_object properties game_vertex_id = 52429 distance = 1.15511835011223e-040 direct_control = 416481280 level_vertex_id = 4290707477 object_flags = 0x203bffff custom_data = <<END [smart_terrains] none = true ; принадлежность к гулагу - ни в один не пойдет [spawn] ; что у него в рюкзаке bread kolbasa wpn_pb ammo_9x18_fmj hand_radio medkit vodka wpn_vintorez wpn_pkm [logic] cfg = scripts\zaton\stalker_gamer.ltx ;логика поведения здесь [task_manager] reward = stalker [spawner] cond = true ;здесь ставить условия для спавна END ; cse_visual properties visual_name = actors\stalker_neutral\stalker_neutral_1 ; без разници - какой визуал - читает из character_desc_general.xml ; cse_alife_creature_abstract properties g_team = 0 g_squad = 0 g_group = 0 health = 1 dynamic_out_restrictions = dynamic_in_restrictions = upd:health = 1 upd:timestamp = 0 upd:creature_flags = 0 upd:position = 243.661834716797,16.4937133789063,506.856964111328 upd:o_model = 0 upd:o_torso = 0,0,0 upd:g_team = 0 upd:g_squad = 0 upd:g_group = 0 ; 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 = 1,1,1,0,2 predicate4 = 0,1,0,1 ; cse_ph_skeleton properties upd:start_dialog = ; se_stalker properties расставить точки пути [gamer_1_look] points = p0,p1,p2 p0:name = name00|a=hide p0:flags = 0x2 p0:position = 239.727722167969,14.4487590789795,499.2287769317627 p0:game_vertex_id = 6 p0:level_vertex_id = 1375126 p1:name = name01|a=hide p1:flags = 0x1 p1:position = 235.727722167969,14.4487590789795,499.2287769317627 p1:game_vertex_id = 6 p1:level_vertex_id = 1375126 p2:name = name02|a=hide p2:flags = 0x1 p2:position = 230.727722167969,14.4487590789795,499.2287769317627 p2:game_vertex_id = 6 p2:level_vertex_id = 1375126 [gamer_1_walk] points = p0,p1,p2,p3,p4 p0:name = name00 p0:position = 239.727722167969,14.4487590789795,499.2287769317627 p0:game_vertex_id = 6 p0:level_vertex_id = 1375126 p0:links = p1(1) p1:name = name01|a=sneak|t=300 p1:position = 230.727722167969,14.4487590789795,494.2287769317627 p1:game_vertex_id = 6 p1:level_vertex_id = 1359863 p1:links = p2(1) p2:name = name02 p2:position = 223.727722167969,14.4487590789795,486.2287769317627 p2:game_vertex_id = 6 p2:level_vertex_id = 1346067 p2:links = p3(1) p3:name = name03|a=raid p3:position = 222.727722167969,14.4487590789795,479.2287769317627 p3:game_vertex_id = 6 p3:level_vertex_id = 1344790 p3:links = p4(1) p4:name = name04 p4:position = 245.727722167969,14.4487590789795,493.2287769317627 p4:game_vertex_id = 6 p4:level_vertex_id = 1386371 p4:links = p0(1) написать логику [logic] active = camper [camper] path_walk = gamer_1_walk path_look = gamer_1_look radius = 5 sniper = true Вот только все это подходит ко всякого рода неразговорчивым часовым и постовым - если в логике прописать [meet] вылетит при вопросе - "чем занимаешься" Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 7 Марта 2010 (изменено) При прекомпиляции в ЛЕ создается файл build.aimap в level_editor\gamedata\levels\marsh. После этого придется пройти все пути компиляции аи-сетки, левел-графов, гейм-графов, олл-спавна и апгрейда 3502. Но боюсь что толку не будет - аи сетки и так нормальные. А локацию чем добавляли - в СДК или прогр. от АМК ? Изменено 7 Марта 2010 пользователем nuklia Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 10 Марта 2010 чем вызвать голос непися? Диалоги в ЗП озвучиваются так-же как и в ТЧ. Фразы встречи и прощания прописываются в логике: [meet] close_snd_hello = zat_a2_stalker_barmen_greeting ;-привет close_snd_bye = zat_a2_stalker_barmen_farewell ;-прощай А чтобы озвучить фразы диалога - надо создать звуковые файлы с тем-же именем с расширением ogg в gamedata\sounds\characters_voice\dialogs\ т.е. если фраза в gamedata\configs\gameplay\dialogs_zaton.ltx к примеру - <text>zat_a2_linker_b14_quest_init_1</text> - задание бармена на земснаряд - то и звуковой файл у вас должен быть создан - gamedata\sounds\characters_voice\dialogs\zat_a2_linker_b14_quest_init_1.ogg Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 11 Марта 2010 SDR-team ! Проверял - и бармену и Гонте и торговцу вставлял - прекрасно озвучиваются. Г.Г. не озвучивается. Попробуй на чистой игре. Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 12 Марта 2010 PavelSnork Если он по логике в смарткавере - то меняй дирекшн смарткавера в all.spawn. Если в логике path_walk, path_look то смотрит на точку path_look. SDR-team Похоже что твой НПС не подключился к логике. Скорее всего не прописан эксклюзивом в смарте - где файл его логики прописывается - хотя диалог все равно должен быть. Попробуй ему прописать сначала диалоги существующих, бармена к примеру в характер-деск-ххх. Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 14 Марта 2010 Народ ! Может кто сталкивался с проблемой - дополнительно заспавнеенные через смарты эксклюзивы с логикой уходят в оффлайн после того как от них далеко уходишь, а когда возвращаешся - их и след простыл - не появляются на месте. Чем их выковыривать ? Пытался условие прописать - "у актора предмет/телепортировать нпс на точку пути" - не помогло. Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 15 Марта 2010 alexwew В ЗП симулянты спавнятся не по одиночке а группами (сквадами), выше уже писали - можно уменьшить размер группы до одного. В configs\misc\squad_descr.ltx прописывай всем npc_in_squad = 1,1 тогда групп не будет, а будут поодиночке ходить только одни командиры. Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 16 Марта 2010 (изменено) юзай IDA,копай xrGame.dll IDA freware 4.3 подойдет ? А литературу какую посоветуете, чтобы разобраться в том, что получается после дизассемблирования в IDA ? Изменено 16 Марта 2010 пользователем nuklia Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 24 Марта 2010 (изменено) В теме "[CoP] Перенос и создание карт " на первых страницах этот вопрос обсуждали (thm стр.- 4 15.2.2010, 12:30 ). Изменено 24 Марта 2010 пользователем nuklia Поделиться этим сообщением Ссылка на сообщение
nuklia 0 Опубликовано 25 Марта 2010 (изменено) Создание укрытия от выброса на добавленной локации - surge_hide : Пропишем нужному нам смарт-терейну укрытие [esc_sim_13]:default surge = 1 ; прописали возможность укрытия territory = 1 sim_avail = true Регистрируем наше укрытие ;escape esc_surge_hide_sim_13 Зарегистрируем нашу локацию в скриптах --'****************************************************** --'* Реестр смарт-террейнов. Игровое поле симуляции. --'****************************************************** --' В этом ltx хранятся дескрипторы сквадов. squad_ltx = system_ini() setting_ini = ini_file("misc\\simulation.ltx") local group_id_by_levels = {zaton = 1, pripyat = 2, jupiter = 3, labx8 = 4, jupiter_underground = 5, escape = 6} строка 1196 function surge_stats() local sim_obj_registry = simulation_objects.get_sim_obj_registry().objects local sim_squads = { ["zaton"] = {}, ["jupiter"] = {}, ["pripyat"] = {}, ["escape"] = {} } local sim_smarts = { ["zaton"] = {}, ["jupiter"] = {}, ["pripyat"] = {}, ["escape"] = {} } строка 1241 print_smarts_and_squads_by_level("zaton") print_smarts_and_squads_by_level("jupiter") print_smarts_and_squads_by_level("pripyat") print_smarts_and_squads_by_level("escape") строка 38 self.levels_respawn = {zaton = false, jupiter = false, pripyat = false, escape = false} строка 194 xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_after_surge") elseif(level.name()=="jupiter") then xr_sound.set_sound_play(db.actor:id(), "jup_a6_stalker_medik_after_surge") elseif not has_alife_info("pri_b305_fifth_cam_end") then xr_sound.set_sound_play(db.actor:id(), "pri_a17_kovalsky_after_surge") elseif(level.name()=="escape") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_after_surge") строка 249 if(level.name()=="zaton") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_surge_phase_2") elseif(level.name()=="jupiter") then xr_sound.set_sound_play(db.actor:id(), "jup_a6_stalker_medik_phase_2") elseif not has_alife_info("pri_b305_fifth_cam_end") then xr_sound.set_sound_play(db.actor:id(), "pri_a17_kovalsky_surge_phase_2") elseif(level.name()=="escape") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_surge_phase_2") строка 273 if(level.name()=="zaton") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_surge_phase_1") elseif(level.name()=="jupiter") then xr_sound.set_sound_play(db.actor:id(), "jup_a6_stalker_medik_phase_1") elseif not has_alife_info("pri_b305_fifth_cam_end") then xr_sound.set_sound_play(db.actor:id(), "pri_a17_kovalsky_surge_phase_1") elseif(level.name()=="escape") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_surge_phase_1") строка 329 self.levels_respawn = {zaton = true, jupiter = true, pripyat = true, escape = true} строка 352 self.levels_respawn = {zaton = true, jupiter = true, pripyat = true, escape = true} строка 638 packet:w_bool(self.levels_respawn.zaton) packet:w_bool(self.levels_respawn.jupiter) packet:w_bool(self.levels_respawn.pripyat) packet:w_bool(self.levels_respawn.escape) строка 665 self.levels_respawn.zaton = packet:r_bool() self.levels_respawn.jupiter = packet:r_bool() self.levels_respawn.pripyat = packet:r_bool() self.levels_respawn.escape = packet:r_bool() переходим к олл.спавн - создаем секцию укрытия [xxxx] ; cse_abstract properties section_name = space_restrictor name = esc_surge_hide_sim_13 position = -11.2279901504517,2.46390247344971,57.3380393981934 direction = 0,0,0 version = 0x7c script_version = 8 ; cse_alife_object properties game_vertex_id = 934 distance = 0 level_vertex_id = 3366 object_flags = 0xffffff3e ; cse_shape properties shapes = shape0 shape0:type = box shape0:axis_x = 3.27519989013672,0,0 shape0:axis_y = 0,5.44060039520264,0 shape0:axis_z = 0,0,7.41159915924072 shape0:offset = 0,0,0 ; cse_alife_space_restrictor properties restrictor_type = 0 Создаем точки пути по колличеству мест в укрытии [esc_sim_13_surge_1_look] points = p0 p0:name = name00 p0:position = -11.0934257507324,2.45600557327271,56.0012626647949 p0:game_vertex_id = 1051 p0:level_vertex_id = 286804 [esc_sim_13_surge_1_walk] points = p0 p0:name = name00 p0:position = -12.587254524231,2.45982217788696,54.6062545776367 p0:game_vertex_id = 1051 p0:level_vertex_id = 284937 [esc_sim_13_surge_2_look] points = p0 p0:name = name00 p0:position = -11.7026491165161,2.45731353759766,55.4043731689453 p0:game_vertex_id = 1051 p0:level_vertex_id = 285862 [esc_sim_13_surge_2_walk] points = p0 p0:name = name00 p0:position = -11.7085494995117,2.45401954650879,54.6906051635742 p0:game_vertex_id = 1051 p0:level_vertex_id = 285861 [esc_sim_13_surge_3_look] points = p0 p0:name = name00 p0:position = -11.700403213501,2.46191310882568,55.9261016845703 p0:game_vertex_id = 1051 p0:level_vertex_id = 285863 [esc_sim_13_surge_3_walk] points = p0 p0:name = name00 p0:position = -10.5211238861084,2.45401906967163,54.5706977844238 p0:game_vertex_id = 1051 p0:level_vertex_id = 287736 [esc_sim_13_surge_4_look] points = p0 p0:name = name00 p0:position = -12.1378507614136,2.46710777282715,55.9775772094727 p0:game_vertex_id = 1051 p0:level_vertex_id = 285863 [esc_sim_13_surge_4_walk] points = p0 p0:name = name00 p0:position = -12.5659475326538,2.4704270362854,55.9364585876465 p0:game_vertex_id = 1051 p0:level_vertex_id = 284939 [esc_sim_13_surge_5_look] points = p0 p0:name = name00 p0:position = -11.3268537521362,2.45915699005127,56.0716171264648 p0:game_vertex_id = 1051 p0:level_vertex_id = 286804 [esc_sim_13_surge_5_walk] points = p0 p0:name = name00 p0:position = -11.4233283996582,2.45504951477051,55.4901466369629 p0:game_vertex_id = 1051 p0:level_vertex_id = 286803 [esc_sim_13_surge_6_look] points = p0 p0:name = name00 p0:position = -11.951548576355,2.46743059158325,56.5034790039063 p0:game_vertex_id = 1051 p0:level_vertex_id = 285864 [esc_sim_13_surge_6_walk] points = p0 p0:name = name00 p0:position = -10.5399560928345,2.45401906967163,55.9832763671875 p0:game_vertex_id = 1051 p0:level_vertex_id = 287738 [esc_sim_13_surge_7_look] points = p0 p0:name = name00 p0:position = -11.060601234436,2.46146583557129,56.6575355529785 p0:game_vertex_id = 1051 p0:level_vertex_id = 286805 [esc_sim_13_surge_7_walk] points = p0 p0:name = name00 p0:position = -12.5727767944336,2.47284889221191,57.334114074707 p0:game_vertex_id = 1051 p0:level_vertex_id = 284941 [esc_sim_13_surge_8_look] points = p0 p0:name = name00 p0:position = -11.7709636688232,2.46654939651489,57.2202682495117 p0:game_vertex_id = 1051 p0:level_vertex_id = 285865 [esc_sim_13_surge_8_walk] points = p0 p0:name = name00 p0:position = -11.6660528182983,2.4660382270813,56.7951736450195 p0:game_vertex_id = 1051 p0:level_vertex_id = 285864 [esc_sim_13_surge_9_look] points = p0 p0:name = name00 p0:position = -11.4014568328857,2.4647479057312,57.3022918701172 p0:game_vertex_id = 1051 p0:level_vertex_id = 286806 [esc_sim_13_surge_9_walk] points = p0 p0:name = name00 p0:position = -10.5875377655029,2.46077871322632,57.3240737915039 p0:game_vertex_id = 1051 p0:level_vertex_id = 287740 [esc_sim_13_surge_10_look] points = p0 p0:name = name00 p0:position = -12.009449005127,2.47024631500244,58.7685432434082 p0:game_vertex_id = 1051 p0:level_vertex_id = 285867 [esc_sim_13_surge_10_walk] points = p0 p0:name = name00 p0:position = -12.5359506607056,2.47053003311157,58.6904754638672 p0:game_vertex_id = 1051 p0:level_vertex_id = 284943 [esc_sim_13_surge_11_look] points = p0 p0:name = name00 p0:position = -11.6696643829346,2.47010707855225,58.7928047180176 p0:game_vertex_id = 1051 p0:level_vertex_id = 285867 [esc_sim_13_surge_11_walk] points = p0 p0:name = name00 p0:position = -11.7617807388306,2.47143888473511,58.0255508422852 p0:game_vertex_id = 1051 p0:level_vertex_id = 285866 [esc_sim_13_surge_12_look] points = p0 p0:name = name00 p0:position = -11.1556959152222,2.46973323822021,58.9260101318359 p0:game_vertex_id = 1051 p0:level_vertex_id = 286808 [esc_sim_13_surge_12_walk] points = p0 p0:name = name00 p0:position = -10.5822420120239,2.46985769271851,58.7564964294434 p0:game_vertex_id = 1051 p0:level_vertex_id = 287742 Изменено 25 Марта 2010 пользователем nuklia Поделиться этим сообщением Ссылка на сообщение