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

[SoC] Ковыряемся в файлах

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

@Ximera_1999, создание переходов скриптом. Автор - не я.

 

 

function create_level_changer( -- Спавн переходов между локациями
	p_story_id,	-- STORY_ID нового level_changer (понадобится нам позже)
	p_position,	-- вектор, координаты точки, в которой будет располагаться центр нового level_changer
	p_lvertex_id,	-- level_vertext_id  - идентифицируют уровень, на котором будет создан level_changer
	p_gvertex_id,	-- game_vertext_id   	
 
	p_dest_lv,	-- level_vertex_id   - идентифицируют уровень, на который level_changer будет перебрасывать игрока 
	p_dest_gv,	-- game_vertex_id
	p_dest_pos,	-- координаты точки, в которой на новом уровне окажется игрок
	p_dest_dir,	-- направрение взгляда игрока
	p_dest_level,	-- название уровня, например "L11_Pripyat"
	p_silent	-- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход)
)
	local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)
 
	level.map_add_object_spot(obj.id, "level_changer", "")
 
	local packet = net_packet()
	obj:STATE_Write(packet)
 
	-- свойства cse_alife_object
	local game_vertex_id 			= packet:r_u16()
	local cse_alife_object__unk1_f32 	= packet:r_float()
	local cse_alife_object__unk2_u32 	= packet:r_u32()
	local level_vertex_id 			= packet:r_u32()
	local object_flags 			= packet:r_u32()
	local custom_data 			= packet:r_stringZ()
	local story_id 				= packet:r_u32()
	local spawn_story_id			= packet:r_u32()
 
	-- свойства cse_shape
	local shape_count 			= packet:r_u8()
	for i=1,shape_count do
		local shape_type 		= packet:r_u8()
		if shape_type == 0 then
			-- sphere
			local center 		= packet:r_vec3()
			local radius 		= packet:r_float()
		else
			-- box
			local axis_x_x = packet:r_float()
			local axis_x_y = packet:r_float()
			local axis_x_z = packet:r_float()
			local axis_y_x = packet:r_float()
			local axis_y_y = packet:r_float()
			local axis_y_z = packet:r_float()
			local axis_z_x = packet:r_float()
			local axis_z_y = packet:r_float()
			local axis_z_z = packet:r_float()
			local offset_x = packet:r_float()
			local offset_y = packet:r_float()
			local offset_z = packet:r_float()
		end
	end
 
	-- свойства cse_alife_space_restrictor
	local restrictor_type 			= packet:r_u8() 
	-- свойства cse_level_changer
	local dest_game_vertex_id		= packet:r_u16()  
	local dest_level_vertex_id 		= packet:r_u32()  
	local dest_position 			= packet:r_vec3()
	local dest_direction 			= packet:r_vec3()
	local dest_level_name 			= packet:r_stringZ()
	local dest_graph_point 			= packet:r_stringZ()
	local silent_mode 			= packet:r_u8()
 
 
	packet:w_begin(game_vertex_id)			-- game_vertex_id
	packet:w_float(cse_alife_object__unk1_f32)
	packet:w_u32(cse_alife_object__unk2_u32) 
	packet:w_u32(level_vertex_id)			-- level_vertex_id
	packet:w_u32( bit_not(193) )			-- object_flags = -193 = 0xFFFFFF3E
	packet:w_stringZ(custom_data)
	packet:w_u32(p_story_id)			-- story_id
	packet:w_u32(spawn_story_id) 
	packet:w_u8(1)			-- количество фигур
	packet:w_u8(1)			-- тип фигуры: box
	packet:w_float(2)	   -- axis_x_x
	packet:w_float(0)	   -- axis_x_y
	packet:w_float(0)	   -- axis_x_z
	packet:w_float(0)	   -- axis_y_x
	packet:w_float(4)	   -- axis_y_y
	packet:w_float(0)	   -- axis_y_z
	packet:w_float(0)	   -- axis_z_x
	packet:w_float(0)	   -- axis_z_y
	packet:w_float(4)	   -- axis_z_z
	packet:w_float(0)	   -- offset_x
	packet:w_float(0)	   -- offset_y
	packet:w_float(0)          -- offset_z
	packet:w_u8(3)	 	   -- restrictor_type
	packet:w_u16(p_dest_gv)			-- destination game_vertex_id
	packet:w_u32(p_dest_lv)			-- destination level_vertex_id
	packet:w_vec3(p_dest_pos)		-- destination position
	packet:w_vec3(p_dest_dir)		-- destination direction (направление взгляда)
	packet:w_stringZ(p_dest_level)		-- destination level name
	packet:w_stringZ("start_actor_99")	-- some string, always const
	packet:w_u8(p_silent)			-- 1 for silent level changing
	
	packet:r_seek(0)
	
	obj:STATE_Read(packet, packet:w_tell())

end

function Название_функции()
		create_level_changer(31410, vector():set( 917.35, 0.419, -316.35 ), 403866, 2401,
			73868,
			2117,
			vector():set( 31.3, 3.0, 240.0 ),
			vector():set(  0.0, 0.0,  -1.0 ),
			"L11_Pripyat",
			0)

end

 

Отметка на карте:

--Находим файл level_tasks.script и в функции add_lchanger_location пишим:

		obj = sim:story_object(11410)
		if obj then
			level.map_add_object_spot(obj.id, "level_changer", "To Pripyat")
		end

Здесь 11410 - story_id нашего level_changer 

 

 

 

Криво и косо описал. Но надеюсь поймешь. Если нет, то в ЛС.

Изменено пользователем Kober(BRUC)
  • Полезно 1
Ссылка на комментарий
Сдается мне, что твои функции пытаются передать один и тот же предмет.

Да я таким способом сколько раз передавал предметы, и не по одному, а помногу.

 

Опытным путем выяснил, что передача одного (!) предмета проходит на ура, передача двух и более (именно этих!) предметов - вылет. При том, что любые другие предметы (патроны, например) передаются кучами без вылета.

 

Собсно, не может ли это быть связано с массой предмета (в районе 4 кг)?

 

 

 

 

мб через цикл, что то типа

У меня была такая мысль, но я уже отказался от всей этой затеи.

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

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

Ссылка на комментарий
Остается только вопрос с курсором

Если смог разобраться с этим, то прошу поделиться опытом.

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

@monk, пока нет. Бала одна теория, но почитав соответствующие статьи понял, что на ТЧ это невозможно реализовать. Во всяком случае без правок движка, а в этом я не бум-бум...

 

З.Ы. По прежнему ищу функцию вида:

if game_difficulty = "novice" or "stalker" then
       return true 
    end 
       return false 
end

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

Изменено пользователем Silver Raven
  • Спасибо 1

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

@Silver Raven, не знаю, работает ли в ТЧ подобная вещь, но попробуй сделать так:

var = get_console():get_float("g_game_difficulty")
if var == "novice" or "stalker" then ... end

Возможные значения: novice, stalker, expirience, gd_master.

Отпиши потом, самому интересно, но, честно говоря, я склоняюсь к вылету...

Ранее был известен под ником BoBaH_671.

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

@BoBaH_671, вылетит. get_float - дробное число, а там строка.

 

@Silver Raven

local game_difficult = get_console():execute( "g_game_difficulty" )
if game_difficult == "gd_novice" or "gd_stalker" then
	return true
end
return false
 

10.png

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

@BoBaH_671@Eugen81,  игра падает с обоими вариантами.

Добавлено Eugen81,

А так:

if game_difficult == "gd_novice" or game_difficult == "gd_stalker" then

?

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

А так: if game_difficult == "gd_novice" or game_difficult == "gd_stalker" then ?

И так не хочет работать.

 

@BoBaH_671, лог - классика жанра:

 

 

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...a.l.k.e.r. - trilogy\shoc\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

 

 

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

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

@Silver Raven, а вот так?

local difficultyNumber = level.get_game_difficulty()
if difficultyNumber <= 1 then
    return true
end
return false

0 - новис
3 - мастер

Изменено пользователем Eugen81
  • Нравится 1
  • Согласен 2
 

10.png

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

А чего вы ожидали товарищи?) Пытаетесь читать строку как число с плавающей запятой. Сделайте так:

local game_difficult = get_console():get_string("g_game_difficulty")
function difficult_check()
 if game_difficult == "gd_novice" or game_difficult == "gd_stalker" then
  return true
 else 
  return false
 end
end

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

Доброго времени суток, уважаемые пользователи амк-форума.

 Я хотел бы поинтересоваться,можно ли реализовать фичу из ЛА(ЛостАльфа),Где если ты убил нпс,а у него в рюкзаке был дробаш к примеру(то он у него на спине висит)Думаю понятно про что я твержу.Мне один человек подсказал что это настраивается как-то и вовсе не мод это.(где-то в конфигах.) Простите если оффтоп или что-то не правильно.Поправьте в данном случае.

 

А и еще вопрос к знатокам - как сделать квест большой.(не обычный "подай - принеси"),а большой как например с флешкой у волка.

 Многоэтапный такой и все такое. помогите,буду благодарен.

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

 

EggIeRar(V.N.S.L), касательно дробовика вообще непонятно на самом деле. А по поводу квеста, вот свой пример с флешкой волка и смотрите. Квест esc_flash_task ищите в файлах.

 

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

EggIeRar(V.N.S.L), касательно дробовика вообще непонятно на самом деле. А по поводу квеста, вот свой пример с флешкой волка и смотрите. Квест esc_flash_task ищите в файлах.

понял спасибо. Постораюсь понятнее донести.

 - Если у нпс есть пушка,то она висит за спиной (ну как  у Петрухи пока он с биноклем например).

-И во время смерти(т.е если убить чтоб пушка дальше так же и висела за спиной).и виузал оружия будет зависить от того какое оно в рюкзаке у убитого. надеюсь понятно.

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

EggIeRar(V.N.S.L), в xr_motivator.script есть колбек (function motivator_binder:death_callback(victim, who) ) который вызывается при смерти каждого НПС. Посмотрите, мб эти изменения в нём.

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

EggIeRar(V.N.S.L), в xr_motivator.script есть колбек (function motivator_binder:death_callback(victim, who) ) который вызывается при смерти каждого НПС. Посмотрите, мб эти изменения в нём.

Я в скриптах плохо. Если только прописать что куда либо, и то, могу напортачить. Вот.

Я посмотрю,_покопаю,_может чего и найду.

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

@Eugen81, и так тоже.

Добавлено Eugen81,

Морочишь голову... Думал догадаешься завернуть в function bla-bla()...

Второй код рабочий.

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

@EggIeRar(V.N.S.L), это движковая фишка, файл называется stalker_death_actions.cpp, достаточно запретить дроп и ничего с оружием не делать, но я не рекомендую, и сразу, не рекомендую копировать из лост альфы, это такая мерзкая фишка на самом деле, не вижу смысла расписывать портянку по клиент-серверу, но вот как есть, можете, конечно, попытаться и поймете о чем я говорю.

 

@Silver Raven,

local game_difficulty_by_num = {
    [0] = "novice",
    [1] = "stalker",
    [2] = "veteran",
    [3] = "master",
}
function get_str_diff() return game_difficulty_by_num[level.get_game_difficulty()] end

local diff = get_str_diff()
if diff == 'novice' then
--// bla-bla-bla
end
  • Согласен 1
Ссылка на комментарий

Существует маленький мод позволяющий видеть рестрикторы. Чем то они там подсвечиваются, вроде партиклами.

А существует ли скриптовый способ, точно так же подсветить все фэйковые поверхности на локации ?

Спасибо.

"Кругом зомби.....у меня кончаются патроны...."

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

@BFG, дык у нас на форуме, вроде была тема по какой-то разработке с такими возможностями. Забыл где. И рестрикторы отрисовываются и спавном можно заниматься, прямо на месте.

 

@Карлан, отлично. Работает. Как и этот вариант от @Kondr48:

 

local game_difficult = get_console():get_string("g_game_difficulty")

function difficult_check()
 if game_difficult == "gd_novice" or game_difficult == "gd_stalker" then
  return true
 else
  return false
 end
end 

 

 

 

А возможно как-то обойти необходимость регистрировать\прописывать функции вызываемые из логики в xr_effects.script?

 

Насчет курсора, есть одна идея. Ему можно задавать координаты на экране? Если да, то как вывести его далеко за пределы экрана, тем самым "скрыв" от игрока?

 

Возможно как-нибудь разделить такую портянку на части? Читать очень неудобно:

 

 

[sr_idle@check_game_difficult_and_actor_outfit]
on_actor_inside = %=lab_x7_check_game_difficult =lab_x7_biohazard_check_actor_outfit% {-lab_x7_actor_chose_hight_difficult -lab_x7_actor_have_bioprotection_outfit} sr_timer@biohazard_without_bioprotection_outfit_low_difficult, {-lab_x7_actor_chose_hight_difficult +lab_x7_actor_have_bioprotection_outfit} sr_timer@biohazard_with_bioprotection_outfit_low_difficult, {+lab_x7_actor_chose_hight_difficult -lab_x7_actor_have_bioprotection_outfit} sr_timer@biohazard_without_bioprotection_outfit_hight_difficult, {+lab_x7_actor_chose_hight_difficult +lab_x7_actor_have_bioprotection_outfit} sr_timer@biohazard_with_bioprotection_outfit_hight_difficult

 

 

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

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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