SoC. Не бесконечные болты — S.T.A.L.K.E.R. Inside Wiki

SoC. Не бесконечные болты

Материал из S.T.A.L.K.E.R. Inside Wiki

Версия от 20:27, 30 октября 2019; Dj Ultor (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Итак, тут я опишу как реализовать болты которые будут заканчиваться. Сразу пишу о том, что будем делать основываясь на гранатах, то есть не исключено, что болт может рвануть (не нанеся урон и только через продолжительный участок времени, так что гг навряд ли будет по близости.), а также, если бросим болт под ноги НПСу, он шуганётся, как от грены (это на самом деле не плохо, если отключены глаза на затылке, можно попробовать их таким образом отвлечь).

Итак, приступим.
Нам потребуются такие файлы:
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
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
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 ;цена за штуку
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_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 раза. Надеюсь, что статья оказалась вам полезна.

Автор

IGN

Sergey: Приношу свои извинения за испорченную станицу. На деюсь восстановил всё как было ранее. Отдельно приношу извинения IGN за доставленные неудобства.

Другие места
LANGUAGE