Artos 99 Опубликовано 27 Августа 2011 Поделиться Опубликовано 27 Августа 2011 (изменено) Ulman И опытные модмейкеры порой допускают просчеты ... Этот кусок кода, как и др. аналогичные имеют вышеуказанный мною недостаток - не имея явной ошибки, по сути не выполняют задуманное. Правильным в этом коде должно было бы быть: строка кода с проверкой общего для всех остальных типов брони патерна (stalker_bandit_) - стоять последней! Тогда бы выбор происходил бы по полным секциям броников, а в последнюю очередь - выбор общего варианта. А теперь, взяв за основу предложенный _Призрак_'ом вариант, построй сам таблицу так, чтобы был ее перебор именно с выбором по всей, а не до 1-го индекса. Примечание: Оптимальнее применить такой вариант для цикла: for _,v in ipairs(stalker_gopnik) do if string.match(vis, v) then return section end end Изменено 27 Августа 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Kirag 39 Опубликовано 27 Августа 2011 Поделиться Опубликовано 27 Августа 2011 Artos В последнем варианте позволю себе не согласиться: на мой взгляд, порядок здесь правильный. Здесь ведь перебор идет до конца в любом случае - вместо оператора return здесь присвоение значения. Первым делом, если вообще найдена подстрока "stalker_bandit_", переменной section присваивается значение по умолчанию. Потом уже проверяются частности - а не ветеран ли, и т.д. , если да, переменная переопределяется (ну и потом, очевидно, используется, скорее всего, для спавна) Если же поставить проверку общей подстроки "stalker_bandit_" в конец, какой бы вид не был определен раньше, он сбросится на дефолтный "bandit_outfit" - именно потому, что условие будет истиным всегда, если истино хоть одно из предыдущих. Вариант section = "bandit_outfit" -- дефолтный вариант без разговоров if string.find(vis,"stalker_bandit_veteran") then section = "bandit_veteran_outfit" elseif string.find(vis,"stalker_bandit_master") or string.find(vis,"stalker_bandit_borov") then section = "bandit_master_outfit" elseif string.find(vis,"stalker_bandit_exoskeleton") then section = "exo_bandit_outfit" end с одной стороны исключает одну проверку на общую подстроку, но с другой - даже если бандит, но визуал НЕ бандитский (редко, но не невозможно) - выдает "bandit_outfit" - и в этом случае уже логика нарушается. А по хорошему, стОит внести все визуалы в таблицу вида визуал = секция, и выбирать оттуда. А такие проверки оставить как план Б, на случай отсутствия визуала в таблице - новая модель, например... Мои работы: Ночные прицелы + смена ножевого слота AI вертолетов + ПЗРК Soul Cube Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем. Ссылка на комментарий
Artos 99 Опубликовано 27 Августа 2011 Поделиться Опубликовано 27 Августа 2011 (изменено) Kirag Ты прав, несколько погорячился, с 'не выполняют задуманное' в коде OGSE. Приношу извинения ... Но, это все же пример из разряда: "как почесать правое ухо левой пяткой". Выполнять первичную проверку на общий патерн и продолжать все дальнейшие проверки на этот же патерн с суффиксами, даже если общая проверка не прошла - далеко и от логичности и от оптимальности. Ведь по сути все это решается просто: local uni_bandit_suits = { --/ массив уникальных бандитских костюмов ["stalker_bandit_veteran"] = "bandit_veteran_outfit", ["stalker_bandit_master"] = "bandit_master_outfit", ["stalker_bandit_borov"] = "bandit_master_outfit", ["stalker_bandit_exoskeleton"] = "exo_bandit_outfit" } if string.match(vis, "stalker_bandit_") then --/ проверка на общий патерн section = "bandit_outfit" --/ дефолтно используем общий простенький бандитский костюм for k,v in pairs(uni_bandit_suits) do if string.match(vis, k) then --/ проверка на 'уникальный' костюм section = v break end end end исключая все лишние проверки, и вместо 5-ти текстовых проверок каждый раз - выполняются только необходимые и достаточные. Предложенный тобою вариант оторван от оригинала, где 'section' нельзя задавать сразу (не только бандиты проверяются), и так же выполняет излишние проверки при несоответствии общему 'бандитскому' шаблону (патерну). Изменено 27 Августа 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
strelok200 0 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 Artos, Именно один раз за всю игру. Когда выполнялось опр. условие Добавлено через 10 мин.: Я использовал функцию на наличие инфопоршня, потом спавн, потом удаление инфо. И получилось Создаю глобальный мод с новыми локациямЭ Ссылка на комментарий
Ulman 5 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 К сожалению я не могу найти хотя бы пример, создания таблицы в которой не прерывается проверка, после первого найденного значения, я просто не делал никогда большие проверки и мне хватало использовать "elseif". Сейчас даже поискал по другим скриптам, так там как раз используется "elseif". А в некоторых была проверка по таблице, вроде так же как и я написал раньше, на предыдущей странице, так вот, он использовался как раз в проверке не на первый найденный, а вообще по всей таблице. Можете пожалуйсто хоть кто то дать мне пример написания, такой таблицы, что бы проверка шла по всей таблице и не прерывалась на первом найденном? P.S. Пример прошу, не потому что я его заучить хочу, а понять принцип, так сказать наглядное пособие. Ссылка на комментарий
Real Wolf 34 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 (изменено) А зачем поиск по всей таблице? Для примера: local tTable = { "1", "2", "3", "1", "4", "1" } local iFindedCount = 0 for iKey, sValue in pairs(tTable) do if sValue == "1" then iFindedCount = iFindedCount + 1 end end Мы искали в таблице "1", на выходе получили значение iFindedCount равное количеству найденных строк("1"), то есть оно будет равно 3, если же нужной строки(значения) нету вообще, значение будет равно 0. Имеется два или более одинаковых значения в таблице? Изменено 28 Августа 2011 пользователем Real Wolf Ссылка на комментарий
Ulman 5 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 Real Wolf, дак а мне надо искать не определённое значение, а именно все те которые есть в таблице, и если хоть одно совпало, то вернуть true. Ссылка на комментарий
Desertir 202 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 (изменено) Не подскажете назначение функций в скрипте xr_logic.script function pstor_store(obj, varname, val) local npc_id = obj:id() --ид объекта if db.storage[npc_id].pstor == nil then --что за пстор ? db.storage[npc_id].pstor = {} end local tv = type(val) -- что за type ? if not pstor_is_registered_type(tv) then abort("xr_logic: pstor_store: not registered type '%s' encountered", tv) --выброс игры? end db.storage[npc_id].pstor[varname] = val end function pstor_retrieve(obj, varname, defval) local npc_id = obj:id() if db.storage[npc_id].pstor ~= nil then local val = db.storage[npc_id].pstor[varname] if val ~= nil then return val end end if defval ~= nil then return defval end return nil --' abort("xr_logic: pstor_retrieve: variable '%s' does not exist", varname) end Ну и что за переменные они принимают. Изменено 28 Августа 2011 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
albor 0 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 Друг просил спросить, у него сейчас нет инета - зачем нужны значения p_dest_xxx, в файлах alife_имя_локи.ltх? Ссылка на комментарий
Habaromaniac 0 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 Нужно дописать к стандартному АМК фриплею точки перехода ЧАЭС1>ЧАЭС2 и обратно. Можно ли это реализовать без редактирования all.spawn и как бы проще всего это осуществить? Ссылка на комментарий
*Shoker* 322 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 Desertir Если грубо, то это записывание какой то информации в сохранение. Все переменные в lua после save\load теряются, и занаво инициализируются. А если какую то переменную нужно сохранить, то тогда её записывают в сохранение, через pstor (есть ещё и другие варианты, но это самый простой) Функции save\load_variable() сейчас есть во всех серьёзных и не очень модах, которые как то затрагивают скрипты. Можешь глянуть в том же amk.script, откуда эта функция и пошла. В оригинале она по моему тока в скрипте xr_wounded используется, по крайнем мере больше не замечал. obj - это онлаин объект, тоесть можно записать какую то инфу конкретно данному НПС. Но обычно передают db.actor (игрока) и в него всякую информацию записывают. varname - это просто текстовое название переменной, по которой она будет занесена в таблицу val - соответственно значение этой переменной. pstor_load уже возвращает записанное значение, ежели такого значения нет, то возвращает defval (значение переменной по умолчанию) type() стандартная луа-функция. Определяет тип переменной - число, строка, ф-я, таблица и прочее. Напомню что в pstor можно записывать тока числа и строки. Нов том же АМК есть функция save_table которая превращает таблицу в строку и также записывает. Ну и нужно учесть, что размер pstor не резиновй, записать туда можно прилично, но если перестараться. игра просто будет вылетать после определённого промежутка времени. Поэтому важно ещё и удалять уже ненужные записи и не записывать ничего тяжёлого, вроде больших текстов. Habaromaniac В ogsm_freeplay.script из OGSM мод глянь функцию спавна level_changera - для перехода между уровнями. В АМК она м.б тоже есть, я не помню как они переходы делали. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Habaromaniac 0 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 Habaromaniac В ogsm_freeplay.script из OGSM мод глянь функцию спавна level_changera - для перехода между уровнями. В АМК она м.б тоже есть, я не помню как они переходы делали. Я выковырял оттуда данные функции: -- Спавним левел-чейнджер function spawn_level_changer(sid, from_pos, from_level, dest_pos, dest_level, hint, mode, dest_dir) local vertexes = { l01_escape = {lvid=594266, gvid=0}, l04_darkvalley = {lvid=121712, gvid=815}, l11_pripyat = {lvid=142116, gvid=2270}, l12_stancia = {lvid=405348, gvid=2400}, l12_stancia_2 = {lvid=9914, gvid=2517} -- l12_stancia_2 = {lvid=227423, gvid=2635} } local obj = alife():create("level_changer", from_pos, vertexes[from_level]["lvid"], vertexes[from_level]["gvid"]) if obj then level.map_add_object_spot(obj.id, "level_changer", hint) 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_s32() local level_vertex_id = packet:r_s32() local object_flags = packet:r_s32() local custom_data = packet:r_stringZ() local story_id = packet:r_s32() local cse_alife_object__unk3_u32 = packet:r_s32() -- свойства cse_shape local shape_count = packet:r_u8() local shape_type local center local radius if shape_count == 0 then shape_type = 0 center = vector():set(0,0,0) radius = 10.0 shape_count = 1 else for i=1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then local center = packet:r_vec3() local radius = packet:r_float() else local v1 = packet:r_vec3() local v2 = packet:r_vec3() local v3 = packet:r_vec3() local v4 = packet:r_vec3() end end end -- свойства cse_alife_space_restrictor local restrictor_type = packet:r_u8() -- свойства cse_alife_level_changer local dest_game_vertex_id = packet:r_u16() local dest_level_vertex_id = packet:r_s32() 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() if packet:r_elapsed() ~= 0 then get_console():execute("left="..packet:r_elapsed()) end -- свойства cse_alife_object packet:w_u16(game_vertex_id) packet:w_float(cse_alife_object__unk1_f32) packet:w_s32(cse_alife_object__unk2_u32) packet:w_s32(level_vertex_id) packet:w_s32(object_flags) packet:w_stringZ(custom_data) packet:w_s32(sid) packet:w_s32(cse_alife_object__unk3_u32) -- свойства cse_shape packet:w_u8(shape_count) for i=1,shape_count do packet:w_u8(shape_type) if shape_type == 0 then packet:w_vec3(vector():set(0,0,0)) packet:w_float(3) else packet:w_vec3(vector():set(3,0,0)) packet:w_vec3(vector():set(0,3,0)) packet:w_vec3(vector():set(0,0,3)) packet:w_vec3(vector():set(0,0,0)) end end -- свойства cse_alife_space_restrictor packet:w_u8(restrictor_type) -- свойства cse_alife_level_changer packet:w_u16(vertexes[dest_level]["gvid"]) packet:w_s32(vertexes[dest_level]["lvid"]) packet:w_vec3(dest_pos) if dest_dir then packet:w_vec3(dest_dir) else packet:w_vec3(dest_direction) end packet:w_stringZ(dest_level) packet:w_stringZ(dest_graph_point) packet:w_u8(mode) obj:STATE_Read(packet, packet:w_tell()-packet:r_tell()) end end -- Удаление лишних переходов function disable_sar_entrance() for i=1,65535 do local obj = alife():object(i) if obj and obj:name()=="exit_to_sarcofag_01" then alife():release(obj, true) end end end -- Спавн всех нужных переходов function set_lc() if not db.actor or not has_alife_info("game_end") then xr_effects.after_credits() else level.add_pp_effector("teleport.ppe", 2008, false) -- ЧАЭС2 - ЧАЭС -- spawn_level_changer(6003, vector():set(554.52,150,201), "l12_stancia_2", vector():set(117.6,-0.1,-76.3), "l12_stancia", "to_aes", 1, vector():set(0,-1.5,0)) spawn_level_changer(6003, vector():set(-42.15,-0.02,56.03), "l12_stancia_2", vector():set(126,-0.1,-76.3), "l12_stancia", "to_aes", 0, vector():set(0,-1.5,0)) -- ЧАЭС - ЧАЭС2 spawn_level_changer(6004, vector():set(117.6,-0.1,-76.3), "l12_stancia", vector():set(-42.15,-0.02,64), "l12_stancia_2", "to_aes", 0) end end -- Отмечаем на карте новые точки перехода function mark_lc() local obj = alife():story_object(6003) if obj then level.map_add_object_spot(obj.id, "level_changer", "to_aes") end local obj = alife():story_object(6004) if obj then level.map_add_object_spot(obj.id, "level_changer", "to_aes") end if has_alife_info("freeplay") and (level.name()=="l12_stancia" or level.name()=="l12_stancia_2" or level.name()=="l11_pripyat" or level.name()=="l10_radar") then level.set_weather("default") end end И закинул это всё в xr_logic.script, однако безрезультатно. Может я что-то делают не так или переход должен быть не через бункер саркофага а где-то в другом месте? Ссылка на комментарий
Ulman 5 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 (изменено) Habaromaniac, функцию мало закинуть, её ещё и нужно вызвать, в данном случае, вроде достаточно вызвать set_lc() и spawn_level_changer() и желательно mark_lc(). Изменено 28 Августа 2011 пользователем Ulman Ссылка на комментарий
Habaromaniac 0 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 (изменено) Habaromaniac, функцию мало закинуть, её ещё и нужно вызвать, в данном случае, вроде достаточно вызвать set_lc() и spawn_level_changer() и желательно mark_lc(). Ulman, Я почему-то думал что они должны выполнятся автоматически, но если это не так, то как тогда прописать автовызов определенной функции? Изменено 28 Августа 2011 пользователем Habaromaniac Ссылка на комментарий
Ulman 5 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 Habaromaniac, ну во первых создать свой скрипт с любым названием, в него кинуть то, что написал ты выше. Потом в скрипте xr_effects в функцию after_credits(actor, npc) написать такие строки: название_скрипта.set_lc() название_скрипта.spawn_level_changer() название_скрипта.mark_lc() По идеи должно работать... Ссылка на комментарий
RayTwitty 492 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 (изменено) Habaromaniac, не парься. Вот функция переходов: Сама функция перехода: -- Author - singapur22 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 pripyat_to_cop_pripyat() create_level_changer(97115, vector():set(189.497,-2.115,233.149),259791,2149, -- где переход (SID,x,y,z,lvertex,gvertex) 176155,3760, vector():set(-15.765,-0.496,307.323), -- куда переходить (lvertex,gvertex,x,y,z) vector():set(0.0,-1.58,-1.0), -- направление взгляда при появлении "pripyat",0) -- на какую локу и запрос (0 - появится вопрос, 1 - автоматический переход) end Думаю понятно. Вот кстати у себя вычислил направления взгляда при появлении: (0.0,0.0,-1.0) смотрим на север (0.0,1.56,-1.0) смотрим на запад (0.0,-1.58,-1.0) смотрим на восток (0.0,-3.15,-1.0) смотрим на юг Дальше нужно переход отметить на карте. Конечно если это нужно (например в подземных локах это будет не красиво смотреться)... В скрипте level_tasks пишешь рядом с стандартными переходами: obj = sim:story_object(97115) -- сид уровня ,который ты задавал в функции спавна, вот здесь: create_level_changer(97115 ... if obj then level.map_add_object_spot(obj.id, "level_changer", "В Припять ЗП") end Всё. Для появления перехода вызываешь: pripyat_to_cop_pripyat(). Изменено 28 Августа 2011 пользователем Shadows Ссылка на комментарий
Habaromaniac 0 Опубликовано 28 Августа 2011 Поделиться Опубликовано 28 Августа 2011 Ulman, Shadows, Спасибо за разъяснения, буду пробовать. Добавлено через 175 мин.: Таки всё безрезультатно, через after_credits(actor, npc) в xr_effects тоже функции не вызываются. Shadows, хотел уточнить, а где брать координаты для create_level_changer? По идее эти точки уже должны быть прописаны в каком-то файле (в сюжете ведь прекрасно все переходы работали)... Ссылка на комментарий
ziStam 1 Опубликовано 29 Августа 2011 Поделиться Опубликовано 29 Августа 2011 Habaromaniac, в сюжете(оригинала тч) все переходы идут через аll.sраwn, а координаты брать через скрипт. Замени в скрипте ui_main_menu функцию function main_menu_on_button_return_game() local console = get_console() console:execute("main_menu_off") end на function main_menu_on_button_return_game() local console = get_console() local text local vid local gvid local a = vector() local text a = db.actor:position() vid = db.actor:level_vertex_id() gvid = db.actor:game_vertex_id() text = "Позиция ГГ:nx= "..a.x.."\\ny = "..a.y.."\\nz= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid news_manager.send_tip(db.actor, text, nil, nil, 30000) console:execute("main_menu_off") end и тебе придет смс с координатами ГГ! Удачи! Legend of Stalker Ссылка на комментарий
singapur22 14 Опубликовано 29 Августа 2011 Поделиться Опубликовано 29 Августа 2011 (изменено) Habaromaniac, Вот кстати у себя вычислил направления взгляда при появлении: ... Значения немного не точные, но укажу как их вычислить. Определение угла от Pi можно производить lua функцией math.rad(num) Где, num -- угол в градусах. -1 по координате Z указывает нулевое направление (в сторону отрицательного луча, вектора Z). Нулевым направлением можно сделать и вектор X, если кому так удобней, но при этом нужно будет учитывать, что угол поворота будет определяться от данного вектора. Приведём небольшой пример: Укажим угол поворота, на 90 градусов вправо, от указанного нулевого луча (-Z): p_dest_dir = vector():set(0, math.rad(90), -1) --будет аналогичен примеру... p_dest_dir = vector():set(0, 1.57, -1) По сути, поворот на 180 градусов, в представлении Pi, равен ему же. (Pi = 3.14159...) Отсюда, углом поворота можно управлять и путём управления значением Pi. В lua, Pi определяется константой math.pi. Соответственно, чтобы указать угол поворота на 90 градусов, нужно будет значение Pi разделить на 2: p_dest_dir = vector():set(0, math.pi / 2, -1) Полный поворот на 360 градусов, объявляется умножением Pi на 2. Изменено 29 Августа 2011 пользователем singapur22 Опаа-а!!! Ливер вылез! Ссылка на комментарий
RayTwitty 492 Опубликовано 29 Августа 2011 Поделиться Опубликовано 29 Августа 2011 (изменено) Habaromaniac, на счет координат тебе ответили выше. Теперь на счет вызова функции. Можно её выполнять при новой игре. Как мы знаем при НИ выдается поршен, и можно на него повесить выполнение функции. В gamedata\config\gameplay в файле info_portions.xml вверху файла видишь: <info_portion id="storyline_actor_start"> <task>storyline_eliminate_gunslinger</task> <action>названия_скрипта.pripyat_to_cop_pripyat</action> ВОТ ЭТО ДОБАВИТЬ </info_portion> pripyat_to_cop_pripyat - название функции спавна перехода. Пишешь какая у тебя там. Добавлено через 2 мин.: singapur22, ну да, я вычислял "кустарным" способом - переходил по новому переходу и смотрел куда смотрит ГГ. Habaromaniac, вызывай pripyat_to_cop_pripyat() откуда угодно. Можешь поставить в поршен завершения игры - тогда переход появится после последнего телепорта. Изменено 29 Августа 2011 пользователем Shadows Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти