Перейти к контенту
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

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

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

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

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

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

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

    Войти

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

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

    AMK-Team.ru

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