Случайная подборка модов
На распутье
3.5
Равновесие
3.2
Old Episodes: Эпизод 1
2.9
Объединенный Пак - 2
3.7
Камень Преткновения. Пролог
4.1
Время перемен v1.0
3.8
Последние обновленные темы Прямой эфир Самые популярные темы Последние новости
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: FanG, Аdmin, FantomICW, Overfirst  
Форум » S.T.A.L.K.E.R. Модификации » Помощь в моддинге » Скрипты, конфиги, логика, движок » [SoC] Система постепенной регенерации жизни (Из Lurk mod и ABC)
[SoC] Система постепенной регенерации жизни
Российская Федерация  supei-sa
Среда, 07.09.2011, 16:13 | Сообщение # 1
Статус:
Ветеран:
Сообщений: 4356
Награды: 6
Регистрация: 25.10.2010

Для начала создадим скрипт. Например health_effect.scripts:

---Система еды и постепенного лечения из Лурк мода---

objectinuse=0
objectused=0

--If/then statements for finding the item.
function start(obj)
snd = xr_sound.get_safe_sound_object([[$no_sound]])
if (db.actor~=nil) and (obj~=nil) then
slotinuse=db.actor:active_slot()
slot_div=1
if obj:section() == "medkit" or obj:section() == "medkit_army" or obj:section() == "medkit_scientic" then
snd= xr_sound.get_safe_sound_object([[interface\inv_medkit]])
holster_time=time_global()+7000
if (objectinuse==1) then
holster_time=holster_time+7000
end
soundhub()

elseif obj:section() == "antirad" then
snd= xr_sound.get_safe_sound_object([[interface\inv_pills]])
holster_time=time_global()+6000
if (objectinuse==1) then
holster_time=holster_time+6000
end
soundhub()

elseif obj:section() == "bandage" then
snd= xr_sound.get_safe_sound_object([[interface\inv_bandage]])
holster_time=time_global()+6000
if (objectinuse==1) then
holster_time=holster_time+6000
end
soundhub()

elseif obj:section() == "vodka" then
snd= xr_sound.get_safe_sound_object([[interface\inv_vodka]])
holster_time=time_global()+4000
if (objectinuse==1) then
holster_time=holster_time+4000
end
soundhub()

elseif obj:section() == "energy_drink" then
snd= xr_sound.get_safe_sound_object([[interface\inv_softdrink]])
holster_time=time_global()+4000
if (objectinuse==1) then
holster_time=holster_time+4000
end
soundhub()

elseif obj:section() == "bread" or obj:section() == "conserva" or obj:section() == "kolbasa" then
snd= xr_sound.get_safe_sound_object([[interface\inv_food]])
holster_time=time_global()+7000
if (objectinuse==1) then
holster_time=holster_time+7000
end
soundhub()
end

end
end

--Other stuff executes from here.
function soundhub()
if db.actor:alive() then
snd:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
snd = xr_sound.get_safe_sound_object([[$no_sound]])
if (objectinuse==0) then
db.actor:hide_weapon()
objectinuse=1
if slotinuse == 1 then
slot_div = ((holster_time-time_global())/1.5)
else
slot_div = 0
end
end
objectused=objectused+1
weapontimer()
end
end

--Holster time. Its set up as additive: A food and a drink taken together will apply instantly, but your gun is holstered for 9 seconds.
function weapontimer()
if (holster_time~=nil) and (time_global()>(holster_time-slot_div)) and level.present() then
objectused=objectused-1
if (objectused==0) then
db.actor:restore_weapon()
objectinuse=0
holster_time=nil
end
end
end

--Message for time remaining and math.Round function. Not used.
--[[
function message()
news_manager.send_tip(db.actor, tostring(math.Round((holster_time - time_global())/1000)).."s", nil, nil, 1000)
end

--Math.round
function math.Round(num)
local floored = math.floor(num)
if (num - floored) >= 0.5 then
return math.ceil(num)
else
return floored
end
end
]]--

Стоит, кстати, учесть параметр

snd = xr_sound.get_safe_sound_object([[interface\inv_food]])

Отвечает за воспроизводимый звук. Так что если его нет, поймаете вылет. Теперь создаёте скрипт abc_medkit.script:

-- Shortened Creds: ABC Mod made this, LURK team just cleaned up the indentions.

-- Should the use of the same medkit accumulate over the previous one?
multiple_medkit = "yes" --Не пробовал ставить no. Но почти уверен что будет вылет

-- How many minutes should take to complete the healing process.
hp_fullhealth_time = 0.125 --Кол-во в течении которого будет юзаться аптечка

--0.25

-- Health update time in MS. 1000 = 1 Second.
hupd_time = 50 --Апдейт времени.Лучше не трогать

-- Time modulation
time_mod=0

-- HP Healed. No higher than 1.
hp_med_kit = 0.65 --Параметр отвечающий за восстановление жизней одной аптечкой.Точнее за скорость восстановления
hp_med_army = 0.75
hp_med_sci = 0.80

-- Is Army faster than Normal?
army_fast = "yes"

-- Is Science faster than Normal?
sci_fast = "yes"

-- Is Science faster than Army?
sci_fast_than_army = "yes"

-- Should medkit_scientic anti-radiation process be progressive?
sci_antirad = "yes"

-- EOF

local med_kit, med_band, med_army, med_sci, medused, medid, medname
local objdtc = 0
function chk_medlot_object(obj)
if db.actor ~= nil then
local objdt = time_global()
if obj ~= nil and obj ~= "load" then
medname = obj:section()
if medname == "medkit" or medname == "medkit_army" or medname == "medkit_scientic" then
if objdtc == 0 then objdtc = time_global() + 350 end
med_used = "yes"
med_id = obj:id()
end
end
if med_used == "yes" and objdt > objdtc then
objdtc = 0
med_used = "no"
if level.object_by_id(med_id) == nil then
if medname == "medkit" then med_kit = "yes" end
if medname == "medkit_army" then med_army = "yes" end
if medname == "medkit_scientic" then med_sci = "yes" end
time_mod=0
end
end
new_medkit()
end
end

local time_mkit, time_army, time_sci, count_mkit, count_army, count_sci
function new_medkit()
if db.actor ~= nil and level.present() then
local cgametimemed = time_global()
local hft = (hp_fullhealth_time * 60000) / hupd_time
--normal
if med_kit == "yes" then
if time_mkit == nil then time_mkit = time_global() + hupd_time end
if cgametimemed > time_mkit then
time_mkit = time_global() + hupd_time
local player_hp = db.actor.health
if player_hp < 1 then
if count_mkit == nil then count_mkit = 0 end
if count_mkit < (hft + 1) then
db.actor.health = (hp_med_kit/(hft + time_mod))
count_mkit = count_mkit + 1
--abort("TimeMod: "..time_mod)
--abort("Health: "..hp_med_kit/(hft + time_mod))
time_mod = math.clamp(time_mod+0.23,0,35)
else
med_kit = nil
time_mkit = nil
count_mkit = nil
end
else
med_kit = nil
time_mkit = nil
count_mkit = nil
end
end
end
--army
if med_army == "yes" then
if time_army == nil then time_army = time_global() + hupd_time end
if cgametimemed > time_army then
time_army = time_global() + hupd_time
local player_hp = db.actor.health
if player_hp < 1 then
if count_army == nil then count_army = 0 end
if count_army < (hft + 1) then
local mamf = 0
if army_fast == "yes" then mamf = (hp_med_army/hft) / 4 end
db.actor.health = (hp_med_army/hft) + mamf
count_army = count_army + 1
time_mod = math.clamp(time_mod+0.23,0,35)
else
med_kit = nil
time_mkit = nil
count_mkit = nil
end
else
med_kit = nil
time_mkit = nil
count_mkit = nil
end
end
end
--science
if med_sci == "yes" then
if time_sci == nil then time_sci = time_global() + hupd_time end
if cgametimemed > time_sci then
time_sci = time_global() + hupd_time
local player_hp = db.actor.health
if player_hp < 1 then
if count_sci == nil then count_sci = 0 end
if count_sci < (hft + 1) then
local mamf = 0
local sfta = 4
if sci_fast_than_army == "yes" then sfta = 2 end
if sci_fast == "yes" then mamf = (hp_med_army/hft) / sfta end
db.actor.health = (hp_med_sci/hft) + mamf
if sci_antirad == "yes" then db.actor.radiation = -(hp_med_sci/hft) end
count_sci = count_sci + 1
time_mod = math.clamp(time_mod+0.23,0,35)
else
med_kit = nil
time_mkit = nil
count_mkit = nil
end
else
med_kit = nil
time_mkit = nil
count_mkit = nil
end
end
end
end
end

function math.clamp (value,mini,maxi)
local clamped = value
if clamped < mini then clamped = mini end
if clamped > maxi then clamped = maxi end
return clamped
end

Теперь самое сложное. Лезем в bind_stalker.scripts. После

self.object:set_callback(callback.on_item_drop, nil)

Пишем

self.object:set_callback(callback.use_object, nil)

В итоге получается вот так:

self.object:set_callback(callback.inventory_info, nil)
self.object:set_callback(callback.article_info, nil)
self.object:set_callback(callback.on_item_take, nil)
self.object:set_callback(callback.on_item_drop, nil)
self.object:set_callback(callback.use_object, nil)
--self.object:set_callback(callback.actor_sleep, nil)
self.object:set_callback(callback.task_state, nil)
self.object:set_callback(callback.level_border_enter, nil)
self.object:set_callback(callback.level_border_exit, nil)
self.object:set_callback(callback.take_item_from_box, nil)

После

self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)

Пишем

self.object:set_callback(callback.use_object, self.use_object, self)

В итоге:

self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.article_info, self.article_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.use_object, self.use_object, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
--self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
self.object:set_callback(callback.task_state, self.task_callback, self)
--self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)

Ищем функцию:

function actor_binder:on_item_drop (obj)

и после ее завершения пишем:

----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object(obj)
heal_regen.start(obj)
end
----------------------------------------------------------------------------------------------------------------------

В итоге:

----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
level_tasks.proceed(self.object)
--game_stats.update_drop_item (obj, self.object)
abc_medkit.chk_medlot_object(obj)
abc_sleep.uptabc(obj)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object(obj)
heal_regen.start(obj)
end
----------------------------------------------------------------------------------------------------------------------

После

--game_stats.update_drop_item (obj, self.object)

Пишем

abc_medkit.chk_medlot_object(obj)

После

function actor_binder:update(delta)

Пишем

abc_medkit.chk_medlot_object()
heal_regen.weapontimer()

Затем надо найти звуки и прописать их в директории \sounds\interface\

Далее идем в файл config\misc\items.ltx, ищем секции аптечек ([medkit],[medkit_army],[medkit_scientic]) и меняем в них параметр eat_health на 0.0, иначе актер будет лечится дважды (сначала сразу, по стандартному, а потом уже постепенно)

Автор статьи: Fireman3000, дополнил Darkscape, а так же спасибо Lurk моду и ABC.
Статья взята из stalker inside
Сообщение отредактировал supei-sa - Среда, 07.09.2011, 16:18
  Злобная реклама
Среда, 07.09.2011, 16:13
Статус:
Сообщений: 666
Регистрация: 25.10.2010
Российская Федерация  RICK
Среда, 07.09.2011, 16:19 | Сообщение # 2
Статус:
Опытный:
Сообщений: 1205
Награды: 4
Регистрация: 10.05.2011

пробывал я неработает
  Злобная реклама
Среда, 07.09.2011, 16:19
Статус:
Сообщений: 666
Регистрация: 10.05.2011
Российская Федерация  supei-sa
Среда, 07.09.2011, 16:23 | Сообщение # 3
Статус:
Ветеран:
Сообщений: 4356
Награды: 6
Регистрация: 25.10.2010

Kail, Щас подожди я тоже попробую.
Quote (Kail)
пробывал я неработает

Тогда лог вылета сюда покажи.
Сообщение отредактировал supei-sa - Среда, 07.09.2011, 16:23
  Злобная реклама
Среда, 07.09.2011, 16:23
Статус:
Сообщений: 666
Регистрация: 25.10.2010
Российская Федерация  Tris
Понедельник, 26.09.2011, 19:30 | Сообщение # 4
Dead Forgetting Zone
Статус:
Бывалый:
Сообщений: 914
Награды: 3
Регистрация: 12.06.2011

Может со скриптом напортачили, сами перепишите там не сложно.
  Злобная реклама
Понедельник, 26.09.2011, 19:30
Статус:
Сообщений: 666
Регистрация: 12.06.2011
Российская Федерация  supei-sa
Вторник, 27.09.2011, 17:59 | Сообщение # 5
Статус:
Ветеран:
Сообщений: 4356
Награды: 6
Регистрация: 25.10.2010

Tris, Я уже давно разобрался.Если надо то потом выложу нормальную рабочую версию скрипта.
  Злобная реклама
Вторник, 27.09.2011, 17:59
Статус:
Сообщений: 666
Регистрация: 25.10.2010
  Nikitos817
Вторник, 27.09.2011, 18:56 | Сообщение # 6
Статус:
:
Сообщений:
Регистрация:

Я пробовал давно. Это не работает
  Злобная реклама
Вторник, 27.09.2011, 18:56
Статус:
Сообщений: 666
Регистрация:
Российская Федерация  panzyuza
Вторник, 27.09.2011, 18:56 | Сообщение # 7
AVS LOCATION MOD
Статус:
Новичок:
Сообщений: 258
Награды: 1
Регистрация: 26.12.2010

мод конечно хорош.Ну без худа как-то тупо смотрится.Я его в своем моде модифицировал,что бы еще и худ был.Получилось неплохо.А ABC_MEDKIT лучше убрать. ним не работает.
  Злобная реклама
Вторник, 27.09.2011, 18:56
Статус:
Сообщений: 666
Регистрация: 26.12.2010
Российская Федерация  supei-sa
Вторник, 27.09.2011, 18:57 | Сообщение # 8
Статус:
Ветеран:
Сообщений: 4356
Награды: 6
Регистрация: 25.10.2010

Quote (panzyuza)
ним не работает.

У меня все работает жизни восстанавливаются медленно.Если надо идите в ЛС я вам покажу рабочую схему.
  Злобная реклама
Вторник, 27.09.2011, 18:57
Статус:
Сообщений: 666
Регистрация: 25.10.2010
Российская Федерация  panzyuza
Вторник, 27.09.2011, 19:05 | Сообщение # 9
AVS LOCATION MOD
Статус:
Новичок:
Сообщений: 258
Награды: 1
Регистрация: 26.12.2010

Хотя,если люди знакомы со скриптами,можно сделать простенький биндер для предметов,и через use_callback в данном биндере прописать,что будет происходить во время использования предмета.Так как биндер актора не резиновый.И просто потеря милисекунд.Просто если предметы будут иметь собственный биндер,то возможности значительно вырастают.Преимущество данного способа велики.Но не все модеры хорошо в скриптах разбираються.
Сообщение отредактировал panzyuza - Вторник, 27.09.2011, 19:10
  Злобная реклама
Вторник, 27.09.2011, 19:05
Статус:
Сообщений: 666
Регистрация: 26.12.2010
Российская Федерация  Darkscape
Вторник, 27.09.2011, 19:43 | Сообщение # 10
Статус:
Новичок:
Сообщений: 285
Награды: 1
Регистрация: 18.09.2011

Те кто "пробывал давно", скрипт уже исправлен, сделайте все еще раз заново, у меня все отлично
  Злобная реклама
Вторник, 27.09.2011, 19:43
Статус:
Сообщений: 666
Регистрация: 18.09.2011
Российская Федерация  supei-sa
Вторник, 27.09.2011, 19:46 | Сообщение # 11
Статус:
Ветеран:
Сообщений: 4356
Награды: 6
Регистрация: 25.10.2010

Quote (Darkscape)
у меня все отлично

Согласен.
  Злобная реклама
Вторник, 27.09.2011, 19:46
Статус:
Сообщений: 666
Регистрация: 25.10.2010
Российская Федерация  panzyuza
Вторник, 27.09.2011, 20:24 | Сообщение # 12
AVS LOCATION MOD
Статус:
Новичок:
Сообщений: 258
Награды: 1
Регистрация: 26.12.2010

Вот пример.Создаем скрипт bind_item.script и пишем следующее

А в секцию предмета вставляем
Code
script_binding      = bind_item.init

Таким образом наш предмет будет обрабатываться через данный биндер.
На практике не проверял,но тоеритически должно работать.И в use_callback() вставляем heal_regen.start(obj)
И в апдейт биндера heal_regen.weapontimer()
Но стоит учитывать,что все предметы,прописанные в скрипте heal_regen стоит апдейтить через данный биндер.
Сообщение отредактировал panzyuza - Вторник, 27.09.2011, 20:40
  Злобная реклама
Вторник, 27.09.2011, 20:24
Статус:
Сообщений: 666
Регистрация: 26.12.2010
Российская Федерация  RICK
Вторник, 11.10.2011, 09:15 | Сообщение # 13
Статус:
Опытный:
Сообщений: 1205
Награды: 4
Регистрация: 10.05.2011

;---------------
;
;---------------

наконецто я смог сделать работает но уменя баг какойто

уменя аптечка только 1 раз работает

второй раз жму использовать когда меня допустим снова ранили то аптечка неработает жизнь невостанавливает приходится

грузить сохранение и снова использовать

да ну лучше тога свой лучше скрипт попробывать написать

вырезать все это дело с едой и убором ствола

сделать что бы аптечки только лечили и все
  Злобная реклама
Вторник, 11.10.2011, 09:15
Статус:
Сообщений: 666
Регистрация: 10.05.2011
Молдова  6poHR777
Пятница, 10.02.2012, 19:45 | Сообщение # 14
Статус:
Опытный:
Сообщений: 1480
Награды: 0
Регистрация: 05.01.2012

А сейчас как, всё работает, багов нет?

Добавлено (10.02.2012, 19:45)
---------------------------------------------
У меня почему то снялось 50% жизни и моментально кинуло 60% радиации wacko

  Злобная реклама
Пятница, 10.02.2012, 19:45
Статус:
Сообщений: 666
Регистрация: 05.01.2012
Российская Федерация  RICK
Суббота, 11.02.2012, 17:19 | Сообщение # 15
Статус:
Опытный:
Сообщений: 1205
Награды: 4
Регистрация: 10.05.2011

да нефига че то неполучается вроде исправил первы раз жму востанавливает медлено здоровье но когда гг делают хит то здоровье продолжает самое востанавливатся а когда жму второй раз использовать то здоровье уже невостанавливается
  Злобная реклама
Суббота, 11.02.2012, 17:19
Статус:
Сообщений: 666
Регистрация: 10.05.2011
Форум » S.T.A.L.K.E.R. Модификации » Помощь в моддинге » Скрипты, конфиги, логика, движок » [SoC] Система постепенной регенерации жизни (Из Lurk mod и ABC)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: