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

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

@Charsi, Просто чудо =) Спасибо огромное. И так можно переопределять любые методы объектов, возвращаемых всяческими функциями? типа system_ini() например.

А переопределить движковые методы, например пространства level - наверно не получится так? Там нам объект не выдается, у которого можно поле изменить...

Изменено пользователем 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.

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

Переопределять можно все методы, в т.ч. и для гейм объектов, а так же добавлять новые. Пространство левел тому явно не исключение.

@RayTwitty, на 4 движке не работает ХЕ ;)

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

на 4 движке не работает ХЕ

4 движке

:lol:

Приближался конец 2015 года...

 

А переопределить движковые методы, например пространства level - наверно не получится так?

function level.new()
return 0
end
всё работает. Изменено пользователем RayTwitty
  • Нравится 1
Ссылка на комментарий

Уважаемые скриптеры! Опять нужна ваша помощь...

Есть скрипт, под ЗП, спавнящий аномалии. С самим размещением аномалий - никаких проблем, вроде бы, но...

Есть в этом скрипте функция, которая работает с 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

 

Так вот. Похоже, что где-то что-то неправильно работает, и, возможно, в ней.

Потому что периодически бьются сейвы, слетают скрипты, вылеты непонятные происходят...

В данный момент я пока отключил этот скрипт совсем - нет ни вылетов, ни боя сохранений, скрипты работают нормально...

Дык, если в функции ошибка, ткните, плиз, где. Или ткните носом в аналогичную функцию, гарантированно работающую в ЗП.

Поиском по темам пробежался - как-то ничего похожего не нашлось...

Изменено пользователем Romz

Шаман - СисАдмин

Всяко-разно: для ЧН

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

@Romz, пробежался глазами, вроде всё правильно.

Единственное, что смутило, это

packet:w_begin(0)
packet:r_seek(2)
p_obj:STATE_Write(packet)
Я бы STATE_Write и r_seek поменял местами, сделав установку позиции чтения после записи в пакет, а не до. Вдруг эта позиция при записи может смещаться.

Ну и непонятно, какие аргументы передаёшь ты в функцию извне.

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

Помогите привязать скрипт телепортации к какому либо поедаемому объекту,

мол гг съел хлебушек и его перекинуло на янтарь.

Скрипт телепортации собирался сделать на примере этого

 


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

 

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

@Stalkeruga_238, "на примере этого" не получится - для перехода на другую локацию нужен level_changer.

А "привязать" - через каллбэк use_object в биндере актера.

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

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

naxac.gif

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

 

 

Помогите привязать скрипт телепортации к какому либо поедаемому объекту, мол гг съел хлебушек и его перекинуло на янтарь.

Смотри, как это сделано в Солянке. Тайники Кости: там портирует в пределах локации - мама не горюй. А далее - делай по аналогии.

 

А насчет другой локации - да, скриптовый левел_ченжер тебе в помощь.

Добавлено BFG,

В той же Солянке , в самом начале, выпиваешь лекарство Доктора и ГГ телепортирует с Кордона в Пещеру.

Сталкер - наше всё!

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

Всем привет. Интересует такой момент. Если перевести npc, который находиться в оффлайне на другой локации, в онлайн, то он будет перемещаться по своей локации?

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

"на другой локации, в онлайн" - не бывает. (С)

 

а что произойдет если все же

см. п1 Изменено пользователем Dennis_Chikin
Ссылка на комментарий
Ну и непонятно, какие аргументы передаёшь ты в функцию извне.

Сама функция вызывается из другого места в этом же скрипте

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

 

Это самый конец функций.

Может ли это влиять?

Изменено пользователем Romz

Шаман - СисАдмин

Всяко-разно: для ЧН

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

@Romz, тут нужны, наверное, специалисты по аномалиям именно в ЗП, так как мои знания ограничиваются только ЧН.

Например,

Ещё у меня возникает некоторое сомнение по поводу anom_t.field, потому что оно или "_zone", или nil

для ЧН это применяется при спавне аномальных полей, и может принимать значение "field", а не "_zone".

В целом же любые манипуляции с нет-пакетом аномалий преследуют, как правило, 2 цели:

1. установка нужного размера (через радиус сферы);

2. установка кастом даты (как раз "field" для аномальных полей в ЧН, и, возможно, что-то другое для аномалий в других частях игры).

Этим целям удовлетворяет, на мой взгляд, как первый скрипт, так и два других, явных ошибок я не вижу. Разве что, как уже писал выше, поменять строчки записи в пакет и установки позиции чтения из него местами. Но это уже на всякий случай; не могу сказать точно, является ли это ошибкой в действительности.

 

Возможно, кто-нибудь сможет оказать бОльшую помощь.

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

для ЧН это применяется при спавне аномальных полей, и может принимать значение "field", а не "_zone".

А, ну да, "_field_", конечно-же. Извиняюсь за дезинформацию.

 

И без подчёркиваний! Kirgudu

Изменено пользователем Kirgudu

Шаман - СисАдмин

Всяко-разно: для ЧН

Ссылка на комментарий
И без подчёркиваний! 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

 

Погонял в таком виде, некоторое количество раз сохранился-загрузился, попереходил между локациями. Вроде бы теперь всё работает, как должно. Вылетов на загрузке сохранений нет, просто вылетов тоже нет, скрипты вроде не слетают.

 

Вопрос возник такого плана: возможно ли аномалии переводить в офлайн при удалении от них ГГ на определённое расстояние, и выдёргивать их оттуда при приближении ГГ к ним? Смысл сего действа - повысить производительность. Просто НПЦ такое проделывают, может и для других объектов возможно?

Изменено пользователем Romz

Шаман - СисАдмин

Всяко-разно: для ЧН

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

Блин, ну неужели нет никакой информации по переводу ЛЮБЫХ объектов в онлайн\офлайн? Про неписей понаписано дофига, а вот про остальное...

Ладно, другой вопрос.

Как проверить, что ГГ заспавнился на локе? Типа if db.actor:что_то_там then? А что?

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

Не, ну можно, конечно, намутить инфопоршней там всяких и из разных биндов их вызывать и проверять. Но... Ради одной проверки такое городить не хочется.

Нужно проверить это один раз в surge_manager.script, на апдейте этого самого CSurgeManager и вызвать определённое действие.

Шаман - СисАдмин

Всяко-разно: для ЧН

Ссылка на комментарий
Нужно получить информацию о том, что локация и все объекты загрузились

Пробуй if device().precache_frame <= 1 then, обычно это используется в каком-либо апдейте.

 

возможно ли аномалии переводить в офлайн при удалении от них ГГ на определённое расстояние

 

А разве они и так не переходят в он\офф в зависимости от alife-расстояния ?

Изменено пользователем UnLoaded
  • Спасибо 1
Ссылка на комментарий
Пробуй if device().precache_frame <= 1 then,

Ок, попробую. Только обычно

	if(device().precache_frame > 1) then
		return
	end

Это так в CSurgeManager:update.

То есть, внутри этой конструкции можно поставить флаг, а сразу после - вызвать функцию, которая проверит этот флаг, сделает какую-то работу, которую нужно сделать только один раз за загрузку, а в конце CSurgeManager:update сбросить этот флаг.

А разве они и так не переходят в он\офф в зависимости от alife-расстояния ?

Стандартные аномалии - возможно. А вот динамически добавленные - видны через всю локу. По крайней мере - в ЗП.

Изменено пользователем Romz

Шаман - СисАдмин

Всяко-разно: для ЧН

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

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

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

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

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

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

Войти

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

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

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