mole venomous 3 433 Опубликовано 31 Декабря 2018 Поделиться Опубликовано 31 Декабря 2018 9 часов назад, DoberBull сказал: Помогите пж с распаковкой ресурсов ОП-2.1 Ты сталкер или где? Кто ищет выход за счёт других? 2 1 Здесь могла быть ваша реклама. Ссылка на комментарий
DoberBull 290 Опубликовано 1 Января 2019 Поделиться Опубликовано 1 Января 2019 @mole venomous так интересно, вдруг вышло у кого. Распаковщики разные не берут, я уже все перепробовал. Да и вопрос вроде безобидный 1 Ссылка на комментарий
Змея 240 Опубликовано 1 Января 2019 Поделиться Опубликовано 1 Января 2019 (изменено) 18 часов назад, Дмитрий Зверев (Книги, Вселенная и вообще) сказал: Не знаешь, часом Неа...Только методом проб и ошибок. Вот у нас с горушки высотой метров 10 прыгают: ph_jump_factor = 1.2 offset = 0,4,0 А вот перепрыгивают через 3-х метровый забор: ph_jump_factor = 0.7 offset = 0,4,0 Изменено 1 Января 2019 пользователем Змея 1 Ссылка на комментарий
naxac 2 447 Опубликовано 1 Января 2019 Поделиться Опубликовано 1 Января 2019 (изменено) @Cagorich, функция для передачи нескольких предметов от актера или нпс к другому нпc function transfer_some_items( section, count, in_npc, out_npc ) if out_npc == nil then out_npc = db.actor end local n = 0 out_npc:iterate_inventory( function ( npc, item ) if n == count then return end if item:section() == section then our_npc:transfer_item( item, in_npc ) n = n + 1 end end, out_npc ) if out_npc:id() == 0 then news_manager.relocate_item( out_npc, "out", section ) end end Применять: script_name.transfer_some_items( "bandage", 4, second_speaker ) Похожая функция для удаления нескольких одинаковых предметов из инвентаря актера function out_some_items( section, number ) local n = 0 db.actor:iterate_inventory( function ( actor, item ) if n == number then return end if item:section() == section then local se_item = alife():object( item:id() ) if se_item then alife():release( se_item, true ) end n = n + 1 end end, db.actor ) news_manager.relocate_item( db.actor, "out", section ) end Применять: script_name.out_some_items( "bandage", 4 ) Изменено 1 Января 2019 пользователем naxac 3 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Graff46 598 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 Возможно ли чтение\запись нэт-пакетов актора? Такое не работает local act = alife():object(0) local pk = m_netpk.get(act) Но так работает: local packet = net_packet() act:STATE_Write(packet) Может кто "карту смещений" нэт-пакета для актора предоставить? Ссылка на комментарий
Graff46 598 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 (изменено) Вот что удалось наработать: 1. В m_netpk.script есть разбор ГГ на нэт-пакет, но при попытке передать ГГ скрипту - вылет. 2. Я используя наработки m_netpk.script написал ф-цию для чтения пакета ГГ. Скрытый текст function actnet() local c = { -- Взято из m_netpk.script { name = 'game_vertex_id', type = 'u16', default = -1 }, { name = 'distance', type = 'f32', default = 0.0 }, { name = 'direct_control', type = 'u32', default = 1 }, { name = 'level_vertex_id', type = 'u32', default = -1 }, { name = 'object_flags', type = 'h32', default = 0 }, --{ name = 'custom_data', type = 'sz', default = '' }, --/#-# if only 'string' { name = 'custom_data', type = 'sz', default = "" }, --/#!# used helpers { name = 'story_id', type = 's32', default = -1 }, { name = 'spawn_story_id', type = 's32', default = -1 }, { name = 'money', type = 'u32', default = 0 }, { name = 'specific_character', type = 'sz', default = '' }, { name = 'trader_flags', type = 'h32', default = 1 }, { name = 'character_profile', type = 'sz', default = '' }, { name = 'community_index', type = 'h32', default = -1 }, { name = 'rank', type = 'h32', default = -2147483647 }, { name = 'reputation', type = 'h32', default = -2147483647 }, { name = 'character_name', type = 'sz', default = '' }, --{ name = 'cse_alife_trader_abstract__unk2', type = 'u8', default = 0, ver = 4 }, --/ SCoP --{ name = 'cse_alife_trader_abstract__unk3', type = 'u8', default = 0, ver = 4 } --/ SCoP { name = 'skeleton_name', type = 'sz', default = '$editor', hook = 'idle' }, { name = 'skeleton_flags', type = 'u8', default = 0 }, { name = 'source_id', type = 'h16', default = -1 }, { name = 'bones_mask', type = 'u8v8', default = {0,0,0,0,0,0,0,0} }, -- на этом вылет { name = 'root_bone', type = 'u16', default = 0 }, { name = 'bbox_min', type = 'f32v3', default = vector() }, { name = 'bbox_max', type = 'f32v3', default = vector() }, { name = 'bones_count', type = 'u16', default = 0 }, --/#~# changed name ('bone_count') { name = 'ph_position', type = 'q8v3', default = {0,0,0}, }, { name = 'ph_rotation', type = 'q8v4', default = {0,0,0,0} }, { name = 'enabled', type = 'b8', default = true } } local act = alife():object(0) local packet = net_packet() act:STATE_Write(packet) local str = "" for _, v in ipairs(c) do str = str.."\n".. v.name..":".. tostring(m_netpk['_r_'..v.type](packet) ) end nt.logfile(str) -- Запись в файл end 3. Есть ошибки в работе: Вылет при попытке чтения методом :r_vec3(vector()), ошибки в парсинге. Возможно 1-я ошибка возникает из 2-ой. Я читал пакет до того места где надо читать векторы и вот что получил: Скрытый текст game_vertex_id:3283 -- Верно distance:64.400001525879 -- Наверное Верно direct_control:1 -- Наверное Верно level_vertex_id:79894 -- Верно object_flags:-65 -- Наверное Верно ********************* custom_data*************** custom_data:[dont_spawn_character_supplies] [spawn] ;wpn_binoc detector_simple device_torch vodka vodka story_id:-1 spawn_story_id:-1 ******************************************************* money:1869898593 -- Не верно! У ГГ было 40р.! specific_character:rs\hero\stalker_novice -- Побито! должно быть : "actors\hero\stalker_novice" trader_flags:0 -- Наверное Верно character_profile: -- Нет ничего community_index:4161536 -- Не вено (нет столько группировок) rank:0 -- Вроде не верно reputation:-16777216 -- Вроде не верно character_name:я -- Верно skeleton_name: -- ? skeleton_flags:0 -- ? source_id:0 -- ? Изменено 7 Января 2019 пользователем Graff46 Ссылка на комментарий
Kirgudu 1 217 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 @Graff46, не всё взял, если не ошибаюсь, вот и появились неверные значения. Например, после spawn_story_id должно быть, емнип, чтение визуала (net_cse_alife_dynamic_object_visual). Инструмент Ссылка на комментарий
Graff46 598 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 (изменено) @Kirgudu, Я делал из примера m_netpk.script . Вот сейчас переделал: Скрытый текст function actnet() local c = { { name = 'game_vertex_id', type = 'u16', default = -1 }, { name = 'distance', type = 'f32', default = 0.0 }, { name = 'direct_control', type = 'u32', default = 1 }, { name = 'level_vertex_id', type = 'u32', default = -1 }, { name = 'object_flags', type = 'h32', default = 0 }, --{ name = 'custom_data', type = 'sz', default = '' }, --/#-# if only 'string' { name = 'custom_data', type = 'sz', default = "" }, --/#!# used helpers { name = 'story_id', type = 's32', default = -1 }, { name = 'spawn_story_id', type = 's32', default = -1 }, --{ name = 'money', type = 's8', default = 0 }, --{ name = 'specific_character', type = 'sz', default = '' }, --{ name = 'trader_flags', type = 'h32', default = 1 }, { name = 'visual_name', type = 'sz', default = '' }, { name = 'visual_flags', type = 'u8', default = 0 }, { name = 'g_team', type = 'u8', default = -1 }, { name = 'g_squad', type = 'u8', default = -1 }, { name = 'g_group', type = 'u8', default = -1 }, { name = 'health', type = 'f32', default = 1.0 }, { name = 'dynamic_out_restrictions', type = 'l32u16v', default = {} }, { name = 'dynamic_in_restrictions', type = 'l32u16v', default = {} }, { name = 'killer_id', type = 'h16', default = -1 }, { name = 'game_death_time', type = 'u8v8', default = {0,0,0,0,0,0,0,0} }, { name = 'character_profile', type = 'sz', default = '' }, { name = 'community_index', type = 'h32', default = -1 }, { name = 'rank', type = 'h32', default = -2147483647 }, { name = 'reputation', type = 'h32', default = -2147483647 }, { name = 'character_name', type = 'sz', default = '' }, --{ name = 'cse_alife_trader_abstract__unk2', type = 'u8', default = 0, ver = 4 }, --/ SCoP --{ name = 'cse_alife_trader_abstract__unk3', type = 'u8', default = 0, ver = 4 } --/ SCoP { name = 'skeleton_name', type = 'sz', default = '$editor', hook = 'idle' }, { name = 'skeleton_flags', type = 'u8', default = 0 }, { name = 'source_id', type = 'h16', default = -1 }, { name = 'bones_mask', type = 'u8v8', default = {0,0,0,0,0,0,0,0} }, { name = 'root_bone', type = 'u16', default = 0 }, --[[ { name = 'bbox_min', type = 'f32v3', default = vector() }, { name = 'bbox_max', type = 'f32v3', default = vector() }, { name = 'bones_count', type = 'u16', default = 0 }, --/#~# changed name ('bone_count') { name = 'ph_position', type = 'q8v3', default = {0,0,0}, }, { name = 'ph_rotation', type = 'q8v4', default = {0,0,0,0} }, { name = 'enabled', type = 'b8', default = true } ]] } local act = alife():object(0) local packet = net_packet() act:STATE_Write(packet) local str = "" for _, v in ipairs(c) do str = str.."\n".. v.name..": ".. tostring(m_netpk['_r_'..v.type](packet) ) end nt.logfile(str) end Как дохожу до векторов - вылет. Вот результат смещений : Скрытый текст game_vertex_id: 3283 distance: 64.400001525879 direct_control: 1 level_vertex_id: 79894 object_flags: -65 custom_data: [dont_spawn_character_supplies] [spawn] ;wpn_binoc detector_simple device_torch vodka vodka story_id: -1 spawn_story_id: -1 visual_name: actors\hero\stalker_novice visual_flags: 0 g_team: 0 g_squad: 0 g_group: 0 health: 1 dynamic_out_restrictions: table: 0FE10940 dynamic_in_restrictions: table: 14A0F5F8 killer_id: 65535 game_death_time: table: 14A05EA8 -- возможно тут пошло не так character_profile: ( -- пошло точно всё ни так , и дальше тоже community_index: 1667301376 rank: 7499636 reputation: 0 character_name: actor -- а тут норм. и предыдущий возможно тоже skeleton_name: skeleton_flags: 0 source_id: 0 bones_mask: table: 437421A0 root_bone: 64450 Может подскажите чего по смещениям? Изменено 7 Января 2019 пользователем Graff46 Ссылка на комментарий
Kirgudu 1 217 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 (изменено) Вообще, в m_netpk и у меня были связанные с актором непонятки. В этом модуле существуют два класса актора: "net_cse_alife_creature_actor" для ТЧ и "net_se_actor" для ЧН/ЗП. И если с первым классом всё, в принципе, понятно, то, как я обнаружил года полтора назад, для класса "net_se_actor" прописан конструктор от первого класса, "net_cse_alife_creature_actor". Насколько это правомерно с точки зрения языка Lua - сказать не могу, тут нужна помощь специалистов. Собственно, из-за неуверенности и невозможности в то время всё проверить я и не стал ничего править в модуле самостоятельно, хотя стоило, наверное, задать вопрос здесь. @Graff46, по конкретному наполнению нет-пакета актора и смещениям не подскажу - нет сейчас возможности порыться в коде. Но если моё предположение верное, и единственное, почему модуль валится - неверный конструктор, тогда стоит попробовать это исправить и посмотреть, что будет. Ведь что даёт запись двух одинаковых функций "function net_cse_alife_creature_actor:__init(...)" подряд? А то, что первая перезатирается второй, и при инициализации класса для ТЧ начинает вызываться конструктор для ЧН/ЗП. Update: Цитата game_death_time: table: 14A05EA8 -- Тут вроде сбилось? Нет, тут CTime в виде таблицы, всё правильно. А вот дальше должны быть update-свойства, разве нет? Не помню. (вспомнил: конечно не должны. тут только state-часть) Изменено 7 Января 2019 пользователем Kirgudu Инструмент Ссылка на комментарий
Graff46 598 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 @Kirgudu, Посидел я повнимательнее и собрал смещения : Скрытый текст function actnet() local c = { { name = 'game_vertex_id', type = 'u16', default = -1 }, { name = 'distance', type = 'f32', default = 0.0 }, { name = 'direct_control', type = 'u32', default = 1 }, { name = 'level_vertex_id', type = 'u32', default = -1 }, { name = 'object_flags', type = 'h32', default = 0 }, --{ name = 'custom_data', type = 'sz', default = '' }, --/#-# if only 'string' { name = 'custom_data', type = 'sz', default = "" }, --/#!# used helpers { name = 'story_id', type = 's32', default = -1 }, { name = 'spawn_story_id', type = 's32', default = -1 }, { name = 'visual_name', type = 'sz', default = '' }, { name = 'visual_flags', type = 'u8', default = 0 }, { name = 'g_team', type = 'u8', default = -1 }, { name = 'g_squad', type = 'u8', default = -1 }, { name = 'g_group', type = 'u8', default = -1 }, { name = 'health', type = 'f32', default = 1.0 }, { name = 'dynamic_out_restrictions', type = 'l32u16v', default = {} }, { name = 'dynamic_in_restrictions', type = 'l32u16v', default = {} }, { name = 'killer_id', type = 'h16', default = -1 }, { name = 'game_death_time', type = 'u8v8', default = {0,0,0,0,0,0,0,0} }, { name = 'money', type = 'u32', default = 0 }, { name = 'specific_character', type = 'sz', default = '' }, { name = 'trader_flags', type = 'h32', default = 1 }, { name = 'character_profile', type = 'sz', default = '' }, { name = 'community_index', type = 'h32', default = -1 }, { name = 'rank', type = 'h32', default = -2147483647 }, { name = 'reputation', type = 'h32', default = -2147483647 }, { name = 'character_name', type = 'sz', default = '' }, --{ name = 'cse_alife_trader_abstract__unk2', type = 'u8', default = 0, ver = 4 }, --/ SCoP --{ name = 'cse_alife_trader_abstract__unk3', type = 'u8', default = 0, ver = 4 }, --/ SCoP { name = 'skeleton_name', type = 'sz', default = '$editor', hook = 'idle' }, { name = 'skeleton_flags', type = 'u8', default = 0 }, { name = 'source_id', type = 'h16', default = -1 }, { name = 'bones_mask', type = 'u8v8', default = {0,0,0,0,0,0,0,0} }, { name = 'root_bone', type = 'u16', default = 0 }, --[[ { name = 'bbox_min', type = 'f32v3', default = vector() }, { name = 'bbox_max', type = 'f32v3', default = vector() }, { name = 'bones_count', type = 'u16', default = 0 }, --/#~# changed name ('bone_count') { name = 'ph_position', type = 'q8v3', default = {0,0,0}, }, { name = 'ph_rotation', type = 'q8v4', default = {0,0,0,0} }, { name = 'enabled', type = 'b8', default = true }, --/#~# changed type 'u8' { name = 'holder_id', type = 'h16', default = -1 }, { name = 'actor_state', type = 'h16' }, { name = 'actor_accel_header', type = 'h16' }, { name = 'actor_accel_data', type = 'h32' }, { name = 'actor_velocity_header', type = 'h16' }, { name = 'actor_velocity_data', type = 'h32' }, { name = 'actor_radiation', type = 'f32' }, { name = 'actor_weapon', type = 'u8' }, { name = 'num_items', type = 'u16' } --/#?# ]] } local act = alife():object(0) local packet = net_packet() act:STATE_Write(packet) local str = "" for _, v in ipairs(c) do str = str.."\n".. v.name..": ".. tostring(m_netpk['_r_'..v.type](packet) ) end nt.logfile(str) end Всё работает, но до первого вектора! Ссылка на комментарий
Graff46 598 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 @Graff46, Всё работает! Просто конструкция tostring([ type: userdata]) не допустима в Луа, пришлось добавить условие: local str = "" local dd = "" for _, v in ipairs(c) do dd = m_netpk['_r_'..v.type](packet) if type(dd) == "userdata" then dd = "userdata" end -- Вот условие str = str.."\n".. v.name..": ".. tostring(dd) end nt.logfile(str) Ссылка на комментарий
Kirgudu 1 217 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 Хм, ну ты ж не написал, что у тебя вылет не при чтении пакета, а при записи в лог. Я тут, кстати, скачал m_netpk и посмотрел код. Обрати внимание, как читаются свойства в классе "net_cse_ph_skeleton": for _,prop in ipairs(self.st_props) do ret[prop.name] = this["_r_"..prop.type](pk) end --/ hooks 'bones' if bit_and(ret.skeleton_flags, 4) ~= 0 then --/ check 'skeleton' ... Сначала из первой группы свойств, а затем, на основании флагов, из второй и третьей. Ты же в своей переработке все свойства читаешь всегда. Не приведёт ли это к ошибке в один прекрасный момент? Я б всё-таки попробовал исправить конструктор класса для ЧН/ЗП и проверить чтение нет-пакета актора самим модулем... Инструмент Ссылка на комментарий
Graff46 598 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 (изменено) @Kirgudu, Ну не знаю, у меня заполнение вроде верное: Скрытый текст game_vertex_id: 3283 distance: 64.400001525879 direct_control: 1 level_vertex_id: 79894 object_flags: -65 custom_data: [dont_spawn_character_supplies] [spawn] ;wpn_binoc detector_simple device_torch vodka vodka story_id: -1 spawn_story_id: -1 visual_name: actors\hero\stalker_novice visual_flags: 0 g_team: 0 g_squad: 0 g_group: 0 health: 1 dynamic_out_restrictions: table: 0FE10CF0 dynamic_in_restrictions: table: 13F7EE00 killer_id: 65535 game_death_time: table: 13F7D7C8 money: 40 specific_character: actor trader_flags: 0 character_profile: actor community_index: 0 rank: 0 reputation: 0 character_name: Вы skeleton_name: $editor skeleton_flags: 4 source_id: 65535 bones_mask: table: 38472430 root_bone: 0 bbox_min: userdata bbox_max: userdata bones_count: 1 ph_position: table: 142F8BA8 ph_rotation: table: 38325390 enabled: false holder_id: 65535 actor_state: 0 actor_accel_header: 0 actor_accel_data: 0 actor_velocity_header: 0 actor_velocity_data: 0 actor_radiation: 0 actor_weapon: 0 num_items: 0 Сделать бы что бы не вылетало когда ГГ в скрипт передаешь. Изменено 7 Января 2019 пользователем Graff46 Ссылка на комментарий
Graff46 598 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 (изменено) @Kirgudu, Есть подозрение, что вылет из-за того, что ГГ подставляют в ф-цию для перемещения в оффлайн. Изменено 7 Января 2019 пользователем Graff46 Ссылка на комментарий
Kirgudu 1 217 Опубликовано 7 Января 2019 Поделиться Опубликовано 7 Января 2019 (изменено) Цитата Ну не знаю, у меня заполнение вроде верное Потому что соотв. флаг присутствует. Может ли он отсутствовать - понятия не имею, никогда этим не интересовался. Но потенциально твой код допускает ошибку (если, конечно, считать, что код Артоса верен). Ладно, дальше сам, мне тут сложно теоретизировать без игры. Изменено 7 Января 2019 пользователем Kirgudu Инструмент Ссылка на комментарий
naxac 2 447 Опубликовано 8 Января 2019 Поделиться Опубликовано 8 Января 2019 @Graff46, https://github.com/naxac/CP2_AddOn/blob/master/gamedata/scripts/naxac_netpk.script Нетпакет актера тоже есть, работает, проверено. 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Graff46 598 Опубликовано 9 Января 2019 Поделиться Опубликовано 9 Января 2019 @naxac, да толку, имя гг не поменять, оно из файла читается всегда Ссылка на комментарий
dsh 3 824 Опубликовано 9 Января 2019 Поделиться Опубликовано 9 Января 2019 @Graff46, насколько я помню, имя берется из двух мест, в разных случаях. Первое место - это нетпакет. Второе место - клиентский объект, m_game_name в CInventoryOwner. Я не знаю, можно-ли через xray extensions добраться к этому месту. 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Graff46 598 Опубликовано 10 Января 2019 Поделиться Опубликовано 10 Января 2019 (изменено) @dsh, Через xray extensions скорее всего можно, по смещению. @dsh, В каком случае из нэт-пекета имя ГГ берется? Я проверил: если изменить имя ГГ в файле, то имя изменится только при новой игре. Имя, в иной ситуации, читается из сейва. вопрос можно ли переименовать ли ГГ нэт-пакетом? Изменено 10 Января 2019 пользователем Graff46 Добавлено Опричник, 10 Января 2019 Отправленный пост, некоторое время можно редактировать, чтобы добавить информацию ("Редактировать" под постом) . Пользуйтесь этой возможностью. Ссылка на комментарий
dsh 3 824 Опубликовано 10 Января 2019 Поделиться Опубликовано 10 Января 2019 2 hours ago, Graff46 said: В каком случае из нэт-пекета имя ГГ берется? Не скажу, забыл уже. Помню только, что в каких-то окошках берется имя из нетпакета, а в каких-то - из клиентского объекта. 2 hours ago, Graff46 said: Имя, в иной ситуации, читается из сейва. Именно так. Поэтому 2 hours ago, Graff46 said: можно ли переименовать ли ГГ нэт-пакетом? Полностью - нет. См. начало. Да и вообще, про переименование нетпакетом я ничего не могу сказать, не пробовал. Все, что я могу сказать, что в нетпакете есть имя и оно используется. Можно так переименовать или нет - не знаю. У меня переименовывается через прямой доступ к свойствам, а не через нетпакет. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти