SoC. Создаем фриплей за пару-тройку минут. — S.T.A.L.K.E.R. Inside Wiki

SoC. Создаем фриплей за пару-тройку минут.

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

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

Отключение смертельных зон на ЧАЭС-2

Открываем sr_aes_deadzone.script. В начале функций: action_postprocess:reset_scheme (), action_postprocess:deactivate(), action_postprocess:update_params (), action_postprocess:update_hit (delta) напишите это:

if not has_alife_info("freeplay") then

Это значит, что «зона» будет работать до подачи этого поршня. Но поршня нету.

Поршни

Открывает config/gameplay/info_l19stanciya.xml Туда дописываем где-нибудь:

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


Таймеры на ЧАЭС-1 и в X-16

В файле sr_timer.script все свяжем с новым поршнем freeplay. Опустошите файл и напишите в нем:

 
----------------------------------------------------------------------------------------------------
-- Таймер с выводом изображения на экран.
----------------------------------------------------------------------------------------------------
 
local k,v = 0,0
 
class "action_timer"
function action_timer:__init(obj, storage)
	self.object = obj
	self.st = storage
end
function action_timer:update(delta)
if not has_alife_info("freeplay") then
	local actor = db.actor
	if xr_logic.try_switch_to_another_section(self.object, self.st, actor) then
		return
	end
	-- Высчитываем сколько времени уже работает счетчик
	local nn = time_global() - db.storage[self.object:id()].activation_time
 
	-- Изменяем значение счетчика
	local value_time = 0
	if self.st.type == "inc" then
		value_time = self.st.start_value + nn
	else
		value_time = self.st.start_value - nn
	end
	if value_time <= 0 then
		value_time = 0
	end
	-- Формируем строку счетчика
	local hours = math.floor(value_time/3600000)
	local minutes = math.floor(value_time/60000 - hours*60)
	local seconds = math.floor(value_time/1000 - hours*3600 - minutes*60)
	local str = tostring(hours)..":"..sr_timer.time2str(minutes)..":"..sr_timer.time2str(seconds)
 
	self.st.timer:SetTextST(str)
 
	-- Определяем нужно ли куда то переходить.
	for k,v in pairs(self.st.on_value) do
		if (self.st.type == "dec" and value_time <= v.dist) or
		   (self.st.type == "inc" and value_time >= v.dist)
		then
			-- Обработка значения.
			xr_logic.switch_to_section(self.object, self.st, xr_logic.pick_section_from_condlist(db.actor, self.object, v.state))
		end
	end
end
end
function action_timer:deactivate(delta)
if not has_alife_info("freeplay") then
	self.st.ui:RemoveCustomStatic(self.st.timer_id)
	if self.st.string ~= nil then
		self.st.ui:RemoveCustomStatic("hud_timer_text")
	end
end
end
--function action_timer:save()
--	xr_logic.pstor_store( self.object, "timer_value", self.state )	
--end
 
function time2str(n)
	if n >= 10 then
		return tostring(n)
	else
		return "0"..tostring(n)
	end
end
---------------------------------------------------------------------------------------------------------------------
function add_to_binder(obj, ini, scheme, section, storage)
	local action = action_timer(obj, storage)
	xr_logic.subscribe_action_for_events(obj, storage, action)
end
function set_scheme(obj, ini, scheme, section, gulag_name)
if not has_alife_info("freeplay") then
	local st = xr_logic.assign_storage_and_bind(obj, ini, scheme, section)
	st.logic = xr_logic.cfg_get_switch_conditions(ini, section, obj)
	st.type = utils.cfg_get_string( ini, section, "type", obj, false, "", "inc")
	if st.type ~= "inc" and st.type ~= "dec" then
		abort("ERROR: wrong sr_timer type. Section [%s], Restrictor [%s]", section, obj:name())
	end
 
	if st.type == "dec" then
		st.start_value = utils.cfg_get_number(ini, section, "start_value", obj, true)
	else
		st.start_value = utils.cfg_get_number(ini, section, "start_value", obj, false, 0)
	end
	-- Вычитываем значения перехода.
	st.on_value = parse_data(obj, utils.cfg_get_string(ini, section, "on_value", obj, false, ""))
	st.timer_id = utils.cfg_get_string( ini, section, "timer_id", obj, false, "", "hud_timer")
	st.string	= utils.cfg_get_string( ini, section, "string", obj, false, "")
 
	st.ui = get_hud()
	st.ui:AddCustomStatic(st.timer_id, true)
	st.timer = st.ui:GetCustomStatic(st.timer_id):wnd()
 
	if st.string ~= nil then
		st.ui:AddCustomStatic("hud_timer_text", true)
		local timer_text = st.ui:GetCustomStatic("hud_timer_text"):wnd()
		timer_text:SetTextST(st.string)
	end
end
end
 
function parse_data(npc,s)
	local t = {}
 
    if s then
		for name in string.gfind( s, "(%|*%d+%|[^%|]+)%p*" ) do
			local dat = {	dist = nil,
							state = nil}	
 
			local t_pos = string.find( name, "|", 1, true )
 
			local dist = string.sub( name, 1, t_pos - 1 )
			local state	= string.sub( name, t_pos + 1)
 
 
			dat.dist = tonumber(dist)
			if state then
				dat.state = xr_logic.parse_condlist(npc, dist, state, state)
			end
			table.insert(t, dat)
		end
	end
    return t
end
 


Землетрясение и подключение скриптов

Находим функцию в файле xr_effects.script aes_earthshake в начале напишите:

if not has_alife_info("freeplay") then

Открываем ui_credits.xml. Находим:

<function_on_stop>xr_effects.after_credits</function_on_stop>

Меняем на:

<function_on_stop>freeplay.set_lchanger</function_on_stop>

Сами скрипты

Создаем в папке /scripts файл 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 disable_sar_entrance()
for i=1,65535 do
	local obj = alife():object(i)
	if obj and obj:name()=="exit_to_sarcofag_01" then
		alife():release(obj, true)
	end
end
end
 
 
-- Спавн всех нужных переходов
function set_lchanger()
 
if not db.actor or not has_alife_info("game_end") then
	xr_effects.after_credits()
else
 
level.add_pp_effector("teleport.ppe", 2008, false)
 
-- Кордон - Темная долина
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)
 
-- Удаление лишних переходов
disable_sar_entrance()
 
-- Перемещаем актора, засчитываем все задания
db.actor:set_actor_position(vector():set(1035.12,-0.0999,229.564))
set_complete_tasks()
 
-- Ставим стандартную погоду
level.set_weather("default")
 
-- Пометим
mark_lc()
 
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
if has_alife_info("freeplay") and (level.name()=="l12_stancia" or level.name()=="l12_stancia_2" or level.name()=="l11_pripyat" or level.name()=="l10_radar") then
	level.set_weather("default")
end
end
 
 
-- Засчитываем задание "Убить Стрелка"
function set_complete_tasks()
if has_alife_info("aes2_monolit_teleport_ready_final") and not has_alife_info("freeplay") and (level.name()=="l12_stancia" or level.name()=="l12_stancia_2") then
	db.actor:iterate_inventory(del_q_items,db.actor)
	db.actor:give_info_portion("cit_fail_first_task")
	db.actor:give_info_portion("freeplay")
	db.actor:disable_info_portion("game_end")
	db.gameover_credits_started = false
end
end
 
 
-- Удаляем ненужные квестовые предметы
function del_q_items(npc, item)
	if item==nil or alife():object(item:id())==nil then return end
	local section = item:section()
	if section=="gunslinger_flash" or 
		section=="good_psy_helmet" or 
		section=="bad_psy_helmet" or 
		section=="decoder" or
		section=="pri_decoder_documents" then
			alife():release(alife():object(item:id()), true)
	end
end
 
 
------------------------- Copyright 2007-2008 DEXXX ---------------------------
 
--[[
 
If you're going to use the whole of this script or its parts in your own creative 
developments for the S.T.A.L.K.E.R. game, please don't become such a goddamn 
motherfucker like the notorious author of the ABC Mod - Carbrobro. Leave the 
copyrights, note the real author(s) and don't claim others' ideas and their 
realization to be your own ones. It's just simple Modmakers' Ethics. Thank you!
 
Если вы собираетесь использовать данный скрипт целиком или частично в своих 
разработках по игре S.T.A.L.K.E.R., пожалуйста не опускайтесь до уровня печально 
известного автора ABC мода - Carbrobro. Не удаляйте копирайты, указывайте настоящего 
автора(ов) и не выдавайте чужие идеи и их реализацию за свои. Ведь это элементарная 
этика модостроителей! Спасибо за понимание.
 
]]--
 

Авторы

Скрипты Взято из OGSM. Статья vllzl


Благодарность

Автору мода OGSM

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