Overf1rst 1 424 Опубликовано 1 июля, 2020 Тема посвящена моддингу на платформе Тень Чернобыля. Правила темы: Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском, ответ на него, вероятно, уже есть. Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода. Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа). Благодарность выражаем в личке или же ставим реакцию. Посты с благодарностями в теме будут удаляться. 6 4 1 3 1 3 6 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pepel 77 Опубликовано 4 января, 2023 (изменено) 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! Урок смотрел ТУТ памагите :`| Изменено 4 января, 2023 пользователем Pepel Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
N42 580 Опубликовано 4 января, 2023 Pepel проверь гейм вертексы, правильно ли вписал Дополнено 5 минуты спустя 5 часов назад, Pepel сказал: function esc_yantar() create_level_changer(6006, vector():set(-241,-19,-116), 14486, 8, 1459, 136667, Ощущение, будто местами перепутаны Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pepel 77 Опубликовано 4 января, 2023 (изменено) 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, удаляйте его скриптом, тем самым не нарушая последовательность индексации. Изменено 4 января, 2023 пользователем Pepel Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imcrazyhoudini 919 Опубликовано 4 января, 2023 Pepel час реального времени максимум попробуй число увеличить, я правда не уверен, что это поможет допустим с 6001 на 20000 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pepel 77 Опубликовано 4 января, 2023 (изменено) 1 час назад, imcrazyhoudini сказал: попробуй число увеличить, я правда не уверен, что это поможет. допустим с 6001 на 20000 я тоже думал что не поможет. всё верно - не помогло) тут какой-то мегамозг нужен по-моему по этому делу): Изменено 4 января, 2023 пользователем Pepel Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
N42 580 Опубликовано 4 января, 2023 Pepel может спавнишь на сохранке, где такой переход уже есть? С новой игры попробуй Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pepel 77 Опубликовано 4 января, 2023 1 минуту назад, M31 сказал: Pepel может спавнишь на сохранке, где такой переход уже есть? С новой игры попробуй не, с новой игры спавнил. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imcrazyhoudini 919 Опубликовано 4 января, 2023 Pepel ну лог врать не может, понимаешь) заспавни через акдк - так будет лучше и не сложно, раз в сдк лезть не хочешь Дополнено 2 минуты спустя 8 часов назад, Pepel сказал: l01_escape а здесь случайно не l08_yantar должен быть? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pepel 77 Опубликовано 4 января, 2023 1 минуту назад, imcrazyhoudini сказал: Pepel ну лог врать не может, понимаешь) заспавни через акдк - так будет лучше и не сложно, раз в сдк лезть не хочешь в том то и дело что я через acdc без проблем могу прописать, а мне надо именно так, как делал этот чел. потому что каждый раз игру начинать я не могу. это не удобно. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
N42 580 Опубликовано 4 января, 2023 (изменено) Pepel так и не написал, в какой момент прошлый вылет был. В диалоге сразу на фразе со спавном? Или при переходе? А щас в какой момент вылет? В диалоге? Вот это убери 8 часов назад, Pepel сказал: <phrase id="3"> <text>new_dialog_buriy_3</text> <action>_freeplay_sa.esc_yantar</action> <next>2</next> </phrase> Изменено 4 января, 2023 пользователем M31 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pepel 77 Опубликовано 4 января, 2023 16 минут назад, M31 сказал: Может дублируется спавн из-за такого перенаправления снова на вторую фразу да. ошибка была в этом. спасибо! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Etil 8 Опубликовано 4 января, 2023 (изменено) Всем привет. Мне нужно "узнать" координаты ближайшей поверхности под объектом, который я спавню скриптом высоко в воздухе. Как это сделать, и как узнать координаты точки, на которую смотрит ГГ? Upd: Кроме того, взрывчатка, которую я спавню по скрипту, не появляется, пока я не подойду достаточно близко (на расстояние в 150м, полагаю). Можно ли её так заспавнить, чтобы она сразу перешла в онлайн? Спойлер я делаю скрипт вызова миномётного обстрела по указанным координатам. Собственно, я решил присобачить звук приближающегося снаряда, а проигрывать его нужно на земле, т.к. "снаряд" спавнится на высоте ~20 метров. Скрипт универсальный, потому вручную прописать все места приземления снарядов не выйдет. P.S: можно просто немного изменить настройки звука, и запускать его в воздухе, но вопрос всё ещё актуален. Изменено 4 января, 2023 пользователем Etil Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
N42 580 Опубликовано 5 января, 2023 (изменено) 18 часов назад, Etil сказал: Мне нужно "узнать" координаты ближайшей поверхности под объектом, который я спавню скриптом высоко в воздухе Можно попробовать использовать координаты левел вертекса local pos = level.vertex_position(lv) 18 часов назад, Etil сказал: как узнать координаты точки, на которую смотрит ГГ? Вроде в ogsr и в x-ray extensions добавили функции для этого, в оригинале без танцев с бубном никак 18 часов назад, Etil сказал: взрывчатка, которую я спавню по скрипту, не появляется, пока я не подойду достаточно близко Она просто спавнится или спавнится и сразу взрывается? Изменено 5 января, 2023 пользователем M31 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Etil 8 Опубликовано 5 января, 2023 M31 3 часа назад, M31 сказал: Она просто спавнится или спавнится и сразу взрывается? Обработчик событий взрывчатки наносит по ней урон (взрывает) на первом binder:update. Сам объект (основанный на секции "explosive_tank") не появляется, пока ГГ не подойдёт достаточно близко. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imcrazyhoudini 919 Опубликовано 5 января, 2023 Etil ну это же спавн элемент, верно? они спавнятся лишь в зоне алайфа в сдк можно было бы поставить галочку всегда быть в онлайне, может как-то и здесь вышло бы Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Etil 8 Опубликовано 5 января, 2023 imcrazyhoudini Знать бы, как работает механика спавна. Если объект, который я спавню, находится в оффлайне пока не окажется в зоне а-лайфа, то что-то с этим можно сделать. Если спавн просто не происходит пока я не подойду достаточно близко - то решения я не вижу. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
N42 580 Опубликовано 6 января, 2023 (изменено) 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() Как проверяешь, заспавнился ли объект? По срабатыванию биндера? Биндер работает только у онлайнового объекта, но это не значит, что объект вообще не заспавнился, просто не появилась клиентская "копия" Для чего ее взрываешь? Если чтобы убить кого-то - смысла держать взрывчатку все время в онлайне нет, все равно все нпс и мутни за радиусом алайфа в оффлайне, и их не зацепит. Или для красивого эффекта? Изменено 6 января, 2023 пользователем M31 2 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Etil 8 Опубликовано 6 января, 2023 M31 Взрываю чтобы убить, но выглядит это довольно странно, когда вызываешь минометный обстрел, отходишь на 100-150 метров, и он не происходит. Потом подходишь на метров 30, вызываешь повторно - и всё работает. По поводу функционала соглашусь, большинство НПС в оригинальной игре постоянно в онлайне не находятся, хотя такие есть (или, как минимум, такая функция). С учётом этого, проще будет симулировать взрыв, если ГГ находится за радиусом алайфа (партиклы + звук, что можно без особых проблем реализовать). За информацию спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
N42 580 Опубликовано 7 января, 2023 (изменено) 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 Изменено 7 января, 2023 пользователем M31 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vladvexa188 5 Опубликовано 11 января, 2023 (изменено) Ребят, а как делать иконки персонажей для инвентаря, типо таких вот? p1K0xoUqClrfNHIWuB_Zmg.png Изменено 11 января, 2023 пользователем vladvexa188 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imcrazyhoudini 919 Опубликовано 12 января, 2023 vladvexa188 невозможно открыть, если ты о иконке в полон рост - то логично, что скринить нпс в удобном месте (3д редактор, сдк, игра), обрезать в фотошопе и вставлять в игру Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
STaLKeRoc 0 Опубликовано 12 января, 2023 Всем привет! Вопрос такой. Как заставить НПС проигрывать анимации покачивания, разминки, почёсывания, поглядывания в даль и т.д. А так же как увеличить вариации анимаций при ранении, чтобы НПС не только падал, но и садился на колени или, хромая, отходил в кусты ( как в билдах )? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imcrazyhoudini 919 Опубликовано 13 января, 2023 STaLKeRoc xr_meet.script и xr_wounded.script раз задаёшь такие вопросы, то наверное не разбираешься, проще с олр перенести возможно придётся анимации новые регистрировать, state_lib.script и прочее, а конкретнее state_mgr_animation_list.script, пишу по памяти, могу быть неточным Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pepel 77 Опубликовано 14 января, 2023 братишки, надеюсь я в правильную тему обращаюсь, если нет, то прошу словом не бить. В общем такая тема: куда и как прописывается сам "индикатор" перехода с локации на локацию? хочется его или совсем убрать, или прописать в файлах другую картинку. помогайте. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
imcrazyhoudini 919 Опубликовано 14 января, 2023 Pepel возможно ui_common.dds имеет иконку перехода Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты