Перейти к контенту

Уроки по модостроению


Zeka1996Korneev

Рекомендуемые сообщения

(изменено)

Создание инвентарного комплекса в чистом ЗП

Перед тем, как начать урок, я хочу сказать, что скриптовой частью я обязан товарищу Ховану и Николаю Болтову. Именно благодаря их скриптам я нашел способ сделать подобную вещь! Огромное им спасибо!
А теперь перейдем к уроку.

Файлы, которые нам потребуются:
- configs/misc/items.ltx
- configs/text/rus/st_items_equipment.ltx
- scripts/_g.script
- scripts/bind_stalker.script
- scripts/my_callbacks.script

Возможно, вы когда-нибудь задумывались над вопросом создания предмета, из при использовании которого в инвентарь будут выпадать сразу несколько других, как, например, универсальный медкомплект. Долго думая, я понял, что такого эффекта можно достичь используя коллбеки на использовании предметов.
Что такое "коллбек"? Если коротко, - это что-то в роде скрипта инфопорции. Однако, коллбек может работать как единожды, так и постоянно: при подборе предметов, при их использовании, при выстреле, при попадению по нпс и так далее. Нас интересует коллбек использования предмета, который будет работать постоянно.

1. Откроем items.ltx и скопируем секцию какого-нибудь бустера. Вставим новую секцию где-нибудь в это-же файле.
2. Настроим его так, как нам этого захочется.
[medkit_complex]:booster
$spawn     = "food and drugs\medkit_complex"
visual    = dynamics\devices\dev_aptechka\dev_aptechka_mid.ogf
description   = st_medkit_complex_desc
inv_name   = st_medkit_complex
inv_name_short          = st_medkit_complex
inv_weight   = 1.8
inv_grid_width     = 2
inv_grid_height    = 2
inv_grid_x         = 10
inv_grid_y         = 27
cost    = 30000
attach_angle_offset  = 0.440521, 1.378287, -0.644026
attach_position_offset         = 0.104196, -0.010821, 0.076969
attach_bone_name  = bip01_r_hand
auto_attach   = false
bone_name   = bip01_r_hand
position_offset   = 0.0,0.0,0.0
angle_offset   = 1.570790,1.570790,3.92699
use_sound   = interface\inv_medkit
Долго здесь зацикливаться не будем. Все элементарно. Могу только сказать, что при использовании будет проигрываться звук аптечки, а модель взяли армейской аптечки.
3. В st_items_equipment.ltx создаем описание и название предмета
<string id="st_medkit_complex">
                     <text>Универсальный медкомплект</text>
                    </string>
                    <string id="st_medkit_complex_desc">
                     <text>Специальный медкомплект, разработанный для спецслужб в Зоне. Включает в себя все основные медикаменты.</text>
                    </string>
На этом с конфигами все.
4. Руководствуясь материалом, взятым из сборника модостроения от Хована, мы создаем файл my_callbacks.script в папке scripts.
5. Наполняем его следующим образом
function on_use_item(sect)
--Переменные
local actor=db.actor
local item_name=sect:section()
local actor_pos=db.actor:position()
local active_slot=db.actor:active_slot()
local active_item=db.actor:active_item()
local pistol_in_slot=db.actor:item_in_slot(2)
local rifle_in_slot=db.actor:item_in_slot(3)
local outfit_in_slot=db.actor:item_in_slot(7)
local helm_in_slot=db.actor:item_in_slot(12)
--Коллбеки
if item_name=="medkit_complex" then
give_object_to_actor("drug_anabiotic")
give_object_to_actor("antirad")
give_object_to_actor("bandage")
give_object_to_actor("drug_radioprotector")
give_object_to_actor("drug_antidot")
give_object_to_actor("drug_psy_blockade")
give_object_to_actor("drug_coagulant")
give_object_to_actor("drug_booster")
end
end
give_object_to_actor - как-раз и есть скрипт выдачи ГГ предмета, опираясь на коллбек. В скобках название предмета.
Вообщем, продолжаем так-же, и добавляем, что хотим. Надеюсь, принцип ясен.
6. Зарегистрируем наш файл в bind_stalker.script. Там находим функцию function actor_binder:use_inventory_item(obj) и под вторым end прописываем
if obj~=nil then
                       my_callbacks.on_use_item(obj)
                       end
В целом выглядит так:
function actor_binder:use_inventory_item(obj)
                    if(obj) then
                     local s_obj = alife():object(obj:id())
                     if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then
                      xr_effects.disable_ui_only(db.actor, nil)
                      level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")
                      level.add_pp_effector("surge_fade.ppe", 11, false)
                      give_info("anabiotic_in_process")
                      _G.mus_vol = get_console():get_float("snd_volume_music")
                      _G.amb_vol = get_console():get_float("snd_volume_eff")
                      get_console():execute("snd_volume_music 0")
                      get_console():execute("snd_volume_eff 0")
                     end
                    end
                    if obj~=nil then
                      my_callbacks.on_use_item(obj)
                       end
end
7. Осталось добавить глобальную функцию give_object_to_actor в _g.script.
Внизу пишем:
-- 'Создание предмета в рюкзаке ГГ.
function give_object_to_actor(obj,count)
                     if count==nil then count=1 end
                     for i=1, count do
                        alife():create(obj,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
                     end
end
На этом урок заканчивается. Осталось только прописать пак ГГ и протестировать!
 
 

Изменено пользователем FantomICW
  • Спасибо 2
  • Нравится 2

c57d8f0c86.png

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...