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

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

@Змея, спасибо. Попытался по твоему совету взять snork_normal (именно они, судя по логике, скакали на ЧАЭС-2) и покрутить offset Y. Началось вообще невообразимое - снорк стал аки воздушный шар летать по всей карте, проваливаться под текстуры, спавниться где угодно и прочее. Причём, если делать jump_factor и offset в пределах нормы для прыжка с дома (3 и 4 соответственно, имхо), то схема опять не работает. Даже не знаю, что и делать. Не знаешь, часом, какой offset Y можно поставить для прыжка с Y 14 на Y 9? Спасибо.

Изменено пользователем Дмитрий Зверев (Книги, Вселенная и вообще)
Ссылка на комментарий
9 часов назад, DoberBull сказал:

Помогите пж с распаковкой ресурсов ОП-2.1

Ты сталкер или где? Кто ищет выход за счёт других?

  • Нравится 2
  • Сомнительно 1

Здесь могла быть ваша реклама.


Подарки

  • 3
  • 2
  • 4
  • 4
  • Ссылка на комментарий

    @mole venomous так интересно, вдруг вышло у кого. Распаковщики разные не берут, я уже все перепробовал. Да и вопрос вроде безобидный

    • Согласен 1

    jpwsa5byp73nyaufrbis15dcci1y.png
     

    Ссылка на комментарий
    18 часов назад, Дмитрий Зверев (Книги, Вселенная и вообще) сказал:

    Не знаешь, часом

    Неа...Только методом проб и ошибок.

    Вот у нас с горушки высотой метров 10 прыгают:

    ph_jump_factor = 1.2
    offset = 0,4,0

    А вот перепрыгивают через 3-х метровый забор:

    ph_jump_factor = 0.7
    offset = 0,4,0

    Изменено пользователем Змея
    • Полезно 1
    Ссылка на комментарий

    @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 )

    Изменено пользователем naxac
    • Полезно 3

    Аддон для ОП-2.09.2: Яндекс/Google/GitHub

    naxac.gif


    Подарки

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

    Возможно ли чтение\запись нэт-пакетов актора?

     

    Такое не работает

    local act = alife():object(0)
    local pk = m_netpk.get(act)

    Но так работает:

    local packet = net_packet()
    act:STATE_Write(packet)

    Может кто "карту смещений" нэт-пакета для актора предоставить?

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

    Вот что удалось наработать:

    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 -- ?

     

     

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

    @Graff46, не всё взял, если не ошибаюсь, вот и появились неверные значения. Например, после spawn_story_id должно быть, емнип, чтение визуала (net_cse_alife_dynamic_object_visual).

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

    @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

     

    Может подскажите чего по смещениям?

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

    Вообще, в 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-часть)

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

    @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, Всё работает! Просто конструкция 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)

     

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

    Хм, ну ты ж не написал, что у тебя вылет не при чтении пакета, а при записи в лог. :) 

    Я тут, кстати, скачал 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'
    ...

    Сначала из первой группы свойств, а затем, на основании флагов, из второй и третьей. Ты же в своей переработке все свойства читаешь всегда. Не приведёт ли это к ошибке в один прекрасный момент?
    Я б всё-таки попробовал исправить конструктор класса для ЧН/ЗП и проверить чтение нет-пакета актора самим модулем...

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

    @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

     

    Сделать бы что бы не вылетало когда ГГ в скрипт передаешь.

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

    @Kirgudu, Есть подозрение, что вылет из-за того, что ГГ подставляют в ф-цию для перемещения в оффлайн.

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

    Ну не знаю, у меня заполнение вроде верное

    Потому что соотв. флаг присутствует. Может ли он отсутствовать - понятия не имею, никогда этим не интересовался. Но потенциально твой код допускает ошибку (если, конечно, считать, что код Артоса верен).

    Ладно, дальше сам, мне тут сложно теоретизировать без игры. :)

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

    @Graff46, https://github.com/naxac/CP2_AddOn/blob/master/gamedata/scripts/naxac_netpk.script

    Нетпакет актера тоже есть, работает, проверено.

    • Полезно 1

    Аддон для ОП-2.09.2: Яндекс/Google/GitHub

    naxac.gif


    Подарки

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

    @Graff46, насколько я помню, имя берется из двух мест, в разных случаях. Первое место - это нетпакет. Второе место - клиентский объект,  m_game_name в CInventoryOwner. Я не знаю, можно-ли через xray extensions добраться к этому месту.

     

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

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

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

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

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

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

    Войти

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

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

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

    AMK-Team.ru

    ×
    ×
    • Создать...