AndrewMor 530 Опубликовано 26 Октября 2014 Прошу помощи. На Агро Крот уходит в оффлайн по выдаче определенного поршня. Я условие закомментировал, теперь он постоянно в онлайне. Но мне хочется, чтобы он уходил на Свалку. Вот секция логики: [walker@well3] path_walk = agr_krot_well_walkpath_look = agr_krot_well_lookmeet = meet@well2on_info = {!actor_enemy +agr_find_gunslinger_cache_found} walker@well4combat_ignore_cond = {!actor_enemy !fighting_actor}danger = danger_condition[walker@well4]path_walk = gar_krot_well_walkpath_look = gar_krot_well_lookmeet = meet@well2combat_ignore_cond = {!actor_enemy !fighting_actor}danger = danger_condition Но проблема в том, что он не хочет идти на Свалку, а прется севернее фабрики на Агро и там остается. Хотя координаты указаны правильные. Но если указать какую-нибудь точку на Агро - он туда идет без проблем. Почему так? Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 27 Октября 2014 Вопрос: если в секции НПС указан смарт [smart_terrain] none = true можно ли его приписать к какому-нибудь другому смарту при выдаче инфорпоршня? Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 27 Октября 2014 А почему сам не попробуешь сделать примерно так: То есть, если сделать так: [smart_terrains] none = {-agr_find_gunslinger_cache_found} gar_angar = {+agr_find_gunslinger_cache_found} то искомый перс пойдет в другой гулаг? А как мне его на конкретную точку посадить? Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 27 Октября 2014 (изменено) В смарте есть гулаг. У гулага есть конфиг. В конфиге есть работы. У работы есть путь. Вот в первую точку этого пути непись и бежит. В том-то и дело, что мне не хочется его под смарт пихать. Хотелось его с одной локи на другую по поршню пересадить. Ну, можно извратиться с CALifeSmartTerrainTask() - писал уже. Но это - dirty hack. Причем логику придется прописывать нетривиально, а все переключения всего делать отдельным скриптом. dc Изменено 27 Октября 2014 пользователем Dennis_Chikin Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 27 Октября 2014 (изменено) Тогда пояните, кто-нибудь (если вопросы нубские - сильно не бейте): 1. есть смарт, есть гулаг и в нем свободная работа. Если к этому смарту ни один НПС не приписан - работа будет свободна, или другой НПС на нее придет? Идея такая: заспавнить смарт-террейн, в гулаге прописать одного волкера, а в секции [smart_terrains] написать: [smart_terrains] none = {-agr_find_gunslinger_cache_found} gar_angar = {+agr_find_gunslinger_cache_found} Так вот этот перс до выдачи поршня будет под СВОЕЙ логикой, прописанной в конфиге, а по выдаче поршня пойдет на работу в указанный гулаг, или нет? Или на эту работу придет любой другой НПС? В gar_angar для работы, зарезервированной под непися, прописать предикат. dc Изменено 27 Октября 2014 пользователем Dennis_Chikin Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 27 Октября 2014 (изменено) В gar_angar для работы, зарезервированной под непися, прописать предикат. dc Что есть предикат? Это в имя_локи.скрипт надо прописывать? И как? Если можно, примерчик.. Хрестоматийный пример из gulag_escape.script: if type == "esc_lager" then ... -- Волк, собственной персоной. t = { section = "logic@esc_lager_volk", idle = 0, prior = 16, state = {0,1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone", predicate = function(obj_info) return obj_info.profile_name == "esc_wolf" end } Кроме него эту работу ни кто не займет. dc Изменено 27 Октября 2014 пользователем Dennis_Chikin Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 28 Октября 2014 По перемещению Крота на Свалку. Вроде все сделал, как советовали. Но на Свалку Крот идти не хочет, ошивается в комплексе. Почему? Секция спавна Крота: ; cse_abstract properties section_name = stalkername = agr_krotposition = 36.3475799560547, 2.50003337860107, -14.4879312515259direction = -3.63589037988277e-007, 0, 0id = 65535version = 118script_version = 6; cse_alife_trader_abstract propertiesmoney = 5000character_profile = agr_krot; cse_alife_object propertiesgame_vertex_id = 663distance = 9.0999994level_vertex_id = 274908object_flags = 0xfffffeffcustom_data = <<END;[spawner];cond = {-agr_find_gunslinger_cache_found}[logic]cfg = scripts\agr\agr_krot.ltx[smart_terrains]none = {-freeplay}gar_ost = {+freeplay}[known_info]agr_krot_secret_infoENDstory_id = 302; cse_visual propertiesvisual_name = actors\neytral\stalker_neytral_rukzak_4; cse_alife_creature_abstract propertiesg_team = 0g_squad = 3g_group = 1health = 2dynamic_out_restrictions =dynamic_in_restrictions =; cse_alife_monster_abstract propertiesequipment_preferences = 0, 1, 0, 2, 2main_weapon_preferences = 2, 2, 0, 1; cse_ph_skeleton properties; se_stalker propertiesupd:health = 2upd:timestamp = 0upd:creature_flags = 0upd:position = 36.3475799560547, 2.50003337860107, -14.4879312515259upd:g_squad = 3upd:g_group = 1; cse_alife_human_stalker propertiesupd:start_dialog = Его логика из чистой игры: [logic]active = walker@holdcombat_ignore = combat_ignoreon_death = death[walker@hold]path_walk = agr_krot_hold_fake_walkpath_look = agr_krot_hold_fake_lookcombat_ignore_cond = {!actor_enemy !fighting_actor}meet = meet@holdon_info = {!actor_enemy +agr_krot_skirmish_start} walker@combaton_info2 = {!actor_enemy +agr_help_stalkers_done} walker@hold2danger = danger_condition[walker@hold2]path_walk = agr_krot_hold_fake_walkpath_look = agr_krot_hold_fake_lookcombat_ignore_cond = {!actor_enemy !fighting_actor}meet = meet@holdon_info = {!actor_enemy +agr_krot_skirmish_start} walker@combaton_timer = 30000 |{!actor_enemy} %+agr_krot_skirmish_start%danger = danger_condition[meet@hold]meet_state = 0 | hide_na@speech1meet_state_wpn = 0 | hide_na@speech1victim = actorvictim_wpn = actoruse = trueuse_wpn = truemeet_dialog = agr_krot_help[walker@combat]path_walk = agr_krot_hold_fake_walkpath_look = agr_krot_hold_fake_lookon_info = {!actor_enemy =agr_factory_hold_inactive} %+agr_help_krot_done% walker@wait_after_hold;on_info = {+agr_help_krot_done +agr_help_stalkers_done} walker@wait_after_hold, {+agr_help_krot_done +agr_help_stalkers_assault_dead} walker@wait_after_holdmeet = meet@no_use;danger = {+agr_help_krot_done +agr_help_stalkers_assault_dead} danger_condition@combatdanger = danger_conditioncombat_ignore_cond = {!actor_enemy !fighting_actor}on_actor_dist_le = 8 | {!actor_enemy} remark@hold2[remark@hold2]anim = guardsnd = agr_krot_feartarget = actoron_info = {=actor_enemy} walker@combat_2on_signal = sound_end | walker@combat_2combat_ignore_cond = {!actor_enemy !fighting_actor}danger = danger_condition[walker@combat_2]path_walk = agr_krot_hold_fake_walkpath_look = agr_krot_hold_fake_look_2on_info = {=agr_factory_hold_inactive !actor_enemy} %+agr_help_krot_done% walker@wait_after_holdmeet = meet@no_usedanger = danger_conditioncombat_ignore_cond = {!actor_enemy !fighting_actor}[walker@wait_after_hold]path_walk = agr_krot_hold_walkpath_look = agr_krot_hold_lookmeet = no_meetcombat_ignore_cond = {!actor_enemy !fighting_actor}on_actor_dist_le_nvis = 5 |{!actor_enemy} %+agr_krot_met% remark@thankon_info = {=actor_enemy -agr_factory_spawn_spetsnaz} %+agr_factory_spawn_spetsnaz%danger = danger_condition[meet@wait_after_hold]meet_state = 10 | hello_wpn@talk_hellomeet_state_wpn = 10 | hello_wpn@talk_hellovictim = 10 | actorvictim_wpn = 10 | actoruse = falseuse_wpn = false[remark@thank]snd = speechon_signal = sound_end | %+agr_krot_go_to_well +agr_factory_spawn_spetsnaz% walker@go_to_wellanim = guardcombat_ignore_cond = {!actor_enemy !fighting_actor}target = actordanger = danger_conditionon_info = {=actor_enemy} walker@wait_after_holdmeet = no_meet[walker@go_to_well]path_walk = agr_krot_to_well_walkdef_state_moving1 = assaultdef_state_moving2 = assaultdef_state_moving3 = assaulton_signal = well | {!actor_enemy} walker@welldanger = danger_conditioncombat_ignore_cond = {!actor_enemy !fighting_actor}meet = no_meet[walker@well]path_walk = agr_krot_well_walkpath_look = agr_krot_well_lookmeet = no_meeton_actor_dist_le = 5 |{!actor_enemy} remark@thanks_2 ;%+agr_find_gunslinger_cache_start%combat_ignore_cond = {!actor_enemy !fighting_actor}danger = danger_condition[remark@thanks_2]anim = guardsnd = agr_krot_thanks_2target = actoron_signal = sound_end | walker@well2danger = danger_conditionmeet = no_meetcombat_ignore_cond = alwayson_info = {=actor_enemy} walker@wait_after_hold[walker@well2]path_walk = agr_krot_well_walkpath_look = agr_krot_well_lookmeet = meet@wellon_info = {!actor_enemy +agr_find_gunslinger_cache_start} walker@well3combat_ignore_cond = {!actor_enemy !fighting_actor}danger = danger_condition[walker@well3]path_walk = agr_krot_well_walkpath_look = agr_krot_well_lookmeet = meet@well2combat_ignore_cond = {!actor_enemy !fighting_actor}danger = danger_condition[meet@well]meet_state = 30|hello@wait|15|wait@wait|5|waitmeet_state_wpn = 30|hello@wait|15|wait@wait|5|waitvictim = 30 | actorvictim_wpn = 30 | actoruse = trueuse_wpn = truemeet_dialog = agr_factory_krot_start[meet@well2]meet_state = 30|hello@wait|15|wait@wait|5|waitmeet_state_wpn = 30|hello@wait|15|wait@wait|5|waitvictim = 30 | actorvictim_wpn = 30 | actoruse = trueuse_wpn = true[meet@no_use]use = falseuse_wpn = falseabuse = false[death]on_info = %+agr_krot_dead +sar2_death_19%[known_info]agr_krot_secret_info[danger_condition]ignore_distance = 0[danger_condition@combat]danger_expiration_time = 9000danger_inertion_time = 9000ignore_distance_corpse = 0 Новый смарт на Свалке: ; cse_abstract propertiessection_name = smart_terrainname = gar_ostposition = 18.255748748779,0.4110446870327,-16.711252212524direction = 0, 0, 0id = 65535version = 118script_version = 6; cse_alife_object propertiesgame_vertex_id = 293level_vertex_id = 191002object_flags = 0xffffff3ecustom_data = <<END[smart_terrain]type = gar_ostcapacity = 1cond = {+freeplay}END; cse_shape propertiesshapes = 1shape_0:type = sphereshape_0:offset = 0,0,0shape_0:radius = 1; cse_alife_space_restrictor propertiesrestrictor_type = 3; se_smart_terrain properties Секции в gulag_garbage.script: if type == "gar_ost" thent = { section = "logic@gar_ost_post1",idle = 0,prior = 10, state = {0},in_rest = "", out_rest = "",predicate = function(obj_info)return obj_info.profile_name == "agr_krot"end}table.insert(sj, t)endif type == "gar_ost" thenreturn function(gulag)return 0endendif gulag_type == "gar_ost" thenreturn npc_community == "stalker"end Секции в gulag_garbage.ltx: [logic@gar_ost_post1]active = walker@gar_ost_post1[walker@gar_ost_post1]path_walk = post1_walkpath_look = post1_look waypoint'ы в way_l02_garbage.ltx: [gar_ost_post1_walk]points = p0p0:name = wp00p0:flags = 0x1p0:position = 18.255748748779,0.4110446870327,-16.711252212524p0:game_vertex_id = 293p0:level_vertex_id = 191002[gar_ost_post1_look]points = p0p0:name = wp00|a=sit_assp0:flags = 0x1p0:position = 11.646841049194,0.29557731747627,-12.039144515991p0:game_vertex_id = 293p0:level_vertex_id = 185183 Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 3 Ноября 2014 (изменено) [smart_terrain] type = gar_ost capacity = 1 cond = {+freeplay} Ну и где этот самый freeplay выдается ? Этот самый freeplay выдается вручную, для проверки. путь напиши, и проверь существующие. Написать - в каком смысле? А существующие пути вроде правильны. Или их надо в way_l03_agroprom.ltx прописывать? Изменено 3 Ноября 2014 пользователем AndrewMor Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 3 Ноября 2014 Зачем оно вообще в смарте ? Крот должен пойти под этот смарт после выдачи поршня. До его выдачи он должен быть под своей сюжетной логикой. Если убрать все переключения отовсюду, крота сразу прописать эксклюзивом в смарт, он с начала игры в него пойдет ? Не проверял, поэтому не знаю. Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 14 Декабря 2014 Всем привет!)) Подскажите, если не сложно, что нужно прописать в логику заспавненному через скрипт НПС, который принадлежит к враждебной ГГ группировке (например, бандиты), чтобы в дальнейшем можно было вступить с ним диалог (т.е. чтобы не кидался на ГГ раньше времени). Прописывала "combat_ignore_cond = always", похоже это не то, что нужно(( Пропиши "combat_ignore_cond = {-имя_твоего_поршня =fighting_actor} и с врагами можно говорить, если конечно, у них прописан хоть один диалог. А когда надо будет, чтобы они стреляли, выдай этот твой поршень - и все. Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 16 Декабря 2014 (изменено) Кто может подсказать, в чем дело.Ставлю метку на рестриктор через нажатие кнопки в главном меню, все прекрасно работает, метка ставится. function test() local obj = alife():object( "generators_mess_doc_2" ) if obj then level.map_add_object_spot_ser(obj.id, "find_item_location", "Неизвестный КПК") endend Пытаюсь сделать то же самое, вызвав функцию в xr_effects из рестриктора:function end_peleng() local obj = alife():object( "generators_mess_doc_2" ) if obj then level.map_add_object_spot_ser(obj.id, "find_item_location", "Неизвестный КПК") end amk.g_start_timer("pel",0, 0, 3)end метка не ставится, хоть убей, хотя таймер прекрасно отрабатывает. Пробовал в функцию таймера совать сии строки - не работают. Все остальные - работают, а эти -нет. Кто подскажет, в чем дело?Вывести в лог что-нибудь сразу после if obj thendc Изменено 16 Декабря 2014 пользователем Dennis_Chikin Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 20 Декабря 2014 (изменено) Подскажите, кто знает, каким образом можно отловить момент обыска конкретного трупа? Если в биндере - то в какой функции?xr_motivator/bind_monster: function motivator_binder:use_callback( obj, who )dc Изменено 20 Декабря 2014 пользователем Dennis_Chikin Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 21 Декабря 2014 Всем привет, прошу помощи. Почему работает такая логика переключателя: [logic] active = ph_button@active[ph_button@active]on_info = {+warlab_antenna_1_off} ph_idle@nilanim = lab_primary_switcher_idletooltip = tips_warlab_presson_press = ph_button@deactivate %=yan_gluk%[ph_button@deactivate]anim = lab_primary_switcher_offon_timer = 500 | ph_idle@nil %+warlab_antenna_1_off =play_snd_from_obj(908:ambient\switch_1) %[ph_idle@nil] и не работает вот такая: [logic]active = ph_button@active[ph_button@active]on_info = {+generators_message_doctor_2} ph_button@activate[ph_button@activate]on_info = {+warlab_antenna_1_off} ph_idle@nilanim = lab_primary_switcher_idletooltip = tips_warlab_presson_press = ph_button@deactivate %=yan_gluk% [ph_button@deactivate]anim = lab_primary_switcher_offon_timer = 500 | ph_idle@nil %+warlab_antenna_1_off =play_snd_from_obj(908:ambient\switch_1) %[ph_idle@nil] хотя поршень "generators_message_doctor_2" выдается совершенно точно? В чем тут дело? PS: мне нужно, чтобы изначально переключатель был неактивен, а становился активным только после выдачи нужного поршня. Могу ошибаться, но чтоб объект в игре разваливался он должен быть на классе P_DSTRBL. А для "physic_object" прописан класс O_PHYS_S(у меня по крайней мере). Визуала такого "physics\decor\stol_sher" у меня нет, не могу потестить. Возьми другой для пробы из physics\stol. Такая же байда и у меня. Стол, стул, кровать разваливаются. Для всяких кружек, тарелок, ложек еще пишу строку "fixed_bones = link", но для стола, стула, кровати такой способ не катит - вылет с руганью на wrong fixed bones, видать, без костей модели. Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 21 Декабря 2014 А как именно не работает ? Переключатель не становится активным ? Или что там у тебя происходит ? Именно, не активен. И подсказка не появляется. Но я уже разобрался. В секции [ph_button@active]on_info = {+generators_message_doctor_2} ph_button@activateнадо было дописать анимку и все заработало, как надо. А кто пояснит, что такое в all.spawn секция с названием "breakable_object"? Есть еще "climable_object", но это вроде невидимый объект, чтобы ГГ мог забираться по вертикальным лестницам. Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 23 Декабря 2014 Вот еще вопрос назрел. В АМК были так называемые рюкзаки-схроны. Их можно было купить и в нужном месте выбросить, они превращались в обычный рюкзак, который невозможно обратно подобрать. Собственно, вопрос: возможно ли их подбирать обратно/уничтожать совсем? Смысл: я эту фишку вытащил, и на нее метку повесил. Теперь рюкзак-схрон имеет метку, по которой его легко найти. Но идея состоит в следующем: если он мне в этом месте больше не нужен, как его обратно подобрать (или чтоб он вообще пропал, типа, хочешь в другом месте - покупай новый)? Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 23 Декабря 2014 @AndreySol, вот функция спавна такого рюкзака: function use_rukzak(pid) local objlocal pos = db.actor:position()obj = alife():create("m_inventory_box", pos, db.actor:level_vertex_id(), db.actor:game_vertex_id()) if (obj) then local t = amk.get_invbox_data(obj) t.custom = "[logic]\ncfg = scripts\\treasure_inventory_box.ltx" amk.set_invbox_data(t, obj) level.map_add_object_spot_ser(obj.id, "my_treasure", "Мой тайник") endend А как его подобрать/уничтожить при наведении курсора? Там же выводится "Обыскать тайник"? А если мне нужно именно обыскать, а не убрать его совсем? А вот еще вопросец: можно ли при обыске конкретного тайника выдавать подсказку не "Обыскать тайник", а при обыске пня, например, выводить "Обшарить пень", а при обыске рюкзака - "Обыскать рюкзак"? Аналогично при обыске сейфа и т.д. - выводить свое сообщение? Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 23 Декабря 2014 @AndrewMor, в scripts\\treasure_inventory_box.ltx меняешь tips на нужный текст Это и ежу понятно. Я ж говорил, чтобы для разных тайников свою подсказку выдавать. Для пней - свою, для сейфов - свою. Ну и так далее. А если tips сменить - у всех тайников она опять же одинаковая будет. Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 9 Января 2015 (изменено) Подскажите, кто знает, как при заходе на локацию подсчитать количество находящихся в онлайне зверей, желательно по видам. Ну к примеру, сколько гуляет плотей. Или кабанов. С чего начать-то надо? Вызывать функцию подсчета надо, я так понимаю, из "function actor_binder:net_spawn(data)". А дальше с чего начинать? Сам принцип хотя бы объясните.В момент захода на локацию онлайновых зверей там нет. Вообще. Появляются через какое-то время после actor_binder:net_spawn(), в зависимости от условий. То есть, тебе надо явно что-то другое. dc Изменено 9 Января 2015 пользователем Dennis_Chikin Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 9 Января 2015 (изменено) dc, я наверно неправильно выразился. Мне нужно узнать, сколько на данной локации живых (не трупов), скажем, плотей. Заспавнено, причем неважно, скриптом или через all.spawn. Или сие в момент захода невозможно узнать в принципе? Или, если на то пошло, сколько тех же плотей находится под гулагами на данной локации? Изменено 9 Января 2015 пользователем AndrewMor Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение
AndrewMor 530 Опубликовано 9 Января 2015 (изменено) Ну хорошо. И все же я так не въехал, как определить принадлежность монстра к конкретной локации. По вертексам? gvid = obj.m_game_vertex_idif gg:valid_vertex_id( gvid ) then map = gg:vertex( gvid ):level_id() dc Изменено 9 Января 2015 пользователем Dennis_Chikin Сталкер - наше всё! Поделиться этим сообщением Ссылка на сообщение