SoC. Не бесконечные болты
Материал из S.T.A.L.K.E.R. Inside Wiki
Итак тут я опишу как реализовать болты которые будут заканчиваться. Сразу пишу о том, что будем делать основываясь на гранатах, то есть не исключено, что болт может рвануть (не нанеся урон и только через продолжительный участок времени, так что гг навряд ли будет по близости.), а также, если бросим болт под ноги НПСу, он шуганётся, как от грены (это на самом деле не плохо, если отключены глаза на затылке, можно попробовать их таким образом отвлечь).
Итак, приступим.
Нам потребуются такие файлы:
gamedata\config\weapons\w_rgd5.ltx
gamedata\config\weapons\w_bolt.ltx
gamedata\config\misc\items.ltx
gamedata\scripts\escape_dialog.script
gamedata\scripts\bind_stalker.script
В первую очередь лезем в файл w_bolt.ltx, там самая первая строка, которая за что-то отвечает:
[bolt]:identity_immunities
Меняем её вот так:
[old_bolt]:identity_immunities
Сохраняем и закрываем. Затем, открываем файл w_rgd5.ltx, спускаемся в самый низ и пишем это:
[bolt]:grenade_rgd5 visual = weapons\bolt\wpn_bolt.ogf inv_name = "Болт" inv_name_short = "Болт" inv_weight = 0.05 cost = 1 hud = bolt_hud2 ef_weapon_type = 1 description = "Обычный металлический болт" destroy_time = 5000000;3500 attach_position_offset = -0.021,-0.075,0.0 attach_angle_offset = 0,0,0 attach_bone_name = blast = 0 blast_r = 0 blast_impulse = 0 ;delete blast_impulse_factor = 1 frags = 0 frags_r = 0 frag_hit = 0 frag_hit_impulse = 0 ;звуки snd_explode = monsters\biting\def_0 ;rgd5_explode snd_checkout = monsters\biting\def_0 explode_particles = weapons\wg-hit-ground inv_grid_width = 1 inv_grid_height = 1 inv_grid_x = 22 inv_grid_y = 6 light_color = 0.0,0.0,0.0 light_range = 0.0 light_time = 0.0 [bolt_hud2] fire_point = 0.05, 0.0, 0.1 fire_bone = bolt_0 orientation = 0,0,0 position = 0,0,0 visual = weapons\bolt\wpn_bolt_hud.ogf throw_point = 0,0.4,0.3 throw_dir = 0,0,0 anim_show = draw3 anim_hide = holster_0 anim_idle = idle_0 anim_playing = idle_01 anim_throw_begin = attack_0_begin anim_throw_idle = attack_0_idle anim_throw_act = attack_0_act anim_throw_end = attack_0_end
Подробно:
[bolt]:grenade_rgd5 ;--секция с отсылкой на секцию grenade_rgd5 visual = weapons\bolt\wpn_bolt.ogf ;--визуал, в данном случае модель болта inv_name = "Болт" ;--название inv_name_short = "Болт" ;--название inv_weight = 0.05 ;вес cost = 1 ;цена за штуку hud = bolt_hud2 ;--ссылка на худ ef_weapon_type = 1 ;тип оружия (не менять ни в коем случае, можно сломать двигло) description = "Обычный металлический болт" ;--описание предмета destroy_time = 5000000;3500 ;лучше оставить как есть, а так это время через которое болт пропадёт attach_position_offset = -0.021,-0.075,0.0 attach_angle_offset = 0,0,0 attach_bone_name = blast = 0 ;мощность взрыва, так как это болт, пусть будет 0 blast_r = 0 ; радиус взрыва blast_impulse = 0 ;импульс от взрыва (отражается на дальности отлёта туши от места взрыва) ;delete blast_impulse_factor = 1 frags = 0 ;кол-во осколков frags_r = 0 ; радиус разлёта осколков frag_hit = 0 ; урон от 1 попавшего осколка frag_hit_impulse = 0 ; импульс от 1 попавшего осколка ;звуки snd_explode = monsters\biting\def_0 ;rgd5_explode звук взрыва snd_checkout = monsters\biting\def_0 ;звук броска explode_particles = weapons\wg-hit-ground ; партикл взрыва (в данном случае поставлен партикл ничего не показывающий) inv_grid_width = 1 inv_grid_height = 1 inv_grid_x = 22 inv_grid_y = 6 light_color = 0.0,0.0,0.0 ;цвет освещения во время взрыва по RGB light_range = 0.0 ;насыщенность на сколько я понимаю light_time = 0.0 ;время подсветки [bolt_hud2] ;секция худа fire_point = 0.05, 0.0, 0.1 fire_bone = bolt_0 orientation = 0,0,0 position = 0,0,0 visual = weapons\bolt\wpn_bolt_hud.ogf ;Визуал болта в руках гг throw_point = 0,0.4,0.3 throw_dir = 0,0,0 anim_show = draw3 anim_hide = holster_0 anim_idle = idle_0 anim_playing = idle_01 anim_throw_begin = attack_0_begin anim_throw_idle = attack_0_idle anim_throw_act = attack_0_act anim_throw_end = attack_0_end
Всё, сохраняем, закрываем. Этот файл нам больше не нужен. Теперь лезем в файл items.ltx и в конец пишем:
[bolt_box]:identity_immunities GroupControlSection = spawn_group discovery_dependency = $spawn = "food and drugs\kolbasa" ;$prefetch = 32 class = II_FOOD cform = skeleton visual = physics\box\box_metall_01.ogf radius = 1 ;script_binding = escape_dialog.use_snd inv_name = "Коробка болтов" inv_name_short = "Коробка болтов" description = "Коробка с болтами, содержит в себе 25 болтов." inv_weight = 1.35 can_trade = on inv_grid_width = 2 inv_grid_height = 1 inv_grid_x = 8 inv_grid_y = 18 cost = 30 ; eatable item eat_health = 0 eat_satiety = 0 eat_power = 0 eat_radiation = 0 wounds_heal_perc = 0 eat_portions_num = -1 ; food item slot = 4 animation_slot = 4 ;hud item hud = wpn_vodka_hud 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 // should be deleted after update bone_name = bip01_r_hand position_offset = 0.0,0.0,0.0 angle_offset = 1.570790,1.570790,3.92699
Сохраняем, закрываем. Дальше мы должны открыть файл escape_dialog.script В конец файла внесём свою функцию:
function use_bolt_box_oz(obj) if obj ~= nil then if obj:section() == "bolt_box" then for i = 1, 25 do --Совершаем спавн 25 раз alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end end end end
Подробно:
function use_bolt_box_oz(obj) --функция с названием use_bolt_box_oz(obj) if obj ~= nil then if obj:section() == "bolt_box" then -- объект который должны мы использовать (коробка болтов) for i = 1, 25 do --Совершаем спавн 25 раз alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавн болта в инвентарь гг end -- окончание цикла for i =... end --окончание if end --окончание if end --окончание функции
В этом же файле находим функцию give_weapon_to_actor и вносим такие строчки перед end:
dialogs.relocate_item_section(trader, "bolt_box", "in")
dialogs.relocate_item_section(trader, "bolt", "in")
В этом файле тоже всё. Теперь ломимся в bind_stalker.script Пишем в функцию function actor_binder:net_destroy() это:
self.object:set_callback(callback.use_object, nil)
И в функцию actor_binder:reinit() это:
self.object:set_callback(callback.use_object, self.use_object, self)
В конец файла добавляем нашу функцию:
function actor_binder:use_object(obj) escape_dialog.use_bolt_box_oz(obj) end
Подробно:
function actor_binder:use_object(obj) -- function название нашей функции escape_dialog.use_bolt_box_oz(obj) --вызов функции use_bolt_box_oz(obj) из файла escape_dialog.script end --окончание функции
Ну вот и всё, сохраняем и закрываем данный файл. Заходим в игру, и, если я нигде не ошибся, наблюдаем не бесконечный болт в начале игры. Чтобы болт был не один, идите к Волку, он даст вам ещё 1 болт и целую коробку болтов. Чтобы изъять болты из коробки, просто воспользуйтесь ей, кликните по ней 2 раза. Надеюсь, что статья оказалась вам полезна.
Автор: Dj Ultor