SoC. Создаем фриплей за пару-тройку минут. — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(→Сами скрипты) |
(<<< aka_sektor) |
||
Строка 410: | Строка 410: | ||
== Благодарность == | == Благодарность == | ||
Автору мода OGSM | Автору мода OGSM | ||
+ | [[Категория:Неоформленные статьи]] |
Версия 00:19, 20 марта 2014
Содержание
Отключение смертельных зон на ЧАЭС-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.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