Главная | Регистрация | Вход | Приветствую Вас | Гость| RSS















Меню
Реклама
Категории раздела
Работа со скриптами [32]
Самые разные полезные статьи по скриптам игры S.T.A.L.K.E.R
Работа с конфигами [13]
Всякие полезные материалы по работе со Сталкером ТЧ.
Базовые знания [6]
Основы для тех кто хочет заниматься модами.
Для тех кто чуть больше чем новичок :) [7]
Работа с ACDC, all.spawn , скрипты...
SDK [3]
Все о работе в официальном SDK.
Прохождения модов ТЧ. [21]
Здесь выкладываем различные прохождения кучи различных модов для ТЧ.
Свежий хабар






Главная » Статьи » Тени Чернобыля » Работа со скриптами

Создание нано-костюма
Представляю скрипт Супер-Мега-Пупер Броника. Скрипт можно привязать к любому бронежилету, хоть к куртке новичка. Точнее, скрипт привязан к актору, где проверяется какой броник надет на ГГ. Если тот, что надо, то скрипт начинает работать.
Особенности:
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

-------------------------------------------------------------------------------------

Теперь открываем файл bind_stalker.script, находим функцию actor_binder:update(delta), и в теле функции вписываем апдейт нашего скрипта:

super_outfit.update_nano()

Затем, ниже находим функцию actor_binder:save(packet) и в конец тела функции вставляем вызов сохранения данных:

super_outfit.nano_save(packet)

Далее, ещё ниже находим функцию actor_binder:load(reader), и так же, в конец тела функции вставляем вызов загрузки данных:

super_outfit.nano_load(reader)

Теперь осталось создать виджет, для вывода оповещений. Для этого открываем файл config\ui\ui_custom_msgs.xml и добавляем новую секцию:

<nano_news x="240" y="600" width="550" height="100" complex_mode="1">
<text font="letterica18" r="255" g="255" b="255" a="255" align="c"/>
</nano_news>

Вот в принципе и всё. Можно идти тестировать. Если у кого есть какие ещё соображения по нововведениям к супер-мега-пупер бронику, просьба писать в коментах.
Категория: Работа со скриптами | Добавил: drweb66 (08.06.2011)
Просмотров: 2839 | Рейтинг: 5.0/1
Всего комментариев: 0
avatar
PDA
Поиск
Как вы думаете,
Какие части СТАЛКЕР вам нравятся больше?
Всего ответов: 3249
Сообщения
Разное
AP production - видео обзоры модов для игры S.T.A.L.K.E.R.

На территории Зоны: 1
Отмычек: 1
Опытных ходоков: 0


Design by:
Guenplenтм, with the participation of Orlenok Design Studio ®
Правообладателям
2024