Отже, тут я опишу як продати болти які будуть закінчуватися. Відразу пишу про те, що робитимемо ґрунтуючись на гранатах, тобто не виключено, що болт може рвонути (не завдавши шкоди і тільки через тривалу ділянку часу, так що рр навряд чи буде по близькості.), а також, якщо кинемо болт під ноги НПСу, він шуганеться, як від гріни (це насправді непогано, якщо відключені очі на потилиці, можна спробувати їх таким чином відволікти).
Отже, почнемо.
Нам будуть потрібні такі файли:
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_stal.
В першу чергу ліземо у файл 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 slot = 5 hud = bolt_hud2 ef_weapon_type = 00000 ; 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_ _ _
Детально:
[ bolt ] :grenade_rgd5 ;--секція з посиланням на секцію grenade_rgd5 visual = weapons\bolt\wpn_bolt.ogf ; --візуал, в даному випадку модель болта inv_name = "Болт " ; --назва inv_name_sh назва болта лежачого землі inv_weight = 0.05 ;вага cost = 1 ;ціна за штуку slot = 5 ;--слот для болта 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_ _ _
Все, зберігаємо, закриваємо. Цей файл нам більше не потрібний. Тепер ліземо у файл 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 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 = bip0 _ _ _ // 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 -- закінчення функції
Ну ось і все, зберігаємо та закриваємо даний файл. Заходимо в гру, і якщо я ніде не помилився, спостерігаємо не нескінченний болт на початку гри. Щоб болт був не один, йдіть до Вовка, він дасть вам ще один болт і цілу коробку болтів. Щоб вилучити болти з коробки, просто скористайтеся ним, клацніть по ній 2 рази. Сподіваюся, що стаття виявилася вам корисною.