SoC. Фриплей — S.T.A.L.K.E.R. Inside Wiki SoC. Фриплей — S.T.A.L.K.E.R. Inside Wiki

SoC. Фриплей

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск

Таймер/выброс на ЧАЭС

Первым делом уберем таймер (ЧАЭС-1) и выброс (ЧАЭС-1 и ЧАЭС-2). Открываем sr_timer.script и в начале всех функций пишем:

if not has_alife_info("freeplay") then

С файлом sr_aes_deadzone.script делаем тоже самое.

В файл info_l19_stanciya.xml(это в gamedata/config/gameplay) пишем:

<info_portion id="freeplay"></info_portion>

В xr_effects.script, в начале функции aes_earthshake напишите:

<info_portion id="freeplay"></info_portion>


Точки перехода

В freeplay.script пишем:

 
-- Спавним левел-чейнджер
function spawn_level_changer(sid, from_pos, from_level, dest_pos, dest_level, hint, mode, dest_dir)
 
local vertexes = {
l01_escape = {lvid=594266, gvid=0},
l04_darkvalley = {lvid=121712, gvid=815},
l11_pripyat = {lvid=142116, gvid=2270},
l12_stancia = {lvid=405348, gvid=2400},
l12_stancia_2 = {lvid=9914, gvid=2517}
-- l12_stancia_2 = {lvid=227423, gvid=2635}
}
 
local obj = alife():create("level_changer", from_pos, vertexes[from_level]["lvid"], vertexes[from_level]["gvid"])
 
if obj then
 
	level.map_add_object_spot(obj.id, "level_changer", hint)
 
	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_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()
 
	-- свойства cse_shape
	local shape_count = packet:r_u8()
	local shape_type
	local center
	local radius
 
	if shape_count == 0 then
		shape_type = 0
		center = vector():set(0,0,0)
		radius = 10.0
		shape_count = 1
	else
		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 v1 = packet:r_vec3()
				local v2 = packet:r_vec3()
				local v3 = packet:r_vec3()
				local v4 = packet:r_vec3()
			end
		end
	end
 
	-- свойства cse_alife_space_restrictor
	local restrictor_type = packet:r_u8()
 
	-- свойства cse_alife_level_changer
	local dest_game_vertex_id = packet:r_u16()
	local dest_level_vertex_id = packet:r_s32()
	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()
 
	if packet:r_elapsed() ~= 0 then get_console():execute("left="..packet:r_elapsed()) end
 
	-- свойства cse_alife_object
	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)
	packet:w_stringZ(custom_data)
	packet:w_s32(sid)
	packet:w_s32(cse_alife_object__unk3_u32)
 
	-- свойства cse_shape
	packet:w_u8(shape_count)
 
	for i=1,shape_count do
		packet:w_u8(shape_type)
		if shape_type == 0 then
			packet:w_vec3(vector():set(0,0,0))
			packet:w_float(3)
		else
			packet:w_vec3(vector():set(3,0,0))
			packet:w_vec3(vector():set(0,3,0))
			packet:w_vec3(vector():set(0,0,3))
			packet:w_vec3(vector():set(0,0,0))
		end
	end
 
	-- свойства cse_alife_space_restrictor
	packet:w_u8(restrictor_type)
 
	-- свойства cse_alife_level_changer
	packet:w_u16(vertexes[dest_level]["gvid"])
	packet:w_s32(vertexes[dest_level]["lvid"])
	packet:w_vec3(dest_pos)
	if dest_dir then 
		packet:w_vec3(dest_dir)
	else
		packet:w_vec3(dest_direction)
	end
	packet:w_stringZ(dest_level)
	packet:w_stringZ(dest_graph_point)
	packet:w_u8(mode)
 
	obj:STATE_Read(packet, packet:w_tell()-packet:r_tell())
 
end
end
 
 
-- Спавн всех нужных переходов
function set_lc(actor, npc)
-- Кордон - Темная долина
spawn_level_changer(6001, vector():set(368.9,15.17,-42.65), "l01_escape", vector():set(-44.77, 0.43, -541.35), "l04_darkvalley", "to_darkvalley", 0)
 
-- ЧАЭС - Припять
spawn_level_changer(6002, vector():set(918.1,-0.1,-401.96), "l12_stancia", vector():set(31.28,1.135,420.61), "l11_pripyat", "to_pripyat", 0, vector():set(0,-3.1,0))
 
-- ЧАЭС2 - ЧАЭС
-- spawn_level_changer(6003, vector():set(554.52,150,201), "l12_stancia_2", vector():set(117.6,-0.1,-76.3), "l12_stancia", "to_aes", 1, vector():set(0,-1.5,0))
spawn_level_changer(6003, vector():set(-42.15,-0.02,56.03), "l12_stancia_2", vector():set(126,-0.1,-76.3), "l12_stancia", "to_aes", 0, vector():set(0,-1.5,0))
 
-- ЧАЭС - ЧАЭС2
spawn_level_changer(6004, vector():set(117.6,-0.1,-76.3), "l12_stancia", vector():set(-42.15,-0.02,64), "l12_stancia_2", "to_aes", 0)
 
-- Перемещаем актора, ато он на трубе станет
db.actor:set_actor_position(vector():set(1035.12,-0.0999,229.564))
 
-- Ставим стандартную погоду, отключаем таймер и выброс
level.set_weather("default")
db.actor:give_info_portion("freeplay")
 
end
end
 
 
-- Отмечаем на карте новые точки перехода
function mark_lc()
local obj = alife():story_object(6001)
if obj then
	level.map_add_object_spot(obj.id, "level_changer", "to_darkvalley")
end
local obj = alife():story_object(6002)
if obj then
	level.map_add_object_spot(obj.id, "level_changer", "to_pripyat")
end
local obj = alife():story_object(6003)
if obj then
	level.map_add_object_spot(obj.id, "level_changer", "to_aes")
end
local obj = alife():story_object(6004)
if obj then
	level.map_add_object_spot(obj.id, "level_changer", "to_aes")
end
end
 

Точки перехода нужны для того, чтобы актор не застрял на ЧАЭС-2, чтобы он мог вернуться к любимому Сидоровичу - на кордон, в Припять, на ЧАЭС-1, на Радар, Янтарь, бар, в Темную долину.

Пишем в файл bind_stalker.script, в функцию actor_binder:update(delta)

-- помечаем точки переходов
freeplay.mark_lc()

Активация

В ui_movies.xml(gamedata/config/ui), в теге mov_refuse_osoznanie, элемент <function_on_stop> модифицировать, чтобы было так:

<function_on_stop>freeplay.set_lc</function_on_stop>

Авторы

Статью писал Я - vllzl.

Скрипт из OGSM.

Другие места
LANGUAGE