Представляю скрипт Супер-Мега-Пупер Броника. Скрипт можно привязать к любому бронежилету, хоть к куртке новичка. Точнее, скрипт привязан к актору, где проверяется какой броник надет на ГГ. Если тот, что надо, то скрипт начинает работать. Особенности: 1. Текущее оздоровление до 0.8 единиц, при падении здоровья актора до 0.4 единиц. Оздоровление плавное, ~2 минуты игрового времени. Система текущего оздоровление ломается, при повреждении броника более чем на 0.6 единиц. 2. Экстренное оздоровление до 0.4 единиц, при падении здоровья актора до 0.2 единиц. Оздоровление мгновенное до 0.4 единиц. Далее действует текущее оздоровление. Система экстренного оздоровление ломается, при повреждении броника более чем на 0.4 единицы. 3. Система поддержки выносливости, более чем в 2 раза. При этом скорость восстановления сил замедленно, так же в 2 раза. Система поддержки выносливости ломается, при повреждении броника более чем на 0.3 единицы. При повреждении броника более чем на 0.7 единиц действует ухудшение выносливости (более быстрое падение сил). В этом случае советуется снять броник. 4. Индивидуальная система вывода оповещений о действиях и состоянии систем броника. Вывод сообщений производится в несколько ниже центральной части экрана. Каждое сообщение сопровождается звуковым зумом. При этом каждый тип сообщений имеет свой цвет.
Я не буду подробно описывать, как работает данный скрипт. Это будет слишком муторно и мало понятно. Но некоторые комментарии в скрипте достаточно наглядно объясняют, где и какой код, за что отвечает.
Итак начнём. Создаём файл super_outfit.script. И вписываем в нём такой код:
local med_obc = 0 --защёлка вывода информации о запуске текущего оздоровления local pred_med = 0 --защёлка вывода информации о повреждении системы текущего оздоровления local ekst_med = 0 --защёлка вывода информации о повреждении экстренного оздоровления local bron_tek = 0 --защёлка вывода информации о востановлении системы текущего оздоровления local bron_eks = 0 --защёлка вывода информации о востановлении системы экстренного оздоровления local pow_kras = 0 --защёлка вывода информации о повреждении и востановлении системы поддержки выносливости local tbl_news = {} --таблица текстовой информации local pow = 1 --переменная для запоминания предыдущего параметра выносливости.
function update_nano() local actor = db.actor local bron = actor:get_current_outfit()
if actor:alive() == true and bron and bron:section() == "outfit_exo_m1" then --здесь ставится имя броника local live_bron = actor:get_current_outfit_protection(9)
--запуск текущего оздоровления if actor.health <= 0.4 and actor.health > 0.2 and med_obc == 0 then if live_bron > 0.4 then med_obc = 1 this.text_list(0) elseif pred_med == 0 then this.text_list(4) pred_med = 1 if bron_tek == 0 then bron_tek = 1 end end elseif med_obc == 1 and live_bron <= 0.4 and actor.health > 0.4 then this.text_list(4) med_obc = 0
--запуск экстренного оздоровления elseif actor.health <= 0.2 then if live_bron > 0.6 then actor.health = 0.2 this.text_list(3) if med_obc == 0 then med_obc = 1 this.text_list(0) else this.text_list(1) end elseif ekst_med == 0 then this.text_list(5) if pred_med == 0 then if med_obc == 0 then this.text_list(0) med_obc = 1 else this.text_list(1) end end ekst_med = 1 if bron_eks == 0 then bron_eks = 1 end end end
--поддержка выносливости if live_bron > 0.7 then local pow_raz = pow - actor.power actor.power = pow_raz/1.1 pow = actor.power elseif live_bron < 0.3 then local pow_raz = pow - actor.power if pow_raz < 0 then actor.power = pow_raz/1.1 else actor.power = -(pow_raz/1.1) end pow = actor.power elseif live_bron <= 0.7 and pow_kras == 0 then this.text_list(8) pow_kras = 1 end
--защёлки вывода информации о повреждениях систем броника if pred_med == 1 and actor.health > 0.4 then pred_med = 0 end if ekst_med == 1 and actor.health > 0.2 then ekst_med = 0 end
--апдейт активных действий this.medic() this.bron_rem(live_bron) this.text_news() end end
--текущее лечение function medic() if med_obc == 1 then db.actor.health = 0.0005 if db.actor.health > 0.8 then this.text_list(2) med_obc = 0 end end end
--востановление ресурсов после ремонта броника function bron_rem(live_bron) if bron_tek == 1 and live_bron > 0.4 then this.text_list(6) bron_tek = 0 end if bron_eks == 1 and live_bron > 0.6 then this.text_list(7) bron_eks = 0 end if pow_kras == 1 and live_bron > 0.7 then this.text_list(9) pow_kras = 0 end end
--список текстовых сообщений, и запуск соответствующих к ним звуковых сопровождений function text_list(typ) if typ == 0 then table.insert (tbl_news, 1, {'Запущен процесс текущего оздоравления!', 1000, 255, 255, 0}) elseif typ == 1 then table.insert (tbl_news, 1, {'Продолжается текущее оздоровление!', 1000, 255, 255, 0}) elseif typ == 2 then table.insert (tbl_news, 1, {'Текущее оздоровление завершено!', 1000, 0, 255, 0}) elseif typ == 3 then table.insert (tbl_news, 1, {'Произведено экстренное оздоровление!', 1000, 255, 255, 0}) elseif typ == 4 then table.insert (tbl_news, 1, {'Внимание! Система текущего оздоровления повреждена!', 1000, 255, 0, 0}) elseif typ == 5 then table.insert (tbl_news, 1, {'Внимание! Система экстренного оздоровления повреждена!', 1000, 255, 0, 0}) elseif typ == 6 then table.insert (tbl_news, 1, {'Система текущего оздоровления востановлена!', 1000, 0, 255, 0}) elseif typ == 7 then table.insert (tbl_news, 1, {'Система экстренного оздоровления востановлена!', 1000, 0, 255, 0}) elseif typ == 8 then table.insert (tbl_news, 1, {'Внимание! Система поддержки выносливости повреждена!', 1000, 255, 0, 0}) elseif typ == 9 then table.insert (tbl_news, 1, {'Система поддержки выносливости востановлена!', 1000, 0, 255, 0}) end
if typ == 4 or typ == 5 or typ == 8 then this.sound_news(1) else this.sound_news(0) end end
--вывод текстовых сообщений function text_news() local hud = get_hud() local tm = hud:GetCustomStatic("nano_news" )
if tm == nil then hud:AddCustomStatic("nano_news", true) tm = hud:GetCustomStatic("nano_news" ) end local tmv = '' for k,v in ipairs(tbl_news) do tmv = tmv.. string.format("%s\n", '%c[255,'..tostring(v[3]..','..v[4]..','..v[5]..']')..v[1]) if v[2] > 0 then v[2] = v[2] - 1 elseif v[3] ~= 70 or v[4] ~= 70 or v[5] ~= 70 then for j = 3, 5 do if v[j] > 70 then v[j] = v[j] - 1 elseif v[j] < 70 then v[j] = v[j] + 1 end end else table.remove (tbl_news, k) end end
if tm ~= nil then tm:wnd():SetText(tmv) end end
--звуковые сопровождения текстовых сообщений function sound_news(typ) local snd if typ == 1 then snd = xr_sound.get_safe_sound_object([[device\pda\pda_sos]]) else snd = xr_sound.get_safe_sound_object([[device\decoder]]) end snd:play(db.actor, 0, sound_object.s2d) end
--сохранение данных function nano_save(packet) packet:w_u8(med_obc) packet:w_u8(pred_med) packet:w_u8(ekst_med) packet:w_u8(bron_tek) packet:w_u8(bron_eks) packet:w_u8(pow_kras) packet:w_u8(pow) end
--загрузка сохранённых данных function nano_load(reader) med_obc = reader:r_u8() pred_med = reader:r_u8() ekst_med = reader:r_u8() bron_tek = reader:r_u8() bron_eks = reader:r_u8() pow_kras = reader:r_u8() pow = reader:r_u8() end
Вот в принципе и всё. Можно идти тестировать. Если у кого есть какие ещё соображения по нововведениям к супер-мега-пупер бронику, просьба писать в коментах.