Перейти к содержанию

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

 
 
9 часов назад, imcrazyhoudini сказал:

единственная заморочка будет с добавлением всех спавнов локаций (если локации все с оригинала будут), но в принципе проблем не должно возникнуть

Как думаете сколько времени это займет?


Дополняю кодом проблему связанную с добавлением точки перехода на другую локацию через скрипт.

Дополнено 23 минуты спустя

Спойлер

<?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
<game_dialogs>
    <dialog id="new_dialog_buriy">
        <phrase_list>
            <phrase id="0">
                <text>new_dialog_buriy_0</text>
                <next>1</next>
            </phrase>
            <phrase id="1">
                <text>new_dialog_buriy_1</text>
                <next>2</next>
            </phrase>
            <phrase id="2">
                <text>new_dialog_buriy_2</text>
                <next>3</next>
            </phrase>
            <phrase id="3">
                <text>new_dialog_buriy_3</text>
                <action>_freeplay_sa.esc_yantar</action>
                <next>2</next>
            </phrase>
        </phrase_list>
    </dialog>
</game_dialogs>

 

Спойлер

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   - идентифицируют уровень, на который level_changer будет перебрасывать игрока 
    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(0)            -- тип фигуры: сфера
--        packet:w_vec3(vector():set(0, 0, 0))  -- sphere_center
--        packet:w_float(3.0)
    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())
 
--    news_manager.send_tip(db.actor, "LC creation finished", nil, nil, 30000)
end

function esc_yantar()
        create_level_changer(6006, vector():set(-241,-19,-116), 14486, 8,
            1459,
            136667,
            vector():set(194,5,-245),
            vector():set(189,5,-245),
            "l01_escape",
            0)
end

 

Спойлер

  <!--тестовый переход с кордона на янтарь-->
  <info_portion id="esc_yantar"></info_portion>

 

 

Спойлер

  ; дополнительные пути переходов
  6006        = "esc_yantar"

 

 

Спойлер

        -- esc_yantar (S6)
        obj = sim:story_object(6006)
        if obj then
            level.map_add_object_spot(obj.id, "level_changer", "to_yantar") ;
        end

 

Спойлер

	<actor_dialog>new_dialog_buriy</actor_dialog>
  </specific_character>

 

после проделанной магии вылетает ошибка

Спойлер

Expression    : ai().game_graph().header().levels().end() != I
Function      : CALifeGraphRegistry::setup_current_level
File          : E:\stalker\sources\trunk\xr_3da\xrGame\alife_graph_registry.cpp
Line          : 91
Description   : Graph point level ID not found!

 

Урок смотрел ТУТ

памагите :`|

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Pepel проверь гейм вертексы, правильно ли вписал


Дополнено 5 минуты спустя
5 часов назад, Pepel сказал:

function esc_yantar()
        create_level_changer(6006, vector():set(-241,-19,-116), 14486, 8,
            1459,
            136667,

Ощущение, будто местами перепутаны

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
55 минут назад, M31 сказал:

Pepel проверь гейм вертексы, правильно ли вписал


Дополнено 5 минуты спустя

Ощущение, будто местами перепутаны

исправил, но теперь вот такой вылет


Expression    : no_assert
Function      : CALifeStoryRegistry::add
File          : E:\stalker\sources\trunk\xr_3da\xrGame\alife_story_registry.cpp
Line          : 30
Description   : Specified story object is already in the Story registry!

Нагуглил вот такой ответ ТУТ, но всё равно что-то не сходится - сид у меня не повторяется, в алспавне тоже нет такого сида. Я специально пытаюсь без использования аллспавна забить переход таким способом, но что-то ничего не выходит.

Спойлер

Expression : no_assert Function : CALifeStoryRegistry::add File : E:\stalker\patch_1_0004\xr_3da\xrGame\alife_story_registry.cpp Line : 30 Description : Specified story object is already in the Story registry!

Причина:

Игра определила одинаковые story_id для двух и более объектов. Возникнуть это может в нескольких случаях:
1. Более явная причина: в all.spawn либо скриптом разным объектам присвоен один и тот же story_id;
2. При изменениях в спавне, т.е. добавлении или удалении секций, происходит переиндексация и секции, которые после добавленой/убавленной - получают иные индексы. В модах, в которых происходит спавн объектов по индексам из all.spawn'a (alife():create(индекс_из_all_spawn)), а это АМК, моды на его основе и не только, происходит ошибочное удаление (не того объекта) и соответственно дублированный спавн не удаленного объекта - вот вам и дублированный сид.

Лечение:

1. Найти поиском дублированные сиды и сделать их разными;
2. Добавлять секции в all.spawn исключительно с индексами превышающими максимальный в принципе в all.spawn, а не в файле. В случае удаления ситуация сложнее. Если всё же нужно избавиться от объекта в all.spawn, удаляйте его скриптом, тем самым не нарушая последовательность индексации.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Pepel час реального времени максимум

 

попробуй число увеличить, я правда не уверен, что это поможет

 

допустим с 6001 на 20000

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, imcrazyhoudini сказал:

попробуй число увеличить, я правда не уверен, что это поможет. допустим с 6001 на 20000

я тоже думал что не поможет. всё верно - не помогло) тут какой-то мегамозг нужен по-моему по этому делу):

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Pepel может спавнишь на сохранке, где такой переход уже есть? С новой игры попробуй

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 минуту назад, M31 сказал:

Pepel может спавнишь на сохранке, где такой переход уже есть? С новой игры попробуй

не, с новой игры спавнил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Pepel ну лог врать не может, понимаешь)

заспавни через акдк - так будет лучше и не сложно, раз в сдк лезть не хочешь


Дополнено 2 минуты спустя
8 часов назад, Pepel сказал:

l01_escape

а здесь случайно не l08_yantar должен быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 минуту назад, imcrazyhoudini сказал:

Pepel ну лог врать не может, понимаешь)

заспавни через акдк - так будет лучше и не сложно, раз в сдк лезть не хочешь

в том то и дело что я через acdc без проблем могу прописать, а мне надо именно так, как делал этот чел. потому что каждый раз игру начинать я не могу. это не удобно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Pepel так и не написал, в какой момент прошлый вылет был. В диалоге сразу на фразе со спавном? Или при переходе? А щас в какой момент вылет? В диалоге? Вот это убери

8 часов назад, Pepel сказал:

            <phrase id="3">
                <text>new_dialog_buriy_3</text>
                <action>_freeplay_sa.esc_yantar</action>
                <next>2</next>
            </phrase>

 

Изменено пользователем M31
  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
16 минут назад, M31 сказал:

Может дублируется спавн из-за такого перенаправления снова на вторую фразу

да. ошибка была в этом. спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Всем привет. Мне нужно "узнать" координаты ближайшей поверхности под объектом, который я спавню скриптом высоко в воздухе. Как это сделать, и как узнать координаты точки, на которую смотрит ГГ?

Upd: Кроме того, взрывчатка, которую я спавню по скрипту, не появляется, пока я не подойду достаточно близко (на расстояние в 150м, полагаю). Можно ли её так заспавнить, чтобы она сразу перешла в онлайн?

Спойлер

я делаю скрипт вызова миномётного обстрела по указанным координатам. Собственно, я решил присобачить звук приближающегося снаряда, а проигрывать его нужно на земле, т.к. "снаряд" спавнится на высоте ~20 метров. Скрипт универсальный, потому вручную прописать все места приземления снарядов не выйдет.

P.S: можно просто немного изменить настройки звука, и запускать его в воздухе, но вопрос всё ещё актуален.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
18 часов назад, Etil сказал:

Мне нужно "узнать" координаты ближайшей поверхности под объектом, который я спавню скриптом высоко в воздухе

Можно попробовать использовать координаты левел вертекса local pos = level.vertex_position(lv)

18 часов назад, Etil сказал:

как узнать координаты точки, на которую смотрит ГГ?

Вроде в ogsr и в x-ray extensions добавили функции для этого, в оригинале без танцев с бубном никак

18 часов назад, Etil сказал:

взрывчатка, которую я спавню по скрипту, не появляется, пока я не подойду достаточно близко

Она просто спавнится или спавнится и сразу взрывается?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

M31 

3 часа назад, M31 сказал:

Она просто спавнится или спавнится и сразу взрывается?

Обработчик событий взрывчатки наносит по ней урон (взрывает) на первом binder:update. Сам объект (основанный на секции "explosive_tank") не появляется, пока ГГ не подойдёт достаточно близко.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Etil ну это же спавн элемент, верно? они спавнятся лишь в зоне алайфа

 

в сдк можно было бы поставить галочку всегда быть в онлайне, может как-то и здесь вышло бы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

imcrazyhoudini Знать бы, как работает механика спавна. Если объект, который я спавню, находится в оффлайне пока не окажется в зоне а-лайфа, то что-то с этим можно сделать. Если спавн просто не происходит пока я не подойду достаточно близко - то решения я не вижу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Etil если грубо и вкратце
 

Спойлер

сталкер сам по себе как серверная игра, но сервер и клиент на одном компе. Есть серверные объекты (оффлайновые) и клиентские (онлайновые) - это копии серверного объекта, создаются когда объект попадает в зону алайфа (или всегда в онлайне на текущей локации). Ну, совсем грубо, если какой-то объект находится в онлайне, получается, этот объект "раздвоен" - один основной на сервере и второй как копия у игрока. За радиусом алайфа только серверные объекты (если не выведены принудительно в онлайн). При спавне за радиусом алайфа должен в любом случае заспавниться объект, но он будет серверным. У оффлайновых и онлайновых объектов разные функции, если что-то работает у онлайнового  - может не работать у оффлайнового (или название другое). Хитануть можно только онлайновый. Можно в lua_help.script посмотреть, что у кого (для онлайновых смотри class game_object, остальное для оффлайновых. Тут можно посмотреть описание большинства функций https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkciyam-i-klassam )

Соответственно, получать серверный объект и клиентский придется по-разному. Например, по id серверный alife():object(id) (сюда еще подойдет name из оллспауна), клиентский level.object_by_id(id) ну т.д. Тот же id объекта по-разному получается, у серверного obj.id, у клиентского obj:id()

Как проверяешь, заспавнился ли объект? По срабатыванию биндера? Биндер работает только у онлайнового объекта, но это не значит, что объект вообще не заспавнился, просто не появилась клиентская "копия"

Для чего ее взрываешь? Если чтобы убить кого-то - смысла держать взрывчатку все время в онлайне нет, все равно все нпс и мутни за радиусом алайфа в оффлайне, и их не зацепит. Или для красивого эффекта?

 

Изменено пользователем M31
  • Мастер! 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

M31 Взрываю чтобы убить, но выглядит это довольно странно, когда вызываешь минометный обстрел, отходишь на 100-150 метров, и он не происходит. Потом подходишь на метров 30, вызываешь повторно - и всё работает. По поводу функционала соглашусь, большинство НПС в оригинальной игре постоянно в онлайне не находятся, хотя такие есть (или, как минимум, такая функция). С учётом этого, проще будет симулировать взрыв, если ГГ находится за радиусом алайфа (партиклы + звук, что можно без особых проблем реализовать). За информацию спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Etil в принципе, можно попробовать убивать оффлайновых нпс и мутней через sobj:on_death(sobj), но тогда придется делать перебор всех объектов и сравнивать расстояние от них до взрывчатки.

В онлайн взрывчатку перевести можно так:

alife():set_switch_offline(id, false)
alife():set_switch_online(id, true)
alife():set_interactive(id, true)

В оффлайн:

alife():set_switch_offline(id, true)
alife():set_switch_online(id, false)
alife():set_interactive(id, false)

В _g.script есть функция для проверки, в онлайне объект или нет - is_object_online, можно через нее проверять и при необходимости переводить в онлайн

Хит лучше перенести в net_spawn, так и будет на каждом апдейте хитовать. Можно взрывать не хитом, а через obj:explode(0)


Дополнено 11 минуты спустя

А, в _g.script есть и функция с переводом в онлайн - switch_online

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Ребят, а как делать иконки персонажей для инвентаря, типо таких вот?

p1K0xoUqClrfNHIWuB_Zmg.png

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

vladvexa188 невозможно открыть, если ты о иконке в полон рост - то логично, что скринить нпс в удобном месте (3д редактор, сдк, игра), обрезать в фотошопе и вставлять в игру

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Всем привет! Вопрос такой. Как заставить НПС проигрывать анимации покачивания, разминки, почёсывания, поглядывания в даль и т.д. А так же как увеличить вариации анимаций при ранении, чтобы НПС не только падал, но и садился на колени или, хромая, отходил в кусты ( как в билдах )?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

STaLKeRoc xr_meet.script и xr_wounded.script

 

раз задаёшь такие вопросы, то наверное не разбираешься, проще с олр перенести

 

возможно придётся анимации новые регистрировать, state_lib.script и прочее, а конкретнее state_mgr_animation_list.script, пишу по памяти, могу быть неточным

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

братишки, надеюсь я в правильную тему обращаюсь, если нет, то прошу словом не бить. В общем такая тема: куда и как прописывается сам "индикатор" перехода с локации на локацию? хочется его или совсем убрать, или прописать в файлах другую картинку. помогайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Pepel возможно ui_common.dds имеет иконку перехода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   1 пользователь онлайн