Описание:
Магазинное питание оружия v.1.0
--Обновлено до 1.1
--Пофикены
Лечение вылета по Can't open section 'секция_e_e'
Лечение вылета по kirag_take_drop.script:56: attempt to call field 'convert_addon'
--Установлен
Патч на вес и разрядку "стопки" оружия от 27.02.2011
---
--Правлены все вылеты по недостающи эффектам. VanoSanturi
gamedata\scripts\kirag_take_drop.script:129: attempt to call field 'vodka_effect' (a nil value)
В архиве 3 версии: для чистой игры ТЧ 1.0004 и для АМК 1.4.1 и Народная солянка 03.09.2010
-----
Установка:
Выбрать нужную версию (ТЧ 1.0004, АМК 1.4.1 или Народная солянка 03.09.2010), и поместить в папку с игрой.
Заряжаемые в слоте бинокля магазины в mp_ranks прописывать не нужно, при смерти с ними вылета быть не должно.
В папке bonus находится файл xrGame.dll для 4 патча (автор malandrinus) для предотвращения вылета из-за не прописанного в mp_ranks оружия. При желании поместить в папку bin, создание резервной копии xrGame.dll приветствуется. Установка этого файла необязательна.
В полной версии я не стал вырезать магазины для оружия, которого нет в оригинале - много кому они понадобятся. Магазины сделаны для того оружия, что есть в моей сборке, но не факт, что это все необходимые магазины на все случаи жизни.
Модели и текстуры магазинов выдраны из существующего оружия, по необходимости доработаны/переработаны и приведены к некому общему знаменателю.
Гаусс-пушка теперь тоже использует магазины, но, в отличие от обычных магазинов, магазины для Гаусса дозаряжать своими силами нельзя. Слишком специфичная у них конструкция, чтобы делать это в полевых условиях.
Реализована поддержка спидлодеров для револьвера. Разница с обычным магазином в том, что при зарядке оружия с помощью спидлодера пустой спидлодер выпадает в инвентарь сразу, а при разрядке оружия вместо спидлодера выпадают обычные патроны.
При покупке револьвера или получения его в диалоге один пустой спидлодер дается автоматически.
Теоретически, можно многократно покупать и продавать револьвер (да и любое оружие с магазинным питанием, только его надо будет разряжать) и собирать халявные спидлодеры (магазины). На деле, при правильно настроенной торговле, это должно быть крайне невыгодно по сравнению с покупкой оружия и магазинов к нему.
Для всего оружия, где это имеет смысл (автоматы в основном, разъемы магазинов у них стандартные), прописаны разные емкости магазинов. Дисковые магазины (хоть их и нет в оригинале) не ставятся на оружие со схемой буллпап. В теории вфоткнутся, но на практике будут мешать целиться.
Все пустые магазины (с окончанием "_е") автоматически получают condition = 0. Все магазины, которые при первоначальном спавне оказались не у актора - condition = 0,995 = полный магазин. Все магазины, которые спавнятся в инвентаре актора, имеют condition = 1, и рассматриваются как "один патрон, извлеченный из оружия при разрядке", поэтому они сразу преобразуются в обычные магазины с condition <= 0,995. Поэтому если просто заспавнить магазин в инвентарь актору, в нем окажется всего один патрон.
Чтобы все-таки выдать актору полный магазин, нужно пользоваться функцией ammo_manager.give_loaded(секция_магазина).
Выдавать таким образом секцию пустого магазина с окончанием "_е" нет смысла, полным он не станет, и в магазин с одним патроном не преобразуется, так и останется пустым. Тут достаточно обычного спавна.
Все оружие, получаемое актором в диалогах или при торговле, становится полностью заряженным. Количество патронов в оружии, подбираемом с трупов, определяется death_manager-ом. Все остальное оружие на магазинном питании - изначально лежащее на земле или в тайниках - заряжено только одним патроном.
Добавление новых магазинов, а также что и зачем:
Допустим, надо добвить магазин 5,45х39 на 60 патронов. Редкий, но существующий.
Находим уже существующий магазин, например, на 30
Магазин на 30 патронов 5,45х39
[wm_5.45x39a30]:wm
ammo_mag_size = 30
ammo_class = ammo_5.45x39_fmj, ammo_5.45x39_ap
charged0 = mag_30_5.45x39_fmj
charged1 = mag_30_5.45x39_ap
inv_weight = 0.203
visual = weapons\magazines\mag_30_545x39.ogf
hud = mag_30_545x39_hud
[wm_5.45x39b30]:wm
ammo_mag_size = 30
ammo_class = ammo_5.45x39_ap, ammo_5.45x39_fmj
charged0 = mag_30_5.45x39_ap
charged1 = mag_30_5.45x39_fmj
inv_weight = 0.203
visual = weapons\magazines\mag_30_545x39.ogf
hud = mag_30_545x39_hud
[mag_30_545x39_hud]:wm_hud
visual = weapons\magazines\mag_30_545x39_hud.ogf
[mag_30_5.45x39_fmj]:ammo_5.45x39_fmj
box_size = 1
mag_size = 30
script_binding = ammo_manager.init
wm_section = wm_5.45x39a30
inv_name = mag_30_5.45x39
description = desc_load_5.45x39_fmj
inv_name_short = mag_30_5.45x39_fmj_s
inv_weight = 0.0105
belt = true
inv_grid_width = 1
inv_grid_height = 1
inv_grid_x = 38
inv_grid_y = 2
visual = weapons\magazines\mag_30_545x39.ogf
cost = 120
[mag_30_5.45x39_ap]:ammo_5.45x39_ap
box_size = 1
mag_size = 30
script_binding = ammo_manager.init
wm_section = wm_5.45x39b30
inv_name = mag_30_5.45x39
description = desc_load_5.45x39_ap
inv_name_short = mag_30_5.45x39_ap_s
inv_weight = 0.0105
belt = true
inv_grid_width = 1
inv_grid_height = 1
inv_grid_x = 38
inv_grid_y = 2
visual = weapons\magazines\mag_30_545x39.ogf
cost = 120
[mag_30_5.45x39_fmj_e]:mag_30_5.45x39_fmj
description = desc_mag_e
inv_weight = 0.203
[mag_30_5.45x39_ap_e]:mag_30_5.45x39_ap
description = desc_mag_e
inv_weight = 0.203
Здесь видим три пары секций: заряжаемый магазин, заряженный магазин (от 1 патрона до максимума, неважно), пустой магазин - три основных типа * два типа боеприпасов в калибре 5,45х39.
Первые две секции - заряжаемые в слоте бинокля магазины. Файл ammo\magazines.ltx
Что и зачем:
Название секции:
wm_ - обязательная часть
5.45x39 - калибр
a,b,c... и т.д. - вариант - уникальная для этого калибра и емкости буква. Могут различаться по типу патрона/виду (для 5,56, например, лента или C-mag, оба на 100 патронов и одного калибра, буква - единственное различие)
30 - емкость магазина
Наследование - от основной секции [wm] либо от ее вариаций с разными визуалами (будут в полной версии, бОльшая часть уже сделана).
Параметры:
ammo_mag_size = 30 - емкость магазина
ammo_class = ammo_5.45x39_fmj, ammo_5.45x39_ap - Типы патронов и порядок их заряжания
charged0 = магазин, который можно зарядить в оружие, заряженный первым патроном из списка ammo_class
charged1 = магазин, который можно зарядить в оружие, заряженный вторым патроном из списка ammo_class
...
chargedN = магазин, который можно зарядить в оружие, заряженный N-м патроном из списка ammo_class. N = количеству типов БП в ammo_class
inv_weight = 0.203 - вес ПУСТОГО магазина
visual = weapons\magazines\mag_30_545x39.ogf - визуал
hud = mag_30_545x39_hud - секция ХУД-а
Дополнительный параметр:
tri_state_reload = off - добавляем его, если магазин должен заряжаться как одно целое, а не по одному патрону. Единственно, где используется - спидлодер револьвера. Как вариант - обойма для Мосинки и иже с ней. В общем, там, где все патроны видны, а частично заряженная обойма/спидлодер не имеет особого смысла.
Секция ХУД-а:
[mag_30_545x39_hud]:wm_hud
visual = weapons\magazines\mag_30_545x39_hud.ogf - визуал ХУД-а
Для добавления магазина новой емкости копируем и правим название секции, ammo_mag_size, и все chargedN соответственно нужной емкости магазина. Выставляем вес и (в идеале) модель
Вторые две секции - магазины, которые можно зарядить в оружие. Файл ammo\<�калибр>.ltx
Названия их секций как раз и определяются в параметрах chargedN в первой паре секций. Наследование - от соответствующих патронов.
Что и зачем
Название секции:
Название должно начинаться с "clip_", "mag_" или "belt_" - обойма, магазин или лента. Фактически, разницы нет, просто, чтоб сами понимали, что это. Но обязательно одно из этих трех, на них реагирует скрипт.
Итак, для примера mag_30_5.45x39_fmj
mag_ - начало названия
30_ - емкость. Для того, чтоб сами понимали.
5.45x39_fmj - тип заряженных патронов, без префикса "ammo_" - по большому счету, тоже для справки.
Параметры:
script_binding = ammo_manager.init - всегда так.
belt = true - фактически, можно ли дозаряжать этот магазин, true/false. Магазин для Гаусса незаряжаемый, у него этот параметр false.
box_size = 1 - всегда равно 1, магазин рассматривается как единое целое
mag_size = 30 - фактическая емкость магазина
wm_section = wm_5.45x39a30 - секция заряжаемого магазина (см. первую пару) - по умолчанию (до)заряжаются те патроны, которые были заряжены в магазин ранее.
inv_name = mag_30_5.45x39 - описание магазина. Одно на емкость магазина, независимо от типа боеприпаса. "Магазин на 30 патронов калибра 5,45х39 мм"
description = desc_load_5.45x39_fmj - Чем заряжен. Одно на тип боеприпаса, независимо от емкости магазина. "Снаряжение: 5,45х39 мм 7Н10"
inv_name_short = mag_30_5.45x39_fmj_s - То, что будет на ХУД в игре. "30 х 5,45х39 7Н10"
inv_grid_width = 1 - Параметры иконки. 1х1
inv_grid_height = 1 - (чтоб без проблем лезла на пояс)
inv_grid_x = 38 - дальше все понятно
inv_grid_y = 2
visual = weapons\magazines\mag_30_545x39.ogf - визуал
!!! Особо подчеркну: !!!
cost = 120 - цена ПУСТОГО!!! магазина
inv_weight = 0.0105 - вес ОДНОГО ПАТРОНА (а не полностью заряженного магазина!) Должен быть строго равен весу_пачки/к-во_патронов_в_пачке. Одно значение если не на весь данный калибр, то на тип БП точно. В инвентаре покажет этот вес, издержки движка - общий вес подсчитается правильно.
Дополнительный параметр:
speedloader = true - добавляем его, если магазин должен обрабатываться как спидлодер (возвращаться пустым в инвентарь сразу же после зарядки оружия), а не как нормальный магазин (возвращаться после разрядки, сколько патронов осталось - столько осталось). Единственно, где используется - спидлодер револьвера. Как вариант - обойма для Мосинки и иже с ней.
Для добавления магазина новой емкости копируем и правим название секции, mag_size, wm_section, ну и всякие описания.
Ну и последняя пара - пустые магазины. Здесь все просто. К названию секции заряженного магазина (см. вторую пару) приписывается в конце "_e", наследование - от секции заряженного магазина:
[mag_30_5.45x39_fmj_e]:mag_30_5.45x39_fmj
description = desc_mag_e - чем заряжено. "Снаряжение: Пустой". Вообще глобальное для магазинов, лент и обойм. Главное, чтоб падежи совпадали.
inv_weight = 0.203 - вес пустого магазина. Здесь все правильно и очевидно, в отличие от заряженных.
Нужно единственно для того, чтобы не пытался зарядить пустой магазин.
Чтобы оружие могло использовать новые магазины, достаточно дописать их через запятую в параметре ammo_class в конфиге оружия.
Параметр ammo_mag_size в оружии, использующем магазинное питание, должен быть равен 1. Было бы странно, если б в автомат вставлялось несколько магазинов за один раз
По большому счету, ничего сложного.
С добавлением нового типа патронов возни побольше, но тоже ничего сложного - в первой паре секций в ammo_class добавится новый тип патронов, соответственно, заряжаемых магазинов, заряженных и пустых станет не по два, а по три. Пример с тремя типами патронов - калибры 9х39 и 7,62х54R
При добавлении нового калибра действуем по той же схеме с нуля.
В скриптах под новые магазины ничего править не нужно.
Настройка торговли:
В этом релизе магазины в торговлю не добавлены - сколько сборок, столько и видений баланса, столько и вариантов торговли. Дам только общие рекомендации по коэффициентам.
Номинальная цена - цена пустого магазина. Соответственно, пустой он и есть пустой, без учета типа БП.
Для магазинов, как заряженных, так и пустых, коэффициент покупки можно оставить 1. Пустые магазины с condition = 0 торговцы будут покупать за жалкие гроши, полные (condition = 0,995) - чуть дешевле номинала.
С коэффициентом продажи сложнее.
Для пустых магазинов рекомендую поставить коэффициент около 6 - это даст цену продажи пустого магазина чуть дороже номинала (с учетом того, что condition пустого магазина нулевой).
Для заряженных магазинов коэффициент продажи можно поставить хорошо за 10. Может, 15-20, в зависимости от типа БП. Сюда пойдет и цена магазина, и цена патронов в нем, и работа по набивке. Ну, и налоги на жадность торговца и на пользование аномалиями и радиацией
Если деньги девать некуда - можно купить уже заряженный магазин, но куда дешевле, хоть и дольше - купить пустой, патроны в пачке, и зарядить вручную.
Для запуска на Народной солянке 03.09.10 патч 1.0005-1.0006 нужно заменить xr_motivator.script