speczadanie 0 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 Да я Сидоровича вообще не трогал! А как проверить запись нет-пакетов? Ссылка на комментарий
@"StreloK" 2 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 (изменено) Люди может кто подсказать в чём дело? Спавню НПС через алл.спавн - когда заспавнил для пробы без логики они нормально появляются. Когда прописал им логику [smart_terrains] none = true [logic] active = camper [camper] path_walk = swamp_mil_walk_1 path_look = swamp_mil_look_1 Получаю стабильный вылет - Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: e:\games\stalker\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value) Может кто подсказать в чём дело? Изменено 1 Сентября 2011 пользователем @"StreloK" Prefiero morir de pie, que vivir siempre arrodillado. Ссылка на комментарий
Artos 99 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 @"StreloK" На разных ресурсах по игре уже не один десяток раз давались разъяснения по ошибке типа: _g.script:20: bad argument #2 to 'format' (string expected, got no value) 1. Давно пора бросить привычку читать сообщение об ошибке из стека блокнота и читать именно лог-файл. Именно в нем (как правило) выше секции 'FATAL ERROR' приводятся строки о месте/причине возникновения ошибки. 2. Данная строка формируется функцией 'abort', которая специально вызывается для нештатного прерывания игры при возникновении критичных ошибок. По многим файлам скриптов в различных местах можно увидеть вызовы принудительного прерывания. В твоем случае, вероятнее всего указаны неверные/отсутствующие пути (swamp_mil_walk_1 и/или swamp_mil_look_1), что и приводит к ошибке в какой-то схеме (вероятно в move_mgr.script) и принудительному прерыванию. Читай лог-файл и исправляй ошибку с путями, почитав про логику для НПС в статьях (см.шапку). Добавлено через 7 мин.: speczadanie О нет-пакетах (этом классе) написано в топике "Справочник по классам и функциям". Ты можешь прочесть и вывести в лог-файл сохраняемые параметры для Сидоровича, поверив на корректность его сохраняемые координаты. Так же после старта сэйва, можно проверить считанные значения. Сам по себе Сидорович под стол не залезет - вот и ищи причину изменения координат его спавна или перемещения. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
@"StreloK" 2 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 Artos - про глянуть лог-файл действительно забыл, спасибо что напомнил. Правда понять что вызывает ошибку моих знаний тут нехватает к сожалению Клиент: Синхронизация... * phase time: 135 ms * phase cmem: 191612 K * [win32]: free[1228952 K], reserved[35648 K], committed[832488 K] * [ D3D ]: textures[379229 K] * [x-ray]: crt heap[191612 K], process heap[476210 K], game lua[24436 K], engine lua[162 K], render[0 K] * [x-ray]: economy: strings[3814 K], smem[0 K] [16-9] get_xml_name for[game_tutorials.xml] returns [game_tutorials.xml] [16-9] get_xml_name for[ui_credits.xml] returns [ui_credits.xml] [16-9] get_xml_name for[ui_movies.xml] returns [ui_movies.xml] [16-9] get_xml_name for[map_spots.xml] returns [map_spots.xml] [16-9] get_xml_name for[map_spots_escape.xml] returns [map_spots_escape.xml] [16-9] get_xml_name for[map_spots_garbage.xml] returns [map_spots_garbage.xml] [16-9] get_xml_name for[map_spots_agroprom.xml] returns [map_spots_agroprom.xml] [16-9] get_xml_name for[map_spots_darkvalley.xml] returns [map_spots_darkvalley.xml] [16-9] get_xml_name for[map_spots_bar.xml] returns [map_spots_bar.xml] [16-9] get_xml_name for[map_spots_military.xml] returns [map_spots_military.xml] [16-9] get_xml_name for[map_spots_radar.xml] returns [map_spots_radar.xml] [16-9] get_xml_name for[map_spots_mp.xml] returns [map_spots_mp.xml] [16-9] get_xml_name for[map_spots_relations.xml] returns [map_spots_relations.xml] [16-9] get_xml_name for[map_spots_lchangers.xml] returns [map_spots_lchangers.xml] ! Unknown command: dbg:!-!-!-_Принудительный_Вылет_-!-!-! FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: e:\games\stalker\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value) stack trace: Можешь что подскозать? Prefiero morir de pie, que vivir siempre arrodillado. Ссылка на комментарий
Artos 99 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 (изменено) @"StreloK" ПодскАзать тебе к сожалению по сути нечего. В твоей солянке явно кто-то криворучками постарался 'замазать' полезную для поиска причин информацию. Строка: '! Unknown command: dbg:!-!-!-_Принудительный_Вылет_-!-!-!' - говорит о перехвате функцией печати в лог-файл и выдаче малоинформативного сообщения о принудительном вылете. Как уже писал выше: а) не имея твоих кодов солянки, врядли кто-то сможет помочь. А заниматься погадалками можно до бесконечности. б) смотри корректность своих путей, задаваемых в конфиге логики! Предполагаю, что ты их даже в all.spawn не прописал. Попробуй (межет криворучка не сильно кастрировал коды) заменить функция 'abort' в '_g.script' на эту: function abort(fmt, ...) local sReason = string.format(fmt or '<NIL>', ...) assert('ERROR:' .. sReason) local con = get_console() con:execute('ОШИБКА:' .. string.gsub(sReason,'%s','_')) con:execute('flush') exit() --/> прерываем игру при фатальных ошибках end - может выдаст что-то более врызумительное и информативное. Изменено 12 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
ziStam 1 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 Artos, а вот и мой function create_level_changer( p_story_id, -- STORY_ID нового level_changer (понадобится нам позже) p_position, -- вектор, координаты точки, в которой будет располагаться центр нового level_changer p_lvertex_id, -- level_vertext_id - идентифицируют уровень, на котором будет создан level_changer p_gvertex_id, -- game_vertext_id p_dest_lv, -- level_vertex_id - идентифицируют уровень, на будет перебрасывать игрока p_dest_gv, -- game_vertex_id p_dest_pos, -- координаты точки, в которой на новом уровне окажется игрок p_dest_dir, -- направрение взгляда игрока p_dest_level, -- название уровня, например "L11_Pripyat" p_silent -- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход) ) local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id) level.map_add_object_spot(obj.id, "level_changer", "") local packet = net_packet() obj:STATE_Write(packet) -- свойства cse_alife_object local game_vertex_id = packet:r_u16() local cse_alife_object__unk1_f32 = packet:r_float() local cse_alife_object__unk2_u32 = packet:r_u32() local level_vertex_id = packet:r_u32() local object_flags = packet:r_u32() local custom_data = packet:r_stringZ() local story_id = packet:r_u32() local spawn_story_id = packet:r_u32() -- свойства cse_shape local shape_count = packet:r_u8() for i=1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then -- sphere local center = packet:r_vec3() local radius = packet:r_float() else -- box local axis_x_x = packet:r_float() local axis_x_y = packet:r_float() local axis_x_z = packet:r_float() local axis_y_x = packet:r_float() local axis_y_y = packet:r_float() local axis_y_z = packet:r_float() local axis_z_x = packet:r_float() local axis_z_y = packet:r_float() local axis_z_z = packet:r_float() local offset_x = packet:r_float() local offset_y = packet:r_float() local offset_z = packet:r_float() end end -- свойства cse_alife_space_restrictor local restrictor_type = packet:r_u8() -- свойства cse_level_changer local dest_game_vertex_id = packet:r_u16() local dest_level_vertex_id = packet:r_u32() local dest_position = packet:r_vec3() local dest_direction = packet:r_vec3() local dest_level_name = packet:r_stringZ() local dest_graph_point = packet:r_stringZ() local silent_mode = packet:r_u8() packet:w_begin(game_vertex_id) -- game_vertex_id packet:w_float(cse_alife_object__unk1_f32) packet:w_u32(cse_alife_object__unk2_u32) packet:w_u32(level_vertex_id) -- level_vertex_id packet:w_u32( bit_not(193) ) -- object_flags = -193 = 0xFFFFFF3E packet:w_stringZ(custom_data) packet:w_u32(p_story_id) -- story_id packet:w_u32(spawn_story_id) packet:w_u8(1) -- количество фигур packet:w_u8(1) -- тип фигуры: box packet:w_float(2) -- axis_x_x packet:w_float(0) -- axis_x_y packet:w_float(0) -- axis_x_z packet:w_float(0) -- axis_y_x packet:w_float(4) -- axis_y_y packet:w_float(0) -- axis_y_z packet:w_float(0) -- axis_z_x packet:w_float(0) -- axis_z_y packet:w_float(4) -- axis_z_z packet:w_float(0) -- offset_x packet:w_float(0) -- offset_y packet:w_float(0) -- offset_z packet:w_u8(3) -- restrictor_type packet:w_u16(p_dest_gv) -- destination game_vertex_id packet:w_u32(p_dest_lv) -- destination level_vertex_id packet:w_vec3(p_dest_pos) -- destination position packet:w_vec3(p_dest_dir) -- destination direction (направление взгляда) packet:w_stringZ(p_dest_level) -- destination level name packet:w_stringZ("start_actor_99") -- some string, always const packet:w_u8(p_silent) -- 1 for silent level changing packet:r_seek(0) obj:STATE_Read(packet, packet:w_tell()) end а вот function zat_to_lab() create_level_changer(2000, vector():set(-313.8479309082,18.318702697754,632.98205566406),322208,212, -- где переход 934,2202, vector():set(-79.5249557495117,42.8666152954102,463.847686767578), -- куда переходить vector():set(0.0,0.0,-1.0), -- направление взгляда при появлении "av_peshera",1) -- на какую локу и запрос (0 - появится вопрос, 1 - автоматический переход) news_manager.send_tip("Затон -> Лабиринт", "Новый путь!", 2, 25, "diagterev") end Напомню, левел ченжер хочу создать в зп, творю на сгм 1.7 Legend of Stalker Ссылка на комментарий
Artos 99 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 (изменено) Вопрос к модераторам/админу форума: Вроде как с сегодня при использовании тегов 'code' в публикуемых годах (IE или Maxthon) обратный слеш '\' стал превращаться в 'W', пример: это должен быть обратный слеш: \ При использовании кодов, путей и т.п. это будет приводить к фатальным ошибкам! Нужно бы исправить. Изменено 1 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
@"StreloK" 2 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 (изменено) Artos Ну насчёт солянки это ты зря - чистая бета Восстановление Старого Сюжета. И по обрезать функции мог только автор. Решил на досуге заселить Болота по старым Диздокам от ПЫС. За функцию спасибо, теперь более-менее вразумительный лог. [16-9] get_xml_name for[message_box.xml] returns [message_box.xml] ! Unknown command: ОШИБКА:object 'swanp_soldier_regular_default3': path_walk 'swamp_dok_walk_1' has 1 waypoint, but has no flags * Log file has been saved successfully! FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: e:\games\stalker\gamedata\scripts\_g.script:1141: attempt to call global 'exit' (a nil value) stack trace: С первым вылетом справился. Но появился новый -- ! Unknown command: ОШИБКА:object 'swanp_soldier_regular_default4': path_walk 'swamp_dok_walk_2', index 0: cannot find corresponding point(s) on path_look 'swamp_dok_look_2' * Log file has been saved successfully! FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: e:\games\stalker\gamedata\scripts\_g.script:1141: attempt to call global 'exit' (a nil value) stack trace: Изменено 1 Сентября 2011 пользователем @"StreloK" Prefiero morir de pie, que vivir siempre arrodillado. Ссылка на комментарий
Старлей 88 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 Народ, help! Разговор с лебедевым в чистом небе не начинается, он просто стоит и все... Естественно изменял скрипты, а где функции и скрипты отвечающие за эту сцену? Заранее спасибо! Ray Of Hope - кооператив сталкера OldStory Ссылка на комментарий
Artos 99 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 (изменено) ziStam Тобою взята функция, которая и далека от оптимальности и использоваться в исходном виде может ТОЛЬКО в ТЧ. В ТЧ и ЗП контролируется чтение и запись пакетов и требуется соблюдать некоторые условия (о которых долго расписывать и врядли сейчас нужно). Попробуй вначале попроще вариант: 1. Возьми из мода "Simbion" модуль нет-пакетов (m_net_utils.script). Его можно найти и у автора твоей функции (create_level_changer) singapur22'а в его мобильном менеджере. 2. Заспавни переход по нужным координатам: soLvChg = alife():create("level_changer", pos, lvid, gvid) 3. Замени требуемые параметры на свои, типа: if soLvChg then local tT = m_net_utils.Get_Data_LvChanger(soLvChg) tT.story_id = iStoryId tT.shapes[1] = {type=0, center=vector():set(0,0,0), radius=3} --/ задать радиус (~=3) tT.restrictor_type = 3 tT.dest_level_name = _f.Get_LevelName(tLC.d_gv) tT.dest_game_vertex_id = tLC.d_gv tT.dest_level_vertex_id = tLC.d_lv tT.dest_position = tLC.d_pos tT.dest_direction = tLC.d_dir tT.dest_graph_point = tLC.d_gp or '' tT.silent_mode = tLC.d_sm or 0 if tLC.path and tLC.path ~= "" then tT.custom_data = "[pt_move_if_reject]\npath = "..tLC.path end local bFlg = m_net_utils.Set_Data_LvChanger(tT,soLvChg) if bFlg then Add_MapSpot(soLvChg.id, "level_changer", tLC.hint or 'none') if tLC.info and not has_alife_info(tLC.info) then give_info(tLC.info) _f.Send_ReceivedInfo("st_take_new_way") end log("%s:Add_LvChanger:(%s)=[%s]:[%s]", sModule, iStoryId, soLvChg:name(), "+") --/#~# return soLvChg --/> else printf("Add_LvChanger:(%s)=[%s]~Write_net-paket:<%s>", iStoryId, soLvChg:name(), "Error!") end end - Внимание! Код взят из конкретного мода и требуется адаптация под свои нужды. Чуть позже дам вариант адаптации, если потребно. Добавлено через 15 мин.: @"StreloK" Учись читать логи. Тебе же пишется об ошибке пути: path_look 'swamp_dok_look_2'. Вот и разбирайся почему у тебя некоректны для него точки ... Уже ведь давал тебе совет - почитать про логику для НПС и соответственно про пути для схем! (и прячь, плз, портянки кодов под спойлеры) Изменено 1 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
_Призрак_ 11 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 Есть ли готовая функция для перевода вектора, возвращаемого функцией db.actor:direction() в direction прописываемый в алл.спавне? Freedom Ссылка на комментарий
*Shoker* 322 Опубликовано 1 Сентября 2011 Поделиться Опубликовано 1 Сентября 2011 (изменено) _Призрак_ Если вопрос адресован мне, то для ЧН, Это отдельный ПДА. Я мог бы прикрутить его к основному, но честно говоря никогда так не пробовал да и нет желания, у него своя шкурка и свои задачи Этакий планшет с иконками... Собстно вот ещё хотел задать вопрос, в ЧН/ТЧ язык на русский никак не сменить? А то сделал мелкую записную книжку, но в ЧН раскладка не меняется. Или хотя бы есть ли колбек на Edit Box, который реагирует на добавление новых букв? Нашёл такой в lua_help но он не сработал. const EDIT_TEXT_CHANGED = 81; const EDIT_TEXT_COMMIT = 82; Зато второй работает, но реагирует он тока на Enter > Есть ли готовая функция для перевода вектора, возвращаемого функцией db.actor:direction() в direction прописываемый в алл.спавне? Спасибо Kirag -- преобразует дирекцию в угол -- Можно найти лишь приблизительный поворт по осям X и Y -- точность колебится от 1-2 градусов function dir2angle(dir) local pi = 0.017453292519943295769236907684886 -- Y -- local dir_h = vector():set(dir.x,0,dir.z):normalize() local a = math.deg(math.acos(dir_h.z)) if dir_h.x < 0 then a = 360 - a end -- X -- local b = 90 * dir.y return vector():set(b*pi, -1 * (a*pi), 0) end Поворот по Z не находит. Вроде рабочая, давно её не проверял, и не уверен, что надо отнимать a от 360 Но координаты похожие возвращала. Изменено 1 Сентября 2011 пользователем ColR_iT Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
dragunof 3 Опубликовано 2 Сентября 2011 Поделиться Опубликовано 2 Сентября 2011 *Shoker*, посмотрите дмх мод на соль. Там есть записная книжка с переключением раскладки. ▲ ▲ ▲ Ссылка на комментарий
Artos 99 Опубликовано 2 Сентября 2011 Поделиться Опубликовано 2 Сентября 2011 (изменено) Gun12 Возвращаясь к классу 'coroutine', дабы и не засорять справочный раздел и дать привязку теории к практике, предлагаю поломать голову над практической задачкой применительно именно к 'coroutine'. Исходные данные: Имеется довольно известный модуль из АМК-мода (amk_offline_alife.script), написанный Sokol_Jack-ом. Корнем этого модужя является апдейт (вызываемый из биндера актора), который периодически сканирует все игровые объекты (и в оффлайне), фильтруя и собирая нужную информацию для дальнейшего использования по заложенным алгоритмам. Вот выжимка прокомментированного кода из этого модуля, которая может иметь практическое применение для модернизации: local bUpDelay = false --/ флаг разрешения/запрета сканирования local iCurID = 0 --/ ID последнего отработанного обьекта local iPause = 10 * 60 --/ периодичность апдейтов (~10 игровых минут) local iUpTime = game_minutes() --/ время последнего глобального сканирования function update() --/ вызов из actor_binder:update() if bUpDelay == false then --/ сканирование запрещено? if game_minutes() > iUpTime + iPause then --/ наступило время следующего сканирования? bUpDelay = true --/ разрешаем выполнение сканирования iCurID = 0 --/ устанавливаем начальный ID из диапазона (0...65534) off_npcs,items = {},{} --/ сброс/инициализация служебных таблиц printf("Updating offline-ALife started") end end if bUpDelay == true then --/ разрешено сканирование? if iCurID < 65535 then --/ еще не достигнут конец диапазона ID? local se_obj = alife():object(iCurID) --/ получаем серверный объект игры if se_obj ~= nil then --/ объект в игре? add_fresh_meat(se_obj) --/ функция сбора информации по объекту end iCurID = iCurID + 1 --/ следующий ID else --/ диапазон ID закончен - останавливаем сканирование bUpDelay = false --/ флаг запрета апдейта iUpTime = game_minutes() --/ запоминаем время окончания сканирования printf("Updating offline-ALife finished") end end end Как видно, периодично (каждые N-секунд игр. времени) сканируется весь диапазон игровых идентификаторов (ID) и с найдеными объектами выполняется функция 'add_fresh_meat()'. Минус данного метода в том, что кол-во объектов в игре довольно значительно (примем среднее для ТЧ значение ~25000). Если ''add_fresh_meat' выполняется за заметный интервал времени, т, да еще будучи наложенным еще на какой-нибудь ресурсоемкий алгоритм - лаги в игре (заметные глазу) неминуемы. Результаты сканирования не используются единомоментно и могут незначительно устаревать (для чего и организована периодичность перепроверки). Первая же мысль - разгрузить один цикл апдейта и 'размазать' сканирование всего диапазона по времени, т.е. по нескольким циклам с сохранением (при необходимости) периодичности полной перепроверки объектов игры (уже было реализовано). Но, и тут есть минус. Т.к. разделить процесс сканирования можно вроде как по поддиапазонам ID (например сканировать по 100 за раз), то непредсказуемость длительности проверки конкретного объекта и наличие пустых (незанятых) диапазонов ID приводит и рваному темпу сканирования и затяжкам. Плавающее общее кол-во занятых ID также влияет на рваный тамп сканирования в процессе игры. ИМХО, класс 'coroutine' может дать более плавное распределение нагрузки на ресурсы игры от сканирования всех игровых объектов, имея свойством выполняться и в другом потоке (треде) и приостанавливаться с возобновлением с прерванного момента. В идеале - сделать бесконечный цикл с заданным (или даже управляемым) временем периода одного цикла (~15 минут игрового времени), который будет постоянно перебирать весь диапазон игровых ID (плавно размазанному по всему периоду цикла) и обновлять информацию по объектам. Т.о. и практическая польза модам на базе АМК будет и практический пример применения класса с приостановкой выполнения функции и ... мозги немного размя можно желающим. ;-) Добавлено через 16 мин.: *Shoker* Не готов дать свой 'правильный' вариант, но вариант Kirag'а не для этого случая. 1. В 'all.spawn' в параметр 'direction' заносятся цифры (углы) в радианах. 2. 'db.actor:direction()' - возвращает вектор в радианах. Для чего заниматься переводом в градусы и обратно да еще без учета Z и погрешностями ... странно это? ИМХО, просто не следует путать 'device().cam_pos' - камеру актора, с направлением объекта актора. P.S. Пользовался этой: function DirToDir(vVec) local vVecN = vector() vVecN.x = math.atan2(-vVec.y,vVec.z) vVecN.y = math.atan2(-vVec.x,vVec.z) vVecN.z = math.atan2(-vVec.y,vVec.x) return vVecN --/> vector_angles end Изменено 2 Сентября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
speczadanie 0 Опубликовано 2 Сентября 2011 Поделиться Опубликовано 2 Сентября 2011 "Ты можешь прочесть и вывести в лог-файл сохраняемые параметры для Сидоровича, поверив на корректность его сохраняемые координаты. Так же после старта сэйва, можно проверить считанные значения." Artos, как это сделать? Ссылка на комментарий
Nazgool 250 Опубликовано 2 Сентября 2011 Поделиться Опубликовано 2 Сентября 2011 Artos Вот что ты мне напомнил ненароком. Нужно внести эту информацию в справочник : coroutine не даёт возможности многопоточности. Подпрограммы выполнятся так же как и обычные функции - в одном потоке. А вот "размазать по времени" вполне можно. Ссылка на комментарий
antreg 178 Опубликовано 3 Сентября 2011 Поделиться Опубликовано 3 Сентября 2011 (изменено) Добрый день! Необходимо сделать логику НПС-врага так, чтобы он реагировал на всех своих врагов, согласно заданным параметрам в файле game_relations.ltx, но до определённого момента не трогал бы актёра, оставаясь для него врагом, но тем не менее игнорировал бы его как врага. Есть, конечно, вариант в логике вписать условие игнорирования: combat_ignore_cond = always , но это заставляет НПС игнорировать всё и вся. Пробовал так: combat_ignore_cond = {=fighting_actor} и так: combat_ignore_cond = {=actor_enemy} - результата нет. Нужно что-то типа того, как идёт игнорирование другого НПС по его стори_айди: combat_ignore_cond = {=check_fighting(9608)} , где 9608 стори_айди какого-нибудь НПС, но только применительно к актёру. Так тоже не получилось: combat_ignore_cond = {=check_fighting(actor)} Есть ещё какие варианты? ТЧ 1.0004 + АМК Пользуйтесь пожалуйста тегами. ColR_iT Изменено 3 Сентября 2011 пользователем ColR_iT "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Ссылка на комментарий
_Призрак_ 11 Опубликовано 3 Сентября 2011 Поделиться Опубликовано 3 Сентября 2011 (изменено) Попробуй так: combat_ignore_cond = {=fighting_actor -my_info} my_info - инфопоршень после которого НПС перестает игнорить актора И не забудь в logic дописать comabt_ignore = combat_ignore И где нибудь в этом файле вставить: [combat_ignore] combat_ignore_cond = {=fighting_actor -my_info} Изменено 3 Сентября 2011 пользователем ColR_iT Freedom Ссылка на комментарий
desert 0 Опубликовано 3 Сентября 2011 Поделиться Опубликовано 3 Сентября 2011 (изменено) Подскажите, возможно ли создание многоразового ремкомплекта в игре, одноразовый сделал, но хочется именно многоразовый, с возможностью восстановления 5-10% от первоначального состояния ствола. Со скриптами практически не дружу, хотя разобраться пытаюсь. Добавлено через 79 мин.: Сам скрипт ремонта function use_repair_kit(what) local repair_slot_num = 0 local item_in_slot_1 = db.actor:item_in_slot(1) local item_in_slot_2 = db.actor:item_in_slot(2) local item_in_slot_6 = db.actor:item_in_slot(6) if (item_in_slot_1 ~= nil) then repair_slot_num = 1 end if (item_in_slot_2 ~= nil) then if (repair_slot_num == 0) then repair_slot_num = 2 elseif (repair_slot_num == 1) then if (item_in_slot_1:condition() > item_in_slot_2:condition()) then repair_slot_num = 2 end end end if (item_in_slot_6 ~= nil) then if (repair_slot_num == 0) then repair_slot_num = 6 elseif (repair_slot_num == 1) then if (item_in_slot_1:condition() > item_in_slot_6:condition()) then repair_slot_num = 6 end elseif (repair_slot_num == 2) then if (item_in_slot_2:condition() > item_in_slot_6:condition()) then repair_slot_num = 6 end end end if (repair_slot_num == 1) then local rep_point = item_in_slot_1:condition() + 0.2 if (rep_point > 1) then rep_point = 1 end item_in_slot_1:set_condition(rep_point) elseif (repair_slot_num == 2) then local rep_point = item_in_slot_2:condition() + 0.2 if (rep_point > 1) then rep_point = 1 end item_in_slot_2:set_condition(rep_point) elseif (repair_slot_num == 6) then local rep_point = item_in_slot_6:condition() + 0.2 if (rep_point > 1) then rep_point = 1 end item_in_slot_6:set_condition(rep_point) end end Скрипт выдернут из nzk-мода, сам к сожалению написать не могу. Изменено 3 Сентября 2011 пользователем ColR_iT Мой форум) Ссылка на комментарий
ColR_iT 171 Опубликовано 3 Сентября 2011 Поделиться Опубликовано 3 Сентября 2011 (изменено) desert, боюся тебя огорчить, но это скрипт самого ремонта и тут совершенно непонятно где, как и самое главное сколько раз используеться этот код. antreg, что у тебя не получается? Почитай вот эту статью: combat_ignore Изменено 3 Сентября 2011 пользователем ColR_iT Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти