Dennis_Chikin 3 665 Опубликовано 22 Марта 2018 if who:active_slot() == 3 then ... else local item = who:active_item() if item and t[item:section()] then ... end end Может, все-таки так ? Или сразу: if who and who.active_slot and ( ( who:active_slot() == 3 ) or ( who:active_item() and t[who:active_item():section()] ) ) then ... end Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 22 Марта 2018 Изрядно гадская, да. Пришлось шаманствовать с removeNpc(): local kamp_end = xr_evaluators_id.stohe_kamp_base + 1 local on_pos = xr_evaluators_id.stohe_kamp_base + 2 local mgr = npc:motivation_action_manager() -- todo: слишком сложно. ПРОСТО оторвать лишние эвалюаторы СОВСЕМ. Оставить все в одном. local a = mgr and mgr:action( xr_actions_id.alife ) if a then a:remove_precondition( kamp_end ) else log( "warning", "(%s):removeNpc, no action (alife) (%s)", self.center_point, npc:name() ) end a = mgr:action( xr_actions_id.stohe_kamp_base + 3 ) if a then xr_logic.unsubscribe_action_from_events( npc, st, a ) mgr:remove_action( xr_actions_id.stohe_kamp_base + 3 ) -- log( "info", "(%s):removeNpc, %s, 2", self.center_point, npc:name() ) else log( "warning", "(%s):removeNpc, no action (action_kamp_wait) (%s)", self.center_point, npc:name() ) end mgr:remove_action( xr_actions_id.stohe_kamp_base + 1 ) -- log( "info", "(%s):removeNpc, %s, 3", self.center_point, npc:name() ) mgr:remove_evaluator( kamp_end ) -- mgr:add_evaluator( kamp_end, property_evaluator_const( true ) ) mgr:remove_evaluator( on_pos ) -- mgr:add_evaluator( on_pos, property_evaluator_const( true ) ) -- if npc:name() == "bar_dolg_ivancov" then -- log( "info", "(%s):removeNpc, %s, remove_evaluators, ok", self.center_point, npc:name() ) -- end st.on_position = false -- поскольку строжейж грохнуть не дают, сделаем вид, что он новый. st.count = 0 st.pos_lvid = nil st.dest_lvid = nil 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 11 Апреля 2018 Партикл - партиклу рознь. Есть бесконечные, есть те, для которых время ограничено. Последние - да, надо перезапускать, если еще нужны. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 11 Апреля 2018 А death - это вообще где ? И, да, я не уверен, что движок делает с партиклами, хранящимися внутри функций. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 11 Апреля 2018 Так это вообще-то запуск другого элемента, когда закончился основной. Вообще, на сколько я понял, запускается particle group, а не element, так ? Тогда время надо смотреть для каждого из элементов. И, да, отключенные, но оставленные эффекты и элементы - хороший способ получить странных и загадочных вылетов. p.s. Но вообще это все уже явно не скрипты. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 13 Апреля 2018 Ни какой. 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 28 Апреля 2018 Ы ? Как бы да, стартовая менюшка - сама по себе, пространства _G, game, level и еще много разных - сами по себе. Более того, традиционная лапша в сталкере, и, особенно, модах, со всеми перекрестными ссылками, требует долгого распутывания, если мы хотим что-то в каком-то ином порядке, чем в том, в котором как-то работает. типа так: https://www.dropbox.com/s/miqjdrqmn95nbjn/_init.script?dl=0 (закомментированное - работало после распутывания, но перестало после принятия дополнительных мер "против читеров поганых" в одном и том же по сути моде.) 2 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 17 Мая 2018 Полагаю, происходит завис. Какова цель данного действа ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 17 Мая 2018 2 часа назад, Graff46 сказал: Цель, подключиться к биндеру объекта и пользоваться, например, его апдейтом в своих целях. Тогда делается строго наоборот: биндер при апдейте сам дергает за то, что надо. Можно дать ему табличку при ините, и потом по мере надобности добавлять в нее ненужное. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 17 Мая 2018 Смотрим все псевдООПшное творчество из amk. Ну или многострадальные "псиантенну"/таскменеджер от ПЫС. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 28 Мая 2018 И, да, ни кто кроме Вас не знает, что у Вас там было и что должно быть после строк local reason=dead_reason[math.random(table.getn(dead_reason))] local dead=where_dead[math.random(table.getn(where_dead))] 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 6 Июня 2018 А напомните мне кто-нибудь, как вызвать my_subdir\my_script.my_function() ? Где-то такое видел, но не помню, как правильно делается. То есть, файлы лежат не в gamedata\scripts, а в gamedata\scripts\my_subdir Можно, конечно, и все в sripts, но там возможна куча файлов на одну тему, и получается как-то "неаккуратненько" (tm). Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 6 Июня 2018 Мы здесь, внезапно, именно про сталкер. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 6 Июня 2018 Например, путь я пытался узнать. Все перебранные варианты - либо nil, либо "ушла и не вернулась". Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 6 Июня 2018 getFS():update_path("$game_scripts$","my_subdir\\my_script.script") Вот это надо было. Спасибо. 1 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 19 Июня 2018 А зачем вообще нужен сид для меток ? И, блин, КАК ??? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 20 Июня 2018 local obj, t, cd for i, v in ipairs( { -- НЕ "ОПТИМИЗИРОВАТЬ" ! Конфиги жрут, и читаются медленнее ! { "respawn_atp_disk_bandit2", 834395, 2851, "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk11\npath_look=atp_disk_bandit_look11" }, { "respawn_atp_disk_bandit1", 838425, 2851, "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk12\npath_look=atp_disk_bandit_look12" }, { "respawn_atp_disk_bandit2", 895677, 2851, "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk13\npath_look=atp_disk_bandit_look13" }, { "respawn_atp_disk_bandit1", 897708, 2851, "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk14\npath_look=atp_disk_bandit_look14" }, { "respawn_atp_disk_bandit2", 785290, 2846, "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk15\npath_look=atp_disk_bandit_look15" }, { "respawn_atp_disk_bandit1", 782279, 2846, "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk16\npath_look=atp_disk_bandit_look16" }, { "respawn_atp_disk_bandit2", 709736, 2841, "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk17\npath_look=atp_disk_bandit_look17" }, { "respawn_atp_disk_bandit1", 936206, 2855, "\n[logic]\nactive=walker\n[walker]\npath_walk=atp_disk_bandit_walk18\npath_look=atp_disk_bandit_look18" }, } ) do obj = sim:create( v[1], level.vertex_position( v[2] ), v[2], v[3] ) if obj then obj = sim:object( obj.id ) if obj then t = get_npc_data( obj ) t.custom = t.custom .. v[4] set_npc_data( t, obj ) obj.smart_none = true end end end ЧДЯНТ ? (С) И, кстати, какая все-таки функция ставит метку по sid ? upd: А вот, кстати, с использованием олспавна: function check_spawn3() if actor:dont_has_info( "spawn_hospit_live" ) then local obj = sim:object( "hospital_muha_trup" ) if obj then sim:release( obj, true ) end obj = sim:create( 10008 ) if obj then local t = get_npc_data( obj ) t.custom = "[dont_spawn_loot]\n" set_npc_data( t, obj ) local p = obj.position p.x, p.y, p.z = -95.5, 29, 566.9 obj.position = p obj.death_call = muha_up -- obj.death_droped = true end -- level.add_call( muha_up, dummy ) muha_pp = particles_object( "static\\zharka_buble_idle" ) if muha_pp then muha_pp:play_at_pos( vector():set( -95.6, 28.3, 566.6 ) ) end local p for i, v in ipairs( { { "anomaly2\\studen_idle_bottom000", vector():set( -94.7, 28.2, 565.5 ) }, { "anomaly2\\studen_idle_bottom000", vector():set( -94.7, 28.3, 566.4 ) }, { "anomaly2\\studen_idle_bottom000", vector():set( -95.1, 28.4, 566.6 ) }, { "anomaly2\\studen_idle_bottom000", vector():set( -95.0, 28.4, 567.4 ) } } ) do p = particles_object( v[1] ) if p then p:play_at_pos( v[2] ) table_insert( t_muha_pp, p ) end end if actor:dont_has_info( "spawn_kamen_udachy" ) then for i, v in ipairs( { { "anomaly2\\studen_idle_bottom000", vector():set( -95.5, 32.5, 613.7 ) }, { "anomaly2\\studen_idle_bottom000", vector():set( -96.0, 32.6, 614.6 ) }, { "anomaly2\\studen_idle_bottom000", vector():set( -95.5, 32.6, 615.5 ) }, -- { "anomaly2\\studen_idle_bottom000", vector():set( -94.1, 32.5, 615.6 ) }, -- { "anomaly2\\studen_idle_bottom000", vector():set( -93.6, 32.4, 614.9 ) }, -- { "anomaly2\\studen_idle_bottom000", vector():set( -92.8, 32.3, 614.2 ) }, -- { "anomaly2\\studen_idle_bottom000", vector():set( -92.3, 32.3, 614.8 ) }, -- { "anomaly2\\studen_idle_bottom000", vector():set( -91.7, 32.3, 615.7 ) } } ) do p = particles_object( v[1] ) if p then p:play_at_pos( v[2] ) table_insert( t_stone_pp, p ) end end end end if actor:dont_has_info( "father_pant_say_start" ) then if not sim:object( "hospital_pantera_girl" ) then sim:create( 9998 ) end if actor:has_info( "real_dok_and_father_spawn" ) then if not sim:object( "hosp_father" ) then sim:create( 9980 ) end end end if actor:has_info( "real_dok_and_father_spawn" ) then add_ports( "real_dok_and_father_spawn", true ) if not sim:object( "hosp_real_bl_dok" ) then sim:create( 9979 ) end if sim:object( "hospital_bl_dok" ) then _util.release_npc( "hospital_bl_dok" ) end elseif not sim:object( "hospital_bl_dok" ) then sim:create( 9978 ) end for k, v in pairs( { ["hos_no_gulag_verh_black2"] = 9982, ["hos_no_gulag_verh_black3"] = 9983, ["hos_no_gulag_nad_black4"] = 9986, ["hospital_black_stalk3"] = 9989, ["hospital_black_stalk1"] = 9990, ["hospital_black_stalk2"] = 9991, ["hospital_sapsan"] = 9993, ["hos_black_niz_rayt"] = 9996, ["hos_black_niz_left"] = 9997, } ) do if not sim:object( k ) then sim:create( v ) end end if actor:dont_has_info( "prodaznay_tvar" ) and actor:dont_has_info( "spawn_hospit_live" ) then add_ports( "spawnim_3otsek", true ) end end Адовы тучи неписей, аномалий, телепортов и еще неведомой некро-сами-знаете-чего. Но все - "одноразовое", нужно только когда актор на локе и только при соблюдении определенных условий. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 21 Июня 2018 "чтобы получить секцию / профиль нпс и передать полученное в number." А-ааа ! Зачем ??? Если мы его сами создаем - ид мы получаем при создании. Если мы знаем имя - мы получаем объект, и из него - ид. Если это непись, получившийся в результате работы респавнера - этот непись под смартом, и мы достаем его ид из смарта. Секцию и профиль - это надо перебирать все от 1 до 65534, и проверять для каждого существующего, но, зачем ??? 2 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 22 Июня 2018 Короче, по обоим постам: "стол заказов" - "сделайте мне мод" - не здесь. По тому что даже если вам сделают мод с меткой на карте, где стоит какой-то непись, и раздает всем мимопроходящим рэндомные награды - все равно окажется, что это не тот непись, и вообще оно у вас "почему-то" не запускается. Тем более, что вполне конретные примеры по обоим вопросам как раз были на последних страницах, но полностью проигнорированы. Не разбираетесь - да, совершенно верно - берите тот же amk-мод, благо, он маленький по нынешним временам, или "симбион", который вообще создавался как образец "академического" стиля - по сути, именно, чтобы на его примере все и изучать, и разбирайтесь, как что работает, пока не будет достигнут хоть минимум понимания. Вот возникнут конкретные вопросы - на них хоть ответить можно будет как-то, вместо того, чтобы все бросить, и срочно делать вам мод. 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 22 Июня 2018 Повторюсь еще раз: если мы знаем sid объекта, то уж его имя мы тем более знаем. Если не знаем ни того, ни другого - на этом приплыли. Дальше получаем собственно объект - ради его ид. Как здесь - local obj = sim:story_object(91) Кстати, совершенно лишние манипуляци: local sim = alife() if sim then, поскольку запускать нечто подобное до запуска собственно alife() - занятие в высшей степени странное. Или, по имени local obj = sim:object( "как_он_там_называется" ) Далее, собственно, ставится метка: level.map_add_object_spot(obj.id, "level_changer", "to_garbage") Первое - ид, ради которого городился весь предшествующий огород. Тип метки - из того, что прописано в gamedata\config\ui\map_spots.xml - то есть, всякие синие, желтые, и зеленые и прочие кракозябры, которые будут рисоваться на карте. Ну и произвольный текст, который будет выводиться при тыкании в кракозябры мышой. Никаких координат для метки задать нельзя. Ставится ТОЛЬКО на что-то существующее. Есть вариант с перебором всего-всего, и установкой меток на все, что кажется подходящим. Типа такого: function set_spots() -- local obj = sim:object( "old_doc_4" ) -- if obj then -- level.map_add_object_spot( obj.id, "artefact_location", obj:name() .. " y:" .. obj.position.y ) -- end local c_af = clsid.artefact -- clsid.artefact_s == electric_ball local c_ibox = clsid.inventory_box local obj, gvid, cls_id for i = 1, 65534 do obj = sim:object( i ) if obj then cls_id = obj:clsid() if cls_id == c_af then if obj.parent_id == 65535 then -- арты gvid = obj.m_game_vertex_id if gg:valid_vertex_id( gvid ) then if gg:vertex( gvid ):level_id() == level_id then log( "info", "found art: %s ( %.02f, %.02f, %.02f )", obj:name(), obj.position.x, obj.position.y, obj.position.z ) level.map_add_object_spot( i, "artefact_location", obj:name() .. " y:" .. obj.position.y ) end end end elseif cls_id == c_ibox -- and not онлайновый_ящик:is_inv_box_empty() and ( string_sub( obj:section_name(), 1, 1 ) == "m" or string_sub( obj:section_name(), 1, 1 ) == "e" ) -- and string_sub( obj:section_name(), 1, 1 ) ~= "m" and obj.position.y >= -290 -- ящики Бака then -- тайники gvid = obj.m_game_vertex_id if gg:valid_vertex_id( gvid ) then if gg:vertex( gvid ):level_id() == level_id then -- log( "info", "found treasure: %s", obj:name() ) local ini = obj:spawn_ini() if ini and ini:section_exist( "logic" ) and ini:line_exist( "logic", "actor_item" ) then level.map_add_object_spot( i, "habar_location", obj:name() .. " y:" .. obj.position.y ) else level.map_add_object_spot( i, "habar_clear_location", --"treasure" obj:name() .. " y:" .. obj.position.y ) end --local item = level.object_by_id( i ) --if item then amk_particle.amk_particle( { -- ["obj"] = item, ["looped"] = true, -- ["particle"] = "explosions\\campfire_grill" } ) --end end end elseif cls_id == 89 then gvid = obj.m_game_vertex_id if gg:valid_vertex_id( gvid ) then if gg:vertex( gvid ):level_id() == level_id then local ini = obj:spawn_ini() if ini and ini:section_exist( "drop_box" ) then -- log( "info", "found drop_box: %s", obj:name() ) level.map_add_object_spot( i, "green_location", obj:name() ) end end end -- elseif c_anoms[cls_id] then -- gvid = obj.m_game_vertex_id -- if gg:valid_vertex_id( gvid ) then -- if gg:vertex( gvid ):level_id() == level_id then -- level.map_add_object_spot( i, "alife_combat_attack", obj:name() ) -- end end -- elseif cls_id == clsid.controller_s then -- gvid = obj.m_game_vertex_id -- if gg:valid_vertex_id( gvid ) then -- if gg:vertex( gvid ):level_id() == level_id then -- level.map_add_object_spot( i, "defend_lager_location", obj:name() ) -- log( "info", "found: %s ( %.02f, %.02f, %.02f )", obj:name(), -- obj.position.x, obj.position.y, obj.position.z ) -- end end elseif string.sub( obj:section_name(), 6, 10 ) == "ameba" then gvid = obj.m_game_vertex_id if gg:valid_vertex_id( gvid ) then if gg:vertex( gvid ):level_id() == level_id then level.map_add_object_spot( i, "alife_combat_attack", obj:name() ) log( "info", "found: %s ( %.02f, %.02f, %.02f )", obj:name(), obj.position.x, obj.position.y, obj.position.z ) end end -- elseif obj:section_name() == "lights_hanging_lamp" then -- gvid = obj.m_game_vertex_id -- if gg:valid_vertex_id( gvid ) then -- if gg:vertex( gvid ):level_id() == level_id then -- level.map_add_object_spot( i, "defend_lager_location", obj:name() ) -- log( "info", "found: %s ( %.02f, %.02f, %.02f )", obj:name(), -- obj.position.x, obj.position.y, obj.position.z ) -- end end -- elseif obj:name() == "muha_hosp_live" then -- вписать ненужное -- log( "info", "found: %s ( %.02f, %.02f, %.02f ), lv: %s", obj:name(), -- obj.position.x, obj.position.y, obj.position.z, -- ( gg:valid_vertex_id( obj.m_game_vertex_id ) -- and gg:vertex(sobj_gv):level_id() ) or "n/a" ) -- level.map_add_object_spot( i, "defend_lager_location", obj:name() ) end end end end Далее - тему "справочник по функциям и классам" в руки, и разбираемся с тем, что непонятно. Дублировать все посты оттуда сюда, вместе с руководством по LUA - уже перебор. 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение