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

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

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

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

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

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

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

Ссылка на комментарий
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
Ссылка на комментарий

@dsh,  Через xray extensions скорее всего можно, по смещению.

 

@dsh, В каком случае из нэт-пекета имя ГГ берется?

 

Я проверил: если изменить имя ГГ в файле, то имя изменится только при новой игре. Имя, в иной ситуации, читается из сейва. вопрос можно ли переименовать ли ГГ нэт-пакетом?

Изменено пользователем Graff46
Добавлено  Опричник,

Отправленный пост, некоторое время можно редактировать, чтобы добавить информацию ("Редактировать" под постом) . Пользуйтесь этой возможностью.

Ссылка на комментарий
2 hours ago, Graff46 said:

В каком случае из нэт-пекета имя ГГ берется?

Не скажу, забыл уже. Помню только, что в каких-то окошках берется имя из нетпакета, а в каких-то - из клиентского объекта.

2 hours ago, Graff46 said:

Имя, в иной ситуации, читается из сейва.

Именно так. Поэтому

2 hours ago, Graff46 said:

можно ли переименовать ли ГГ нэт-пакетом?

Полностью - нет. См. начало. Да и вообще, про переименование нетпакетом я ничего не могу сказать, не пробовал. Все, что я могу сказать, что в нетпакете есть имя и оно используется. Можно так переименовать или нет - не знаю. У меня переименовывается через прямой доступ к свойствам, а не через нетпакет.

 

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

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

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

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

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

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

Войти

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

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

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