Merge branch 'master' into map-use-slotitemevent

This commit is contained in:
johnb432
2024-06-14 20:44:13 +02:00
397 changed files with 6772 additions and 2802 deletions

View File

@ -28,7 +28,7 @@ exclude = [
"zeus/functions/fnc_zeusAttributes.sqf",
]
[hemtt.launch]
[hemtt.launch.default]
workshop = [
"450814997", # CBA_A3
]

View File

@ -10,16 +10,6 @@ if (!hasInterface) exitWith {};
// Temporary Wind Info indication
GVAR(tempWindInfo) = false;
// Ammo/Magazines look-up hash for correctness of initSpeed
GVAR(ammoMagLookup) = call CBA_fnc_createNamespace;
{
{
private _ammo = getText (configFile >> "CfgMagazines" >> _x >> "ammo");
if (_ammo != "") then { GVAR(ammoMagLookup) setVariable [_ammo, _x]; };
} forEach (getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines"));
} forEach getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles");
// Add keybinds
["ACE3 Weapons", QGVAR(prepare), localize LSTRING(Prepare), {
// Condition

View File

@ -1,3 +1,21 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"
// Ammo/Magazines look-up hash for correctness of initSpeed
private _cfgMagazines = configFile >> "CfgMagazines";
private _cfgAmmo = configFile >> "CfgAmmo";
private _cfgThrow = configFile >> "CfgWeapons" >> "Throw";
private _ammoMagLookup = createHashMap;
{
{
private _ammo = getText (_cfgMagazines >> _x >> "ammo");
if (_ammo != "") then {
_ammoMagLookup set [configName (_cfgAmmo >> _ammo), _x];
};
} forEach (getArray (_cfgThrow >> _x >> "magazines"));
} forEach (getArray (_cfgThrow >> "muzzles"));
uiNamespace setVariable [QGVAR(ammoMagLookup), compileFinal _ammoMagLookup];

View File

@ -43,13 +43,10 @@ if ((!_primed) && {!((_throwableMag in (uniformItems ACE_player)) || {_throwable
// Get correct throw power for primed grenade
if (_primed) then {
private _ammoType = typeOf _activeThrowable;
_throwableMag = GVAR(ammoMagLookup) getVariable _ammoType;
if (isNil "_throwableMag") then {
// What we're trying to throw must not be a normal throwable because it is not in our lookup hash (e.g. 40mm smoke)
// Just use HandGrenade as it has an average initSpeed value
_throwableMag = "HandGrenade";
};
// If ammo type is not found:
// What we're trying to throw must not be a normal throwable because it is not in our lookup hash (e.g. 40mm smoke)
// Just use HandGrenade as it has an average initSpeed value
_throwableMag = (uiNamespace getVariable QGVAR(ammoMagLookup)) getOrDefault [typeOf _activeThrowable, "HandGrenade"];
};
// Some throwables have different classname for magazine and ammo

View File

@ -18,15 +18,6 @@
params ["_unit"];
TRACE_1("params",_unit);
// Temporarily enable wind info, to aid in throwing smoke grenades effectively
if (
GVAR(enableTempWindInfo) &&
{!(missionNamespace getVariable [QEGVAR(weather,WindInfo), false])}
) then {
[] call EFUNC(weather,displayWindInfo);
GVAR(tempWindInfo) = true;
};
// Select next throwable if one already in hand
if (_unit getVariable [QGVAR(inHand), false]) exitWith {
TRACE_1("inHand",_unit);
@ -44,6 +35,11 @@ if (isNull (_unit getVariable [QGVAR(activeThrowable), objNull]) && {(currentThr
TRACE_1("no throwables",_unit);
};
// Temporarily enable wind info, to aid in throwing smoke grenades effectively
if (GVAR(enableTempWindInfo) && {!(missionNamespace getVariable [QEGVAR(weather,WindInfo), false])}) then {
[] call EFUNC(weather,displayWindInfo);
GVAR(tempWindInfo) = true;
};
_unit setVariable [QGVAR(inHand), true];

View File

@ -193,6 +193,7 @@
<Korean>바람 정보 임시로 표시</Korean>
<French>Afficher temporairement les informations sur le vent</French>
<Russian>Временно показать информацию о ветре</Russian>
<Spanish>Mostrar información del viento temporalmente</Spanish>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_EnableTempWindInfo_Description">
<English>Temporarily display Wind Info while throwing, to aid in placing smoke grenades effectively.</English>
@ -202,6 +203,7 @@
<Korean>연막탄을 효과적으로 배치하는 데 도움이 되도록 투척하는 동안 일시적으로 바람 정보를 표시합니다.</Korean>
<French>Affiche les informations sur le vent pendant le lancement pour placer les grenades fumigènes plus efficacement.</French>
<Russian>Временно отображайте информацию о ветре во время броска, чтобы помочь эффективно разместить дымовые шашки.</Russian>
<Spanish>Mostrar información del viento temporalmente mientras se lanza, para ayudar a lanzar las granadas de humo de forma efectiva.</Spanish>
</Key>
<Key ID="STR_ACE_Advanced_Throwing_Prepare">
<English>Prepare/Change Throwable</English>

View File

@ -91,6 +91,7 @@
<Portuguese>Equipar NVGs automaticamente</Portuguese>
<Japanese>暗視装置の自動装備</Japanese>
<Russian>Автоматическое оснащение ПНВ</Russian>
<Spanish>Auto equipar gafas de visión nocturna</Spanish>
</Key>
<Key ID="STR_ACE_AI_AssignNVG_Description">
<English>Equips NVG in inventory during night time and unequips it during day time.\nDoes not add NVGs to inventory!</English>
@ -102,6 +103,7 @@
<Portuguese>Equipa o NVG do inventário durante a noite e desequipa durante o dia.\nNão adiciona NVGs ao inventário!</Portuguese>
<Japanese>インベントリ内の暗視装置を夜間に装備し、日中は解除し収納します。\nこれはNVGをインベントリに追加しません。</Japanese>
<Russian>Экипирует ПНВ в ночное время и отключает его в дневное время.\nНе добавляет ПНВ в инвентарь!</Russian>
<Spanish>Equipa las gafas de visión nocturna en el inventario cuando es de noche, y las desequipa cuando es de día.\nNo añade las gafas al inventario!</Spanish>
</Key>
</Package>
</Project>

View File

@ -18,7 +18,7 @@
(_this select 1) params ["", "_exitCode"];
[QGVAR(displayClosed), []] call CBA_fnc_localEvent;
removeMissionEventHandler ["draw3D", GVAR(camPosUpdateHandle)];
removeMissionEventHandler ["Draw3D", GVAR(camPosUpdateHandle)];
if (is3DEN) then {
private _centerOriginParent = objectParent GVAR(centerOrigin);

View File

@ -278,4 +278,4 @@ showCinemaBorder false;
//--------------- Reset camera pos
[nil, [controlNull, 0, 0]] call FUNC(handleMouse);
GVAR(camPosUpdateHandle) = addMissionEventHandler ["draw3D", {call FUNC(updateCamPos)}];
GVAR(camPosUpdateHandle) = addMissionEventHandler ["Draw3D", {call FUNC(updateCamPos)}];

View File

@ -382,6 +382,9 @@ switch (GVAR(currentLeftPanel)) do {
};
GVAR(currentItems) set [IDX_CURR_VEST, _item];
[GVAR(center), ""] call BIS_fnc_setUnitInsignia;
[GVAR(center), GVAR(currentInsignia)] call BIS_fnc_setUnitInsignia;
};
TOGGLE_RIGHT_PANEL_CONTAINER
@ -420,6 +423,9 @@ switch (GVAR(currentLeftPanel)) do {
};
GVAR(currentItems) set [IDX_CURR_BACKPACK, _item];
[GVAR(center), ""] call BIS_fnc_setUnitInsignia;
[GVAR(center), GVAR(currentInsignia)] call BIS_fnc_setUnitInsignia;
};
TOGGLE_RIGHT_PANEL_CONTAINER

View File

@ -69,7 +69,14 @@ switch (_currentItemsIndex) do {
// Secondary weapon
case IDX_CURR_SECONDARY_WEAPON_ITEMS: {
private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select _itemIndex;
private _isDisposable = CBA_disposable_replaceDisposableLauncher && {!isNil {CBA_disposable_loadedLaunchers getVariable (secondaryWeapon GVAR(center))}};
private _isDisposable = CBA_disposable_replaceDisposableLauncher && {!isNil "CBA_disposable_loadedLaunchers"} &&
{
if (CBA_disposable_loadedLaunchers isEqualType createHashMap) then { // after CBA 3.18
(secondaryWeapon GVAR(center)) in CBA_disposable_loadedLaunchers
} else {
!isNil {CBA_disposable_loadedLaunchers getVariable (secondaryWeapon player)}
}
};
// If removal
if (_item == "") then {

View File

@ -63,7 +63,7 @@ _target switchMove "amovpercmstpslowwrfldnon";
_target setVariable ["origin", _position];
// When killed, respawn AI
_target addEventHandler ["killed", {
_target addEventHandler ["Killed", {
params ["_target"];
// Killed may fire twice, 2nd will be null - https://github.com/acemod/ACE3/pull/7561

View File

@ -1245,6 +1245,8 @@
<Russian>Интегрирован тепловизор.</Russian>
<Korean>열화상 내장</Korean>
<French>Thermique intégrée</French>
<German>Thermal integriert</German>
<Spanish>Térmica integrada</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_intPrimTi">
<English>Thermal &amp; Primary integrated</English>
@ -1253,6 +1255,8 @@
<Russian>Интегрирован тепловизор и осн.прицел.</Russian>
<Korean>열화상과 주무기 내장</Korean>
<French>Thermique et primaire intégrés</French>
<German>Thermal und in Primärwaffe integriert</German>
<Spanish>Térmica y Primaria integrada</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_statVisionMode_NoSup">
<English>Not Supported</English>
@ -1609,6 +1613,7 @@
<French>Décroissant</French>
<Portuguese>Decrescente</Portuguese>
<Russian>Нисходящий</Russian>
<Spanish>Descendiente</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_sortAscending">
<English>Ascending</English>
@ -1620,6 +1625,7 @@
<French>Croissant</French>
<Portuguese>Crescente</Portuguese>
<Russian>Восходящий</Russian>
<Spanish>Ascendiente</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_toolsTab">
<English>Tools</English>
@ -1647,6 +1653,7 @@
<French>Nombre de munitions</French>
<Portuguese>Quantidade de munição</Portuguese>
<Russian>Количество боеприпасов</Russian>
<Spanish>Cantidad de munición</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_statIlluminators">
<English>Illuminators</English>
@ -1657,6 +1664,7 @@
<Portuguese>Iluminadores</Portuguese>
<Japanese>イルミネーター</Japanese>
<Russian>Осветители</Russian>
<Spanish>Iluminadores</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_defaultToFavoritesSetting">
<English>Default to Favorites</English>
@ -1668,6 +1676,7 @@
<French>Favoris par défaut</French>
<Portuguese>Favoritos por padrão</Portuguese>
<Russian>По умолчанию - Избранное</Russian>
<Spanish>Favoritos por defecto</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_defaultToFavoritesTooltip">
<English>Controls whether the ACE Arsenal defaults to showing all items or favorites.</English>
@ -1679,6 +1688,7 @@
<French>Contrôle si l'arsenal ACE affiche par défaut tous les éléments ou les favoris.</French>
<Portuguese>Controla se o Arsenal ACE exibe por padrão todos os itens ou favoritos.</Portuguese>
<Russian>Определяет, будет ли в арсенале ACE по умолчанию отображаться все предметы или избранное.</Russian>
<Spanish>Controla si el Arsenal de ACE muestra por defecto todos los objetos o sólo los favoritos</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_favoritesColorSetting">
<English>Favorites Color</English>
@ -1690,6 +1700,7 @@
<French>Couleurs favorites</French>
<Portuguese>Cor dos favoritos</Portuguese>
<Russian>Избранный цвет</Russian>
<Spanish>Color de Favoritos</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_favoritesColorTooltip">
<English>Highlight color for favorited items.</English>
@ -1701,6 +1712,7 @@
<French>Met en surbrillance les éléments favoris.</French>
<Portuguese>Cor de destaque para itens favoritados.</Portuguese>
<Russian>Выделите цветом любимые предметы.</Russian>
<Spanish>Color de marcado para los objetos favoritos</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_buttonFavoritesTooltip">
<English>Switch between displaying all items or your favorites.\nDouble click while holding Shift to add or remove an item.</English>
@ -1712,6 +1724,7 @@
<French>Change entre l'affichage de tous les éléments ou de vos favoris.\nDouble-cliquez en maintenant la touche Maj enfoncée pour ajouter ou supprimer un élément.</French>
<Portuguese>Alterna entre a exibição de todos os itens ou seus favoritos.\nClique duas vezes enquanto mantém pressionada a tecla Shift para adicionar ou remover um item.</Portuguese>
<Russian>Переключайтесь между отображением всех элементов или ваших избранных.\nДважды щелкните, удерживая Shift, чтобы добавить или удалить элемент.</Russian>
<Spanish>Alterna entre mostrar todos los objetos o sólo los favoritos.\nDoble click mientras se pulsa Shift para añadir o quitar un objeto.</Spanish>
</Key>
<Key ID="STR_ACE_Arsenal_buttonSearchTooltip">
<English>Search\nCTRL + Click to enable live results</English>
@ -1721,6 +1734,7 @@
<Korean>검색\nCtrl + 클릭으로 실시간 검색 결과를 활성화</Korean>
<Russian>Поиск\nCtrl + Click для включения результатов в реальном времени</Russian>
<French>Recherche\nCTRL + clic pour modifier les résultats tout en écrivant</French>
<Spanish>Buscar\nCTRL + Click habilita los objetos en directo</Spanish>
</Key>
</Package>
</Project>

View File

@ -15,7 +15,5 @@ private _categoryName = [format ["ACE %1", localize "str_a3_cfgmarkers_nato_art"
[LSTRING(disableArtilleryComputer_displayName), LSTRING(disableArtilleryComputer_description)],
_categoryName,
false, // default value
true, // isGlobal
{[QGVAR(disableArtilleryComputer), _this] call EFUNC(common,cbaSettings_settingChanged)},
false // Needs mission restart
true // isGlobal
] call CBA_fnc_addSetting;

View File

@ -3540,6 +3540,7 @@
<French>Utilisation de l'IA</French>
<Portuguese>Utilização por IA</Portuguese>
<Russian>Использование ИИ</Russian>
<Spanish>Uso de la IA</Spanish>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_illumination">
<English>Illum</English>
@ -3551,6 +3552,7 @@
<French>Fusées éclairantes</French>
<Portuguese>Sinalizadoras</Portuguese>
<Russian>Осветители</Russian>
<Spanish>Iluminación</Spanish>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_concealment">
<English>Smoke</English>
@ -3562,6 +3564,7 @@
<French>Fumigènes</French>
<Portuguese>Fumígenas</Portuguese>
<Russian>Дым</Russian>
<Spanish>Humo</Spanish>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_infantry">
<English>Inf</English>
@ -3573,6 +3576,7 @@
<French>Infanterie</French>
<Portuguese>Infantaria</Portuguese>
<Russian>Пехота</Russian>
<Spanish>Infantería</Spanish>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_lightVehicle">
<English>Veh</English>
@ -3584,6 +3588,7 @@
<French>Véhicule</French>
<Portuguese>Veículo</Portuguese>
<Russian>Техника</Russian>
<Spanish>Vehículo</Spanish>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_armor">
<English>Armor</English>
@ -3595,6 +3600,7 @@
<French>Blindage</French>
<Portuguese>Blindagem</Portuguese>
<Russian>Бронетехника</Russian>
<Spanish>Blindados</Spanish>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_aircraft">
<English>Air</English>
@ -3606,6 +3612,7 @@
<French>Aviation</French>
<Portuguese>Aeronaves</Portuguese>
<Russian>Авиация</Russian>
<Spanish>Aeronaves</Spanish>
</Key>
</Package>
</Project>

View File

@ -24,7 +24,7 @@ if (isServer) then {
}];
};
["unit", FUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler;
["unit", LINKFUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler;
[QGVAR(moveInCaptive), LINKFUNC(vehicleCaptiveMoveIn)] call CBA_fnc_addEventHandler;
[QGVAR(moveOutCaptive), LINKFUNC(vehicleCaptiveMoveOut)] call CBA_fnc_addEventHandler;

View File

@ -146,6 +146,7 @@
<Korean>포로 눈 가리기</Korean>
<Japanese>目隠しをする</Japanese>
<Russian>Завязать глаза пленному</Russian>
<Spanish>Vendar ojos al prisionero</Spanish>
</Key>
<Key ID="STR_ACE_Captives_RemoveBlindfoldCaptive">
<English>Remove blindfold</English>
@ -156,6 +157,7 @@
<Korean>눈가리개 풀기</Korean>
<Japanese>目隠しを外す</Japanese>
<Russian>Снять повязку с глаз</Russian>
<Spanish>Quitar vendas de los ojos</Spanish>
</Key>
<Key ID="STR_ACE_Captives_CableTie">
<English>Cable Tie</English>

View File

@ -48,15 +48,7 @@ class CfgVehicles {
class Car: LandVehicle {
GVAR(space) = 4;
GVAR(hasCargo) = 1;
class ACE_Cargo {
/*
class Cargo {
class ACE_medicalSupplyCrate {
type = "ACE_medicalSupplyCrate";
amount = 1;
};
};*/
};
class ADDON {};
};
class Tank: LandVehicle {
@ -75,7 +67,7 @@ class CfgVehicles {
GVAR(hasCargo) = 1;
};
// HEMTTs - Default at 10, some variants are altered based on model size and/or expected level of free space inside.
// HEMTTs - Default at 30, some variants are altered based on model size and/or expected level of free space inside.
class Truck_01_base_F: Truck_F {
GVAR(space) = 30;
};
@ -510,7 +502,7 @@ class CfgVehicles {
};
GVAR(space) = 2;
GVAR(hasCargo) = 2;
GVAR(hasCargo) = 1;
GVAR(size) = 3;
GVAR(canLoad) = 1;
@ -523,8 +515,9 @@ class CfgVehicles {
class EventHandlers {
class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};
};
GVAR(space) = 3;
GVAR(hasCargo) = 3;
GVAR(hasCargo) = 1;
GVAR(size) = 3;
GVAR(canLoad) = 1;

View File

@ -86,7 +86,7 @@ GVAR(vehicleAction) = [
GVAR(enable) &&
{alive _target} &&
{locked _target < 2} &&
{(_target getVariable [QGVAR(hasCargo), getNumber (configOf _target >> QGVAR(hasCargo)) == 1])} &&
{_target getVariable [QGVAR(hasCargo), getNumber (configOf _target >> QGVAR(hasCargo)) == 1]} &&
{[_player, _target, ["isNotSwimming"]] call EFUNC(common,canInteractWith)} &&
{[_player, _target] call EFUNC(interaction,canInteractWithVehicleCrew)} &&
{([_player, _target] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}

View File

@ -7,9 +7,10 @@
* 0: Item to be loaded <STRING> or <OBJECT>
* 1: Holder object (vehicle) <OBJECT>
* 2: Amount <NUMBER> (default: 1)
* 3: Ignore interaction distance and stability checks <BOOL> (default: false)
*
* Return Value:
* None
* Objects loaded <NUMBER>
*
* Example:
* ["ACE_Wheel", cursorObject] call ace_cargo_fnc_addCargoItem
@ -17,21 +18,29 @@
* Public: No
*/
params ["_item", "_vehicle", ["_amount", 1]];
TRACE_3("params",_item,_vehicle,_amount);
params ["_item", "_vehicle", ["_amount", 1], ["_ignoreInteraction", false]];
TRACE_4("params",_item,_vehicle,_amount,_ignoreInteraction);
private _loaded = 0;
// Get config sensitive case name
if (_item isEqualType "") then {
_item = _item call EFUNC(common,getConfigName);
for "_i" from 1 to _amount do {
[_item, _vehicle] call FUNC(loadItem);
if !([_item, _vehicle, _ignoreInteraction] call FUNC(loadItem)) exitWith {};
_loaded = _loaded + 1;
};
} else {
[_item, _vehicle] call FUNC(loadItem);
_loaded = parseNumber ([_item, _vehicle, _ignoreInteraction] call FUNC(loadItem));
_item = typeOf _item;
};
TRACE_1("loaded",_loaded);
// Invoke listenable event
["ace_cargoAdded", [_item, _vehicle, _amount]] call CBA_fnc_globalEvent;
["ace_cargoAdded", [_item, _vehicle, _loaded]] call CBA_fnc_globalEvent;
_loaded // return

View File

@ -23,7 +23,7 @@ private _config = configOf _vehicle;
// If vehicle had space given to it via eden/public, then override config hasCargo setting
private _hasCargoPublic = _vehicle getVariable QGVAR(hasCargo);
private _hasCargoPublicDefined = !isNil "_canLoadPublic";
private _hasCargoPublicDefined = !isNil "_hasCargoPublic";
if (_hasCargoPublicDefined && {!(_hasCargoPublic isEqualType false)}) then {
WARNING_4("%1[%2] - Variable %3 is %4 - Should be bool",_vehicle,_type,QGVAR(hasCargo),_hasCargoPublic);
@ -52,14 +52,21 @@ if (isServer) then {
private _cargoClassname = "";
private _cargoCount = 0;
private _loaded = 0;
{
_cargoClassname = getText (_x >> "type");
_cargoCount = getNumber (_x >> "amount");
TRACE_3("adding ACE_Cargo",configName _x,_cargoClassname,_cargoCount);
TRACE_3("adding ace_cargo",configName _x,_cargoClassname,_cargoCount);
["ace_addCargo", [_cargoClassname, _vehicle, _cargoCount]] call CBA_fnc_localEvent;
// Ignore stability check (distance check is also ignored with this, but it's ignored by default if item is a string)
_loaded = [_cargoClassname, _vehicle, _cargoCount, true] call FUNC(addCargoItem);
// Let loop continue until the end, so that it prints everything into the rpt (there might be smaller items that could still fit in cargo)
if (_loaded != _cargoCount) then {
WARNING_5("%1 (%2) could not fit %3 %4 inside its cargo, only %5 were loaded.",_vehicle,_type,_cargoCount,_cargoClassname,_loaded);
};
} forEach ("true" configClasses (_config >> QUOTE(ADDON) >> "cargo"));
};

View File

@ -6,8 +6,7 @@ private _category = [ELSTRING(main,Category_Logistics), LSTRING(openMenu)];
[LSTRING(ModuleSettings_enable), LSTRING(ModuleSettings_enable_Description)],
_category,
true,
1,
{[QGVAR(enable), _this] call EFUNC(common,cbaSettings_settingChanged)}
1
] call CBA_fnc_addSetting;
[
@ -16,8 +15,7 @@ private _category = [ELSTRING(main,Category_Logistics), LSTRING(openMenu)];
[LSTRING(loadTimeCoefficient), LSTRING(loadTimeCoefficient_description)],
_category,
[0, 10, 5, 1],
1,
{[QGVAR(loadTimeCoefficient), _this, true] call EFUNC(common,cbaSettings_settingChanged)}
1
] call CBA_fnc_addSetting;
[
@ -26,8 +24,7 @@ private _category = [ELSTRING(main,Category_Logistics), LSTRING(openMenu)];
[LSTRING(paradropTimeCoefficent), LSTRING(paradropTimeCoefficent_description)],
_category,
[0, 10, 2.5, 1],
1,
{[QGVAR(paradropTimeCoefficent), _this, true] call EFUNC(common,cbaSettings_settingChanged)}
1
] call CBA_fnc_addSetting;
[
@ -35,9 +32,7 @@ private _category = [ELSTRING(main,Category_Logistics), LSTRING(openMenu)];
"LIST",
[LSTRING(openAfterUnload), LSTRING(openAfterUnload_description)],
_category,
[[0, 1, 2, 3], [ELSTRING(common,never), LSTRING(unloadObject), LSTRING(paradropButton), ELSTRING(common,both)], 0],
0,
{[QGVAR(openAfterUnload), _this, true] call EFUNC(common,cbaSettings_settingChanged)}
[[0, 1, 2, 3], [ELSTRING(common,never), LSTRING(unloadObject), LSTRING(paradropButton), ELSTRING(common,both)], 0]
] call CBA_fnc_addSetting;
[
@ -45,9 +40,7 @@ private _category = [ELSTRING(main,Category_Logistics), LSTRING(openMenu)];
"CHECKBOX",
[LSTRING(carryAfterUnload), LSTRING(carryAfterUnload_description)],
_category,
true,
0,
{[QGVAR(carryAfterUnload), _this] call EFUNC(common,cbaSettings_settingChanged)}
true
] call CBA_fnc_addSetting;
[
@ -56,8 +49,7 @@ private _category = [ELSTRING(main,Category_Logistics), LSTRING(openMenu)];
[LSTRING(enableDeploy), LSTRING(enableDeploy_description)],
_category,
true,
1,
{[QGVAR(enableDeploy), _this] call EFUNC(common,cbaSettings_settingChanged)}
1
] call CBA_fnc_addSetting;
[
@ -65,7 +57,5 @@ private _category = [ELSTRING(main,Category_Logistics), LSTRING(openMenu)];
"CHECKBOX",
[LSTRING(ModuleSettings_enableRename), LSTRING(ModuleSettings_enableRename_Description)],
_category,
true,
0,
{[QGVAR(enableRename), _this, true] call EFUNC(common,cbaSettings_settingChanged)}
true
] call CBA_fnc_addSetting;

View File

@ -40,6 +40,8 @@
<Japanese>配置する</Japanese>
<Korean>배치하기</Korean>
<French>Déployer</French>
<German>Aufstellen</German>
<Spanish>Desplegar</Spanish>
</Key>
<Key ID="STR_ACE_Cargo_ScrollAction">
<English>Raise/Lower | (Ctrl + Scroll) Rotate</English>
@ -287,6 +289,7 @@
<Russian>Загружаем %1 в %2...</Russian>
<Korean>%1을(를) %2에 싣는 중...</Korean>
<French>Chargement %1 dans %2...</French>
<German>%1 wird in %2 geladen...</German>
</Key>
<Key ID="STR_ACE_Cargo_UnloadingItem">
<English>Unloading %1 from %2...</English>
@ -296,6 +299,7 @@
<Russian>Выгружаем %1 из %2...</Russian>
<Korean>%1을(를) %2(으)로부터 내리는 중...</Korean>
<French>Déchargement %1 de %2...</French>
<German>%1 wird von %2 entladen...</German>
</Key>
<Key ID="STR_ACE_Cargo_LoadingFailed">
<English>%1&lt;br/&gt;could not be loaded</English>
@ -337,6 +341,7 @@
<Japanese>荷降ろし不可能です</Japanese>
<Korean>하역할 수가 없습니다</Korean>
<Russian>Не может быть выгружен</Russian>
<Spanish>No puede ser descargado</Spanish>
</Key>
<Key ID="STR_ACE_Cargo_SizeMenu">
<English>Cargo Size: %1</English>
@ -346,6 +351,7 @@
<Japanese>貨物のサイズ: %1</Japanese>
<Korean>화물 크기: %1</Korean>
<Russian>Размер груза: %1</Russian>
<Spanish>Tamaño de carga: %1</Spanish>
</Key>
<Key ID="STR_ACE_Cargo_customName_edenName">
<English>Custom Name</English>
@ -513,7 +519,7 @@
<Key ID="STR_ACE_Cargo_loadTimeCoefficient_description">
<English>Modifies how long it takes to load/unload items.\nTime, in seconds, is the size of the item multiplied by this value.</English>
<German>Gibt an, wie lange das Laden / Entladen von Gegenständen dauern soll.\nZeit in Sekunden, die mit der Größe des Gegenstandes multipliziert wird.</German>
<Japanese>貨物の積み込み/積み下ろしに掛かる時間を変更します。\n時間 (秒) は、貨物のサイズにこの値を掛けたものです。</Japanese>
<Japanese>貨物の積み込み/積み下ろしに掛かる時間を変更します。\n時間 (秒単位) は、貨物のサイズにこの値を掛けたものです。</Japanese>
<Polish>Modyfikuje, jak długo zajmuje załadowywanie/wyładowywanie przedmiotów. \nCzasem, w sekundach, jest wielkość przedmiotu razy jego wartość.</Polish>
<Italian>Modifica il tempo impiegato per caricare o scaricare gli oggetti.\nIl tempo, in secondi, equivale alla dimensione dell'oggetto moltiplicata per questo valore</Italian>
<Russian>Изменяет время для загрузки/выгрузки предметов. \nВремя (сек) - это размер предмета, умноженный на это значение.</Russian>
@ -584,6 +590,8 @@
<Japanese>配置機能を有効化</Japanese>
<Korean>배치 활성화</Korean>
<French>Permettre le placement</French>
<German>Aktiviere Aufbauen</German>
<Spanish>Habilitar despliegue</Spanish>
</Key>
<Key ID="STR_ACE_Cargo_enableDeploy_description">
<English>Controls whether cargo items can be unloaded via the deploy method.</English>
@ -592,6 +600,8 @@
<Japanese>配置機能を介して貨物アイテムを降ろすことが出来るかどうかを制御します。</Japanese>
<Korean>배치 방법을 통해 화물 아이템을 내릴 수 있는지 여부를 제어합니다.</Korean>
<French>Contrôler si les éléments de cargaison peuvent être déchargés via la méthode de déploiement.</French>
<German>Steuert, ob Frachtgegenstände über die Aufbaumethode entladen werden können.</German>
<Spanish>Controla si los objetos de la carga pueden ser descargados mediante el método de despliegue.</Spanish>
</Key>
</Package>
</Project>

View File

@ -355,7 +355,7 @@
</Key>
<Key ID="STR_ACE_Chemlights_HiGreen_DisplayName">
<English>Chemlight (Hi Green)</English>
<French>Cyalume HL (vert)</French>
<French>Cyalume HL (Vert)</French>
<German>Knicklicht (Grün, Hell)</German>
<Japanese>ケミカルライト(高輝度 緑)</Japanese>
<Polish>Świetlik (jaskrawy zielony)</Polish>
@ -533,9 +533,9 @@
<English>Chemlight Shield (Green)</English>
<Japanese>ケミカルライト シールド(緑)</Japanese>
<Polish>Osłona na świetlik (zielona)</Polish>
<German>Knicklicht-Abschirmung (grün)</German>
<German>Knicklicht-Abschirmung (Grün)</German>
<Korean>화학조명 가림막 (초록)</Korean>
<French>Etui avec cyalume (vert)</French>
<French>Etui avec cyalume (Vert)</French>
<Italian>Scudo Luce Chimica (Verde)</Italian>
<Chinese>螢光棒保護殼 (綠色)</Chinese>
<Chinesesimp>荧光棒保护壳(绿色)</Chinesesimp>

View File

@ -1,8 +1,5 @@
class CfgMovesBasic {
// Idle affects legs when weapon switching - fixes units sliding when holstering weapons
class Default {
idle = "";
};
class Default;
// From ACRE
class ManActions {
@ -86,5 +83,14 @@ class CfgMovesMaleSdr: CfgMovesBasic {
class AinvPknlMstpSnonWnonDnon_medic0: HealBase {
variantsPlayer[] = {};
};
// Idle affects legs when weapon switching - fixes units sliding when holstering weapons
class AmovPercMstpSnonWnonDnon: StandBase {
idle = "";
};
// Need to reset idle, as it breaks animations otherwise
class CutSceneAnimationBase: AmovPercMstpSnonWnonDnon {
idle = "idleDefault";
};
};
};

View File

@ -161,6 +161,7 @@ PREP(sendRequest);
PREP(serverLog);
PREP(setAimCoef);
PREP(setApproximateVariablePublic);
PREP(setDead);
PREP(setDefinedVariable);
PREP(setDisableUserInputStatus);
PREP(setHearingCapability);
@ -264,6 +265,7 @@ PREP(_handleRequestAllSyncedEvents);
PREP(addActionEventHandler);
PREP(addActionMenuEventHandler);
PREP(addMapMarkerCreatedEventHandler);
PREP(addPlayerEH);
PREP(removeActionEventHandler);
PREP(removeActionMenuEventHandler);

View File

@ -145,7 +145,7 @@ if (isServer) then {
INFO_3("[%1] DC - Was Zeus [%2] while controlling unit [%3] - manually clearing `bis_fnc_moduleRemoteControl_owner`",[_x] call FUNC(getName),_dcPlayer,_x);
_x setVariable ["bis_fnc_moduleRemoteControl_owner", nil, true];
};
} forEach (curatorEditableObjects _zeusLogic);
} forEach (curatorEditableObjects _zeusLogic);
};
}];
};
@ -191,6 +191,7 @@ if (isServer) then {
[QGVAR(switchMove), {(_this select 0) switchMove (_this select 1)}] call CBA_fnc_addEventHandler;
[QGVAR(setVectorDirAndUp), {(_this select 0) setVectorDirAndUp (_this select 1)}] call CBA_fnc_addEventHandler;
[QGVAR(addWeaponItem), {(_this select 0) addWeaponItem [(_this select 1), (_this select 2)]}] call CBA_fnc_addEventHandler;
[QGVAR(removeMagazinesTurret), {(_this select 0) removeMagazinesTurret [_this select 1, _this select 2]}] call CBA_fnc_addEventHandler;
[QGVAR(setVanillaHitPointDamage), {
params ["_object", "_hitPointAnddamage"];
@ -222,6 +223,9 @@ if (isServer) then {
[QGVAR(claimSafe), LINKFUNC(claimSafeServer)] call CBA_fnc_addEventHandler;
};
["CBA_SettingChanged", {
["ace_settingChanged", _this] call CBA_fnc_localEvent;
}] call CBA_fnc_addEventHandler;
//////////////////////////////////////////////////
// Set up remote execution

View File

@ -43,10 +43,10 @@ if (isNil "_keyTable") then {
};
};
private _keyCache = uiNamespace getVariable [QGVAR(keyNameCache), locationNull];
private _keyCache = uiNamespace getVariable QGVAR(keyNameCache); // @TODO: Move cache creation to preStart/somewhere else
if (isNull _keyCache) then {
_keyCache = call CBA_fnc_createNamespace;
if (isNil "_keyCache") then {
_keyCache = createHashMap;
uiNamespace setVariable [QGVAR(keyNameCache), _keyCache];
};
@ -54,7 +54,7 @@ params [["_action", "", [""]]];
private _keybinds = actionKeysNamesArray _action apply {
private _keyName = _x;
private _keybind = _keyCache getVariable _keyName;
private _keybind = _keyCache get _keyName;
if (isNil "_keybind") then {
private _key = -1;
@ -101,7 +101,7 @@ private _keybinds = actionKeysNamesArray _action apply {
// cache
_keybind = [_key, _shift, _ctrl, _alt];
_keyCache setVariable [_keyName, _keybind];
_keyCache set [_keyName, _keybind];
};
_keybind

View File

@ -0,0 +1,61 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
* Adds event handler just to ACE_player
*
* Arguments:
* 0: Key <STRING>
* 1: Event Type <STRING>
* 2: Event Code <CODE>
* 3: Ignore Virtual Units (spectators, virtual zeus, uav RC) <BOOL> (default: false)
*
* Return Value:
* None
*
* Example:
* ["example", "FiredNear", {systemChat str _this}] call ace_common_fnc_addPlayerEH
*
* Public: Yes
*/
params [["_key", "", [""]], ["_type", "", [""]], ["_code", {}, [{}]], ["_ignoreVirtual", false, [false]]];
TRACE_3("addPlayerEH",_key,_type,_ignoreVirtual);
if (isNil QGVAR(playerEventsHash)) then { // first-run init
GVAR(playerEventsHash) = createHashMap;
["unit", {
params ["_newPlayer", "_oldPlayer"];
// uav check only applies to direct controlling UAVs from zeus, no effect on normal UAV operation
private _isVirutal = (unitIsUAV _newPlayer) || {getNumber (configOf _newPlayer >> "isPlayableLogic") == 1};
TRACE_4("",_newPlayer,_oldPlayer,_isVirutal,count GVAR(playerEventsHash));
{
_y params ["_type", "_code", "_ignoreVirtual"];
private _oldEH = _oldPlayer getVariable [_x, -1];
if (_oldEH != -1) then {
_oldPlayer removeEventHandler [_type, _oldEH];
_oldPlayer setVariable [_x, nil];
};
_oldEH = _newPlayer getVariable [_x, -1];
if (_oldEH != -1) then { continue }; // if respawned then var and EH already exists
if (_ignoreVirtual && _isVirutal) then { continue };
private _newEH = _newPlayer addEventHandler [_type, _code];
_newPlayer setVariable [_x, _newEH];
} forEach GVAR(playerEventsHash);
}, false] call CBA_fnc_addPlayerEventHandler;
};
_key = format [QGVAR(playerEvents_%1), toLower _key];
if (_key in GVAR(playerEventsHash)) exitWith { ERROR_1("bad key %1",_this); };
GVAR(playerEventsHash) set [_key, [_type, _code, _ignoreVirtual]];
if (isNull ACE_player) exitWith {};
if (_ignoreVirtual && {(unitIsUAV ACE_player) || {getNumber (configOf ACE_player >> "isPlayableLogic") == 1}}) exitWith {};
// Add event now
private _newEH = ACE_player addEventHandler [_type, _code];
ACE_player setVariable [_key, _newEH];

View File

@ -59,6 +59,21 @@ switch (_container) do {
};
};
if (_type select 0 == "magazine") then {
private _configAmmoCount = getNumber (configFile >> "CfgMagazines" >> _classname >> "count");
// https://feedback.bistudio.com/T74244
// When adding throwables with the addXXXCargo(Global) commands, they don't show up in the throwables list
// If a throwable has more than 1 ammo count, adding it with addItem(XXX) commands also renders the throwable unusable
if (_configAmmoCount == 1 && {_ammoCount in [-1, 1]} && {_classname call BIS_fnc_isThrowable}) then { // TODO: replace with https://community.bistudio.com/wiki/isThrowable in 2.18
_type set [0, "item"];
};
if (_ammoCount == -1) then {
_ammoCount = _configAmmoCount;
};
};
switch (_type select 0) do {
case "weapon": {
if (_canAdd || {_canFitWeaponSlot}) then {
@ -106,10 +121,6 @@ switch (_type select 0) do {
};
case "magazine": {
if (_ammoCount == -1) then {
_ammoCount = getNumber (configFile >> "CfgMagazines" >> _classname >> "count");
};
if (_canAdd) then {
_addedToUnit = true;

View File

@ -2,22 +2,33 @@
/*
* Author: commy2, johnb43
* Adds weapon to unit without taking a magazine.
* Same as CBA_fnc_addWeaponWithoutItems, but doesn't remove linked items.
* Same as CBA_fnc_addWeaponWithoutItems, but doesn't remove linked items by default.
*
* Arguments:
* 0: Unit to add the weapon to <OBEJCT>
* 0: Unit to add the weapon to <OBJECT>
* 1: Weapon to add <STRING>
* 2: If linked items should be removed or not <BOOL> (default: false)
* 3: Magazines that should be added to the weapon <ARRAY> (default: [])
* - 0: Magazine classname <STRING>
* - 1: Ammo count <NUMBER>
*
* Return Value:
* None
*
* Example:
* [player, "arifle_AK12_F"] call ace_common_fnc_addWeapon
* [player, "arifle_MX_GL_F", true, [["30Rnd_65x39_caseless_mag", 30], ["1Rnd_HE_Grenade_shell", 1]]] call ace_common_fnc_addWeapon
*
* Public: Yes
*/
params ["_unit", "_weapon"];
params [
["_unit", objNull, [objNull]],
["_weapon", "", [""]],
["_removeLinkedItems", false, [false]],
["_magazines", [], [[]]]
];
if (isNull _unit || {_weapon == ""}) exitWith {};
// Config case
private _compatibleMagazines = compatibleMagazines _weapon;
@ -45,6 +56,35 @@ private _backpackMagazines = (magazinesAmmoCargo _backpack) select {
// Add weapon
_unit addWeapon _weapon;
// This doesn't remove magazines, but linked items can't be magazines, so it's fine
if (_removeLinkedItems) then {
switch (_weapon call FUNC(getConfigName)) do {
case (primaryWeapon _unit): {
removeAllPrimaryWeaponItems _unit;
};
case (secondaryWeapon _unit): {
removeAllSecondaryWeaponItems _unit;
};
case (handgunWeapon _unit): {
removeAllHandgunItems _unit;
};
case (binocular _unit): {
removeAllBinocularItems _unit;
};
};
};
// Add magazines directly now, so that AI don't reload
if (_magazines isNotEqualTo []) then {
{
_x params [["_magazine", "", [""]], ["_ammoCount", -1, [0]]];
if (_magazine != "" && {_ammoCount > -1}) then {
_unit addWeaponItem [_weapon, [_magazine, _ammoCount], true];
};
} forEach _magazines;
};
// Add all magazines back
{
_uniform addMagazineAmmoCargo [_x select 0, 1, _x select 1];

View File

@ -1,8 +1,8 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
* Function for handeling a cba setting being changed.
* Adds warning if global setting is changed after ace_settingsInitialized
* Function for handling a cba setting being changed.
* Adds warning if global setting is changed after ace_settingsInitialized.
*
* Arguments:
* 0: Setting Name <STRING>
@ -21,9 +21,7 @@
params ["_settingName", "_newValue", ["_canBeChanged", false]];
TRACE_2("",_settingName,_newValue);
["ace_settingChanged", [_settingName, _newValue]] call CBA_fnc_localEvent;
if (!((toLower _settingName) in CBA_settings_needRestart)) exitWith {};
if !((toLower _settingName) in CBA_settings_needRestart) exitWith {};
if (_canBeChanged) exitWith {WARNING_1("update cba setting [%1] to use correct Need Restart param",_settingName);};
if (!GVAR(settingsInitFinished)) exitWith {}; // Ignore changed event before CBA_settingsInitialized

View File

@ -143,11 +143,7 @@ if (_state) then {
_ctrl ctrlSetEventHandler ["ButtonClick", toString {
closeDialog 0;
if (["ace_medical"] call FUNC(isModLoaded)) then {
[player, "respawn_button"] call EFUNC(medical_status,setDead);
} else {
player setDamage 1;
};
[player, "respawn_button"] call FUNC(setDead);
[false] call FUNC(disableUserInput);
}];

View File

@ -137,11 +137,11 @@ if (_onCancel isEqualTo {}) then {
ctrlSetFocus _ctrlButtonCancel;
};
_ctrlButtonOK ctrlAddEventHandler ["buttonClick", {(ctrlParent (_this select 0)) closeDisplay 1; true}];
_ctrlButtonCancel ctrlAddEventHandler ["buttonClick", {(ctrlParent (_this select 0)) closeDisplay 2; true}];
_ctrlButtonOK ctrlAddEventHandler ["ButtonClick", {(ctrlParent (_this select 0)) closeDisplay 1; true}];
_ctrlButtonCancel ctrlAddEventHandler ["ButtonClick", {(ctrlParent (_this select 0)) closeDisplay 2; true}];
GVAR(errorOnOK) = _onOK;
GVAR(errorOnCancel) = _onCancel;
_display displayAddEventHandler ["unload", {call ([{}, GVAR(errorOnOK), GVAR(errorOnCancel)] select (_this select 1))}];
_display displayAddEventHandler ["keyDown", {_this select 1 == 1}];
_display displayAddEventHandler ["Unload", {call ([{}, GVAR(errorOnOK), GVAR(errorOnCancel)] select (_this select 1))}];
_display displayAddEventHandler ["KeyDown", {_this select 1 == 1}];

View File

@ -32,7 +32,6 @@ scopeName "main";
if (_x select 0 == _name) then {
_x breakOut "main";
};
false
} count GVAR(settings);
} forEach GVAR(settings);
[]

View File

@ -20,15 +20,23 @@
params [["_oldItem", "", [0,""]], ["_newItems", "", ["", []]], ["_replaceInherited", false, [false]]];
TRACE_3("registerItemReplacement",_oldItem,_newItems,_replaceInherited);
// Setup on first run
if (isNil QGVAR(itemReplacements)) then {
GVAR(itemReplacements) = [] call CBA_fnc_createNamespace;
GVAR(itemReplacements) = createHashMap;
GVAR(inheritedReplacements) = [];
GVAR(oldItems) = [];
["loadout", LINKFUNC(replaceRegisteredItems)] call CBA_fnc_addPlayerEventHandler;
};
// Get config case - if item doesn't exist, "" is returned
if (_oldItem isEqualType "") then {
_oldItem = _oldItem call FUNC(getConfigName);
};
if (_oldItem isEqualTo "") exitWith {
ERROR("Item doesn't exist");
};
// Save item replacement
// $ prefix is used for types (numbers) and replacements with inheritance
if (_replaceInherited) then {
@ -42,9 +50,8 @@ if (_newItems isEqualType "") then {
_newItems = [_newItems];
};
private _oldReplacements = GVAR(itemReplacements) getVariable [_oldItem, []];
private _oldReplacements = GVAR(itemReplacements) getOrDefault [_oldItem, [], true];
_oldReplacements append _newItems;
GVAR(itemReplacements) setVariable [_oldItem, _oldReplacements];
// Force item scan when new replacement was registered in PostInit
if !(isNull ACE_player) then {

View File

@ -42,7 +42,7 @@ for "_i" from 0 to count _newItems - 1 do {
private _replacements = [];
// Determine replacement items: direct replacements, ...
private _directReplacements = GVAR(itemReplacements) getVariable _item;
private _directReplacements = GVAR(itemReplacements) get _item;
if (!isNil "_directReplacements") then {
_doReplace = true;
_replacements append _directReplacements;
@ -50,7 +50,7 @@ for "_i" from 0 to count _newItems - 1 do {
// ... item type replacements ...
private _type = getNumber (_cfgWeapons >> _item >> "ItemInfo" >> "type");
private _typeReplacements = GVAR(itemReplacements) getVariable ("$" + str _type);
private _typeReplacements = GVAR(itemReplacements) get ("$" + str _type);
if (!isNil "_typeReplacements") then {
_doReplace = true;
_replacements append _typeReplacements;
@ -59,7 +59,7 @@ for "_i" from 0 to count _newItems - 1 do {
// ... and inherited replacements
{
if (_item isKindOf [_x, _cfgWeapons]) then {
private _inheritedReplacements = GVAR(itemReplacements) getVariable _x;
private _inheritedReplacements = GVAR(itemReplacements) get _x;
if (!isNil "_inheritedReplacements") then {
_doReplace = true;
_replacements append _inheritedReplacements;

View File

@ -0,0 +1,44 @@
#include "..\script_component.hpp"
/*
* Author: johnb43
* Kills a unit without changing visual appearance.
*
* Arguments:
* 0: Unit <ARRAY>
* 1: Reason for death (only used if ace_medical is loaded) <STRING> (default: "")
* 2: Killer (vehicle that killed unit) <ARRAY> (default: objNull)
* 3: Instigator (unit who pulled trigger) <ARRAY> (default: objNull)
*
* Return Value:
* None
*
* Example:
* [cursorObject, "", player, player] call ace_common_fnc_setDead;
*
* Public: Yes
*/
params [["_unit", objNull, [objNull]], ["_reason", "", [""]], ["_source", objNull, [objNull]], ["_instigator", objNull, [objNull]]];
if (!local _unit) exitWith {
WARNING_1("setDead executed on non-local unit - %1",_this);
};
if (["ace_medical"] call EFUNC(common,isModLoaded)) then {
[_unit, _reason, _source, _instigator] call EFUNC(medical_status,setDead);
} else {
// From 'ace_medical_status_fnc_setDead': Kill the unit without changing visual appearance
// (#8803) Reenable damage if disabled to prevent having live units in dead state
// Keep this after death event for compatibility with third party hooks
if (!isDamageAllowed _unit) then {
WARNING_1("setDead executed on unit with damage blocked - %1",_this);
_unit allowDamage true;
};
private _currentDamage = _unit getHitPointDamage "HitHead";
_unit setHitPointDamage ["HitHead", 1, true, _source, _instigator];
_unit setHitPointDamage ["HitHead", _currentDamage, true, _source, _instigator];
};

View File

@ -498,7 +498,7 @@
<Chinesesimp>设定当玩家有错误的 PBO 时要如何处理。</Chinesesimp>
<Czech>Nastavuje jakou akci provést pokud hráč nemá správné PBO.</Czech>
<Polish>Określa akcję, która ma być podjęta, jeśli gracz nie ma właściwych PBO.</Polish>
<Japanese>プレイヤーが不正規のPBOを所持している場合の動作を定します。</Japanese>
<Japanese>プレイヤーが不正規のPBOを所持している場合の動作を定します。</Japanese>
<Spanish>Define la accion a tomar si un jugador no tiene el PBO correcto</Spanish>
<Italian>Definisce l'azione che verrà presa se il giocatore non ha gli stessi PBO.</Italian>
<Russian>Определяет, какое действие будет предпринято, если игрок не имеет корректные PBO.</Russian>
@ -1582,7 +1582,7 @@
</Key>
<Key ID="STR_ACE_Common_progressBarInfoDesc">
<English>Controls extra information shown in progress bar.</English>
<Japanese>プログレス バーへ表示される情報量を決定します。</Japanese>
<Japanese>プログレス バーへ表示される情報量を制御します。</Japanese>
<French>Définit quelles informations supplémentaires sont affichées dans la barre de progression.</French>
<Russian>Устанавливает дополнительную информацию в индикаторе процесса.</Russian>
<German>Kontrolliert zusätzliche Informationen beim Fortschrittsbalkens.</German>
@ -1834,6 +1834,9 @@
<Korean>무기 흔들림</Korean>
<French>Oscillation de l'arme</French>
<Russian>Колебание оружия</Russian>
<German>Waffen schwanken</German>
<Spanish>Oscilación del arma</Spanish>
<Italian>Oscillazione arma</Italian>
</Key>
<Key ID="STR_ACE_Common_EnableSway">
<English>Enable Weapon Sway</English>
@ -1841,6 +1844,9 @@
<Korean>무기 흔들림 추가</Korean>
<French>Activer l'oscillation de l'arme</French>
<Russian>Включить колебание оружия</Russian>
<German>Aktiviere Waffen schwanken</German>
<Spanish>Habilitar oscilación del arma</Spanish>
<Italian>Abilita oscillazione arma</Italian>
</Key>
<Key ID="STR_ACE_Common_EnableSway_Description">
<English>Enables weapon sway influenced by sway factors, such as stance, fatigue and medical condition.\nDisabling this setting will defer sway to vanilla or other mods.</English>
@ -1848,6 +1854,9 @@
<Korean>흔들림 계수, 자세, 피로도, 건강 상태 등의 요인에 영향을 받는 무기 흔들림을 활성화합니다.\n이 설정을 비활성화하면 바닐라 또는 다른 모드의 흔들림으로 대체됩니다.</Korean>
<French>Active l'oscillation de l'arme influencé par les facteurs d'oscillation, tels que la position, la fatigue et l'état de santé.\nLa désactivation de ce paramètre reportera l'oscillation à vanilla ou à d'autres mods.</French>
<Russian>Активируйте колебание оружия в зависимости от таких факторов, как стойка, усталость и состояние здоровья.\nОтключение этого параметра приведет к переносу раскачивания на vanilla или другие моды.</Russian>
<German>Ermöglicht die Beeinflussung des Waffen-Schwankens durch Beeinflussungsfaktoren wie Haltung, Müdigkeit und Gesundheitszustand.\nDie Deaktivierung dieser Einstellung erlaubt die Beeinflussung durch Vanilla oder andere Mods.</German>
<Spanish>Habilita la oscilación del arma afectado por factores como la postura, la fatiga y la condición médica.\nDeshabilitar esta opción hará que el comportamiento de la oscilación venga definido por Vanilla o por otros mods.</Spanish>
<Italian>Abilita l'oscillazione ACE, influenzata da fattori come postura, fatica e condizione medica.\nDisabilitare questa impostazione farà controllare l'oscillazione al gioco vanilla o altre mod.</Italian>
</Key>
<Key ID="STR_ACE_Common_SwayFactor">
<English>Sway factor</English>
@ -1888,6 +1897,7 @@
<Italian>Fattore di Oscillazione Appoggiato</Italian>
<Japanese>静止依託時の手ぶれ係数</Japanese>
<Russian>Коэффициент колебания прицела в состоянии покоя</Russian>
<Spanish>Factor de oscilación apoyado</Spanish>
</Key>
<Key ID="STR_ACE_Common_RestedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is rested.</English>
@ -1898,6 +1908,7 @@
<Italian>Determina la quantità di oscillazione dell'arma quando questa è appoggiata.</Italian>
<Japanese>静止し壁などに依託している時の武器の手ぶれの大きさに影響します。</Japanese>
<Russian>Влияет на величину колебания прицела оружия в состоянии покоя.</Russian>
<Spanish>Afecta la cantidad de oscilación del arma cuando se está apoyado.</Spanish>
</Key>
<Key ID="STR_ACE_Common_DeployedSwayFactor">
<English>Deployed sway factor</English>
@ -1908,6 +1919,7 @@
<Italian>Fattore di Oscillazione su Bipode</Italian>
<Japanese>接地展開時の手ぶれ係数</Japanese>
<Russian>Коэффициент колебания прицела при развертывании</Russian>
<Spanish>Factor de oscilación desplegado</Spanish>
</Key>
<Key ID="STR_ACE_Common_DeployedSwayFactor_Description">
<English>Influences the amount of weapon sway while weapon is deployed.</English>
@ -1918,6 +1930,7 @@
<Italian>Determina la quantità di oscillazione dell'arma quando questa è stabilizzata usando il bipode.</Italian>
<Japanese>武器の接地展開時の武器の手ぶれの大きさに影響します。</Japanese>
<Russian>Влияет на величину колебания прицела оружия при его развертывании.</Russian>
<Spanish>Afecta la cantidad de oscilación del arma cuando se está desplegado.</Spanish>
</Key>
</Package>
</Project>

View File

@ -1,3 +1,6 @@
class CBA_Extended_EventHandlers;
#define XEH_INHERITED class EventHandlers {class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};}
class CfgVehicles {
class House;
class House_Small_F;
@ -5,7 +8,7 @@ class CfgVehicles {
class House_EP1: House {};
class Land_Benzina_schnell: House {
transportFuel = 0;
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{-1.5,-3.93,-1.25}, {2.35,-3.93,-1.25}};
EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL;
class ACE_Actions {
@ -18,22 +21,22 @@ class CfgVehicles {
};
};
class Land_A_FuelStation_Feed: Strategic {
transportFuel = 0;
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{-0.34,0,0}, {0.34,0,0}};
EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL;
};
class Land_Ind_FuelStation_Feed_EP1: House_EP1 {
transportFuel = 0;
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{-0.34,0,0}, {0.34,0,0}};
EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL;
};
class Land_FuelStation_Feed_PMC: Strategic {
transportFuel = 0;
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{-0.34,0,0}, {0.34,0,0}};
EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL;
};
class FuelStation: House_Small_F {
transportFuel = 0;
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{1.25, .2, -1.1}};
EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL;
class ACE_Actions {
@ -45,4 +48,9 @@ class CfgVehicles {
};
};
};
class WarfareBBaseStructure;
class Base_WarfareBVehicleServicePoint: WarfareBBaseStructure {
// "vehicle service point" (a conex /w barrels) - need hooks???
XEH_INHERITED;
};
};

View File

@ -0,0 +1,492 @@
class CfgGlasses {
#define ESS_OVERLAY \
ace_overlay = QPATHTOEF(goggles,textures\hud\combatgoggles.paa); \
ace_overlayCracked = QPATHTOEF(goggles,textures\hud\combatgogglescracked.paa)
class None;
class CUP_G_PMC_RadioHeadset_Glasses;
// ESS Goggles - Dark
class CUP_G_ESS_BLK_Dark: None {
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Blk: None {
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Blk_Beard: None {
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Blk_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Face_Blk: None {
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_CBR_Dark: None {
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Dark: None {
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_RGR_Dark: None {
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
// ESS Goggles - Ember
class CUP_G_ESS_BLK_Ember: None {
ace_color[] = {1, 0, 0};
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_CBR_Ember: None {
ace_color[] = {1, 0, 0};
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_RGR_Ember: None {
ace_color[] = {1, 0, 0};
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Ember: None {
ace_color[] = {1, 0, 0};
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Facewrap_White: None {
ace_color[] = {1, 0, 0};
ace_protection = 1;
ace_resistance = 1;
ace_tintAmount = 8;
ESS_OVERLAY;
};
// ESS Goggles - Clear
class CUP_G_ESS_BLK: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_CBR: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_RGR: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Facewrap_Black: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Facewrap_Black_GPS: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Face_Grn: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Face_Grn_GPS: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Face_Red: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Face_White: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Face_White_GPS: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Grn: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Grn_Beard: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Grn_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Grn_GPS: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Grn_GPS_Beard: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Grn_GPS_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Red: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Red_Beard: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_Red_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_White: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_White_Beard: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_White_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_White_GPS: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_White_GPS_Beard: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_BLK_Scarf_White_GPS_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_CBR_Facewrap_Red: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Facewrap_Tan: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Scarf_Face_Tan: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Scarf_Face_Tan_GPS: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Scarf_Tan: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Scarf_Tan_Beard: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Scarf_Tan_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Scarf_Tan_GPS: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Scarf_Tan_GPS_Beard: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_KHK_Scarf_Tan_GPS_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_RGR_Facewrap_Ranger: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_RGR_Facewrap_Skull: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
class CUP_G_ESS_RGR_Facewrap_Tropical: None {
ace_protection = 1;
ace_resistance = 1;
ESS_OVERLAY;
};
// Oakleys - Dark
class CUP_G_Oakleys_Drk: None {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Black_Glasses_Dark: None {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Black_Glasses_Dark_Headset: None {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Tan_Glasses_Dark: CUP_G_PMC_Facewrap_Black_Glasses_Dark {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Tan_Glasses_Dark_Headset: None {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Tropical_Glasses_Dark: CUP_G_PMC_Facewrap_Black_Glasses_Dark {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Tropical_Glasses_Dark_Headset: None {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Winter_Glasses_Dark: CUP_G_PMC_Facewrap_Black_Glasses_Dark {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Winter_Glasses_Dark_Headset: None {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_RadioHeadset_Glasses_Dark: CUP_G_PMC_RadioHeadset_Glasses {
ace_resistance = 1;
ace_tintAmount = 8;
};
// Oakleys - Ember
class CUP_G_Oakleys_Embr: None {
ace_color[] = {1, 0, 0};
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Black_Glasses_Ember: CUP_G_PMC_Facewrap_Black_Glasses_Dark {
ace_color[] = {1, 0, 0};
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Tan_Glasses_Ember: CUP_G_PMC_Facewrap_Black_Glasses_Dark {
ace_color[] = {1, 0, 0};
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Tropical_Glasses_Ember: CUP_G_PMC_Facewrap_Black_Glasses_Dark {
ace_color[] = {1, 0, 0};
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_Facewrap_Winter_Glasses_Ember: CUP_G_PMC_Facewrap_Black_Glasses_Dark {
ace_color[] = {1, 0, 0};
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_PMC_RadioHeadset_Glasses_Ember: CUP_G_PMC_RadioHeadset_Glasses {
ace_color[] = {1, 0, 0};
ace_resistance = 1;
ace_tintAmount = 8;
};
// Shades - Dark
class CUP_G_Beard_Shades_Black: None {
ace_resistance = 1;
ace_tintAmount = 8;
};
class CUP_G_Beard_Shades_Blonde: CUP_G_Beard_Shades_Black {
ace_resistance = 1;
ace_tintAmount = 8;
};
// Shades - Clear
class CUP_G_Grn_Scarf_Shades: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Grn_Scarf_Shades_Beard: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Grn_Scarf_Shades_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Grn_Scarf_Shades_GPS: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Grn_Scarf_Shades_GPS_Beard: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Grn_Scarf_Shades_GPS_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Grn_Scarf_Shades_GPSCombo: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Grn_Scarf_Shades_GPSCombo_Beard: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Grn_Scarf_Shades_GPSCombo_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Tan_Scarf_Shades: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Tan_Scarf_Shades_Beard: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Tan_Scarf_Shades_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Tan_Scarf_Shades_GPS: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Tan_Scarf_Shades_GPS_Beard: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Tan_Scarf_Shades_GPS_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Tan_Scarf_Shades_GPSCombo: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Tan_Scarf_Shades_GPSCombo_Beard: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_Tan_Scarf_Shades_GPSCombo_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_White_Scarf_Shades: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_White_Scarf_Shades_Beard: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_White_Scarf_Shades_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_White_Scarf_Shades_GPS: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_White_Scarf_Shades_GPS_Beard: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_White_Scarf_Shades_GPS_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_White_Scarf_Shades_GPSCombo: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_White_Scarf_Shades_GPSCombo_Beard: None {
ace_protection = 1;
ace_resistance = 1;
};
class CUP_G_White_Scarf_Shades_GPSCombo_Beard_Blonde: None {
ace_protection = 1;
ace_resistance = 1;
};
// Thug - Dark
class CUP_PMC_G_thug: None {
ace_tintAmount = 8;
};
};

View File

@ -15,4 +15,5 @@ class CfgPatches {
};
};
#include "CfgGlasses.hpp"
#include "CfgWeapons.hpp"

View File

@ -1,35 +1,30 @@
class CfgVehicles {
class CUP_T810_Unarmed_Base;
class CUP_T810_Refuel_Base: CUP_T810_Unarmed_Base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{-1.01, 0.21, -0.5},{1.08, 0.2, -0.5}};
EGVAR(refuel,fuelCargo) = 10000;
};
class Truck_02_fuel_base_F;
class CUP_Kamaz_5350_Refuel_Base: Truck_02_fuel_base_F {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{-0.02, -3.33, -1.05}};
EGVAR(refuel,fuelCargo) = 10000;
};
class CUP_Ural_Support_Base;
class CUP_Ural_Refuel_Base: CUP_Ural_Support_Base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{-0.05, -3.65, -0.42}};
EGVAR(refuel,fuelCargo) = 10000;
};
class CUP_V3S_Open_Base;
class CUP_V3S_Refuel_Base: CUP_V3S_Open_Base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{-0.35, -3.35, -0.4},{0.40, -3.35, -0.4}};
EGVAR(refuel,fuelCargo) = 6500;
};
class CUP_MTVR_Base;
class CUP_MTVR_Refuel_Base: CUP_MTVR_Base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{-1.09, -0.01, -0.5},{1, -0.01, -0.5}};
EGVAR(refuel,fuelCargo) = 10000;
};

View File

@ -6,36 +6,48 @@
<Japanese>[CSW] AGS30 ベルト</Japanese>
<Russian>[CSW] Лента AGS 30</Russian>
<Korean>[CSW] AGS-30 벨트</Korean>
<German>[CSW] AGS30 Gurt</German>
<Spanish>[CSW] Cinta de AGS30</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_MK19_displayName">
<English>[CSW] MK19 Belt</English>
<Japanese>[CSW] Mk19 ベルト</Japanese>
<Russian>[CSW] Лента Mk19</Russian>
<Korean>[CSW] Mk.19 벨트</Korean>
<German>[CSW] MK19 Gurt</German>
<Spanish>[CSW] Cinta de MK19</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_TOW_displayName">
<English>[CSW] TOW Tube</English>
<Japanese>[CSW] TOW チューブ</Japanese>
<Russian>[CSW] Туба TOW</Russian>
<Korean>[CSW] TOW 튜브</Korean>
<German>[CSW] TOW Rohr</German>
<Spanish>[CSW] Tubo de TOW</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_TOW2_displayName">
<English>[CSW] TOW2 Tube</English>
<Japanese>[CSW] TOW2 チューブ</Japanese>
<Russian>[CSW] Туба TOW-2</Russian>
<Korean>[CSW] TOW2 튜브</Korean>
<German>[CSW] TOW2 Rohr</German>
<Spanish>[CSW] Tubo de TOW2</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_PG9_displayName">
<English>[CSW] PG-9 Round</English>
<Japanese>[CSW] PG-9 砲弾</Japanese>
<Russian>[CSW] Снаряд ПГ-9</Russian>
<Korean>[CSW] PG-9 대전차고폭탄</Korean>
<German>[CSW] PG-9 Rakete</German>
<Spanish>[CSW] Carga de PG-9</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_OG9_displayName">
<English>[CSW] OG-9 Round</English>
<Japanese>[CSW] OG-9 砲弾</Japanese>
<Russian>[CSW] Снаряд OГ-9</Russian>
<Korean>[CSW] OG-9 고폭파편탄</Korean>
<German>[CSW] OG-9 Rakete</German>
<Spanish>[CSW] Carga de OG-9</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M1HE_displayName">
<English>[CSW] M1 HE</English>
@ -43,6 +55,8 @@
<Russian>[CSW] M1 HE</Russian>
<Korean>[CSW] M1 고폭탄</Korean>
<French>[CSW] M1 HE</French>
<German>[CSW] M1 HE</German>
<Spanish>[CSW] HE de M1</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M84Smoke_displayName">
<English>[CSW] M84 Smoke</English>
@ -50,6 +64,8 @@
<Russian>[CSW] M84 Дымовая</Russian>
<Korean>[CSW] M84 연막탄</Korean>
<French>[CSW] M84 Fumigène</French>
<German>[CSW] M84 Rauch</German>
<Spanish>[CSW] Humo M84</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M60A2_displayName">
<English>[CSW] M60A2 WP</English>
@ -57,6 +73,8 @@
<Russian>[CSW] M60A2 WP</Russian>
<Korean>[CSW] M60A2 백린연막탄</Korean>
<French>[CSW] M60A2 WP</French>
<German>[CSW] M60A2 WP</German>
<Spanish>[CSW] M60A2 WP</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M67AT_displayName">
<English>[CSW] M67 AT Laser Guided</English>
@ -64,6 +82,8 @@
<Russian>[CSW] M67 AT Laser Guided</Russian>
<Korean>[CSW] M67 레이저유도 대전차탄</Korean>
<French>[CSW] M67 AT Guidé laser</French>
<German>[CSW] M67 AT Lasergelenkt</German>
<Spanish>[CSW] AT Guiado por Láser M67</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M314Illum_displayName">
<English>[CSW] M314 Illumination</English>
@ -71,6 +91,8 @@
<Russian>[CSW] M314 Осветительная</Russian>
<Korean>[CSW] M314 조명탄</Korean>
<French>[CSW] M314 Illumination</French>
<German>[CSW] M314 Beleuchtung</German>
<Spanish>[CSW] Iluminación M314</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_3OF56_displayName">
<English>[CSW] 3OF56 HE</English>
@ -78,6 +100,8 @@
<Russian>[CSW] 3OF56 HE</Russian>
<Korean>[CSW] 3OF56 고폭탄</Korean>
<French>[CSW] 3OF56 HE</French>
<German>[CSW] 3OF56 HE</German>
<Spanish>[CSW] HE de 3OF56</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_3OF69M_displayName">
<English>[CSW] 3OF69M Laser Guided</English>
@ -85,6 +109,8 @@
<Russian>[CSW] 3OF69M Laser Guided</Russian>
<Korean>[CSW] 3OF69M 레이저유도탄</Korean>
<French>[CSW] 3OF69M Guidé laser</French>
<German>[CSW] 3OF69M Lasergelenkt</German>
<Spanish>[CSW] 3OF69M Guiado por Láser</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_122mmWP_displayName">
<English>[CSW] 122mm WP</English>
@ -92,6 +118,8 @@
<Russian>[CSW] 122mm WP</Russian>
<Korean>[CSW] 122mm 백린탄</Korean>
<French>[CSW] 122mm WP</French>
<German>[CSW] 122mm WP</German>
<Spanish>[CSW] WP de 122mm</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_122mmSmoke_displayName">
<English>[CSW] D-462 Smoke</English>
@ -99,6 +127,8 @@
<Russian>[CSW] D-462 Дымовая</Russian>
<Korean>[CSW] D-462 연막탄</Korean>
<French>[CSW] D-462 Fumigène</French>
<German>[CSW] D-462 Rauch</German>
<Spanish>[CSW] Humo D-462</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_122mmIllum_displayName">
<English>[CSW] S-463 Illumination</English>
@ -106,6 +136,8 @@
<Russian>[CSW] S-463 Осветительная</Russian>
<Korean>[CSW] S-463 조명탄</Korean>
<French>[CSW] S-463 Eclairante</French>
<German>[CSW] S-463 Beleuchtung</German>
<Spanish>[CSW] Iluminación S-463</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_122mmAT_displayName">
<English>[CSW] BK-6M HEAT</English>
@ -113,6 +145,8 @@
<Russian>[CSW] BK-6M HEAT</Russian>
<Korean>[CSW] BK-6M 대전차고폭탄</Korean>
<French>[CSW] BK-6M HEAT</French>
<German>[CSW] BK-6M HEAT</German>
<Spanish>[CSW] BK-6M HEAT</Spanish>
</Key>
</Package>
</Project>

View File

@ -10,36 +10,40 @@
<Korean>AN/PVS-14 (백색광)</Korean>
<French>AN/PVS-14 (WP)</French>
<Russian>AN/PVS-14 (БФ)</Russian>
<Spanish>AN/PVS-14 (WP)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS15_black_WP">
<English>AN/PVS-15 (Black, WP)</English>
<Japanese>AN/PVS-15 (グリーン, 白色蛍光)</Japanese>
<Italian>AN/PVS-15 (Verde, FB)</Italian>
<Polish>AN/PVS-15 (Zielone, WP)</Polish>
<German>AN/PVS-15 (grün, WP)</German>
<Korean>AN/PVS-15 (녹색, 백색광)</Korean>
<French>AN/PVS-15 (vertes, WP)</French>
<Russian>AN/PVS-15 (Чёрный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS15_green_WP">
<English>AN/PVS-15 (Green, WP)</English>
<Japanese>AN/PVS-15 (ブラック、白色蛍光)</Japanese>
<Italian>AN/PVS-15 (Nero, FB)</Italian>
<Polish>AN/PVS-15 (Czarne, WP)</Polish>
<German>AN/PVS-15 (Schwarz, WP)</German>
<Korean>AN/PVS-15 (검정, 백색광)</Korean>
<French>AN/PVS-15 (noires, WP)</French>
<French>AN/PVS-15 (Noires, WP)</French>
<Russian>AN/PVS-15 (Чёрный, БФ)</Russian>
<Spanish>AN/PVS-15 (Negras, WP)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS15_green_WP">
<English>AN/PVS-15 (Green, WP)</English>
<Japanese>AN/PVS-15 (グリーン, 白色蛍光)</Japanese>
<Italian>AN/PVS-15 (Verde, FB)</Italian>
<Polish>AN/PVS-15 (Zielone, WP)</Polish>
<German>AN/PVS-15 (Grün, WP)</German>
<Korean>AN/PVS-15 (녹색, 백색광)</Korean>
<French>AN/PVS-15 (Vertes, WP)</French>
<Russian>AN/PVS-15 (Зелёный, БФ)</Russian>
<Spanish>AN/PVS-15 (Verdes, WP)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS15_tan_WP">
<English>AN/PVS-15 (Tan, WP)</English>
<Japanese>AN/PVS-15 (タン, 白色蛍光)</Japanese>
<Italian>AN/PVS-15 (Marroncina, FB)</Italian>
<Polish>AN/PVS-15 (jasnobrązowa, WP)</Polish>
<German>AN/PVS-15 (hellbraun, WP)</German>
<Polish>AN/PVS-15 (Jasnobrązowa, WP)</Polish>
<German>AN/PVS-15 (Hellbraun, WP)</German>
<Korean>AN/PVS-15 (황갈색, 백색광)</Korean>
<French>AN/PVS-15 (marron clair, WP)</French>
<French>AN/PVS-15 (Marron clair, WP)</French>
<Russian>AN/PVS-15 (Желтовато-коричневый, БФ)</Russian>
<Spanish>AN/PVS-15 (Marrones, WP)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_PVS15_winter_WP">
<English>AN/PVS-15 (Winter, WP)</English>
@ -47,36 +51,41 @@
<Korean>AN/PVS-15 (설상, 백색광)</Korean>
<Russian>AN/PVS-15 (Белый, БФ)</Russian>
<French>AN/PVS-15 (Blanc, WP)</French>
<German>AN/PVS-15 (Winter, WP)</German>
<Spanish>AN/PVS-15 (Blancas, WP)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_black_WP">
<English>GPNVG (Black, WP)</English>
<Japanese>GPNVG (グリーン, 白色蛍光)</Japanese>
<Italian>GPNVG (Verde, FB)</Italian>
<Polish>GPNVG (Zielone, WP)</Polish>
<German>GPNVG (grün, WP)</German>
<Korean>GPNVG (녹색, 백색광)</Korean>
<French>GPNVG (vertes, WP)</French>
<Russian>GPNVG (Чёрный, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_tan_WP">
<English>GPNVG (Tan, WP)</English>
<Japanese>GPNVG (タン, 白色蛍光)</Japanese>
<Italian>GPNVG (Marroncina, FB)</Italian>
<Polish>GPNVG (jasnobrązowa, WP)</Polish>
<German>GPNVG (hellbraun, WP)</German>
<Korean>GPNVG (황갈색, 백색광)</Korean>
<French>GPNVG (marron clair, WP)</French>
<Russian>GPNVG (Желтовато-коричневый, БФ)</Russian>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_green_WP">
<English>GPNVG (Green, WP)</English>
<Japanese>GPNVG (ブラック、白色蛍光)</Japanese>
<Italian>GPNVG (Nero, FB)</Italian>
<Polish>GPNVG (Czarne, WP)</Polish>
<German>GPNVG (Schwarz, WP)</German>
<Korean>GPNVG (검정, 백색광)</Korean>
<French>GPNVG (noires, WP)</French>
<French>GPNVG (Noires, WP)</French>
<Russian>GPNVG (Чёрный, БФ)</Russian>
<Spanish>GPNVG (Negras, WP)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_tan_WP">
<English>GPNVG (Tan, WP)</English>
<Japanese>GPNVG (タン, 白色蛍光)</Japanese>
<Italian>GPNVG (Marroncina, FB)</Italian>
<Polish>GPNVG (Jasnobrązowa, WP)</Polish>
<German>GPNVG (Hellbraun, WP)</German>
<Korean>GPNVG (황갈색, 백색광)</Korean>
<French>GPNVG (Marron clair, WP)</French>
<Russian>GPNVG (Желтовато-коричневый, БФ)</Russian>
<Spanish>GPNVG (Marrones, WP)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_green_WP">
<English>GPNVG (Green, WP)</English>
<Japanese>GPNVG (グリーン, 白色蛍光)</Japanese>
<Italian>GPNVG (Verde, FB)</Italian>
<Polish>GPNVG (Zielone, WP)</Polish>
<German>GPNVG (Grün, WP)</German>
<Korean>GPNVG (녹색, 백색광)</Korean>
<French>GPNVG (Vertes, WP)</French>
<Russian>GPNVG (Зелёный, БФ)</Russian>
<Spanish>GPNVG (Verdes, WP)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_nightvision_CUP_NVG_GPNVG_winter_WP">
<English>GPNVG (Winter, WP)</English>
@ -84,6 +93,8 @@
<Korean>GPNVG (설상, 백색광)</Korean>
<Russian>AN/PVS-15 (Белый, БФ)</Russian>
<French>GPNVG (Blanc, WP)</French>
<German>GPNVG (Winter, WP)</German>
<Spanish>GPNVG (Blancas, WP)</Spanish>
</Key>
</Package>
</Project>

View File

@ -1,6 +0,0 @@
class CfgVehicles {
class gm_ural4320_base;
class gm_ural4320_refuel_base: gm_ural4320_base {
transportFuel = 0;
};
};

View File

@ -21,4 +21,3 @@ class CfgPatches {
};
#include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp"

View File

@ -0,0 +1 @@
z\ace\addons\compat_rf

View File

@ -0,0 +1,42 @@
class CfgWeapons {
// Ballistics
class Pistol_Base_F;
class hgun_Glock19_RF: Pistol_Base_F {
ace_barrelTwist = 254;
ace_barrelLength = 102;
ace_twistDirection = 1;
};
class hgun_DEagle_RF: Pistol_Base_F {
ace_barrelTwist = 482;
ace_barrelLength = 127;
ace_twistDirection = 1;
};
class Rifle_Long_Base_F;
class srifle_h6_base_rf: Rifle_Long_Base_F {
ace_barrelTwist = 228.6;
ace_barrelLength = 460;
ace_twistDirection = 1;
};
class Rifle_Base_F;
class arifle_ash12_base_RF: Rifle_Base_F {
ace_barrelTwist = 228.6;
ace_barrelLength = 400;
ace_twistDirection = 1;
};
class arifle_ash12_LR_base_RF: arifle_ash12_base_RF {
ace_barrelLength = 450;
};
// Hearing
class H_HelmetIA;
class H_HelmetIA_sb_arid_RF: H_HelmetIA {
ace_hearing_protection = 0.75;
};
class H_HelmetIA_sb_digital_RF: H_HelmetIA {
ace_hearing_protection = 0.75;
};
};

View File

@ -0,0 +1,12 @@
// Generated using ace_nouniformrestrictions_fnc_exportConfig
class CfgVehicles {
class B_Helipilot_F;
class C_Helipilot_Green_UniformHolder_RF;
class C_Helipilot_Rescue_UniformHolder_RF: B_Helipilot_F {
modelSides[] = {6};
};
class B_Helipilot_Green_UniformHolder_RF: C_Helipilot_Green_UniformHolder_RF {
modelSides[] = {6};
};
};

View File

@ -0,0 +1,21 @@
#include "script_component.hpp"
class CfgPatches {
class SUBADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {
"RF_Data_Loadorder",
"ace_nouniformrestrictions"
};
skipWhenMissingDependencies = 1;
author = ECSTRING(common,ACETeam);
authors[] = {"Mike"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgVehicles.hpp"

View File

@ -0,0 +1,3 @@
#define SUBCOMPONENT nouniformrestrictions
#define SUBCOMPONENT_BEAUTIFIED No Uniform Restrictions
#include "..\script_component.hpp"

View File

@ -0,0 +1,41 @@
class optic_MRD;
class optic_MRD_khk_RF: optic_MRD {
displayName = SUBCSTRING(optic_mrd_khk_Name);
};
class optic_MRD_tan_RF: optic_MRD {
displayName = SUBCSTRING(optic_mrd_tan_Name);
};
class optic_ACO_grn;
class optic_ACO_grn_desert_RF: optic_ACO_grn {
displayName = SUBCSTRING(optic_aco_grn_desert_Name);
};
class optic_ACO_grn_wood_RF: optic_ACO_grn {
displayName = SUBCSTRING(optic_aco_grn_wood_Name);
};
class optic_Aco;
class optic_ACO_desert_RF: optic_Aco {
displayName = SUBCSTRING(optic_aco_desert_Name);
};
class optic_ACO_wood_RF: optic_Aco {
displayName = SUBCSTRING(optic_aco_wood_Name);
};
class ItemCore;
class optic_rds_RF: ItemCore {
displayName = SUBCSTRING(optic_rds_Name);
};
class optic_VRCO_RF: ItemCore {
displayName = SUBCSTRING(optic_vrco_Name);
};
class optic_VRCO_tan_RF: optic_VRCO_RF {
displayName = SUBCSTRING(optic_vrco_tan_Name);
};
class optic_VRCO_khk_RF: optic_VRCO_RF {
displayName = SUBCSTRING(optic_vrco_khk_Name);
};
class optic_VRCO_pistol_RF: optic_VRCO_RF {
displayName = SUBCSTRING(optic_vrco_pistol_Name);
};

View File

@ -0,0 +1,24 @@
class CfgMagazines {
class CA_Magazine;
class 1Rnd_RC40_shell_RF: CA_Magazine {
displayName = SUBCSTRING(rc40_Name);
};
class 1Rnd_RC40_HE_shell_RF: 1Rnd_RC40_shell_RF {
displayName = SUBCSTRING(rc40_he_Name);
};
class 1Rnd_RC40_SmokeWhite_shell_RF: 1Rnd_RC40_shell_RF {
displayName = SUBCSTRING(rc40_white_Name);
};
class 1Rnd_RC40_SmokeBlue_shell_RF: 1Rnd_RC40_shell_RF {
displayName = SUBCSTRING(rc40_blue_Name);
};
class 1Rnd_RC40_SmokeRed_shell_RF: 1Rnd_RC40_shell_RF {
displayName = SUBCSTRING(rc40_red_Name);
};
class 1Rnd_RC40_SmokeGreen_shell_RF: 1Rnd_RC40_shell_RF {
displayName = SUBCSTRING(rc40_green_Name);
};
class 1Rnd_RC40_SmokeOrange_shell_RF: 1Rnd_RC40_shell_RF {
displayName = SUBCSTRING(rc40_orange_Name);
};
};

View File

@ -0,0 +1,134 @@
class CfgVehicles {
class Heli_light_03_dynamicLoadout_base_F;
class B_Heli_light_03_dynamicLoadout_RF: Heli_light_03_dynamicLoadout_base_F {
displayName = SUBCSTRING(heli_light_03_Name);
};
class Heli_light_03_unarmed_base_F;
class B_Heli_light_03_unarmed_RF: Heli_light_03_unarmed_base_F {
displayName = SUBCSTRING(heli_light_03_unarmed_Name);
};
class I_Heli_light_03_dynamicLoadout_RF;
class I_E_Heli_light_03_dynamicLoadout_RF: I_Heli_light_03_dynamicLoadout_RF {
displayName = SUBCSTRING(heli_light_03_Name);
};
class I_Heli_light_03_unarmed_RF;
class I_E_Heli_light_03_unarmed_RF: I_Heli_light_03_unarmed_RF {
displayName = SUBCSTRING(heli_light_03_unarmed_Name);
};
class Heli_EC_01A_base_RF;
class Heli_EC_01A_military_base_RF: Heli_EC_01A_base_RF {
displayName = SUBCSTRING(ec_01a_military_Name);
};
class Helicopter_Base_H;
class Heli_EC_01_base_RF: Helicopter_Base_H {
displayName = SUBCSTRING(ec_01_base_Name);
};
class Heli_EC_01_civ_base_RF: Heli_EC_01_base_RF {
displayName = SUBCSTRING(ec_01_Name);
};
class Heli_EC_01A_civ_base_RF: Heli_EC_01A_base_RF {
displayName = SUBCSTRING(ec_01a_Name);
};
class Heli_EC_02_base_RF: Heli_EC_01_base_RF {
displayName = SUBCSTRING(ec_02_Name);
};
class Heli_EC_03_base_RF: Heli_EC_01_base_RF {
displayName = SUBCSTRING(ec_03_Name);
};
class Heli_EC_04_base_RF: Heli_EC_01_base_RF {
displayName = SUBCSTRING(ec_04_Name);
};
// Typhoon
class O_Truck_03_fuel_F;
class C_Truck_03_water_rf: O_Truck_03_fuel_F {
displayName = SUBCSTRING(truck_03_water_Name);
};
// RAM 1500 (Pickup)
class Offroad_01_unarmed_base_F;
class Pickup_01_base_rf: Offroad_01_unarmed_base_F {
displayName = SUBCSTRING(pickup_01_Name);
};
class Pickup_fuel_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_fuel_Name);
};
class Pickup_service_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_service_Name);
};
class Pickup_repair_base_rf: Pickup_service_base_rf {
displayName = SUBCSTRING(pickup_01_repair_Name);
};
class Pickup_comms_base_rf: Pickup_service_base_rf {
displayName = SUBCSTRING(pickup_01_comms_Name);
};
class Pickup_repair_ig_base_rf: Pickup_repair_base_rf {
displayName = SUBCSTRING(pickup_01_repair_Name);
};
class Pickup_01_hmg_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_hmg_Name);
};
class Pickup_01_mmg_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_mmg_Name);
};
class Pickup_01_mrl_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_mrl_Name);
};
class Pickup_01_aat_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_aa_Name);
};
class Pickup_covered_base_rf: Pickup_service_base_rf {
displayName = SUBCSTRING(pickup_01_covered_Name);
};
class C_IDAP_Pickup_rf;
class C_IDAP_Pickup_water_rf: C_IDAP_Pickup_rf {
displayName = SUBCSTRING(pickup_01_water_Name);
};
class StaticMortar;
class CommandoMortar_base_RF: StaticMortar {
displayName = SUBCSTRING(commando_Name);
};
class StaticMGWeapon;
class TwinMortar_base_RF: StaticMGWeapon {
displayName = SUBCSTRING(twinmortar_Name);
};
class Helicopter_Base_F;
class UAV_RC40_Base_RF: Helicopter_Base_F {
displayName = SUBCSTRING(rc40_base_Name);
};
class UAV_RC40_Base_Sensor_RF: UAV_RC40_Base_RF {
displayName = SUBCSTRING(rc40_Name);
};
class UAV_RC40_Base_HE_RF: UAV_RC40_Base_RF {
displayName = SUBCSTRING(rc40_he_Name);
};
class UAV_RC40_Base_SmokeWhite_RF: UAV_RC40_Base_HE_RF {
displayName = SUBCSTRING(rc40_white_Name);
};
class UAV_RC40_Base_SmokeBlue_RF: UAV_RC40_Base_HE_RF {
displayName = SUBCSTRING(rc40_blue_Name);
};
class UAV_RC40_Base_SmokeRed_RF: UAV_RC40_Base_HE_RF {
displayName = SUBCSTRING(rc40_red_Name);
};
class UAV_RC40_Base_SmokeGreen_RF: UAV_RC40_Base_HE_RF {
displayName = SUBCSTRING(rc40_green_Name);
};
class UAV_RC40_Base_SmokeOrange_RF: UAV_RC40_Base_HE_RF {
displayName = SUBCSTRING(rc40_orange_Name);
};
};

View File

@ -0,0 +1,111 @@
class CfgWeapons {
#include "Attachments.hpp"
class Pistol_Base_F;
class hgun_Glock19_RF: Pistol_Base_F {
displayName = SUBCSTRING(glock19_Name);
};
class hgun_Glock19_khk_RF: hgun_Glock19_RF {
displayName = SUBCSTRING(glock19_khk_Name);
};
class hgun_Glock19_Tan_RF: hgun_Glock19_RF {
displayName = SUBCSTRING(glock19_tan_Name);
};
class hgun_Glock19_auto_RF: hgun_Glock19_RF {
displayName = SUBCSTRING(glock19_auto_Name);
};
class hgun_Glock19_auto_khk_RF: hgun_Glock19_auto_RF {
displayName = SUBCSTRING(glock19_auto_khk_Name);
};
class hgun_Glock19_auto_Tan_RF: hgun_Glock19_auto_RF {
displayName = SUBCSTRING(glock19_auto_tan_Name);
};
class hgun_DEagle_RF: Pistol_Base_F {
displayName = SUBCSTRING(deagle_Name);
};
class hgun_DEagle_classic_RF: hgun_DEagle_RF {
displayName = SUBCSTRING(deagle_classic_Name);
};
class hgun_DEagle_bronze_RF: hgun_DEagle_RF {
displayName = SUBCSTRING(deagle_bronze_Name);
};
class hgun_DEagle_copper_RF: hgun_DEagle_RF {
displayName = SUBCSTRING(deagle_copper_Name);
};
class hgun_DEagle_gold_RF: hgun_DEagle_RF {
displayName = SUBCSTRING(deagle_gold_Name);
};
class srifle_h6_base_rf;
class srifle_h6_tan_rf: srifle_h6_base_rf {
displayName = SUBCSTRING(h6_tan_Name);
};
class srifle_h6_oli_rf: srifle_h6_tan_rf {
displayName = SUBCSTRING(h6_oli_Name);
};
class srifle_h6_blk_rf: srifle_h6_tan_rf {
displayName = SUBCSTRING(h6_blk_Name);
};
class srifle_h6_digi_rf: srifle_h6_tan_rf {
displayName = SUBCSTRING(h6_digi_Name);
};
class srifle_h6_gold_rf: srifle_h6_tan_rf {
displayName = SUBCSTRING(h6_gold_Name);
};
class srifle_DMR_01_F;
class srifle_DMR_01_black_RF: srifle_DMR_01_F {
displayName = SUBCSTRING(dmr_01_black_Name);
};
class srifle_DMR_01_tan_RF: srifle_DMR_01_black_RF {
displayName = SUBCSTRING(dmr_01_tan_Name);
};
class SMG_01_F;
class SMG_01_black_RF: SMG_01_F {
displayName = SUBCSTRING(smg_01_black_Name);
};
class arifle_ash12_base_RF;
class arifle_ash12_blk_RF: arifle_ash12_base_RF {
displayName = SUBCSTRING(ash12_blk_Name);
};
class arifle_ash12_desert_RF: arifle_ash12_base_RF {
displayName = SUBCSTRING(ash12_desert_Name);
};
class arifle_ash12_urban_RF: arifle_ash12_base_RF {
displayName = SUBCSTRING(ash12_urban_Name);
};
class arifle_ash12_wood_RF: arifle_ash12_base_RF {
displayName = SUBCSTRING(ash12_wood_Name);
};
class arifle_ash12_GL_base_RF;
class arifle_ash12_GL_blk_RF: arifle_ash12_GL_base_RF {
displayName = SUBCSTRING(ash12_gl_blk_Name);
};
class arifle_ash12_GL_desert_RF: arifle_ash12_GL_blk_RF {
displayName = SUBCSTRING(ash12_gl_desert_Name);
};
class arifle_ash12_GL_urban_RF: arifle_ash12_GL_blk_RF {
displayName = SUBCSTRING(ash12_gl_urban_Name);
};
class arifle_ash12_GL_wood_RF: arifle_ash12_GL_blk_RF {
displayName = SUBCSTRING(ash12_gl_wood_Name);
};
class arifle_ash12_LR_base_RF;
class arifle_ash12_LR_blk_RF: arifle_ash12_LR_base_RF {
displayName = SUBCSTRING(ash12_lr_blk_Name);
};
class arifle_ash12_LR_desert_RF: arifle_ash12_LR_blk_RF {
displayName = SUBCSTRING(ash12_lr_desert_Name);
};
class arifle_ash12_LR_urban_RF: arifle_ash12_LR_blk_RF {
displayName = SUBCSTRING(ash12_lr_urban_Name);
};
class arifle_ash12_LR_wood_RF: arifle_ash12_LR_blk_RF {
displayName = SUBCSTRING(ash12_lr_wood_Name);
};
};

View File

@ -0,0 +1,23 @@
#include "script_component.hpp"
class CfgPatches {
class SUBADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {
"RF_Data_Loadorder",
"ace_realisticnames"
};
skipWhenMissingDependencies = 1;
author = ECSTRING(common,ACETeam);
authors[] = {"Mike", "Marc"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgMagazines.hpp"
#include "CfgWeapons.hpp"
#include "CfgVehicles.hpp"

View File

@ -0,0 +1,3 @@
#define SUBCOMPONENT realisticnames
#define SUBCOMPONENT_BEAUTIFIED Realistic Names
#include "..\script_component.hpp"

View File

@ -0,0 +1,297 @@
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Compat_RF_RealisticNames">
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_mrd_khk_Name">
<English>EOTech MRDS (Khaki)</English>
<Japanese>EOTech MRDS (カーキ)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_mrd_tan_Name">
<English>EOTech MRDS (Tan)</English>
<Japanese>EOTech MRDS (タン)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_aco_grn_desert_Name">
<English>C-More Railway (Green, Desert)</English>
<Japanese>C-More レイルウェイ (グリーン、砂漠迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_aco_grn_wood_Name">
<English>C-More Railway (Green, Woodland)</English>
<Japanese>C-More レイルウェイ (グリーン、森林迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_aco_desert_Name">
<English>C-More Railway (Red, Desert)</English>
<Japanese>C-More レイルウェイ (グリーン、砂漠迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_aco_wood_Name">
<English>C-More Railway (Red, Woodland)</English>
<Japanese>C-More レイルウェイ (グリーン、森林迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_rds_Name">
<English>Aimpoint Micro R-1</English>
<Japanese>Aimpoint マイクロ R-1</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_vrco_Name">
<English>Vortex Spitfire Prism</English>
<Japanese>Vortex スピットファイア プリズム</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_vrco_tan_Name">
<English>Vortex Spitfire Prism (Tan)</English>
<Japanese>Vortex スピットファイア プリズム (タン)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_vrco_khk_Name">
<English>Vortex Spitfire Prism (Khaki)</English>
<Japanese>Vortex スピットファイア プリズム (カーキ)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_optic_vrco_pistol_Name">
<English>Vortex Spitfire Prism (Pistol)</English>
<Japanese>Vortex スピットファイア プリズム (ピストル用)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_glock19_Name">
<English>Glock 19X</English>
<Japanese>グロック 19X</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_glock19_khk_Name">
<English>Glock 19X (Khaki)</English>
<Japanese>グロック 19X (カーキ)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_glock19_tan_Name">
<English>Glock 19X (Tan)</English>
<Japanese>グロック 19X (タン)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_glock19_auto_Name">
<English>Glock 19X Auto</English>
<Japanese>グロック 19X オート</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_glock19_auto_khk_Name">
<English>Glock 19X Auto (Khaki)</English>
<Japanese>グロック 19X オート (カーキ)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_glock19_auto_tan_Name">
<English>Glock 19X Auto (Tan)</English>
<Japanese>グロック 19X オート (タン)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_deagle_Name">
<English>Desert Eagle Mark XIX L5</English>
<Japanese>デザートイーグル Mark XIX L5</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_deagle_classic_Name">
<English>Desert Eagle Mark XIX L5 (Classic)</English>
<Japanese>デザートイーグル Mark XIX L5 (クラシック)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_deagle_bronze_Name">
<English>Desert Eagle Mark XIX L5 (Bronze)</English>
<Japanese>デザートイーグル Mark XIX L5 (ブロンズ)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_deagle_copper_Name">
<English>Desert Eagle Mark XIX L5 (Copper)</English>
<Japanese>デザートイーグル Mark XIX L5 (カッパー)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_deagle_gold_Name">
<English>Desert Eagle Mark XIX L5 (Gold)</English>
<Japanese>デザートイーグル Mark XIX L5 (ゴールド)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_h6_tan_Name">
<English>Hera H6 (Tan)</English>
<Japanese>ヘラ H6 (タン)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_h6_oli_Name">
<English>Hera H6 (Olive)</English>
<Japanese>ヘラ H6 (オリーブ)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_h6_blk_Name">
<English>Hera H6 (Black)</English>
<Japanese>ヘラ H6 (ブラック)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_h6_digi_Name">
<English>Hera H6 (Digital)</English>
<Japanese>ヘラ H6 (AAF迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_h6_gold_Name">
<English>Hera H6 (Gold)</English>
<Japanese>ヘラ H6 (ゴールド)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_dmr_01_black_Name">
<English>VS-121 (Black)</English>
<Japanese>VS-121 (ブラック)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_dmr_01_tan_Name">
<English>VS-121 (Tan)</English>
<Japanese>VS-121 (タン)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_smg_01_black_Name">
<English>Vector SMG (Black)</English>
<Japanese>ベクター SMG (ブラック)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_blk_Name">
<English>ASh-12 (Black)</English>
<Japanese>ASh-12 (ブラック)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_desert_Name">
<English>ASh-12 (Desert)</English>
<Japanese>ASh-12 (砂漠迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_urban_Name">
<English>ASh-12 (Urban)</English>
<Japanese>ASh-12 (市街地迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_wood_Name">
<English>ASh-12 (Woodland)</English>
<Japanese>ASh-12 (森林迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_gl_blk_Name">
<English>ASh-12 GL (Black)</English>
<Japanese>ASh-12 GL (ブラック)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_gl_desert_Name">
<English>ASh-12 GL (Desert)</English>
<Japanese>ASh-12 GL (砂漠迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_gl_urban_Name">
<English>ASh-12 GL (Urban)</English>
<Japanese>ASh-12 GL (市街地迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_gl_wood_Name">
<English>ASh-12 GL (Woodland)</English>
<Japanese>ASh-12 GL (森林迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_lr_blk_Name">
<English>ASh-12 LR (Black)</English>
<Japanese>ASh-12 LR (ブラック)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_lr_desert_Name">
<English>ASh-12 LR (Desert)</English>
<Japanese>ASh-12 LR (砂漠迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_lr_urban_Name">
<English>ASh-12 LR (Urban)</English>
<Japanese>ASh-12 LR (市街地迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ash12_lr_wood_Name">
<English>ASh-12 LR (Woodland)</English>
<Japanese>ASh-12 LR (森林迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_heli_light_03_Name">
<English>AW159 Wildcat</English>
<Japanese>AW159 ワイルドキャット</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_heli_light_03_unarmed_Name">
<English>AW159 Wildcat (Unarmed)</English>
<Japanese>AW159 ワイルドキャット (非武装)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ec_01a_military_Name">
<English>H225M Super Cougar HADR</English>
<Japanese>H225M シュペル クーガー HADR</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ec_01_base_Name">
<English>H225M Super Cougar Transport</English>
<Japanese>H225M シュペル クーガー 輸送</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ec_01_Name">
<English>H225 Super Puma Transport</English>
<Japanese>H225 シュペル ピューマ 輸送</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ec_01a_Name">
<English>H225 Super Puma VIP</English>
<Japanese>H225 シュペル ピューマ VIP</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ec_02_Name">
<English>H225M Super Cougar SOCAT</English>
<Japanese>H225M シュペル クーガー SOCAT</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ec_03_Name">
<English>H225M Super Cougar CSAR</English>
<Japanese>H225M シュペル クーガー CSAR</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_ec_04_Name">
<English>H225 Super Puma SAR</English>
<Japanese>H225 シュペル ピューマ SAR</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_truck_03_water_Name">
<English>Typhoon Water</English>
<Japanese>タイフーン 給水</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_Name">
<English>Ram 1500</English>
<Japanese>ラム 1500</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_Fuel_Name">
<English>Ram 1500 (Fuel)</English>
<Japanese>ラム 1500 (燃料)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_service_Name">
<English>Ram 1500 (Services)</English>
<Japanese>ラム 1500 (サービス)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_repair_Name">
<English>Ram 1500 (Repair)</English>
<Japanese>ラム 1500 (修理)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_comms_Name">
<English>Ram 1500 (Comms)</English>
<Japanese>ラム 1500 (通信)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_hmg_Name">
<English>Ram 1500 (HMG)</English>
<Japanese>ラム 1500 (HMG)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_mmg_Name">
<English>Ram 1500 (MMG)</English>
<Japanese>ラム 1500 (MMG)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_mrl_Name">
<English>Ram 1500 (MRL)</English>
<Japanese>ラム 1500 (MRL)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_aa_Name">
<English>Ram 1500 (AA)</English>
<Japanese>ラム 1500 (対空)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_covered_Name">
<English>Ram 1500 (Covered)</English>
<Japanese>ラム 1500 (カバー)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_pickup_01_water_Name">
<English>Ram 1500 (Water)</English>
<Japanese>ラム 1500 (給水)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_commando_Name">
<English>RSG60</English>
<Japanese>RSG60</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_twinmortar_Name">
<English>AMOS</English>
<Japanese>AMOS</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_rc40_base_Name">
<English>Drone40</English>
<Japanese>ドローン40</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_rc40_Name">
<English>Drone40 Scout</English>
<Japanese>ドローン40 偵察型</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_rc40_he_Name">
<English>Drone40 HE</English>
<Japanese>ドローン40 榴弾</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_rc40_white_Name">
<English>Drone40 Smoke (White)</English>
<Japanese>ドローン40 発煙弾 (白)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_rc40_blue_Name">
<English>Drone40 Smoke (Blue)</English>
<Japanese>ドローン40 発煙弾 (青)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_rc40_red_Name">
<English>Drone40 Smoke (Red)</English>
<Japanese>ドローン40 発煙弾 (赤)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_rc40_green_Name">
<English>Drone40 Smoke (Green)</English>
<Japanese>ドローン40 発煙弾 (緑)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_RF_RealisticNames_rc40_orange_Name">
<English>Drone40 Smoke (Orange)</English>
<Japanese>ドローン40 発煙弾 (橙)</Japanese>
</Key>
</Package>
</Project>

View File

@ -0,0 +1,18 @@
#include "script_component.hpp"
class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"RF_Data_Loadorder"};
skipWhenMissingDependencies = 1;
author = ECSTRING(common,ACETeam);
authors[] = {"Mike"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgWeapons.hpp"

View File

@ -0,0 +1,6 @@
#define COMPONENT compat_rf
#define COMPONENT_BEAUTIFIED Reaction Forces Compatibility
#include "\z\ace\addons\main\script_mod.hpp"
#include "\z\ace\addons\main\script_macros.hpp"

View File

@ -219,6 +219,10 @@ class CfgAmmo {
EGVAR(frag,force) = 0;
};
class SmokeShell;
class rhs_ammo_rdg2_white: SmokeShell {
EGVAR(grenades,rollVectorDirAndUp)[] = {{0, 1, 0}, {0, 0, 1}};
};
class Sh_125mm_APFSDS;
class Sh_125mm_HE;

View File

@ -1,10 +0,0 @@
class CfgVehicles {
class RHS_Ural_Support_MSV_Base_01;
class RHS_Ural_Fuel_MSV_01: RHS_Ural_Support_MSV_Base_01 {
transportFuel = 0;
};
class rhs_kraz255b1_base;
class rhs_kraz255b1_fuel_base: rhs_kraz255b1_base {
transportFuel = 0;
};
};

View File

@ -18,4 +18,4 @@ class CfgPatches {
};
};
#include "CfgVehicles.hpp"
// ADDON kept for backward compatiblity

View File

@ -1,15 +0,0 @@
class CfgVehicles {
class rhsusf_M1078A1P2_B_M2_fmtv_usarmy;
class rhsusf_M1078A1R_SOV_M2_D_fmtv_socom: rhsusf_M1078A1P2_B_M2_fmtv_usarmy {
transportFuel = 0;
};
class rhsusf_M977A4_usarmy_wd;
class rhsusf_M978A4_usarmy_wd: rhsusf_M977A4_usarmy_wd {
transportFuel = 0;
};
class rhsusf_M978A4_BKIT_usarmy_wd: rhsusf_M977A4_usarmy_wd {
transportFuel = 0;
};
};

View File

@ -21,4 +21,3 @@ class CfgPatches {
};
#include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp"

View File

@ -4,6 +4,13 @@ class vn_molotov_grenade_ammo: vn_grenadehand {
EGVAR(frag,enabled) = 0;
};
class vn_t67_grenade_ammo: vn_grenadehand {
EGVAR(grenades,rollVectorDirAndUp)[] = {{-1, 0, 0}, {0, 0, 1}};
};
class vn_chicom_grenade_ammo: vn_grenadehand {
EGVAR(grenades,rollVectorDirAndUp)[] = {{1, 0, 0}, {0, 0, 1}};
};
class SmokeShell;
class vn_m14_grenade_ammo: SmokeShell {
EGVAR(grenades,incendiary) = 1;

View File

@ -32,6 +32,16 @@ class Extended_InitPost_EventHandlers {
init = QUOTE((_this select 0) setMass 1e-12);
};
};
class Land_vn_canisterfuel_f {
class ADDON {
init = QUOTE(call (missionNamespace getVariable [ARR_2(QQEFUNC(refuel,makeJerryCan),{})]));
};
};
class Land_vn_fuelcan {
class ADDON {
init = QUOTE(call (missionNamespace getVariable [ARR_2(QQEFUNC(refuel,makeJerryCan),{})]));
};
};
class vn_bicycle_base {
class ADDON {
init = QUOTE(call FUNC(disableCookoff));

View File

@ -1,18 +1,19 @@
#define XEH_INHERITED class EventHandlers {class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {};}
// fuel pumps
class Land_vn_commercial_base;
class Land_vn_fuelstation_01_pump_f: Land_vn_commercial_base {
transportFuel = 0;
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{0, 0.4, -0.5}, {0, -0.4, -0.5}};
EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL;
};
class Land_vn_fuelstation_02_pump_f: Land_vn_commercial_base {
transportFuel = 0;
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{0, 0.4, -0.5}, {0, -0.4, -0.5}};
EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL;
};
class Land_vn_fuelstation_feed_f: Land_vn_commercial_base {
transportFuel = 0;
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{0, 0.4, -0.5}, {0, -0.4, -0.5}};
EGVAR(refuel,fuelCargo) = REFUEL_INFINITE_FUEL;
};
@ -20,13 +21,47 @@ class Land_vn_fuelstation_feed_f: Land_vn_commercial_base {
// fuel objects
class Land_vn_building_b_base;
class Land_vn_usaf_fueltank_75_01: Land_vn_building_b_base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{0, -0.4, -0.5}};
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{-2.52, -2.2, -2.05}, {2.5, 0, -1.3}};
EGVAR(refuel,fuelCargo) = 2840; // 750 * 3.785
};
class Land_vn_b_prop_fuelbladder_01: Land_vn_usaf_fueltank_75_01 {
EGVAR(refuel,hooks)[] = {{-1.75, -6.7, -1}};
EGVAR(refuel,fuelCargo) = 3785; // 1000 * 3.785
};
class Land_vn_b_prop_fuelbladder_03: Land_vn_b_prop_fuelbladder_01 {
EGVAR(refuel,hooks)[] = {{-1.55, -6.5, -1}};
};
class Land_vn_building_industrial_base;
class Land_vn_fuel_tank_stairs: Land_vn_building_industrial_base {
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{0, 0.4, -1.3}, {0, -0.4, -1.3}};
EGVAR(refuel,fuelCargo) = 10000; // reference is B_Slingload_01_Fuel_F
};
class Land_vn_object_b_base;
class Land_vn_b_prop_fueldrum_01: Land_vn_object_b_base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{0, 0, 0.5}}; // reference is Land_FlexibleTank_01_F
XEH_INHERITED;
EGVAR(refuel,hooks)[] = {{0, 0, 0}};
EGVAR(refuel,fuelCargo) = 300; // reference is Land_FlexibleTank_01_F
};
class Land_vn_b_prop_fueldrum_02: Land_vn_b_prop_fueldrum_01 {
EGVAR(refuel,hooks)[] = {{0, -1.3, -0.15}, {2.3, 1.25, -0.15}};
EGVAR(refuel,fuelCargo) = 14100; // (23 + 24) * 300
};
class vn_b_ammobox_supply_07;
class vn_b_ammobox_supply_09: vn_b_ammobox_supply_07 { // just a pallet
XEH_INHERITED;
};
class vn_object_c_base_02;
class Land_vn_canisterfuel_f: vn_object_c_base_02 {
EGVAR(cargo,size) = 1;
EGVAR(cargo,canLoad) = 1;
EGVAR(cargo,noRename) = 1;
};
class Land_vn_object_c_base;
class Land_vn_fuelcan: Land_vn_object_c_base {
XEH_INHERITED;
EGVAR(cargo,size) = 1;
EGVAR(cargo,canLoad) = 1;
EGVAR(cargo,noRename) = 1;
};

View File

@ -5,7 +5,6 @@ class vn_wheeled_m54_base: vn_wheeled_truck_base {
};
class vn_wheeled_m54_cab_base;
class vn_wheeled_m54_fuel_base: vn_wheeled_m54_cab_base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{-1.15, -2.3, 0.28}};
EGVAR(refuel,fuelCargo) = 4542;
};
@ -25,7 +24,6 @@ class vn_wheeled_z157_base: vn_wheeled_truck_base {
EGVAR(refuel,fuelCapacity) = 150;
};
class vn_wheeled_z157_fuel_base: vn_wheeled_z157_base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{-1.36, -3.575, -0.4}};
EGVAR(refuel,fuelCargo) = 4000;
};

View File

@ -1,5 +1,4 @@
#include "script_component.hpp"
// ToDo: move refuel to subconfig
#include "\z\ace\addons\refuel\defines.hpp"
#include "\z\ace\addons\hearing\script_macros_hearingProtection.hpp"
@ -47,6 +46,8 @@ class CfgPatches {
};
};
class CBA_Extended_EventHandlers;
#include "ACE_CSW_Groups.hpp"
#include "ACE_Medical_Injuries.hpp"
#include "ACE_Triggers.hpp"

View File

@ -1,13 +1,11 @@
class CfgVehicles {
class SPE_Halftrack_base;
class SPE_US_M3_Halftrack_Fuel: SPE_Halftrack_base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{-0.23,-2.58,-0.59}};
EGVAR(refuel,fuelCargo) = 2000;
};
class SPE_OpelBlitz_base;
class SPE_OpelBlitz_Fuel: SPE_OpelBlitz_base {
transportFuel = 0;
EGVAR(refuel,hooks)[] = {{-0.23,-2.58,-0.59}};
EGVAR(refuel,fuelCargo) = 2000;
};

View File

@ -37,6 +37,11 @@ class CfgWeapons {
ACE_twistDirection = 1;
};
class arifle_SLR_V_lxWS;
class arifle_SLR_Para_lxWS: arifle_SLR_V_lxWS {
ACE_barrelLength = 266.7;
};
// Velko R4/R5
class arifle_Velko_base_lxWS: arifle_Galat_base_lxWS {
ACE_barrelLength = 460;

View File

@ -0,0 +1,75 @@
class optic_Arco;
class optic_arco_hex_lxWS: optic_Arco {
displayName = SUBCSTRING(arco_hex_Name);
};
class optic_Holosight;
class optic_Holosight_snake_lxWS: optic_Holosight {
displayName = SUBCSTRING(holosight_snake_Name);
};
class optic_Holosight_smg;
class optic_Holosight_smg_snake_lxWS: optic_Holosight_smg {
displayName = SUBCSTRING(holosight_snake_smg_Name);
};
class optic_Hamr;
class optic_Hamr_arid_lxWS: optic_Hamr {
displayName = SUBCSTRING(hamr_arid_Name);
};
class optic_Hamr_lush_lxWS: optic_Hamr {
displayName = SUBCSTRING(hamr_lush_Name);
};
class optic_Hamr_sand_lxWS: optic_Hamr {
displayName = SUBCSTRING(hamr_sand_Name);
};
class optic_Hamr_snake_lxWS: optic_Hamr {
displayName = SUBCSTRING(hamr_snake_Name);
};
class ItemCore;
class optic_r1_high_lxWS: ItemCore {
displayName = SUBCSTRING(r1_high_black_Name);
};
class optic_r1_high_khaki_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_high_khaki_Name);
};
class optic_r1_high_sand_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_high_sand_Name);
};
class optic_r1_high_snake_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_high_snake_Name);
};
class optic_r1_high_arid_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_high_arid_Name);
};
class optic_r1_high_lush_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_high_lush_Name);
};
class optic_r1_high_black_sand_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_high_black_sand_Name);
};
class optic_r1_low_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_low_black_Name);
};
class optic_r1_low_khaki_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_low_khaki_Name);
};
class optic_r1_low_sand_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_low_sand_Name);
};
class optic_r1_low_snake_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_low_snake_Name);
};
class optic_r1_low_arid_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_low_arid_Name);
};
class optic_r1_low_lush_lxWS: optic_r1_high_lxWS {
displayName = SUBCSTRING(r1_low_lush_Name);
};
class optic_DMS;
class optic_DMS_snake_lxWS: optic_DMS {
displayName = SUBCSTRING(dms_snake_Name);
};

View File

@ -0,0 +1,60 @@
class CfgVehicles {
class APC_Wheeled_01_base_F;
class APC_Wheeled_01_atgm_base_lxWS: APC_Wheeled_01_base_F {
displayName = SUBCSTRING(apc_wheeled_01_atgm_Name);
};
class APC_Wheeled_01_command_base_lxWS: APC_Wheeled_01_base_F {
displayName = SUBCSTRING(apc_wheeled_01_command_Name);
};
class APC_Wheeled_01_mortar_base_lxWS: APC_Wheeled_01_base_F {
displayName = SUBCSTRING(apc_wheeled_01_mortar_Name);
};
class Truck_02_base_F;
class Truck_02_aa_base_lxWS: Truck_02_base_F {
displayName = SUBCSTRING(truck_02_aa_Name);
};
class Truck_02_cargo_base_lxWS: Truck_02_base_F {
displayName = SUBCSTRING(truck_02_cargo_Name);
};
class Truck_02_box_base_lxWS: Truck_02_base_F {
displayName = SUBCSTRING(truck_02_repair_Name);
};
class C_Truck_02_racing_lxWS: Truck_02_box_base_lxWS {
displayName = SUBCSTRING(truck_02_racing_Name);
};
class Truck_02_Ammo_base_lxWS: Truck_02_base_F {
displayName = SUBCSTRING(truck_02_ammo_Name);
};
class Truck_02_flatbed_base_lxWS: Truck_02_cargo_base_lxWS {
displayName = SUBCSTRING(truck_02_flatbed_Name);
};
class Heli_Transport_02_base_F;
class B_UN_Heli_Transport_02_lxWS: Heli_Transport_02_base_F {
displayName = SUBCSTRING(heli_transport_02_Name);
};
class O_APC_Tracked_02_cannon_F;
class O_APC_Tracked_02_30mm_lxWS: O_APC_Tracked_02_cannon_F {
displayName = SUBCSTRING(apc_tracked_02_Name);
};
class APC_Wheeled_02_base_v2_F;
class APC_Wheeled_02_hmg_base_lxws: APC_Wheeled_02_base_v2_F {
displayName = SUBCSTRING(apc_wheeled_02_hmg_Name);
};
class APC_Wheeled_02_unarmed_base_lxws: APC_Wheeled_02_base_v2_F {
displayName = SUBCSTRING(apc_wheeled_02_unarmed_Name);
};
class O_Heli_Light_02_dynamicLoadout_F;
class B_ION_Heli_Light_02_dynamicLoadout_lxWS: O_Heli_Light_02_dynamicLoadout_F {
displayName = SUBCSTRING(heli_light_02_armed_Name);
};
class O_Heli_Light_02_unarmed_F;
class B_ION_Heli_Light_02_unarmed_lxWS: O_Heli_Light_02_unarmed_F {
displayName = SUBCSTRING(heli_light_02_unarmed_Name);
};
};

View File

@ -1,4 +1,6 @@
class CfgWeapons {
#include "Attachments.hpp"
// AA12
class sgun_aa40_base_lxWS;
class sgun_aa40_lxWS: sgun_aa40_base_lxWS {
@ -99,6 +101,12 @@ class CfgWeapons {
class arifle_SLR_V_camo_lxWS: arifle_SLR_V_lxWS {
displayName = SUBCSTRING(SLR_Camo_Name);
};
class arifle_SLR_Para_lxWS: arifle_SLR_V_lxWS {
displayName = SUBCSTRING(SLR_Para_Name);
};
class arifle_SLR_Para_snake_lxWS: arifle_SLR_Para_lxWS {
displayName = SUBCSTRING(SLR_Para_Snake_Name);
};
// Vektor R4/R5
class arifle_Velko_base_lxWS;
@ -156,4 +164,16 @@ class CfgWeapons {
class arifle_XMS_M_Sand_lxWS: arifle_XMS_M_lxWS {
displayName = SUBCSTRING(XMS_SW_Sand_Name);
};
// GM6 Lynx
class srifle_GM6_F;
class srifle_GM6_snake_lxWS: srifle_GM6_F {
displayName = SUBCSTRING(gm6_snake_Name);
};
// RPG-32
class launch_RPG32_F;
class launch_RPG32_tan_lxWS: launch_RPG32_F {
displayName = SUBCSTRING(rpg32_tan_Name);
};
};

View File

@ -19,3 +19,4 @@ class CfgPatches {
};
#include "CfgWeapons.hpp"
#include "CfgVehicles.hpp"

View File

@ -9,6 +9,7 @@
<Japanese>AA12</Japanese>
<Russian>AA12</Russian>
<French>AA12</French>
<Spanish>AA12</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_AA40_Tan_Name">
<English>AA12 (Sand)</English>
@ -18,14 +19,16 @@
<Japanese>AA12 (サンド)</Japanese>
<Russian>AA12 (Песочный)</Russian>
<French>AA12 (Sable)</French>
<Spanish>AA12 (Arena)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_AA40_Snake_Name">
<English>AA12 (Snake)</English>
<Korean>AA-12 (뱀 위장)</Korean>
<German>AA12 (Schlange)</German>
<Italian>AA12 (Serpe)</Italian>
<Japanese>AA12 (ヘビ柄)</Japanese>
<Japanese>AA12 (ヘビ柄迷彩)</Japanese>
<Russian>AA12 (Змея)</Russian>
<Spanish>AA12 (Serpiente)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Galat_Name">
<English>Galil ARM</English>
@ -35,15 +38,17 @@
<Japanese>ガリル ARM</Japanese>
<Russian>Galil ARM</Russian>
<French>Galil ARM</French>
<Spanish>Galil ARM</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Galat_Old_Name">
<English>Galil ARM (Old)</English>
<Korean>갈릴 ARM (낡음)</Korean>
<German>Galil ARM (Alt)</German>
<Italian>Galil ARM (Vecchio)</Italian>
<Japanese>ガリル ARM (使い古し)</Japanese>
<Japanese>ガリル ARM (古びた)</Japanese>
<Russian>Galil ARM (Старый)</Russian>
<French>Galil ARM (Ancien)</French>
<Spanish>Galil ARM (Vieja)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Name">
<English>GLX 160</English>
@ -53,14 +58,16 @@
<Japanese>GLX 160</Japanese>
<Russian>GLX 160</Russian>
<French>GLX 160</French>
<Spanish>GLX 160</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Snake_Name">
<English>GLX 160 (Snake)</English>
<Korean>GLX-160 (뱀 위장)</Korean>
<German>GLX 160 (Schlange)</German>
<Italian>GLX-160 (Serpe)</Italian>
<Japanese>GLX 160 (ヘビ柄)</Japanese>
<Japanese>GLX 160 (ヘビ柄迷彩)</Japanese>
<Russian>GLX 160 (Змея)</Russian>
<Spanish>GLX 160 (Serpiente)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Hex_Name">
<English>GLX 160 (Hex)</English>
@ -70,6 +77,7 @@
<Japanese>GLX 160 (六角形迷彩)</Japanese>
<Russian>GLX 160 (Гекс)</Russian>
<French>GLX 160 (Hex)</French>
<Spanish>GLX 160 (Hex)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_GreenHex_Name">
<English>GLX 160 (Green Hex)</English>
@ -79,15 +87,17 @@
<Japanese>GLX 160 (緑六角形迷彩)</Japanese>
<Russian>GLX 160 (Зеленый Гекс)</Russian>
<French>GLX 160 (Vert Hex)</French>
<Spanish>GLX 160 (Hex Verde)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Camo_Name">
<English>GLX 160 (Camo)</English>
<Korean>GLX-160 (위장)</Korean>
<German>GLX 160 (Tarn)</German>
<Italian>GLX-160 (Mimetica)</Italian>
<Japanese>GLX 160 (迷彩)</Japanese>
<Japanese>GLX 160 (AAF迷彩)</Japanese>
<Russian>GLX 160 (Камуфляж)</Russian>
<French>GLX 160 (Camo)</French>
<Spanish>GLX 160 (Camo)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Tan_Name">
<English>GLX 160 (Sand)</English>
@ -97,6 +107,7 @@
<Japanese>GLX 160 (サンド)</Japanese>
<Russian>GLX 160 (Песочный)</Russian>
<French>GLX 160 (Sable)</French>
<Spanish>GLX 160 (Arena)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_EBR_Black_Name">
<English>Mk14 Mod 1 EBR (Black)</English>
@ -106,14 +117,16 @@
<Japanese>Mk14 Mod 1 EBR (ブラック)</Japanese>
<Russian>Mk14 Mod 1 EBR (Черный)</Russian>
<French>Mk14 Mod 1 EBR (Noir)</French>
<Spanish>Mk14 Mod 1 EBR (Negra)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_EBR_Snake_Name">
<English>Mk14 Mod 1 EBR (Snake)</English>
<Korean>Mk.14 Mod 1 EBR (뱀 위장)</Korean>
<German>Mk14 Mod 1 EBR (Schlange)</German>
<Italian>Mk14 Mod 1 EBR (Serpe)</Italian>
<Japanese>Mk14 Mod 1 EBR (ヘビ柄)</Japanese>
<Japanese>Mk14 Mod 1 EBR (ヘビ柄迷彩)</Japanese>
<Russian>Mk14 Mod 1 EBR (Змея)</Russian>
<Spanish>Mk14 Mod 1 EBR (Serpiente)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Name">
<English>Vektor SS-77</English>
@ -122,15 +135,17 @@
<Japanese>ヴェクター SS-77</Japanese>
<Russian>Vektor SS-77</Russian>
<French>Vektor SS-77</French>
<Spanish>Vektor SS-77</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_AAF_Name">
<English>Vektor SS-77 (Camo)</English>
<Korean>벡터 SS-77 (위장)</Korean>
<German>Vektor SS-77 (Tarn)</German>
<Italian>Vektor SS-77 (Mimetica)</Italian>
<Japanese>ヴェクター SS-77 (迷彩)</Japanese>
<Japanese>ヴェクター SS-77 (AAF迷彩)</Japanese>
<Russian>Vektor SS-77 (Камуфляж)</Russian>
<French>Vektor SS-77 (Camo)</French>
<Spanish>Vektor SS-77 (Camo)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Hex_Name">
<English>Vektor SS-77 (Hex)</English>
@ -140,6 +155,7 @@
<Japanese>ヴェクター SS-77 (六角形迷彩)</Japanese>
<Russian>Vektor SS-77 (гекс)</Russian>
<French>Vektor SS-77 (Hex)</French>
<Spanish>Vektor SS-77 (Hex)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_GreenHex_Name">
<English>Vektor SS-77 (Green Hex)</English>
@ -149,6 +165,7 @@
<Japanese>ヴェクター SS-77 (緑六角形迷彩)</Japanese>
<Russian>Vektor SS-77 (зеленый гекс)</Russian>
<French>Vektor SS-77 (VertHex)</French>
<Spanish>Vektor SS-77 (Hex Verde)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Desert_Name">
<English>Vektor SS-77 (Desert)</English>
@ -158,6 +175,7 @@
<Japanese>ヴェクター SS-77 (砂漠迷彩)</Japanese>
<Russian>Vektor SS-77 (песочныйt)</Russian>
<French>Vektor SS-77 (Désert)</French>
<Spanish>Vektor SS-77 (Desierto)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Compact_Name">
<English>Vektor SS-77 Compact</English>
@ -167,32 +185,36 @@
<Japanese>ヴェクター SS-77 コンパクト</Japanese>
<Russian>Vektor SS-77 Compact</Russian>
<French>Vektor SS-77 Compacte</French>
<Spanish>Vektor SS-77 Compacta</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Compact_Snake_Name">
<English>Vektor SS-77 Compact (Snake)</English>
<Korean>벡터 SS-77 단축형 (뱀 위장)</Korean>
<German>Vektor SS-77 Compact (Schlange)</German>
<Italian>Vektor SS-77 Compatto (Serpe)</Italian>
<Japanese>ヴェクター SS-77 コンパクト (ヘビ柄)</Japanese>
<Japanese>ヴェクター SS-77 コンパクト (ヘビ柄迷彩)</Japanese>
<Russian>Vektor SS-77 Compact (змея)</Russian>
<Spanish>Vektor SS-77 Compacta (Serpiente)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Wood_Name">
<English>FN FAL 50.00 (Wood)</English>
<Korean>FN FAL 50.00 (목재)</Korean>
<German>FN FAL 50.00 (Holz)</German>
<Italian>FN FAL 50.00 (Legno)</Italian>
<Japanese>FN FAL 50.00 (森林迷彩)</Japanese>
<Japanese>FN FAL 50.00 (木製)</Japanese>
<Russian>FN FAL 50.00 (лесной)</Russian>
<French>FN FAL 50.00 (Bois)</French>
<Spanish>FN FAL 50.00 (Madera)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_GL_Wood_Name">
<English>FN FAL 50.00 GL (Wood)</English>
<Korean>FN FAL 50.00 GL (목재)</Korean>
<German>FN FAL 50.00 GL (Holz)</German>
<Italian>FN FAL 50.00 GL (Legno)</Italian>
<Japanese>FN FAL 50.00 GL (森林迷彩)</Japanese>
<Japanese>FN FAL 50.00 GL (木製)</Japanese>
<Russian>FN FAL 50.00 GL (лесной)</Russian>
<French>FN FAL 50.00 GL (Bois)</French>
<Spanish>FN FAL 50.00 GL (Madera)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Name">
<English>FN FAL 50.00</English>
@ -202,6 +224,7 @@
<Japanese>FN FAL 50.00</Japanese>
<Russian>FN FAL 50.00</Russian>
<French>FN FAL 50.00</French>
<Spanish>FN FAL 50.00</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_GL_Name">
<English>FN FAL 50.00 GL</English>
@ -211,6 +234,7 @@
<Japanese>FN FAL 50.00 GL</Japanese>
<Russian>FN FAL 50.00 GL</Russian>
<French>FN FAL 50.00 GL</French>
<Spanish>FN FAL 50.00 GL</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Desert_Name">
<English>FN FAL 50.00 (Desert)</English>
@ -220,6 +244,7 @@
<Japanese>FN FAL 50.00 (砂漠迷彩)</Japanese>
<Russian>FN FAL 50.00 (песочный)</Russian>
<French>FN FAL 50.00 (Désert)</French>
<Spanish>FN FAL 50.00 (Desierto)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Camo_Name">
<English>FN FAL 50.00 (Jungle)</English>
@ -229,15 +254,25 @@
<Japanese>FN FAL 50.00 (熱帯迷彩)</Japanese>
<Russian>FN FAL 50.00 (джунгли)</Russian>
<French>FN FAL 50.00 (Jungle)</French>
<Spanish>FN FAL 50.00 (Jungla)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Para_Name">
<English>FN FAL OSW Para</English>
<Japanese>FN FAL OSW パラ</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Para_Snake_Name">
<English>FN FAL OSW Para (Snake)</English>
<Japanese>FN FAL OSW パラ (ヘビ柄迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R4_Name">
<English>Vektor R4</English>
<Korean>벡터 R4</Korean>
<German>Vektor R4</German>
<Italian>Vektor R4</Italian>
<Japanese>ヴェクター R5</Japanese>
<Japanese>ヴェクター R4</Japanese>
<Russian>Vektor R4</Russian>
<French>Vektor R4</French>
<Spanish>Vektor R4</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_Name">
<English>Vektor R5 Carbine</English>
@ -247,6 +282,7 @@
<Japanese>ヴェクター R5 カービン</Japanese>
<Russian>Vektor R5 Carbine</Russian>
<French>Vektor R5 Carbine</French>
<Spanish>Vektor R5 Carabina</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_GL_Name">
<English>Vektor R5 Carbine GL</English>
@ -256,22 +292,25 @@
<Japanese>ヴェクター R5 カービン GL</Japanese>
<Russian>Vektor R5 Carbine GL</Russian>
<French>Vektor R5 Carbine GL</French>
<Spanish>Vektor R5 Carabina GL</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_Snake_Name">
<English>Vektor R5 Carbine (Snake)</English>
<Korean>벡터 R5 카빈 (뱀 위장)</Korean>
<German>Vektor R5 Carbine (Schlange)</German>
<Italian>Vektor R5 Carabina (Serpe)</Italian>
<Japanese>ヴェクター R5 カービン (ヘビ柄)</Japanese>
<Japanese>ヴェクター R5 カービン (ヘビ柄迷彩)</Japanese>
<Russian>Vektor R5 Carbine (Змея)</Russian>
<Spanish>Vektor R5 Carabina (Serpiente)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_GL_Snake_Name">
<English>Vektor R5 Carbine GL (Snake)</English>
<Korean>벡터 R5 카빈 GL (뱀 위장)</Korean>
<German>Vektor R5 Carbine GL (Schlange)</German>
<Italian>Vektor R5 Carabina GL (Serpe)</Italian>
<Japanese>ヴェクター R5 カービン GL (ヘビ柄)</Japanese>
<Japanese>ヴェクター R5 カービン GL (ヘビ柄迷彩)</Japanese>
<Russian>Vektor R5 Carbine GL (Змея)</Russian>
<Spanish>Vektor R5 Carabina GL (Serpiente)</Spanish>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_Name">
<English>XMS</English>
@ -417,5 +456,157 @@
<Korean>XMS SW (모래)</Korean>
<Japanese>XMS SW (サンド)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_gm6_snake_Name">
<English>GM6 Lynx (Snake)</English>
<Japanese>GM6 リンクス (ヘビ柄迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_rpg32_tan_Name">
<English>RPG-32 (Sand)</English>
<Japanese>RPG-32 (サンド)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_arco_hex_Name">
<English>ELCAN SpecterOS (Hex)</English>
<Japanese>ELCAN SpecterOS (六角形迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_holosight_snake_Name">
<English>EOTech XPS3 (Snake)</English>
<Japanese>EOTech XPS3 (ヘビ柄迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_holosight_snake_smg_Name">
<English>EOTech XPS3 SMG (Snake)</English>
<Japanese>EOTech XPS3 SMG (ヘビ柄迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_hamr_arid_Name">
<English>Leupold Mark 4 HAMR (Arid)</English>
<Japanese>Leupold Mark 4 HAMR (乾燥地帯迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_hamr_lush_Name">
<English>Leupold Mark 4 HAMR (Lush)</English>
<Japanese>Leupold Mark 4 HAMR (緑地迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_hamr_sand_Name">
<English>Leupold Mark 4 HAMR (Sand)</English>
<Japanese>Leupold Mark 4 HAMR (サンド)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_hamr_snake_Name">
<English>Leupold Mark 4 HAMR (Snake)</English>
<Japanese>Leupold Mark 4 HAMR (ヘビ柄迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_high_black_Name">
<English>Aimpoint Micro R-1 (High, Black)</English>
<Japanese>Aimpoint マイクロ R-1 (ハイマウント、ブラック)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_high_khaki_Name">
<English>Aimpoint Micro R-1 (High, Khaki)</English>
<Japanese>Aimpoint マイクロ R-1 (ハイマウント、カーキ)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_high_sand_Name">
<English>Aimpoint Micro R-1 (High, Sand)</English>
<Japanese>Aimpoint マイクロ R-1 (ハイマウント、サンド)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_high_snake_Name">
<English>Aimpoint Micro R-1 (High, Snake)</English>
<Japanese>Aimpoint マイクロ R-1 (ハイマウント、ヘビ柄迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_high_arid_Name">
<English>Aimpoint Micro R-1 (High, Arid)</English>
<Japanese>Aimpoint マイクロ R-1 (ハイマウント、乾燥地帯迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_high_lush_Name">
<English>Aimpoint Micro R-1 (High, Lush)</English>
<Japanese>Aimpoint マイクロ R-1 (ハイマウント、緑地迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_high_black_sand_Name">
<English>Aimpoint Micro R-1 (High, Black/Sand)</English>
<Japanese>Aimpoint マイクロ R-1 (ハイマウント、ブラック/サンド)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_low_black_Name">
<English>Aimpoint Micro R-1 (Low, Black)</English>
<Japanese>Aimpoint マイクロ R-1 (ローマウント、ブラック)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_low_khaki_Name">
<English>Aimpoint Micro R-1 (Low, Khaki)</English>
<Japanese>Aimpoint マイクロ R-1 (ローマウント、カーキ)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_low_sand_Name">
<English>Aimpoint Micro R-1 (Low, Sand)</English>
<Japanese>Aimpoint マイクロ R-1 (ローマウント、サンド)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_low_snake_Name">
<English>Aimpoint Micro R-1 (Low, Snake)</English>
<Japanese>Aimpoint マイクロ R-1 (ローマウント、ヘビ柄迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_low_arid_Name">
<English>Aimpoint Micro R-1 (Low, Arid)</English>
<Japanese>Aimpoint マイクロ R-1 (ローマウント、乾燥地帯迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_r1_low_lush_Name">
<English>Aimpoint Micro R-1 (Low, Lush)</English>
<Japanese>Aimpoint マイクロ R-1 (ローマウント、緑地迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_dms_snake_Name">
<English>Burris XTR II (Snake)</English>
<Japanese>Burris XTR II (ヘビ柄迷彩)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_apc_wheeled_01_atgm_Name">
<English>Badger IFV (ATGM)</English>
<Japanese>バジャー IFV (ATGM)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_apc_wheeled_01_command_Name">
<English>Badger IFV (Command)</English>
<Japanese>バジャー IFV (指揮)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_apc_wheeled_01_mortar_Name">
<English>Badger IFV (Mortar)</English>
<Japanese>バジャー IFV (迫撃砲)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_truck_02_aa_Name">
<English>KamAZ (Zu-23-2)</English>
<Japanese>KamAZ (Zu-23-2)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_truck_02_cargo_Name">
<English>KamAZ Cargo</English>
<Japanese>KamAZ 貨物</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_truck_02_repair_Name">
<English>KamAZ Repair</English>
<Japanese>KamAZ 修理</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_truck_02_racing_Name">
<English>KamAZ Racing</English>
<Japanese>KamAZ レース仕様</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_truck_02_ammo_Name">
<English>KamAZ Ammo</English>
<Japanese>KamAZ 弾薬</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_truck_02_flatbed_Name">
<English>KamAZ Flatbed</English>
<Japanese>KamAZ フラットベッド</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_heli_transport_02_Name">
<English>AW101 Merlin</English>
<Japanese>AW101 マーリン</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_apc_tracked_02_Name">
<English>BM-2T Stalker (Bumerang-BM)</English>
<Japanese>BM-2T ストーカー (ブーメランク-BM)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_apc_wheeled_02_hmg_Name">
<English>Otokar ARMA (HMG)</English>
<Japanese>オトカ アルマ (HMG)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_apc_wheeled_02_unarmed_Name">
<English>Otokar ARMA (Unarmed)</English>
<Japanese>オトカ アルマ (非武装)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_heli_light_02_armed_Name">
<English>Ka-60 Kasatka (UP)</English>
<Japanese>Ka-60 カサートカ (UP)</Japanese>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_heli_light_02_unarmed_Name">
<English>Ka-60 Kasatka (UP, Unarmed)</English>
<Japanese>Ka-60 カサートカ (UP、非武装)</Japanese>
</Key>
</Package>
</Project>

View File

@ -1,12 +1,8 @@
class ACE_Settings {
class GVAR(enable) {
movedToSqf = 1;
};
class GVAR(enableAmmobox) {
movedToSQF = 1;
};
class GVAR(enableAmmoCookoff) { // For CBA Setting Switch: we can eliminate and just use (ammoCookoffDuration == 0)
class GVAR(enableAmmoCookoff) {
movedToSQF = 1;
};
class GVAR(ammoCookoffDuration) {

View File

@ -1,4 +1,3 @@
class CfgCloudlets {
class GVAR(CookOff) {
interval = 0.004;

View File

@ -1,28 +1,27 @@
class Cfg3DEN {
class Object {
class AttributeCategories {
class ace_attributes {
class Attributes {
class GVAR(enable) {
property = QGVAR(enable);
class GVAR(enable) { // setting was previously GVAR(enable), so maintain for backwards compatiblity with missions
property = QGVAR(enable); // same as above
control = "Checkbox";
displayName = CSTRING(enable_hd_name);
tooltip = CSTRING(enable_hd_tooltip);
expression = QUOTE(if !(_value) then {_this setVariable [ARR_3('%s',_value,true)];};);
displayName = CSTRING(enableFire_name);
tooltip = CSTRING(enableFire_tooltip);
expression = QUOTE(if (!_value) then {_this setVariable [ARR_3('%s',_value,true)]});
typeName = "BOOL";
condition = "objectVehicle";
defaultValue = QUOTE((GETMVAR(QGVAR(enable),0)) in [ARR_2(1,2)]);
defaultValue = QUOTE(GETMVAR(QGVAR(enableFire),true));
};
class GVAR(enableAmmoCookoff) {
property = QGVAR(enableAmmoCookoff);
control = "Checkbox";
displayName = CSTRING(enableAmmoCookoff_name);
tooltip = CSTRING(enableAmmoCookoff_tooltip);
expression = QUOTE(if !(_value) then {_this setVariable [ARR_3('%s',_value,true)];};);
expression = QUOTE(if (!_value) then {_this setVariable [ARR_3('%s',_value,true)]});
typeName = "BOOL";
condition = "objectHasInventoryCargo";
defaultValue = QUOTE(if (_this isKindOf 'ReammoBox_F') then { GETMVAR(QGVAR(enableAmmobox),true) } else { GETMVAR(QGVAR(enableAmmoCookoff),true) };);
defaultValue = QUOTE(if (_this isKindOf 'ReammoBox_F') then {GETMVAR(QGVAR(enableAmmobox),true)} else {GETMVAR(QGVAR(enableAmmoCookoff),true)});
};
};
};

View File

@ -1,4 +1,3 @@
class Extended_PreStart_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));

View File

@ -1,4 +1,3 @@
class CfgSFX {
class GVAR(CookOff_low) {
name = QGVAR(cookoff_low);

View File

@ -1,4 +1,3 @@
class CfgVehicles {
class Sound;
class GVAR(Sound_low): Sound {
@ -7,7 +6,6 @@ class CfgVehicles {
scope = 1;
sound = QGVAR(CookOff_low);
};
class GVAR(Sound_mid): GVAR(Sound_low) {
sound = QGVAR(CookOff_mid);
};
@ -17,47 +15,14 @@ class CfgVehicles {
class Tank;
class Tank_F: Tank {
GVAR(ammoLocation) = "HitHull";
GVAR(cookoffSelections)[] = {"poklop_gunner","poklop_commander"};
GVAR(probability) = 0.5;
};
class MBT_02_base_F: Tank_F {
GVAR(ammoLocation) = "HitTurret";
};
class Car_F;
class Wheeled_APC_F: Car_F {
GVAR(ammoLocation) = "HitHull";
GVAR(cookoffSelections)[] = {"poklop_gunner","poklop_commander"};
GVAR(probability) = 0.8;
// big explosions for wheeled APCs (same as for tanks)
// Big explosions for wheeled APCs (same as for tanks)
explosionEffect = "FuelExplosionBig";
};
class MRAP_01_base_F: Car_F {
GVAR(engineSmokeOffset)[] = {0,-2,0};
};
class MRAP_02_base_F: Car_F {
GVAR(engineSmokeOffset)[] = {0,-2,0};
};
class MRAP_03_base_F: Car_F {
GVAR(engineSmokeOffset)[] = {0,-2,0};
};
class Quadbike_01_base_F: Car_F {
GVAR(engineSmokeOffset)[] = {0,1,0};
};
class Truck_F;
class Truck_02_base_F: Truck_F {
GVAR(engineSmokeOffset)[] = {0,-2.6,-0.1};
};
class Truck_02_MRL_base_F: Truck_02_base_F {
GVAR(engineSmokeOffset)[] = {0,0.3,-0.1};
};
};

View File

@ -1,10 +1,12 @@
PREP(handleDamageBox);
PREP(engineFire);
PREP(cookOff);
PREP(smoke);
PREP(cookOffEffect);
PREP(cookOffBox);
PREP(detonateAmmunition);
PREP(cookOffBoxLocal);
PREP(cookOffBoxServer);
PREP(cookOffLocal);
PREP(cookOffServer);
PREP(detonateAmmunitionServer);
PREP(detonateAmmunitionServerLoop);
PREP(engineFireLocal);
PREP(engineFireServer);
PREP(getVehicleAmmo);
PREP(handleDamageBox);
PREP(isMagazineFlare);
PREP(smoke);

View File

@ -1,63 +1,64 @@
#include "script_component.hpp"
[QGVAR(engineFire), LINKFUNC(engineFire)] call CBA_fnc_addEventHandler;
[QGVAR(cookOff), {
params ["_vehicle"];
if (local _vehicle) then {
_this call FUNC(cookOff);
};
}] call CBA_fnc_addEventHandler;
[QGVAR(cookOffEffect), LINKFUNC(cookOffEffect)] call CBA_fnc_addEventHandler;
[QGVAR(cookOffBoxLocal), LINKFUNC(cookOffBoxLocal)] call CBA_fnc_addEventHandler;
[QGVAR(cookOffLocal), LINKFUNC(cookOffLocal)] call CBA_fnc_addEventHandler;
[QGVAR(engineFireLocal), LINKFUNC(engineFireLocal)] call CBA_fnc_addEventHandler;
[QGVAR(smoke), LINKFUNC(smoke)] call CBA_fnc_addEventHandler;
[QGVAR(cookOffBox), LINKFUNC(cookOffBox)] call CBA_fnc_addEventHandler;
// handle cleaning up effects when vehicle is deleted mid-cookoff
[QGVAR(addCleanupHandlers), {
params ["_vehicle"];
if (isServer) then {
[QGVAR(cookOffBoxServer), LINKFUNC(cookOffBoxServer)] call CBA_fnc_addEventHandler;
[QGVAR(cookOffServer), LINKFUNC(cookOffServer)] call CBA_fnc_addEventHandler;
[QGVAR(detonateAmmunitionServer), LINKFUNC(detonateAmmunitionServer)] call CBA_fnc_addEventHandler;
[QGVAR(engineFireServer), LINKFUNC(engineFire)] call CBA_fnc_addEventHandler;
};
// Don't add a new EH if cookoff is run multiple times
if ((_vehicle getVariable [QGVAR(deletedEH), -1]) == -1) then {
private _deletedEH = _vehicle addEventHandler ["Deleted", {
params ["_vehicle"];
// Handle cleaning up effects when objects are deleted mid cook-off
["AllVehicles", "Deleted", {
{
deleteVehicle _x;
} forEach ((_this select 0) getVariable [QGVAR(effects), []]);
}, true, ["CAManBase", "StaticWeapon"], true] call CBA_fnc_addClassEventHandler;
[QGVAR(cleanupEffects), [_vehicle]] call CBA_fnc_localEvent;
}];
_vehicle setVariable [QGVAR(deletedEH), _deletedEH];
};
}] call CBA_fnc_addEventHandler;
["ReammoBox_F", "Deleted", {
{
deleteVehicle _x;
} forEach ((_this select 0) getVariable [QGVAR(effects), []]);
}, true, [], true] call CBA_fnc_addClassEventHandler;
// Raised when the flames have subsided or after the ammo of a box has finished cooking off
[QGVAR(cleanupEffects), {
params ["_vehicle", ["_effects", []]];
params ["_object"];
_effects = _effects + (_vehicle getVariable [QGVAR(effects), []]);
if (_effects isNotEqualTo []) then {
{ deleteVehicle _x } count _effects;
};
{
deleteVehicle _x;
} forEach (_object getVariable [QGVAR(effects), []]);
_object setVariable [QGVAR(effects), nil];
}] call CBA_fnc_addEventHandler;
// Ammo box damage handling
["ReammoBox_F", "init", {
(_this select 0) addEventHandler ["HandleDamage", {
if ((_this select 0) getVariable [QGVAR(enableAmmoCookoff), GVAR(enableAmmobox)]) then {
_this call FUNC(handleDamageBox);
};
}];
}, nil, nil, true] call CBA_fnc_addClassEventHandler;
// Calling this function inside curly brackets allows the usage of "exitWith", which would be broken with "HandleDamage" otherwise
(_this select 0) addEventHandler ["HandleDamage", {_this call FUNC(handleDamageBox)}];
}, true, [], true] call CBA_fnc_addClassEventHandler;
// Vehicle ammo cook-off (secondary explosions)
["AllVehicles", "Killed", {
if (!GVAR(enableAmmoCookoff) || {GVAR(ammoCookoffDuration) == 0}) exitWith {};
// secondary explosions
["AllVehicles", "killed", {
params ["_vehicle", "", "", "_useEffects"];
if (
_useEffects &&
_vehicle getVariable [QGVAR(enableAmmoCookoff), GVAR(enableAmmoCookoff)]
) then {
if (GVAR(ammoCookoffDuration) == 0) exitWith {};
([_vehicle] call FUNC(getVehicleAmmo)) params ["_mags", "_total"];
private _delay = (random MAX_AMMO_DETONATION_START_DELAY) max MIN_AMMO_DETONATION_START_DELAY;
[FUNC(detonateAmmunition), [_vehicle, _mags, _total], _delay] call CBA_fnc_waitAndExecute;
if (_useEffects && {_vehicle getVariable [QGVAR(enableAmmoCookoff), true]}) then {
// We don't need to pass source and instigator, as vehicle is already dead
[QGVAR(detonateAmmunitionServer), [
_vehicle,
false,
objNull,
objNull,
random [MIN_AMMO_DETONATION_START_DELAY, (MIN_AMMO_DETONATION_START_DELAY + MAX_AMMO_DETONATION_START_DELAY) / 2, MAX_AMMO_DETONATION_START_DELAY]
]] call CBA_fnc_serverEvent;
};
}, nil, ["Man","StaticWeapon"]] call CBA_fnc_addClassEventHandler;
}, true, ["CAManBase", "StaticWeapon"], true] call CBA_fnc_addClassEventHandler;
if (hasInterface) then {
// Plays a sound locally, so that different sounds can be used for various distances
@ -68,7 +69,7 @@ if (hasInterface) then {
private _distance = _object distance (positionCameraToWorld [0, 0, 0]);
TRACE_3("",_object,_sound,_maxDistance);
TRACE_2("",_object,_sound);
// 3 classes of distances: close, mid and far, each having different sound files
private _classDistance = switch (true) do {
@ -94,6 +95,6 @@ if (hasInterface) then {
if (!fileExists _sound) exitWith {};
// Obeys speed of sound and takes doppler effects into account
playSound3D [_sound, objNull, insideBuilding _object >= 0.5, getPosASL _object, _volume, _pitch + (random 0.2) - 0.1, _maxDistance, 0, true];
playSound3D [_sound, objNull, false, getPosASL _object, _volume, _pitch + (random 0.2) - 0.1, _maxDistance, 0, true];
}] call CBA_fnc_addEventHandler;
};

View File

@ -1,129 +0,0 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
* Start a cook-off in the given vehicle.
*
* Arguments:
* 0: Vehicle <Object>
* 1: Intensity of fire <Number>
*
* Return Value:
* None
*
* Example:
* [(vehicle player), 3] call ace_cookoff_fnc_cookOff
*
* Public: No
*/
params ["_vehicle", "_intensity", ["_instigator", objNull], ["_smokeDelayEnabled", true], ["_ammoDetonationChance", 0], ["_detonateAfterCookoff", false], ["_fireSource", ""], ["_canRing", true], ["_maxIntensity", MAX_COOKOFF_INTENSITY, [0]], ["_canJet", true, [true]]];
if (GVAR(enable) == 0) exitWith {};
if !(GVAR(enableFire)) exitWith {};
if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] in [0, false]) exitWith {};
// exit if cook-off enabled only for players and no players in vehicle crew found
if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] isEqualTo 1 && {fullCrew [_vehicle, "", false] findIf {isPlayer (_x select 0)} == -1}) exitWith {};
TRACE_2("cooking off",_vehicle,_intensity);
TRACE_8("",_instigator,_smokeDelayEnabled,_ammoDetonationChance,_detonateAfterCookoff,_fireSource,_canRing,_maxIntensity,_canJet);
if (_vehicle getVariable [QGVAR(isCookingOff), false]) exitWith {};
_vehicle setVariable [QGVAR(isCookingOff), true, true];
[QGVAR(addCleanupHandlers), [_vehicle]] call CBA_fnc_globalEvent;
// limit maximum value of intensity to prevent very long cook-off times
_intensity = _intensity min _maxIntensity;
private _config = configOf _vehicle;
private _positions = getArray (_config >> QGVAR(cookoffSelections)) select {(_vehicle selectionPosition _x) isNotEqualTo [0,0,0]};
if (_positions isEqualTo []) then {
WARNING_1("no valid selection for cookoff found. %1",typeOf _vehicle);
{
private _pos = _vehicle selectionPosition _x;
if (_pos isEqualTo [0, 0, 0]) exitWith {};
_positions pushBack _x;
} forEach DEFAULT_COMMANDER_HATCHES;
if (_positions isEqualTo []) then {
_positions pushBack "#noselection";
};
};
private _delay = 0;
if (_smokeDelayEnabled) then {
_delay = SMOKE_TIME + random SMOKE_TIME;
};
[QGVAR(smoke), [_vehicle, _positions]] call CBA_fnc_globalEvent;
[{
params ["_vehicle", "_positions", "_intensity", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing", "_canJet"];
_vehicle setVariable [QGVAR(intensity), _intensity];
private _smokeEffects = _vehicle getVariable [QGVAR(effects), []];
[{
params ["_args", "_pfh"];
_args params ["_vehicle", "_positions", "_ammoDetonationChance", "_detonateAfterCookoff", "_instigator", "_fireSource", "_canRing", "_canJet", "_smokeEffects"];
private _intensity = _vehicle getVariable [QGVAR(intensity), 0];
if (isNull _vehicle || {_intensity <= 1}) exitWith {
[QGVAR(cleanupEffects), [_vehicle, _smokeEffects]] call CBA_fnc_globalEvent;
_vehicle setVariable [QGVAR(isCookingOff), false, true];
[_pfh] call CBA_fnc_removePerFrameHandler;
if (GVAR(destroyVehicleAfterCookoff) || _detonateAfterCookoff) then {
_vehicle setDamage [1, true];
};
};
private _lastFlameTime = _vehicle getVariable [QGVAR(lastFlame), 0];
private _nextFlameTime = _vehicle getVariable [QGVAR(nextFlame), 0];
// Wait until we are ready for the next flame
// dt = Tcurrent - Tlast
// dt >= Tnext
if ((CBA_missionTime - _lastFlameTime) >= _nextFlameTime) then {
private _ring = (0.2 > random 1);
if (!_ring && _intensity >= 2) then {
_ring = (0.7 > random 1);
};
if !(_canRing) then {
_ring = false;
};
private _time = linearConversion [0, 10, _intensity, 3, 20] + random COOKOFF_TIME;
if (_fireSource isEqualTo "") then {
_fireSource = selectRandom _positions;
};
[QGVAR(cookOffEffect), [_vehicle, _canJet, _ring, _time, _fireSource, _intensity]] call CBA_fnc_globalEvent;
_intensity = _intensity - (0.5 max random 1);
_vehicle setVariable [QGVAR(intensity), _intensity];
_vehicle setVariable [QGVAR(lastFlame), CBA_missionTime];
_vehicle setVariable [QGVAR(nextFlame), _time + (MIN_TIME_BETWEEN_FLAMES max random MAX_TIME_BETWEEN_FLAMES)];
{
[QEGVAR(fire,burn), [_x, _intensity * 1.5, _instigator]] call CBA_fnc_globalEvent;
} forEach crew _vehicle
};
if (_ammoDetonationChance > random 1) then {
private _lastExplosiveDetonationTime = _vehicle getVariable [QGVAR(lastExplosiveDetonation), 0];
private _nextExplosiveDetonation = _vehicle getVariable [QGVAR(nextExplosiveDetonation), 0];
if ((CBA_missionTime - _lastExplosiveDetonationTime) > _nextExplosiveDetonation) then {
if (_fireSource isEqualTo "") then {
_fireSource = selectRandom _positions;
};
createVehicle ["ACE_ammoExplosionLarge", (_vehicle modelToWorld (_vehicle selectionPosition _fireSource)), [], 0 , "CAN_COLLIDE"];
_vehicle setVariable [QGVAR(lastExplosiveDetonation), CBA_missionTime];
_vehicle setVariable [QGVAR(nextExplosiveDetonation), random 60];
};
};
}, 0.25, [_vehicle, _positions, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing, _canJet, _smokeEffects]] call CBA_fnc_addPerFrameHandler
}, [_vehicle, _positions, _intensity, _ammoDetonationChance, _detonateAfterCookoff, _instigator, _fireSource, _canRing, _canJet], _delay] call CBA_fnc_waitAndExecute;

View File

@ -1,74 +0,0 @@
#include "..\script_component.hpp"
/*
* Author: KoffeinFlummi, commy2, kymckay
* Start a cook-off in the given ammo box.
*
* Arguments:
* 0: Ammo box <OBJECT>
*
* Return Value:
* None
*
* Example:
* [_box] call ace_cookoff_fnc_cookOffBox
*
* Public: No
*/
params ["_box"];
if (_box getVariable [QGVAR(isCookingOff), false]) exitWith {};
_box setVariable [QGVAR(isCookingOff), true];
if (local _box) then {
[QGVAR(cookOffBox), _box] call CBA_fnc_globalEvent;
};
[{
params ["_box"];
// Box will start smoking
private _smoke = "#particlesource" createVehicleLocal [0,0,0];
_smoke setParticleClass "AmmoSmokeParticles2";
_smoke attachTo [_box, [0,0,0]];
private _effects = [_smoke];
if (isServer) then {
private _sound = createSoundSource ["Sound_Fire", position _box, [], 0];
_effects pushBack _sound;
};
[{
params ["_box", "_effects"];
// These functions are smart and do all the cooking off work
if (local _box) then {
if (GVAR(ammoCookoffDuration) == 0) exitWith {};
([_box] call FUNC(getVehicleAmmo)) params ["_mags", "_total"];
[_box, _mags, _total] call FUNC(detonateAmmunition);
// This shit is busy being on fire, magazines aren't accessible/usable
clearMagazineCargoGlobal _box;
};
// Light the fire (also handles lighting)
private _fire = "#particlesource" createVehicleLocal [0,0,0];
_fire setParticleClass "AmmoBulletCore";
_fire attachTo [_box, [0,0,0]];
_effects pushBack _fire;
[{
params ["_box", "_effects"];
{
deleteVehicle _x;
} forEach _effects;
if (local _box) then {
_box setDamage 1;
};
}, [_box, _effects], COOKOFF_TIME_BOX] call CBA_fnc_waitAndExecute; // TODO: Change so that box is alive until no ammo left, with locality in mind
}, [_box, _effects], SMOKE_TIME] call CBA_fnc_waitAndExecute;
}, _box, IGNITE_TIME] call CBA_fnc_waitAndExecute;

View File

@ -0,0 +1,52 @@
#include "..\script_component.hpp"
/*
* Author: KoffeinFlummi, commy2, kymckay, johnb43
* Spawns local cook-off effects for ammo boxes.
*
* Arguments:
* 0: Box <OBJECT>
* 1: Source <OBJECT>
* 2: Instigator <OBJECT>
* 3: Start time of the cook-off <NUMBER>
*
* Return Value:
* None
*
* Example:
* [cursorObject, player, player, CBA_missionTime + 10] call ace_cookoff_fnc_cookOffBoxLocal
*
* Public: No
*/
params ["", "", "", "_startTime"];
[{
params ["_box", "_source", "_instigator"];
// If box was deleted before smoke could be spawned, just exit
if (isNull _box) exitWith {};
private _boxPos = ASLToAGL getPosASL _box;
private _effects = [];
// Box will start smoking
if (hasInterface) then {
private _smoke = createVehicleLocal ["#particlesource", _boxPos, [], 0, "CAN_COLLIDE"];
_smoke setParticleClass "AmmoSmokeParticles2";
_smoke attachTo [_box];
_effects pushBack _smoke;
};
if (isServer) then {
private _sound = createSoundSource ["Sound_Fire", _boxPos, [], 0];
_sound attachTo [_box];
_effects pushBack _sound;
// Detonate the ammunition
[QGVAR(detonateAmmunitionServer), [_box, true, _source, _instigator, random [DETONATION_DELAY / 2, DETONATION_DELAY, DETONATION_DELAY / 2 * 3]]] call CBA_fnc_localEvent;
};
_box setVariable [QGVAR(effects), _effects];
}, _this, (_startTime - CBA_missionTime) max 0] call CBA_fnc_waitAndExecute; // This delay allows for synchronisation for JIP players

View File

@ -0,0 +1,50 @@
#include "..\script_component.hpp"
/*
* Author: KoffeinFlummi, commy2, kymckay, johnb43
* Start an ammo cook-off in the given ammo box.
*
* Arguments:
* 0: Ammo box <OBJECT>
* 1: Source <OBJECT> (default: objNull)
* 2: Instigator <OBJECT> (default: objNull)
*
* Return Value:
* None
*
* Example:
* cursorObject call ace_cookoff_fnc_cookOffBoxServer
*
* Public: No
*/
if (!isServer) exitWith {};
if (!GVAR(enableAmmobox) || {GVAR(ammoCookoffDuration) == 0}) exitWith {};
params ["_box", ["_source", objNull], ["_instigator", objNull]];
// Make sure it's a box (important, because deleted EH is assigned to ReammoBox_F only in postInit)
if !(_box isKindOf "ReammoBox_F") exitWith {};
if !(_box getVariable [QGVAR(enableAmmoCookoff), true]) exitWith {};
// Allow only 1 cook-off per box at a time
if (_box getVariable [QGVAR(isCookingOff), false]) exitWith {};
_box setVariable [QGVAR(isCookingOff), true, true];
private _delay = random [SMOKE_DELAY / 2, SMOKE_DELAY, SMOKE_DELAY / 2 * 3];
// Spawn cook-off effects on all connected machines and JIP
private _jipID = [QGVAR(cookOffBoxLocal), [
_box,
_source,
_instigator,
CBA_missionTime + _delay // Generate a globally synced timestamp
]] call CBA_fnc_globalEventJIP;
[_jipID, _box] call CBA_fnc_removeGlobalEventJIP;
_box setVariable [QGVAR(cookoffBoxJipID), _jipID];
// API
[QGVAR(cookOffBox), [_box, _source, _instigator, _delay]] call CBA_fnc_globalEvent;

View File

@ -1,200 +0,0 @@
#include "..\script_component.hpp"
/*
* Author: tcvm
* Spawn cook-off effects
*
* Arguments:
* 0: Vehicle <Object>
* 1: Spawn fire jet <Boolean>
* 2: Spawn fire ring <Boolean>
* 3: How long effect will last (Max 20 seconds) <Number>
* 4: What selection will fire originate from <String>
* 5: Cookoff intensity value <Number>
*
* Return Value:
* None
*
* Example:
* [vehicle player, true, false, 15, "commander_turret"] call ace_cookoff_fnc_cookOffEffect
*
* Public: No
*/
params ["_obj", "_jet", "_ring", "_time", "_fireSelection", "_intensity"];
private _light = "#lightpoint" createVehicleLocal [0,0,0];
_light setLightBrightness 5;
_light setLightAmbient [0.8, 0.6, 0.2];
_light setLightColor [1, 0.5, 0.2];
_light lightAttachObject [_obj, [0,0,0]];
_time = 0 max (_time min 20);
private _sound = objNull;
if (isServer) then {
// ironically biggest performance hit is this. Creating a new sound source takes up aprox 400 milliseconds.
// I dont think there is an alternative that takes into effect distance and whatever, but if you find one please fix!
if (_jet || _ring) then {
private _soundName = selectRandomWeighted [QGVAR(Sound_low), 0.1, QGVAR(Sound_mid), 0.25, QGVAR(Sound_high), 0.65];
_sound = createSoundSource [_soundName, position _obj, [], 0];
};
if (_ring) then {
private _intensity = 6;
private _radius = 1.5 * ((boundingBoxReal _obj) select 2);
[QEGVAR(fire,addFireSource), [_obj, _radius, _intensity, format [QGVAR(%1), hashValue _obj]]] call CBA_fnc_localEvent;
};
};
[{
params ["_args", "_pfh"];
_args params ["_obj", "_jet", "_ring", "_time", "_startTime", "_light", "_fireSelection", "_sound", "_intensity"];
private _elapsedTime = CBA_missionTime - _startTime;
if (_elapsedTime >= _time) exitWith {
deleteVehicle _light;
deleteVehicle _sound;
if (isServer) then {
[QEGVAR(fire,removeFireSource), [format [QGVAR(%1), hashValue _obj]]] call CBA_fnc_localEvent;
};
[_pfh] call CBA_fnc_removePerFrameHandler;
};
private _factor = (1 + (_elapsedTime / 2) min 2);
private _flameSize = 1.5;
if (_elapsedTime > (_time * (3 / 4))) then {
_factor = _factor * linearConversion [_time * (3 / 4), _time, _elapsedTime, 1, 0.5];
};
_light setLightBrightness 5 * (_factor / 5);
if (_jet) then {
private _particlePosition = (_obj selectionPosition _fireSelection) vectorAdd [-0.1 + random 0.2, -0.1 + random 0.2, 0];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"",
"Billboard",
1,
(0.1 + (random 0.2)) * _factor,
_particlePosition,
[0, 0, 15 * (_factor / 2)],
0,
10,
7.9,
0.075,
[1.25 * _factor, 2.5 * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1],
1,
0,
"",
"",
_obj
];
// make flame push object into ground to make effect seem more "alive"
if (!isGamePaused && { local _obj }) then {
private _force = [0, 0, _factor * -(0.5 min random 1.5) * (0.3 min random 1)] vectorMultiply getMass _obj;
_obj addForce [_force, vectorUpVisual _obj];
};
};
if (_ring) then {
private _ringOrigin = (_obj selectionPosition _fireSelection) vectorAdd [-0.1 + random 0.2, -0.1 + random 0.2, -1];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal",16,2,32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[0, 20 * (_factor / 2), 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, _flameSize * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _obj
];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[0, -20 * (_factor / 2), 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, _flameSize * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _obj
];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[20 * (_factor / 2), 0, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, _flameSize * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _obj
];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
[-0.1 + random 0.2, -0.1 + random 0.2, -1],
[-20 * (_factor / 2), 0, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, _flameSize * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _obj
];
private _dir = 20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[_dir, _dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, _flameSize * _factor],
[[1, 1, 1, -2],[1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _obj
];
_dir = -20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[_dir, _dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, _flameSize * _factor],
[[1, 1, 1, -2],[1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _obj
];
_dir = 20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal",16,2,32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[_dir, -_dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, _flameSize * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _obj
];
_dir = 20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[-_dir, _dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, _flameSize * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _obj
];
};
(getVehicleTIPars _obj) params ["_tiEngine", "_tiWheels", "_tiWeapon"];
_obj setVehicleTIPars [
// formula is designed to have the temperature ramp up quickly and then level out
(_tiEngine + (_intensity * 0.01))/1.005,
(_tiWheels + (_intensity * 0.004))/1.002, // wheels//tracks are further away from burning parts
(_tiWeapon + (_intensity * 0.01))/1.005
];
}, 0, [_obj, _jet, _ring, _time, CBA_missionTime, _light, _fireSelection, _sound, _intensity]] call CBA_fnc_addPerFrameHandler;

View File

@ -0,0 +1,229 @@
#include "..\script_component.hpp"
/*
* Author: tcvm, johnb43
* Spawn cook-off fire effects.
*
* Arguments:
* 0: Vehicle <OBJECT>
* 1: Spawn fire jet <BOOL>
* 2: Spawn fire ring <BOOL>
* 3: What selection fire will originate from <STRING>
* 4: Cookoff intensity value <NUMBER>
* 5: Start time <NUMBER>
* 6: Duration of effect (max 20 seconds) <NUMBER>
*
* Return Value:
* None
*
* Example:
* [cursorObject, true, false, "commander_turret", 6, CBA_missionTime, 15] call ace_cookoff_fnc_cookOffLocal
*
* Public: No
*/
#define FLAME_SIZE 1.5
#define FIRE_INTENSITY 20
params ["_vehicle", "_jet", "_ring", "_fireSelection", "_intensity", "_startTime", "_duration"];
// Check if still valid for JIP players
if (isNull _vehicle || {CBA_missionTime - _startTime >= _duration}) exitWith {};
// Spawn light
private _light = objNull;
if (hasInterface) then {
_light = "#lightpoint" createVehicleLocal [0, 0, 0];
_light setLightBrightness 5;
_light setLightAmbient [0.8, 0.6, 0.2];
_light setLightColor [1, 0.5, 0.2];
_light lightAttachObject [_vehicle, [0, 0, 0]];
};
_duration = 0 max _duration min 20;
private _sound = objNull;
private _fireKey = "";
if (isServer) then {
// Spawn sound effect
if (_jet || _ring) then {
private _soundName = selectRandomWeighted [QGVAR(Sound_low), 0.1, QGVAR(Sound_mid), 0.25, QGVAR(Sound_high), 0.65];
_sound = createSoundSource [_soundName, ASLToAGL getPosASL _vehicle, [], 0];
_sound attachTo [_vehicle];
};
// Make the ring a source of fire
if (_ring && {["ace_fire"] call EFUNC(common,isModLoaded)}) then {
_fireKey = format [QGVAR(cookoffFire_%1), hashValue _vehicle];
[QEGVAR(fire,addFireSource), [_vehicle, FLAME_SIZE * ((boundingBoxReal _vehicle) select 2), FIRE_INTENSITY, _fireKey]] call CBA_fnc_localEvent;
};
};
[{
(_this select 0) params ["_vehicle", "_jet", "_ring", "_startTime", "_duration", "_light", "_fireSelection", "_sound", "_intensity", "_fireKey"];
private _elapsedTime = CBA_missionTime - _startTime;
// Clean up effects once effects have finished or vehicle has been deleted
if (isNull _vehicle || {_elapsedTime >= _duration}) exitWith {
(_this select 1) call CBA_fnc_removePerFrameHandler;
deleteVehicle _light;
if (isServer) then {
deleteVehicle _sound;
if (["ace_fire"] call EFUNC(common,isModLoaded)) then {
[QEGVAR(fire,removeFireSource), _fireKey] call CBA_fnc_localEvent;
};
};
};
private _factor = 1 + (_elapsedTime / 2) min 2;
if (_elapsedTime > _duration * 3 / 4) then {
_factor = _factor * linearConversion [_duration * 3 / 4, _duration, _elapsedTime, 1, 0.5];
};
// Make flame push object into ground to make effect seem more "alive"
if (_jet && !isGamePaused && {local _vehicle} && {_vehicle getVariable [QGVAR(nextForceTime), 0] <= CBA_missionTime}) then {
private _force = [0, 0, _factor * -(0.5 min random 1.5) * (0.3 min random 1)] vectorMultiply getMass _vehicle;
_vehicle addForce [_force, vectorUpVisual _vehicle];
_vehicle setVariable [QGVAR(nextForceTime), CBA_missionTime + 0.01]; // This prevents bad behaviour when setAccTime is small
};
// Don't spawn visual effects on machines without interfaces
if (!hasInterface) exitWith {};
_light setLightBrightness _factor;
if (_jet) then {
private _particlePosition = (_vehicle selectionPosition _fireSelection) vectorAdd [-0.1 + random 0.2, -0.1 + random 0.2, 0];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"",
"Billboard",
1,
(0.1 + random 0.2) * _factor,
_particlePosition,
[0, 0, 15 * (_factor / 2)],
0,
10,
7.9,
0.075,
[1.25 * _factor, 2.5 * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1],
1,
0,
"",
"",
_vehicle
];
};
if (_ring) then {
private _ringOrigin = (_vehicle selectionPosition _fireSelection) vectorAdd [-0.1 + random 0.2, -0.1 + random 0.2, -1];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal",16,2,32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
_ringOrigin,
[0, 20 * (_factor / 2), 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
_ringOrigin,
[0, -20 * (_factor / 2), 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
_ringOrigin,
[20 * (_factor / 2), 0, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
[-0.1 + random 0.2, -0.1 + random 0.2, -1],
[-20 * (_factor / 2), 0, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
private _dir = 20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
_ringOrigin,
[_dir, _dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2],[1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
_dir = -20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[_dir, _dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2],[1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
_dir = 20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal",16,2,32],
"", "Billboard", 1, (0.1 + (random 0.2)) * _factor,
_ringOrigin,
[_dir, -_dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
_dir = 20 * (_factor / 2);
drop [
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 2, 32],
"", "Billboard", 1, (0.1 + random 0.2) * _factor,
_ringOrigin,
[-_dir, _dir, 0],
0, 10, 7.9, 0.075,
[1.25 * _factor, FLAME_SIZE * _factor],
[[1, 1, 1, -2], [1, 1, 1, -2], [1, 1, 1, -1], [1, 1, 1, -0]],
[2 + random 1], 1, 0, "", "", _vehicle
];
};
(getVehicleTIPars _vehicle) params ["_tiEngine", "_tiWheels", "_tiWeapon"];
// Formula is designed to have the temperature ramp up quickly and then level out
_vehicle setVehicleTIPars [
(_tiEngine + _intensity * 0.01) / 1.005,
(_tiWheels + _intensity * 0.004) / 1.002, // Wheels/tracks are further away from burning parts
(_tiWeapon + _intensity * 0.01) / 1.005
];
}, 0, [_vehicle, _jet, _ring, _startTime, _duration, _light, _fireSelection, _sound, _intensity, _fireKey]] call CBA_fnc_addPerFrameHandler;

View File

@ -0,0 +1,202 @@
#include "..\script_component.hpp"
/*
* Author: tcvm, johnb43
* Start a cook-off in the given vehicle.
* Spews flames in multiple directions at the same time (ring) or from the turret towards the sky (jet).
*
* Arguments:
* 0: Vehicle <OBJECT>
* 1: Intensity of fire <NUMBER>
* 2: Source <OBJECT> (default: objNull)
* 3: Instigator <OBJECT> (default: objNull)
* 4: Delay between smoke and fire enabled <BOOL> (default: true)
* 5: Ammo detonation chance <NUMBER> (default: 0)
* 6: Detonate after cook-off <BOOL> (default: false)
* 7: Selection for fire source <STRING> (default: "")
* 8: Can spawn fire ring <BOOL> (default: true)
* 9: Can spawn fire jet <BOOL> (default: true)
* 10: Maximum intensity <NUMBER> (default: MAX_COOKOFF_INTENSITY)
*
* Return Value:
* None
*
* Example:
* [cursorObject, 3] call ace_cookoff_fnc_cookOffServer
*
* Public: No
*/
if (!isServer) exitWith {};
if (!GVAR(enableFire) || {GVAR(cookoffDuration) == 0}) exitWith {};
params [
"_vehicle",
"_intensity",
["_source", objNull],
["_instigator", objNull],
["_delayBetweenSmokeAndFire", true],
["_ammoDetonationChance", 0],
["_detonateAfterCookoff", false],
["_fireSelection", ""],
["_canRing", true],
["_canJet", true],
["_maxIntensity", MAX_COOKOFF_INTENSITY]
];
// Make sure it's a vehicle (important, because deleted EH is assigned to AllVehicles only in postInit)
if !(_vehicle isKindOf "AllVehicles") exitWith {};
if (_vehicle isKindOf "CAManBase" || {_vehicle isKindOf "StaticWeapon"}) exitWith {};
// If under water, ignore
// underwater is not very reliable, so use model center instead
if (underwater _vehicle || {private _posASL = getPosWorld _vehicle; surfaceIsWater _posASL && {(_posASL select 2) < 0}}) exitWith {};
// Check if cook-off is disabled on vehicle specifically
if !(_vehicle getVariable [QGVAR(enable), true]) exitWith {}; // QGVAR(enable) is API
TRACE_3("cooking off",_vehicle,_intensity,_maxIntensity);
TRACE_8("",_source,_instigator,_delayBetweenSmokeAndFire,_ammoDetonationChance,_detonateAfterCookoff,_fireSelection,_canRing,_canJet);
if (_vehicle getVariable [QGVAR(isCookingOff), false]) exitWith {};
_vehicle setVariable [QGVAR(isCookingOff), true, true];
// Limit maximum value of intensity to prevent very long cook-off times
_intensity = _intensity min _maxIntensity;
private _selections = getArray (configOf _vehicle >> QGVAR(cookoffSelections)) select {(_vehicle selectionPosition _x) isNotEqualTo [0, 0, 0]};
if (_selections isEqualTo []) then {
WARNING_1("no valid selection for cookoff found. %1",typeOf _vehicle);
{
if ((_vehicle selectionPosition _x) isNotEqualTo [0, 0, 0]) then {
_selections pushBack _x;
};
} forEach DEFAULT_COMMANDER_HATCHES;
if (_selections isEqualTo []) then {
_selections pushBack "#noselection";
};
};
// Not guaranteed to be active/used, but reserve it nonetheless
private _fireJipID = format [QGVAR(cookOffLocal_%1), hashValue _vehicle];
[_fireJipID, _vehicle] call CBA_fnc_removeGlobalEventJIP;
// Spawn smoke
private _smokeJipID = [QGVAR(smoke), [_vehicle, _selections]] call CBA_fnc_globalEventJIP;
[_smokeJipID, _vehicle] call CBA_fnc_removeGlobalEventJIP;
// Save intensity for looping purposes
_vehicle setVariable [QGVAR(intensity), _intensity];
private _delay = 0;
if (_delayBetweenSmokeAndFire) then {
_delay = random [SMOKE_DELAY, 1.5 * SMOKE_DELAY, 2 * SMOKE_DELAY];
};
[{
[{
(_this select 0) params ["_vehicle", "_selections", "_ammoDetonationChance", "_detonateAfterCookoff", "_source", "_instigator", "_fireSelection", "_canRing", "_canJet", "_smokeJipID", "_fireJipID"];
if (
isNull _vehicle ||
!GVAR(enableFire) ||
{!(_vehicle getVariable [QGVAR(enable), true])} || // QGVAR(enable) is API
{GVAR(cookoffDuration) == 0} ||
{underwater _vehicle} ||
{private _posASL = getPosWorld _vehicle; surfaceIsWater _posASL && {(_posASL select 2) < 0}} // Underwater is not very reliable, so use model center instead
) exitWith {
// Effects are deleted when vehicle is deleted
(_this select 1) call CBA_fnc_removePerFrameHandler;
};
private _intensity = _vehicle getVariable [QGVAR(intensity), 0];
if (_intensity <= 1) exitWith {
(_this select 1) call CBA_fnc_removePerFrameHandler;
// Wait until the previous flame has finished
private _nextFlameTime = (_vehicle getVariable [QGVAR(endCurrentFlame), CBA_missionTime]) - CBA_missionTime + (MIN_TIME_BETWEEN_FLAMES max random MAX_TIME_BETWEEN_FLAMES);
if (_fireSelection isEqualTo "") then {
_fireSelection = selectRandom _selections;
};
[{
params ["_vehicle", "_source", "_instigator", "_detonateAfterCookoff", "_fireSelection", "_smokeJipID", "_fireJipID"];
// Effects are deleted when vehicle is deleted
if (isNull _vehicle) exitWith {};
// Remove effects from JIP
_smokeJipID call CBA_fnc_removeGlobalEventJIP;
_fireJipID call CBA_fnc_removeGlobalEventJIP;
// Remove effects
[QGVAR(cleanupEffects), _vehicle] call CBA_fnc_globalEvent;
// Reset variable, so it can cook-off again
_vehicle setVariable [QGVAR(isCookingOff), nil, true];
if (GVAR(destroyVehicleAfterCookoff) || _detonateAfterCookoff) then {
createVehicle ["ACE_ammoExplosionLarge", _vehicle modelToWorld (_vehicle selectionPosition _fireSelection), [], 0 , "CAN_COLLIDE"];
_vehicle setDamage [1, true, _source, _instigator]; // Because it's running on the server, source and instigator can be set
};
}, [_vehicle, _source, _instigator, _detonateAfterCookoff, _fireSelection, _smokeJipID, _fireJipID], _nextFlameTime] call CBA_fnc_waitAndExecute;
};
// Wait until we are ready for the next flame
if ((_vehicle getVariable [QGVAR(nextFlame), 0]) <= CBA_missionTime) then {
private _ring = false;
if (_canRing) then {
_ring = 0.2 > random 1;
if (!_ring && {_intensity >= 2}) then {
_ring = 0.7 > random 1;
};
};
private _duration = linearConversion [0, 10, _intensity, 3, 20] + random COOKOFF_TIME;
if (_fireSelection isEqualTo "") then {
_fireSelection = selectRandom _selections;
};
// Sync for JIP players
[QGVAR(cookOffLocal), [_vehicle, _canJet, _ring, _fireSelection, _intensity, CBA_missionTime, _duration], _fireJipID] call CBA_fnc_globalEventJIP;
// If there are any crew, burn them
if (["ace_fire"] call EFUNC(common,isModLoaded)) then {
// Use current intensity, in case GVAR(cookoffDuration) is very large and only 1 flameout stage happens
{
[QEGVAR(fire,burn), [_x, _intensity * 1.5, _instigator]] call CBA_fnc_globalEvent;
} forEach (crew _vehicle);
};
_intensity = (_intensity - (0.5 max random 1) / GVAR(cookoffDuration)) max 0;
_vehicle setVariable [QGVAR(intensity), _intensity];
_vehicle setVariable [QGVAR(endCurrentFlame), CBA_missionTime + _duration];
_vehicle setVariable [QGVAR(nextFlame), CBA_missionTime + _duration + (MIN_TIME_BETWEEN_FLAMES max random MAX_TIME_BETWEEN_FLAMES)];
};
if (_ammoDetonationChance > random 1 && {_vehicle getVariable [QGVAR(nextExplosiveDetonation), 0] <= CBA_missionTime}) then {
if (_fireSelection isEqualTo "") then {
_fireSelection = selectRandom _selections;
};
createVehicle ["ACE_ammoExplosionLarge", _vehicle modelToWorld (_vehicle selectionPosition _fireSelection), [], 0 , "CAN_COLLIDE"];
_vehicle setVariable [QGVAR(nextExplosiveDetonation), CBA_missionTime + random 60];
};
}, 0.25, _this] call CBA_fnc_addPerFrameHandler;
}, [_vehicle, _selections, _ammoDetonationChance, _detonateAfterCookoff, _source, _instigator, _fireSelection, _canRing, _canJet, _smokeJipID, _fireJipID], _delay] call CBA_fnc_waitAndExecute;
// API
[QGVAR(cookoff), [_vehicle, _intensity, _instigator, _smokeDelayEnabled, _ammoDetonationChance, _detonateAfterCookoff, _fireSelection, _canRing, _maxIntensity, _canJet]] call CBA_fnc_globalEvent;

View File

@ -1,132 +0,0 @@
#include "..\script_component.hpp"
/*
* Author: Glowbal
* Detonates ammunition from a vehicle until no ammo left
*
* Arguments:
* 0: vehicle <OBJECT>
* 1: Ammo Array <ARRAY>
* - 0: Magazine Classname <STRING>
* - 1: Ammo Count <NUMBER>
* 2: Total Ammo Count <NUMBER>
*
* Return Value:
* None
*
* Example:
* [_vehicle, magazinesAmmo _vehicle] call ace_cookoff_fnc_detonateAmmunition
*
* Public: No
*/
params ["_vehicle", "_magazines", "_totalAmmo"];
if (GVAR(enable) == 0) exitWith {};
if !(GVAR(enableAmmoCookoff)) exitWith {};
if (isNull _vehicle) exitWith {}; // vehicle got deleted
if (_magazines isEqualTo []) exitWith {}; // nothing to detonate anymore
if (underwater _vehicle) exitWith {};
private _magazineIndex = floor random(count _magazines);
private _magazine = _magazines select _magazineIndex;
_magazine params ["_magazineClassname", "_amountOfMagazines"];
if (_amountOfMagazines < 0) exitWith {
ERROR_1("mag with no ammo - %1",_magazine);
};
private _removed = _amountOfMagazines min floor(1 + random(6 / GVAR(ammoCookoffDuration)));
_amountOfMagazines = _amountOfMagazines - _removed;
if (_amountOfMagazines <= 0) then {
_magazines deleteAt _magazineIndex;
} else {
_magazine set [1, _amountOfMagazines]; // clear out the magazine
};
private _timeBetweenAmmoDetonation = (((random 10) / (sqrt _totalAmmo)) min MAX_TIME_BETWEEN_AMMO_DET) max 0.1;
TRACE_2("",_totalAmmo,_timeBetweenAmmoDetonation);
_totalAmmo = _totalAmmo - _removed;
private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClassname >> "ammo");
private _ammoCfg = configFile >> "CfgAmmo" >> _ammo;
private _speedOfAmmo = getNumber (configFile >> "CfgMagazines" >> _magazineClassname >> "initSpeed");
private _simType = getText (_ammoCfg >> "simulation");
private _effect2pos = _vehicle selectionPosition "destructionEffect2";
private _spawnProjectile = {
params ["_vehicle", "_ammo", "_speed", "_flyAway"];
private _spawnPos = _vehicle modelToWorld [-0.2 + (random 0.4), -0.2 + (random 0.4), random 3];
if (_spawnPos select 2 < 0) then {
_spawnPos set [2, 0];
};
private _projectile = createVehicle [_ammo, _spawnPos, [], 0, "CAN_COLLIDE"];
if (_flyAway) then {
private _vectorAmmo = [(-1 + (random 2)), (-1 + (random 2)), -0.2 + (random 1)];
private _velVec = _vectorAmmo vectorMultiply _speed;
_projectile setVectorDir _velVec;
_projectile setVelocity _velVec;
} else {
_projectile setDamage 1;
};
_projectile;
};
private _speed = random (_speedOfAmmo / 10) max 1;
_simType = toLowerANSI _simType;
switch (_simType) do {
case ("shotbullet"): {
[QGVAR(playCookoffSound), [_vehicle, _simType]] call CBA_fnc_globalEvent;
if (random 1 < 0.6) then {
[_vehicle, _ammo, _speed, true] call _spawnProjectile;
};
};
case ("shotshell"): {
[QGVAR(playCookoffSound), [_vehicle, _simType]] call CBA_fnc_globalEvent;
if (random 1 < 0.15) then {
[_vehicle, _ammo, _speed, true] call _spawnProjectile;
};
};
case ("shotgrenade"): {
if (random 1 < 0.9) then {
_speed = 0;
};
[_vehicle, _ammo, _speed, random 1 < 0.5] call _spawnProjectile;
};
case ("shotrocket");
case ("shotmissile");
case ("shotsubmunitions"): {
if (random 1 < 0.1) then {
[QGVAR(playCookoffSound), [_vehicle, _simType]] call CBA_fnc_globalEvent;
[_vehicle, _ammo, _speed, random 1 < 0.3] call _spawnProjectile;
} else {
createvehicle ["ACE_ammoExplosionLarge", (_vehicle modelToWorld _effect2pos), [], 0 , "CAN_COLLIDE"];
};
};
case ("shotmine");
case ("shotdirectionalbomb"): {
if (random 1 < 0.5) then {
// Not all explosives detonate on destruction, some have scripted alternatives
private _scripted = getNumber (_ammoCfg >> "triggerWhenDestroyed") == 1;
if !(_scripted) then {
_ammo = getText (_ammoCfg >> "ace_explosives_Explosive");
};
// If a scripted alternative doesn't exist use generic explosion
if (_ammo != "") then {
[_vehicle, _ammo, 0, false] call _spawnProjectile;
} else {
createvehicle ["SmallSecondary", (_vehicle modelToWorld _effect2pos), [], 0 , "CAN_COLLIDE"];
};
};
};
case ("shotilluminating"): {
if (random 1 < 0.15) then {
[_vehicle, _ammo, _speed, random 1 < 0.3] call _spawnProjectile;
};
};
};
[FUNC(detonateAmmunition), [_vehicle, _magazines, _totalAmmo], _timeBetweenAmmoDetonation] call CBA_fnc_waitAndExecute;

View File

@ -0,0 +1,54 @@
#include "..\script_component.hpp"
/*
* Author: johnb43
* Starts detonating ammunition from an object (e.g. vehicle or crate).
*
* Arguments:
* 0: Object <OBJECT>
* 1: Destroy when finished <BOOL> (default: false)
* 2: Source <OBJECT> (default: objNull)
* 3: Instigator <OBJECT> (default: objNull)
* 4: Initial delay <NUMBER> (default: 0)
*
* Return Value:
* None
*
* Example:
* [cursorObject] call ace_cookoff_fnc_detonateAmmunitionServer
*
* Public: No
*/
if (!isServer) exitWith {};
params ["_object", ["_destroyWhenFinished", false], ["_source", objNull], ["_instigator", objNull], ["_initialDelay", 0]];
if (isNull _object) exitWith {};
// Check if the object can cook its ammo off
if (
underwater _object ||
{private _posASL = getPosWorld _object; surfaceIsWater _posASL && {(_posASL select 2) < 0}} || // Underwater is not very reliable, so use model center instead
{GVAR(ammoCookoffDuration) == 0} ||
{!([GVAR(enableAmmoCookoff), GVAR(enableAmmobox)] select (_object isKindOf "ReammoBox_F"))} ||
{!(_object getVariable [QGVAR(enableAmmoCookoff), true])}
) exitWith {};
// Don't have an object detonate its ammo twice
if (_object getVariable [QGVAR(isAmmoDetonating), false]) exitWith {};
_object setVariable [QGVAR(isAmmoDetonating), true, true];
_object setVariable [QGVAR(cookoffMagazines), _object call FUNC(getVehicleAmmo)];
// TODO: When setMagazineTurretAmmo and magazineTurretAmmo are fixed (https://feedback.bistudio.com/T79689),
// we can add gradual ammo removal during cook-off
if (GVAR(removeAmmoDuringCookoff)) then {
clearMagazineCargoGlobal _object;
{
[QEGVAR(common,removeMagazinesTurret), [_object, _x select 0, _x select 1], _object, _x select 1] call CBA_fnc_turretEvent;
} forEach (magazinesAllTurrets _object);
};
[LINKFUNC(detonateAmmunitionServerLoop), [_object, _destroyWhenFinished, _source, _instigator], _initialDelay] call CBA_fnc_waitAndExecute;

View File

@ -0,0 +1,181 @@
#include "..\script_component.hpp"
/*
* Author: Glowbal, johnb43
* Detonates ammunition from an object (e.g. vehicle or crate) until no ammo is left.
*
* Arguments:
* 0: Object <OBJECT>
* 1: Destroy when finished <BOOL>
* 2: Source <OBJECT>
* 3: Instigator <OBJECT>
*
* Return Value:
* None
*
* Example:
* [cursorObject, true, player, player] call ace_cookoff_fnc_detonateAmmunitionServerLoop
*
* Public: No
*/
params ["_object", "_destroyWhenFinished", "_source", "_instigator"];
if (isNull _object) exitWith {};
(_object getVariable QGVAR(cookoffMagazines)) params ["_magazines", "_totalAmmo"];
private _hasFinished = _totalAmmo <= 0 || {_magazines isEqualTo []};
// If the cook-off has finished or been interrupted, clean up the effects for boxes (no vehicle effects)
if (
_hasFinished ||
{underwater _object} ||
{private _posASL = getPosWorld _object; surfaceIsWater _posASL && {(_posASL select 2) < 0}} || // Underwater is not very reliable, so use model center instead
{GVAR(ammoCookoffDuration) == 0} ||
{!([GVAR(enableAmmoCookoff), GVAR(enableAmmobox)] select (_object isKindOf "ReammoBox_F"))} ||
{!(_object getVariable [QGVAR(enableAmmoCookoff), true])}
) exitWith {
// Box cook-off fire ends after the ammo has detonated (vehicle cook-off fire does not depend on the ammo detonation)
if (_object isKindOf "ReammoBox_F") then {
[QGVAR(cleanupEffects), _object] call CBA_fnc_globalEvent;
// Reset variable, so the box can cook-off again
_object setVariable [QGVAR(isCookingOff), nil, true];
// Remove cook-off effects from box
private _jipID = _object getVariable QGVAR(cookoffBoxJipID);
if (isNil "_jipID") exitWith {};
_jipID call CBA_fnc_removeGlobalEventJIP;
_object setVariable [QGVAR(cookoffBoxJipID), nil];
};
// Reset variables, so the object can detonate its ammo again
_object setVariable [QGVAR(cookoffMagazines), nil];
_object setVariable [QGVAR(isAmmoDetonating), nil, true];
// If done, destroy the object if necessary
if (_hasFinished && _destroyWhenFinished) then {
_object setDamage [1, true, _source, _instigator];
};
};
private _magazineIndex = floor random (count _magazines);
private _magazine = _magazines select _magazineIndex;
_magazine params ["_magazineClassname", "_ammoCount", "_spawnProjectile"];
// Make sure ammo is at least 0
_ammoCount = _ammoCount max 0;
// Remove some ammo, which will be detonated
private _removed = _ammoCount min floor (1 + random (6 / GVAR(ammoCookoffDuration)));
_ammoCount = _ammoCount - _removed;
if (_ammoCount <= 0) then {
_magazines deleteAt _magazineIndex;
} else {
_magazine set [1, _ammoCount]; // remove ammo that was detonated
};
private _timeBetweenAmmoDetonation = ((random 10 / sqrt _totalAmmo) min MAX_TIME_BETWEEN_AMMO_DET) max 0.1;
TRACE_2("",_totalAmmo,_timeBetweenAmmoDetonation);
_totalAmmo = _totalAmmo - _removed;
_object setVariable [QGVAR(cookoffMagazines), [_magazines, _totalAmmo]];
// Get magazine info, which is used to spawn projectiles
private _configMagazine = configFile >> "CfgMagazines" >> _magazineClassname;
private _ammo = getText (_configMagazine >> "ammo");
private _configAmmo = configFile >> "CfgAmmo" >> _ammo;
private _simType = toLower getText (_configAmmo >> "simulation");
private _speed = linearConversion [0, 1, random 1, 1, 20, true];
private _effect2pos = _object selectionPosition "destructionEffect2";
// Spawns the projectiles, making them either fly in random directions or explode
private _fnc_spawnProjectile = {
// If the magazines are inside of the cargo (inventory), don't let their projectiles escape the interior of the vehicle
if (!_spawnProjectile) exitWith {};
params ["_object", "_ammo", "_speed", "_flyAway"];
private _spawnPos = _object modelToWorld [-0.2 + random 0.4, -0.2 + random 0.4, random 3];
if (_spawnPos select 2 < 0) then {
_spawnPos set [2, 0];
};
private _projectile = createVehicle [_ammo, _spawnPos, [], 0, "CAN_COLLIDE"];
if (_flyAway) then {
private _vectorAmmo = [-1 + random 2, -1 + random 2, -0.2 + random 1];
private _vectorVelocity = _vectorAmmo vectorMultiply _speed;
_projectile setVectorDir _vectorVelocity;
_projectile setVelocity _vectorVelocity;
} else {
_projectile setDamage 1;
};
};
switch (_simType) do {
case "shotbullet": {
[QGVAR(playCookoffSound), [_object, _simType]] call CBA_fnc_globalEvent;
if (random 1 < 0.6) then {
[_object, _ammo, _speed, true] call _fnc_spawnProjectile;
};
};
case "shotshell": {
[QGVAR(playCookoffSound), [_object, _simType]] call CBA_fnc_globalEvent;
if (random 1 < 0.15) then {
[_object, _ammo, _speed, true] call _fnc_spawnProjectile;
};
};
case "shotgrenade": {
if (random 1 < 0.9) then {
_speed = 0;
};
[_object, _ammo, _speed, random 1 < 0.5] call _fnc_spawnProjectile;
};
case "shotrocket";
case "shotmissile";
case "shotsubmunitions": {
if (random 1 < 0.1) then {
[QGVAR(playCookoffSound), [_object, _simType]] call CBA_fnc_globalEvent;
[_object, _ammo, _speed, random 1 < 0.3] call _fnc_spawnProjectile;
} else {
createVehicle ["ACE_ammoExplosionLarge", _object modelToWorld _effect2pos, [], 0 , "CAN_COLLIDE"];
};
};
case "shotdirectionalbomb";
case "shotmine": {
if (random 1 < 0.5) then {
// Not all explosives detonate on destruction, some have scripted alternatives
if (getNumber (_configAmmo >> "triggerWhenDestroyed") != 1) then {
_ammo = getText (_configAmmo >> QEGVAR(explosives,explosive));
};
// If a scripted alternative doesn't exist use generic explosion
if (_ammo != "") then {
[_object, _ammo, 0, false] call _fnc_spawnProjectile;
} else {
createVehicle ["SmallSecondary", _object modelToWorld _effect2pos, [], 0 , "CAN_COLLIDE"];
};
};
};
case "shotilluminating": {
if (random 1 < 0.15) then {
[_object, _ammo, _speed, random 1 < 0.3] call _fnc_spawnProjectile;
};
};
};
// Detonate the remaining ammo after a delay
[LINKFUNC(detonateAmmunitionServerLoop), [_object, _destroyWhenFinished, _source, _instigator], _timeBetweenAmmoDetonation] call CBA_fnc_waitAndExecute;

View File

@ -1,51 +0,0 @@
#include "..\script_component.hpp"
/*
* Author: KoffeinFlummi, commy2
* Start fire in engine block of a car.
*
* Arguments:
* 0: Vehicle <Object>
*
* Return Value:
* None
*
* Example:
* (vehicle player) call ace_cookoff_fnc_engineFire
*
* Public: No
*/
params ["_vehicle"];
if (_vehicle getVariable [QGVAR(isEngineSmoking), false]) exitWith {};
_vehicle setVariable [QGVAR(isEngineSmoking), true];
if (local _vehicle) then {
[QGVAR(engineFire), _vehicle] call CBA_fnc_globalEvent;
};
private _offset = getArray (_vehicle call CBA_fnc_getObjectConfig >> QGVAR(engineSmokeOffset));
if (_offset isEqualTo []) then {
_offset = [0,0,0];
};
private _position = [
0,
(boundingBoxReal _vehicle select 1 select 1) - 2,
(boundingBoxReal _vehicle select 0 select 2) + 2
] vectorAdd _offset;
private _smoke = "#particlesource" createVehicleLocal [0,0,0];
_smoke setParticleClass "ObjectDestructionSmoke1_2Smallx";
_smoke attachTo [_vehicle, _position];
[{
(_this select 0) params ["_vehicle", "_smoke", "_time"];
if (isNull _vehicle || {!alive _vehicle} || {_vehicle getHitPointDamage "HitEngine" < 0.9} || {CBA_missionTime > _time}) then {
deleteVehicle _smoke;
_vehicle setVariable [QGVAR(isEngineSmoking), false];
[_this select 1] call CBA_fnc_removePerFrameHandler;
};
}, 5, [_vehicle, _smoke, CBA_missionTime + 240]] call CBA_fnc_addPerFrameHandler;

View File

@ -0,0 +1,81 @@
#include "..\script_component.hpp"
/*
* Author: KoffeinFlummi, commy2, johnb43
* Start fire in engine block of a car.
*
* Arguments:
* 0: Vehicle <OBJECT>
* 1: End time <NUMBER>
*
* Return Value:
* None
*
* Example:
* [cursorObject, CBA_missionTime + 10] call ace_cookoff_fnc_engineFireLocal
*
* Public: No
*/
params ["_vehicle", "_endTime"];
// For JIP players and if the time wasn't set properly
if (_endTime < CBA_missionTime) exitWith {};
private _smoke = objNull;
if (hasInterface) then {
private _hitPoints = getAllHitPointsDamage _vehicle;
// Get hitpoint for engine
private _index = (_hitPoints select 0) findIf {_x == "hitengine"};
// Get corresponding selection
private _position = if (_index != -1) then {
_vehicle selectionPosition [(_hitPoints select 1) select _index, "HitPoints", "AveragePoint"]
} else {
[0, 0, 0]
};
if (_position isEqualTo [0, 0, 0]) then {
// Get offset for engine smoke if there is one
private _offset = getArray (configOf _vehicle >> QGVAR(engineSmokeOffset));
if (_offset isEqualTo []) then {
_offset = [0, 0, 0];
};
_position = [
0,
(boundingBoxReal _vehicle select 1 select 1) - 2,
(boundingBoxReal _vehicle select 0 select 2) + 2
] vectorAdd _offset;
};
// Spawn smoke
_smoke = createVehicleLocal ["#particlesource", ASLToAGL getPosASL _vehicle, [], 0, "CAN_COLLIDE"];;
_smoke setParticleClass "ObjectDestructionSmoke1_2Smallx";
_smoke attachTo [_vehicle, _position];
};
[{
(_this select 0) params ["_vehicle", "_smoke", "_endTime"];
if (alive _vehicle && {_vehicle getHitPointDamage "HitEngine" >= 0.9} && {CBA_missionTime < _endTime}) exitWith {};
(_this select 1) call CBA_fnc_removePerFrameHandler;
deleteVehicle _smoke;
if (!isServer || {isNull _vehicle}) exitWith {};
// Reset variable, so engine can smoke again in the future
_vehicle setVariable [QGVAR(isEngineSmoking), nil, true];
private _jipID = _vehicle getVariable QGVAR(engineFireJipID);
if (isNil "_jipID") exitWith {};
_jipID call CBA_fnc_removeGlobalEventJIP;
_vehicle setVariable [QGVAR(engineFireJipID), nil];
}, 5, [_vehicle, _smoke, _endTime]] call CBA_fnc_addPerFrameHandler;

View File

@ -0,0 +1,34 @@
#include "..\script_component.hpp"
/*
* Author: KoffeinFlummi, commy2, johnb43
* Start fire in engine block of a car.
*
* Arguments:
* 0: Vehicle <OBJECT>
*
* Return Value:
* None
*
* Example:
* cursorObject call ace_cookoff_fnc_engineFireServer
*
* Public: No
*/
if (!isServer) exitWith {};
params ["_vehicle"];
// If already smoking, stop
if (_vehicle getVariable [QGVAR(isEngineSmoking), false]) exitWith {};
_vehicle setVariable [QGVAR(isEngineSmoking), true, true];
// Spawn engine fire effects on all connected machines
private _jipID = [QGVAR(engineFireLocal), [_vehicle, CBA_missionTime + random [ENGINE_FIRE_TIME / 2, ENGINE_FIRE_TIME, ENGINE_FIRE_TIME / 2 * 3]]] call CBA_fnc_globalEventJIP;
[_jipID, _vehicle] call CBA_fnc_removeGlobalEventJIP;
_vehicle setVariable [QGVAR(engineFireJipID), _jipID];
// API
[QGVAR(engineFire), [_vehicle]] call CBA_fnc_globalEvent;

View File

@ -1,65 +1,76 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
* Gets all magazines inside of a vehicle.
* Gets all magazines inside of an object.
*
* Arguments:
* 0: Vehicle <Object>
* 0: Object <OBJECT>
*
* Return Value:
* 0: Ammo Array <ARRAY>
* - 0: Magazine Classname <STRING>
* - 1: Ammo Count <NUMBER>
* 1: Total Ammo Count <NUMBER>
* 0: Ammo array <ARRAY>
* - 0: Magazine classname <STRING>
* - 1: Ammo count <NUMBER>
* - 2: If a projectile should be spawned upon detonation <BOOL>
* 1: Total ammo count <NUMBER>
*
* Example:
* [vehicle player] call ace_cookoff_fnc_getVehicleAmmo
* cursorObject call ace_cookoff_fnc_getVehicleAmmo
*
* Public: No
*/
params ["_vehicle"];
TRACE_1("getVehicleAmmo",_vehicle);
params ["_object"];
TRACE_1("getVehicleAmmo",_object);
private _ammoToDetonate = [];
private _totalAmmo = 0;
private _cfgMagazines = configFile >> "CfgMagazines";
private _cfgAmmo = configFile >> "CfgAmmo";
private _ammo = "";
// Get ammo from turrets
{
_x params ["_mag", "_turret", "_count"];
// if the turret is an FFV seat, it takes magazines from the soldier
if (_count > 0) then {
if (_mag call FUNC(isMagazineFlare)) then {continue};
private _ammo = getText (configFile >> "CfgMagazines" >> _mag >> "ammo");
private _model = getText (configFile >> "CfgAmmo" >> _ammo >> "model");
if (_model == "\A3\weapons_f\empty") exitWith {TRACE_3("skipping",_mag,_ammo,_model);};
_ammoToDetonate pushBack [_mag, _count];
// If the turret is an FFV seat, it takes magazines from the soldier
_x params ["_magazine", "", "_count"];
if (_count > 0 && {!(_magazine call FUNC(isMagazineFlare))}) then {
_ammo = getText (_cfgMagazines >> _magazine >> "ammo");
if (getText (_cfgAmmo >> _ammo >> "model") == "\A3\weapons_f\empty") then {
TRACE_2("skipping",_magazine,_ammo);
continue;
};
_ammoToDetonate pushBack [_magazine, _count, true];
_totalAmmo = _totalAmmo + _count;
};
} forEach (magazinesAllTurrets [_vehicle, true]);
} forEach (magazinesAllTurrets [_object, true]);
// Get ammo from cargo space
{
_x params ["_mag", "_count"];
if (_count > 0) then {
if (_mag call FUNC(isMagazineFlare)) then {continue};
_ammoToDetonate pushBack [_mag, _count];
_x params ["_magazine", "_count"];
if (_count > 0 && {!(_magazine call FUNC(isMagazineFlare))}) then {
_ammoToDetonate pushBack [_magazine, _count, false];
_totalAmmo = _totalAmmo + _count;
};
} forEach (magazinesAmmoCargo _vehicle);
} forEach (magazinesAmmoCargo _object);
// Get ammo from transportAmmo / ace_rearm
private _vehCfg = configOf _vehicle;
private _configVehicle = configOf _object;
private _configSupply = (getNumber (_configVehicle >> "transportAmmo")) max (getNumber (_configVehicle >> QEGVAR(rearm,defaultSupply)));
private _configSupply = (getNumber (_vehCfg >> "transportAmmo")) max (getNumber (_vehCfg >> QEGVAR(rearm,defaultSupply)));
if (_vehicle getVariable [QEGVAR(rearm,isSupplyVehicle), (_configSupply > 0)]) then {
TRACE_1("transportAmmo vehicle - adding virtual ammo",typeOf _vehicle);
if (_object getVariable [QEGVAR(rearm,isSupplyVehicle), _configSupply > 0]) then {
TRACE_1("transportAmmo vehicle - adding virtual ammo",typeOf _object);
_ammoToDetonate pushBack ["2000Rnd_65x39_belt", 2000];
_ammoToDetonate pushBack ["2000Rnd_65x39_belt", 2000, false];
_totalAmmo = _totalAmmo + 2000;
_ammoToDetonate pushBack ["20Rnd_105mm_HEAT_MP", 100];
_ammoToDetonate pushBack ["20Rnd_105mm_HEAT_MP", 100, true];
_totalAmmo = _totalAmmo + 100;
_ammoToDetonate pushBack ["SatchelCharge_Remote_Mag", 10];
_ammoToDetonate pushBack ["SatchelCharge_Remote_Mag", 10, true];
_totalAmmo = _totalAmmo + 10;
};

Some files were not shown because too many files have changed in this diff Show More