Zander_driver 10 334 Опубликовано 19 Сентября 2015 Поделиться Опубликовано 19 Сентября 2015 (изменено) @Charsi, Просто чудо =) Спасибо огромное. И так можно переопределять любые методы объектов, возвращаемых всяческими функциями? типа system_ini() например. А переопределить движковые методы, например пространства level - наверно не получится так? Там нам объект не выдается, у которого можно поле изменить... Изменено 19 Сентября 2015 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Карлан 1 049 Опубликовано 19 Сентября 2015 Поделиться Опубликовано 19 Сентября 2015 Переопределять можно все методы, в т.ч. и для гейм объектов, а так же добавлять новые. Пространство левел тому явно не исключение. @RayTwitty, на 4 движке не работает ХЕ Ссылка на комментарий
RayTwitty 502 Опубликовано 19 Сентября 2015 Поделиться Опубликовано 19 Сентября 2015 (изменено) на 4 движке не работает ХЕ 4 движке Приближался конец 2015 года... А переопределить движковые методы, например пространства level - наверно не получится так? function level.new() return 0 endвсё работает. Изменено 19 Сентября 2015 пользователем RayTwitty 1 Ссылка на комментарий
Romz 142 Опубликовано 25 Сентября 2015 Поделиться Опубликовано 25 Сентября 2015 (изменено) Уважаемые скриптеры! Опять нужна ваша помощь... Есть скрипт, под ЗП, спавнящий аномалии. С самим размещением аномалий - никаких проблем, вроде бы, но... Есть в этом скрипте функция, которая работает с net-пакетами function create_anom(section,rad_anom,x,y,z,lv,gv,mode,time1,time2) if gv==nil then gv=db.actor:game_vertex_id() end if lv==nil then lv=db.actor:level_vertex_id() end if pos==nil then pos=db.actor:position() end local p_obj = alife():create(section,vector():set(x,y,z),lv,gv) local packet = net_packet() packet:w_begin(0) packet:r_seek(2) p_obj:STATE_Write(packet) 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() local shape_count = packet:r_u8() 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 box = packet:r_matrix() end end local restrictor_type = packet:r_u8() local cse_alife_custom_zone__unk1_f32 = packet:r_float() local cse_alife_custom_zone__unk2_u32 = packet:r_s32() local on_off_mode_enabled_time = packet:r_s32() local on_off_mode_disabled_time = packet:r_s32() local on_off_mode_shift_time = packet:r_s32() local offline_interactive_radius = packet:r_float() local artefact_spawn_places_count = packet:r_u16() local cse_alife_anomalous_zone__unk1_u32 = packet:r_s32() local last_spawn_time_present = packet:r_u8() 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) if mode~=nil then custom_data = mode end packet:w_stringZ(custom_data) packet:w_s32(story_id) packet:w_s32(cse_alife_object__unk3_u32) packet:w_u8(1) packet:w_u8(0) local sphere_center = vector() sphere_center:set(0, 0, 0) packet:w_vec3(sphere_center) radius = rad_anom packet:w_float(radius) packet:w_u8(restrictor_type) packet:w_float(cse_alife_custom_zone__unk1_f32) cse_alife_custom_zone__unk2_u32 = bit_not(0) packet:w_s32(cse_alife_custom_zone__unk2_u32) if time1 ~= nil then packet:w_s32(time1) else packet:w_s32(on_off_mode_enabled_time) end if time2 ~= nil then packet:w_s32(time2) else packet:w_s32(on_off_mode_disabled_time) end packet:w_s32(on_off_mode_shift_time) packet:w_float(offline_interactive_radius) packet:w_u16(artefact_spawn_places_count) packet:w_s32(cse_alife_anomalous_zone__unk1_u32) if mode==nil then packet:w_u8(last_spawn_time_present) end p_obj:STATE_Read(packet, packet:w_tell()-packet:r_tell()) return p_obj end Так вот. Похоже, что где-то что-то неправильно работает, и, возможно, в ней. Потому что периодически бьются сейвы, слетают скрипты, вылеты непонятные происходят... В данный момент я пока отключил этот скрипт совсем - нет ни вылетов, ни боя сохранений, скрипты работают нормально... Дык, если в функции ошибка, ткните, плиз, где. Или ткните носом в аналогичную функцию, гарантированно работающую в ЗП. Поиском по темам пробежался - как-то ничего похожего не нашлось... Изменено 25 Сентября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Kirgudu 1 217 Опубликовано 26 Сентября 2015 Поделиться Опубликовано 26 Сентября 2015 @Romz, пробежался глазами, вроде всё правильно. Единственное, что смутило, это packet:w_begin(0) packet:r_seek(2) p_obj:STATE_Write(packet)Я бы STATE_Write и r_seek поменял местами, сделав установку позиции чтения после записи в пакет, а не до. Вдруг эта позиция при записи может смещаться.Ну и непонятно, какие аргументы передаёшь ты в функцию извне. 1 Инструмент Ссылка на комментарий
Stalkeruga_238 2 Опубликовано 26 Сентября 2015 Поделиться Опубликовано 26 Сентября 2015 Помогите привязать скрипт телепортации к какому либо поедаемому объекту, мол гг съел хлебушек и его перекинуло на янтарь. Скрипт телепортации собирался сделать на примере этого function osoznanie_decline(npc, actor)db.actor:disable_info_portion("oso_init_dialog")npc:stop_talk()actor:stop_talk()xr_effects.enable_ui(db.actor, nil)local point = patrol("mon_jump_aes2_walk")local look = patrol("mon_jump_aes2_look")db.actor:set_actor_position(point:point(0))local dir = look:point(0):sub(point:point(0))db.actor:set_actor_direction(-dir:getH())end Ссылка на комментарий
naxac 2 447 Опубликовано 26 Сентября 2015 Поделиться Опубликовано 26 Сентября 2015 (изменено) @Stalkeruga_238, "на примере этого" не получится - для перехода на другую локацию нужен level_changer. А "привязать" - через каллбэк use_object в биндере актера. Изменено 26 Сентября 2015 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
HESH 64 Опубликовано 27 Сентября 2015 Поделиться Опубликовано 27 Сентября 2015 Вопрос: возможно ли заспавнить, например, АК с сразу же надетым аддоном? ps: если что, платформа - ЗП. 1 Ссылка на комментарий
AndrewMor 527 Опубликовано 27 Сентября 2015 Поделиться Опубликовано 27 Сентября 2015 Помогите привязать скрипт телепортации к какому либо поедаемому объекту, мол гг съел хлебушек и его перекинуло на янтарь. Смотри, как это сделано в Солянке. Тайники Кости: там портирует в пределах локации - мама не горюй. А далее - делай по аналогии. А насчет другой локации - да, скриптовый левел_ченжер тебе в помощь. Добавлено BFG, 27 Сентября 2015 В той же Солянке , в самом начале, выпиваешь лекарство Доктора и ГГ телепортирует с Кордона в Пещеру. Сталкер - наше всё! Ссылка на комментарий
AuReN 0 Опубликовано 27 Сентября 2015 Поделиться Опубликовано 27 Сентября 2015 Всем привет. Интересует такой момент. Если перевести npc, который находиться в оффлайне на другой локации, в онлайн, то он будет перемещаться по своей локации? Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 27 Сентября 2015 Поделиться Опубликовано 27 Сентября 2015 (изменено) "на другой локации, в онлайн" - не бывает. (С) а что произойдет если все жесм. п1 Изменено 27 Сентября 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
AuReN 0 Опубликовано 27 Сентября 2015 Поделиться Опубликовано 27 Сентября 2015 @Dennis_Chikin, а что произойдет если все же попытаться перевести его в онлайн? Ссылка на комментарий
UnLoaded 313 Опубликовано 28 Сентября 2015 Поделиться Опубликовано 28 Сентября 2015 возможно ли заспавнить, например, АК с сразу же надетым аддоном? Обычный спавн + правка нет-пакета. 1 Ссылка на комментарий
Romz 142 Опубликовано 28 Сентября 2015 Поделиться Опубликовано 28 Сентября 2015 (изменено) Ну и непонятно, какие аргументы передаёшь ты в функцию извне. Сама функция вызывается из другого места в этом же скрипте function spawn_anomaly_from_queue() local anom_t = anomaly_queue[#anomaly_queue] create_anom(anom_t.section, 4, anom_t.x, anom_t.y, anom_t.z, anom_t.level_vertex, anom_t.game_vertex, anom_t.field) table.remove(anomaly_queue, #anomaly_queue) end anomaly_queue - это табличка, куда складываются аномалии, типа, уровень, где она будет, координаты, тип. Ещё у меня возникает некоторое сомнение по поводу anom_t.field, потому что оно или "_zone", или nil Так же, раскопки в различных модах дали ещё два варианта похожих скриптов function rewrite_anomaly(obj, in_custom_data, in_radius) -- dbglog("level_anomaly.rewrite_anomaly()") packet:w_begin(0) packet:r_seek(2) obj:STATE_Write(packet) 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() local shape_count = packet:r_u8() 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 box = packet:r_matrix() end end local restrictor_type = packet:r_u8() local cse_alife_custom_zone__unk1_f32 = packet:r_float() local cse_alife_custom_zone__unk2_u32 = packet:r_s32() local on_off_mode_enabled_time = packet:r_s32() local on_off_mode_disabled_time = packet:r_s32() local on_off_mode_shift_time = packet:r_s32() local offline_interactive_radius = packet:r_float() local artefact_spawn_places_count = packet:r_u16() local cse_alife_anomalous_zone__unk1_u32 = packet:r_s32() local last_spawn_time_present = packet:r_u8() if packet:r_elapsed() ~= 0 then abort("left=%d", packet:r_elapsed()) end packet:w_begin(0) 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) if in_custom_data ~= nil then custom_data = in_custom_data end packet:w_stringZ(custom_data) packet:w_s32(story_id) packet:w_s32(cse_alife_object__unk3_u32) packet:w_u8(1) packet:w_u8(0) local sphere_center = vector() sphere_center:set(0, 0, 0) packet:w_vec3(sphere_center) if in_radius ~= nil then radius = in_radius end packet:w_float(radius) packet:w_u8(restrictor_type) packet:w_float(cse_alife_custom_zone__unk1_f32) cse_alife_custom_zone__unk2_u32 = bit_not(0) packet:w_s32(cse_alife_custom_zone__unk2_u32) packet:w_s32(on_off_mode_enabled_time) packet:w_s32(on_off_mode_disabled_time) packet:w_s32(on_off_mode_shift_time) packet:w_float(offline_interactive_radius) packet:w_u16(artefact_spawn_places_count) packet:w_s32(cse_alife_anomalous_zone__unk1_u32) packet:w_u8(last_spawn_time_present) packet:r_seek(2) obj:STATE_Read(packet, packet:w_tell()) return obj end и function create_anomaly( zone_name, zone_radius, position, lv, gv ) ----------------------------Создаём объект-аномалию local sobj = alife():create( zone_name, position, lv, gv ) local packet = net_packet() packet:w_begin( 0 ) -------------------------------------Читаем нет-пакет sobj:STATE_Write( packet ) packet:r_seek( 2 ) local game_vertex_id = packet:r_u16() local distance = packet:r_float() local direct_control = 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 spawn_story_id = packet:r_s32() local shape_count = packet:r_u8() 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 box = packet:r_matrix() end end local restrictor_type = packet:r_u8() local max_power = packet:r_float() local owner_id = packet:r_s32() local enabled_time = packet:r_u32() local disabled_time = packet:r_u32() local start_time_shift = packet:r_u32() local offline_interactive_radius = packet:r_float() local artefact_spawn_count = packet:r_u16() local artefact_position_offset = packet:r_s32() local last_spawn_time = packet:r_u8() ------------------------------------------Меняем данные пакета local new_center = vector():set( 0, 0, 0 ) owner_id = bit_not( 0 ) restrictor_type = 3 max_power = 0 offline_interactive_radius = 30 artefact_spawn_count = 32 last_spawn_time = 0 ------------------------------------------------Пишем в пакет packet:w_begin( 0 ) packet:w_u16( game_vertex_id ) packet:w_float( distance ) packet:w_s32( direct_control ) packet:w_s32( level_vertex_id ) packet:w_s32( object_flags ) packet:w_stringZ( custom_data ) packet:w_s32( story_id ) packet:w_s32( spawn_story_id ) packet:w_u8( 1 ) packet:w_u8( 0 ) packet:w_vec3( new_center ) packet:w_float( zone_radius ) packet:w_u8( restrictor_type ) packet:w_float( max_power ) packet:w_s32( owner_id ) packet:w_u32( enabled_time ) packet:w_u32( disabled_time ) packet:w_u32( start_time_shift ) packet:w_float( offline_interactive_radius ) packet:w_u16( artefact_spawn_count ) packet:w_s32( artefact_position_offset ) packet:w_u8( last_spawn_time ) packet:r_seek( 2 ) sobj:STATE_Read( packet, packet:w_tell() ) return sobj end Разницу в них-то я найду, но ввиду полного непонимания работы с нет-пакетами, боюсь туда лезть, чтобы не поломать совсем... Upd По различиям. Я вижу из различий: В том скрипте, что у меня есть сейчас if mode==nil then packet:w_u8(last_spawn_time_present) end p_obj:STATE_Read(packet, packet:w_tell()-packet:r_tell()) return p_obj end А в тех, что я нарыл - packet:w_u8( last_spawn_time ) packet:r_seek(2) obj:STATE_Read(packet, packet:w_tell()) return obj end и packet:w_u8( last_spawn_time ) packet:r_seek( 2 ) sobj:STATE_Read( packet, packet:w_tell() ) return sobj end Это самый конец функций. Может ли это влиять? Изменено 28 Сентября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Kirgudu 1 217 Опубликовано 28 Сентября 2015 Поделиться Опубликовано 28 Сентября 2015 @Romz, тут нужны, наверное, специалисты по аномалиям именно в ЗП, так как мои знания ограничиваются только ЧН. Например, Ещё у меня возникает некоторое сомнение по поводу anom_t.field, потому что оно или "_zone", или nilдля ЧН это применяется при спавне аномальных полей, и может принимать значение "field", а не "_zone". В целом же любые манипуляции с нет-пакетом аномалий преследуют, как правило, 2 цели: 1. установка нужного размера (через радиус сферы); 2. установка кастом даты (как раз "field" для аномальных полей в ЧН, и, возможно, что-то другое для аномалий в других частях игры). Этим целям удовлетворяет, на мой взгляд, как первый скрипт, так и два других, явных ошибок я не вижу. Разве что, как уже писал выше, поменять строчки записи в пакет и установки позиции чтения из него местами. Но это уже на всякий случай; не могу сказать точно, является ли это ошибкой в действительности. Возможно, кто-нибудь сможет оказать бОльшую помощь. 1 Инструмент Ссылка на комментарий
Romz 142 Опубликовано 28 Сентября 2015 Поделиться Опубликовано 28 Сентября 2015 (изменено) для ЧН это применяется при спавне аномальных полей, и может принимать значение "field", а не "_zone". А, ну да, "_field_", конечно-же. Извиняюсь за дезинформацию. И без подчёркиваний! Kirgudu Изменено 28 Сентября 2015 пользователем Kirgudu Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Romz 142 Опубликовано 28 Сентября 2015 Поделиться Опубликовано 28 Сентября 2015 (изменено) И без подчёркиваний! Kirgudu Само собой. Переписал функцию. function create_anom(section, rad_anom, x, y, z, lv, gv, mode) if gv == nil then gv = db.actor:game_vertex_id() end if lv == nil then lv = db.actor:level_vertex_id() end local pos = db.actor:position() if x == nil then x = pos.x end if y == nil then y = pos.y end if z == nil then z = pos.z end local p_obj = alife():create(section, vector():set(x, y, z), lv, gv) local packet = net_packet() ---------------------Читаем нет-пакет---------------- packet:w_begin(0) p_obj:STATE_Write(packet) packet:r_seek(2) local game_vertex_id = packet:r_u16() local distance = packet:r_float() local direct_control = 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 spawn_story_id = packet:r_s32() local shape_count = packet:r_u8() 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 box = packet:r_matrix() end end local restrictor_type = packet:r_u8() local max_power = packet:r_float() local owner_id = packet:r_s32() local enabled_time = packet:r_u32() local disabled_time = packet:r_u32() local start_time_shift = packet:r_u32() local offline_interactive_radius = packet:r_float() local artefact_spawn_count = packet:r_u16() local artefact_position_offset = packet:r_s32() local last_spawn_time = packet:r_u8() ---------------------Меняем данные пакета--------------------- local new_center = vector():set(0, 0, 0) owner_id = bit_not(0) offline_interactive_radius = 30 if mode ~= nil then custom_data = mode end if rad_anom ~= nil then radius = rad_anom end ---------------------------Пишем в пакет--------------------- packet:w_begin( 0 ) packet:w_u16(game_vertex_id) packet:w_float(distance) packet:w_s32(direct_control) packet:w_s32(level_vertex_id) packet:w_s32(object_flags) packet:w_stringZ(custom_data) packet:w_s32(story_id) packet:w_s32(spawn_story_id) packet:w_u8(1) packet:w_u8(0) packet:w_vec3(new_center) packet:w_float(radius) packet:w_u8(restrictor_type) packet:w_float(max_power) packet:w_s32(owner_id) packet:w_u32(enabled_time) packet:w_u32(disabled_time) packet:w_u32(start_time_shift) packet:w_float(offline_interactive_radius) packet:w_u16(artefact_spawn_count) packet:w_s32(artefact_position_offset) if mode == nil then packet:w_u8(last_spawn_time) end packet:r_seek(2) p_obj:STATE_Read(packet, packet:w_tell()) return p_obj end Погонял в таком виде, некоторое количество раз сохранился-загрузился, попереходил между локациями. Вроде бы теперь всё работает, как должно. Вылетов на загрузке сохранений нет, просто вылетов тоже нет, скрипты вроде не слетают. Вопрос возник такого плана: возможно ли аномалии переводить в офлайн при удалении от них ГГ на определённое расстояние, и выдёргивать их оттуда при приближении ГГ к ним? Смысл сего действа - повысить производительность. Просто НПЦ такое проделывают, может и для других объектов возможно? Изменено 28 Сентября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Romz 142 Опубликовано 30 Сентября 2015 Поделиться Опубликовано 30 Сентября 2015 Блин, ну неужели нет никакой информации по переводу ЛЮБЫХ объектов в онлайн\офлайн? Про неписей понаписано дофига, а вот про остальное... Ладно, другой вопрос. Как проверить, что ГГ заспавнился на локе? Типа if db.actor:что_то_там then? А что? Нужно получить информацию о том, что локация и все объекты загрузились, при переходе на другую локу, начале игры, загрузке сохранения. Поиском по ресурсам пробежался - не нашёл. Не, ну можно, конечно, намутить инфопоршней там всяких и из разных биндов их вызывать и проверять. Но... Ради одной проверки такое городить не хочется. Нужно проверить это один раз в surge_manager.script, на апдейте этого самого CSurgeManager и вызвать определённое действие. Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
UnLoaded 313 Опубликовано 30 Сентября 2015 Поделиться Опубликовано 30 Сентября 2015 (изменено) Нужно получить информацию о том, что локация и все объекты загрузились Пробуй if device().precache_frame <= 1 then, обычно это используется в каком-либо апдейте. возможно ли аномалии переводить в офлайн при удалении от них ГГ на определённое расстояние А разве они и так не переходят в он\офф в зависимости от alife-расстояния ? Изменено 30 Сентября 2015 пользователем UnLoaded 1 Ссылка на комментарий
Romz 142 Опубликовано 30 Сентября 2015 Поделиться Опубликовано 30 Сентября 2015 (изменено) Пробуй if device().precache_frame <= 1 then, Ок, попробую. Только обычно if(device().precache_frame > 1) then return end Это так в CSurgeManager:update. То есть, внутри этой конструкции можно поставить флаг, а сразу после - вызвать функцию, которая проверит этот флаг, сделает какую-то работу, которую нужно сделать только один раз за загрузку, а в конце CSurgeManager:update сбросить этот флаг. А разве они и так не переходят в он\офф в зависимости от alife-расстояния ? Стандартные аномалии - возможно. А вот динамически добавленные - видны через всю локу. По крайней мере - в ЗП. Изменено 30 Сентября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти