Перейти к контенту

Рекомендуемые сообщения

Ulman

И опытные модмейкеры порой допускают просчеты ...

Этот кусок кода, как и др. аналогичные имеют вышеуказанный мною недостаток - не имея явной ошибки, по сути не выполняют задуманное.

Правильным в этом коде должно было бы быть: строка кода с проверкой общего для всех остальных типов брони патерна (stalker_bandit_) - стоять последней! Тогда бы выбор происходил бы по полным секциям броников, а в последнюю очередь - выбор общего варианта.

 

А теперь, взяв за основу предложенный _Призрак_'ом вариант, построй сам таблицу так, чтобы был ее перебор именно с выбором по всей, а не до 1-го индекса.

 

Примечание: Оптимальнее применить такой вариант для цикла:

for _,v in ipairs(stalker_gopnik) do
  if string.match(vis, v) then return section end
end

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

Ссылка на комментарий

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' нельзя задавать сразу (не только бандиты проверяются), и так же выполняет излишние проверки при несоответствии общему 'бандитскому' шаблону (патерну).

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos, Именно один раз за всю игру. Когда выполнялось опр. условие

 

Добавлено через 10 мин.:

Я использовал функцию на наличие инфопоршня, потом спавн, потом удаление инфо. И получилось

Создаю глобальный мод с новыми локациямЭ

Ссылка на комментарий

К сожалению я не могу найти хотя бы пример, создания таблицы в которой не прерывается проверка, после первого найденного значения, я просто не делал никогда большие проверки и мне хватало использовать "elseif". Сейчас даже поискал по другим скриптам, так там как раз используется "elseif". А в некоторых была проверка по таблице, вроде так же как и я написал раньше, на предыдущей странице, так вот, он использовался как раз в проверке не на первый найденный, а вообще по всей таблице. Можете пожалуйсто хоть кто то дать мне пример написания, такой таблицы, что бы проверка шла по всей таблице и не прерывалась на первом найденном?

 

P.S. Пример прошу, не потому что я его заучить хочу, а понять принцип, так сказать наглядное пособие.

Ссылка на комментарий

А зачем поиск по всей таблице?

Для примера:

    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.

 

Имеется два или более одинаковых значения в таблице?

Изменено пользователем Real Wolf
Ссылка на комментарий
Real Wolf, дак а мне надо искать не определённое значение, а именно все те которые есть в таблице, и если хоть одно совпало, то вернуть true.
Ссылка на комментарий

Не подскажете назначение функций в скрипте 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

 

Ну и что за переменные они принимают.

Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

Нужно дописать к стандартному АМК фриплею точки перехода ЧАЭС1>ЧАЭС2 и обратно. Можно ли это реализовать без редактирования all.spawn и как бы проще всего это осуществить?

Ссылка на комментарий

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

В 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, однако безрезультатно. Может я что-то делают не так или переход должен быть не через бункер саркофага а где-то в другом месте?

Ссылка на комментарий
Habaromaniac, функцию мало закинуть, её ещё и нужно вызвать, в данном случае, вроде достаточно вызвать set_lc() и spawn_level_changer() и желательно mark_lc(). Изменено пользователем Ulman
Ссылка на комментарий
Habaromaniac, функцию мало закинуть, её ещё и нужно вызвать, в данном случае, вроде достаточно вызвать set_lc() и spawn_level_changer() и желательно mark_lc().

Ulman, Я почему-то думал что они должны выполнятся автоматически, но если это не так, то как тогда прописать автовызов определенной функции?

Изменено пользователем Habaromaniac
Ссылка на комментарий

Habaromaniac, ну во первых создать свой скрипт с любым названием, в него кинуть то, что написал ты выше. Потом в скрипте xr_effects в функцию after_credits(actor, npc) написать такие строки:

название_скрипта.set_lc()
название_скрипта.spawn_level_changer()
название_скрипта.mark_lc()

По идеи должно работать...

Ссылка на комментарий

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().

Изменено пользователем Shadows
Ссылка на комментарий

Ulman,

Shadows,

Спасибо за разъяснения, буду пробовать.

 

Добавлено через 175 мин.:

Таки всё безрезультатно, через after_credits(actor, npc) в xr_effects тоже функции не вызываются.

Shadows, хотел уточнить, а где брать координаты для create_level_changer? По идее эти точки уже должны быть прописаны в каком-то файле (в сюжете ведь прекрасно все переходы работали)...

Ссылка на комментарий

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

Ссылка на комментарий

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.

Изменено пользователем singapur22

Опаа-а!!! Ливер вылез!

Ссылка на комментарий

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() откуда угодно. Можешь поставить в поршен завершения игры - тогда переход появится после последнего телепорта.

Изменено пользователем Shadows
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...