mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Merge branch 'master' into 40mmBrass
This commit is contained in:
@ -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
|
||||
|
@ -1245,6 +1245,7 @@
|
||||
<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">
|
||||
@ -1254,6 +1255,7 @@
|
||||
<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">
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -40,6 +40,7 @@
|
||||
<Japanese>配置する</Japanese>
|
||||
<Korean>배치하기</Korean>
|
||||
<French>Déployer</French>
|
||||
<German>Aufstellen</German>
|
||||
<Spanish>Desplegar</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Cargo_ScrollAction">
|
||||
@ -288,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>
|
||||
@ -297,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<br/>could not be loaded</English>
|
||||
@ -587,6 +590,7 @@
|
||||
<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">
|
||||
@ -596,6 +600,7 @@
|
||||
<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>
|
||||
|
@ -161,6 +161,7 @@ PREP(sendRequest);
|
||||
PREP(serverLog);
|
||||
PREP(setAimCoef);
|
||||
PREP(setApproximateVariablePublic);
|
||||
PREP(setDead);
|
||||
PREP(setDefinedVariable);
|
||||
PREP(setDisableUserInputStatus);
|
||||
PREP(setHearingCapability);
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,65 @@
|
||||
#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];
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Adds event handler just to ace_player
|
||||
|
@ -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];
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
}];
|
||||
|
44
addons/common/functions/fnc_setDead.sqf
Normal file
44
addons/common/functions/fnc_setDead.sqf
Normal 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];
|
||||
};
|
@ -1834,6 +1834,7 @@
|
||||
<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>
|
||||
@ -1843,6 +1844,7 @@
|
||||
<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>
|
||||
@ -1852,6 +1854,7 @@
|
||||
<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>
|
||||
|
@ -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;
|
||||
};
|
||||
};
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -6,6 +6,7 @@
|
||||
<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">
|
||||
@ -13,6 +14,7 @@
|
||||
<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">
|
||||
@ -20,6 +22,7 @@
|
||||
<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">
|
||||
@ -27,6 +30,7 @@
|
||||
<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">
|
||||
@ -34,6 +38,7 @@
|
||||
<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">
|
||||
@ -41,6 +46,7 @@
|
||||
<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">
|
||||
@ -49,6 +55,7 @@
|
||||
<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">
|
||||
@ -57,6 +64,7 @@
|
||||
<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">
|
||||
@ -65,6 +73,7 @@
|
||||
<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">
|
||||
@ -73,6 +82,7 @@
|
||||
<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">
|
||||
@ -81,6 +91,7 @@
|
||||
<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">
|
||||
@ -89,6 +100,7 @@
|
||||
<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">
|
||||
@ -97,6 +109,7 @@
|
||||
<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">
|
||||
@ -105,6 +118,7 @@
|
||||
<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">
|
||||
@ -113,6 +127,7 @@
|
||||
<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">
|
||||
@ -121,6 +136,7 @@
|
||||
<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">
|
||||
@ -129,6 +145,7 @@
|
||||
<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>
|
||||
|
@ -51,6 +51,7 @@
|
||||
<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">
|
||||
@ -92,6 +93,7 @@
|
||||
<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>
|
||||
|
@ -1,6 +0,0 @@
|
||||
class CfgVehicles {
|
||||
class gm_ural4320_base;
|
||||
class gm_ural4320_refuel_base: gm_ural4320_base {
|
||||
transportFuel = 0;
|
||||
};
|
||||
};
|
@ -21,4 +21,3 @@ class CfgPatches {
|
||||
};
|
||||
|
||||
#include "CfgEventHandlers.hpp"
|
||||
#include "CfgVehicles.hpp"
|
||||
|
1
addons/compat_rf/$PBOPREFIX$
Normal file
1
addons/compat_rf/$PBOPREFIX$
Normal file
@ -0,0 +1 @@
|
||||
z\ace\addons\compat_rf
|
42
addons/compat_rf/CfgWeapons.hpp
Normal file
42
addons/compat_rf/CfgWeapons.hpp
Normal 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;
|
||||
};
|
||||
};
|
@ -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};
|
||||
};
|
||||
};
|
21
addons/compat_rf/compat_rf_nouniformrestrictions/config.cpp
Normal file
21
addons/compat_rf/compat_rf_nouniformrestrictions/config.cpp
Normal 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"
|
@ -0,0 +1,3 @@
|
||||
#define SUBCOMPONENT nouniformrestrictions
|
||||
#define SUBCOMPONENT_BEAUTIFIED No Uniform Restrictions
|
||||
#include "..\script_component.hpp"
|
41
addons/compat_rf/compat_rf_realisticnames/Attachments.hpp
Normal file
41
addons/compat_rf/compat_rf_realisticnames/Attachments.hpp
Normal 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);
|
||||
};
|
24
addons/compat_rf/compat_rf_realisticnames/CfgMagazines.hpp
Normal file
24
addons/compat_rf/compat_rf_realisticnames/CfgMagazines.hpp
Normal 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);
|
||||
};
|
||||
};
|
134
addons/compat_rf/compat_rf_realisticnames/CfgVehicles.hpp
Normal file
134
addons/compat_rf/compat_rf_realisticnames/CfgVehicles.hpp
Normal 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);
|
||||
};
|
||||
};
|
111
addons/compat_rf/compat_rf_realisticnames/CfgWeapons.hpp
Normal file
111
addons/compat_rf/compat_rf_realisticnames/CfgWeapons.hpp
Normal 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);
|
||||
};
|
||||
};
|
23
addons/compat_rf/compat_rf_realisticnames/config.cpp
Normal file
23
addons/compat_rf/compat_rf_realisticnames/config.cpp
Normal 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"
|
@ -0,0 +1,3 @@
|
||||
#define SUBCOMPONENT realisticnames
|
||||
#define SUBCOMPONENT_BEAUTIFIED Realistic Names
|
||||
#include "..\script_component.hpp"
|
297
addons/compat_rf/compat_rf_realisticnames/stringtable.xml
Normal file
297
addons/compat_rf/compat_rf_realisticnames/stringtable.xml
Normal 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>
|
18
addons/compat_rf/config.cpp
Normal file
18
addons/compat_rf/config.cpp
Normal 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"
|
6
addons/compat_rf/script_component.hpp
Normal file
6
addons/compat_rf/script_component.hpp
Normal 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"
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
};
|
@ -18,4 +18,4 @@ class CfgPatches {
|
||||
};
|
||||
};
|
||||
|
||||
#include "CfgVehicles.hpp"
|
||||
// ADDON kept for backward compatiblity
|
||||
|
@ -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;
|
||||
};
|
||||
};
|
@ -21,4 +21,3 @@ class CfgPatches {
|
||||
};
|
||||
|
||||
#include "CfgEventHandlers.hpp"
|
||||
#include "CfgVehicles.hpp"
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
|
75
addons/compat_ws/compat_ws_realisticnames/Attachments.hpp
Normal file
75
addons/compat_ws/compat_ws_realisticnames/Attachments.hpp
Normal 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);
|
||||
};
|
60
addons/compat_ws/compat_ws_realisticnames/CfgVehicles.hpp
Normal file
60
addons/compat_ws/compat_ws_realisticnames/CfgVehicles.hpp
Normal 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);
|
||||
};
|
||||
};
|
@ -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);
|
||||
};
|
||||
};
|
||||
|
@ -19,3 +19,4 @@ class CfgPatches {
|
||||
};
|
||||
|
||||
#include "CfgWeapons.hpp"
|
||||
#include "CfgVehicles.hpp"
|
||||
|
@ -26,7 +26,7 @@
|
||||
<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>
|
||||
@ -45,7 +45,7 @@
|
||||
<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>
|
||||
@ -65,7 +65,7 @@
|
||||
<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>
|
||||
@ -94,7 +94,7 @@
|
||||
<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>
|
||||
@ -124,7 +124,7 @@
|
||||
<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>
|
||||
@ -142,7 +142,7 @@
|
||||
<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>
|
||||
@ -192,7 +192,7 @@
|
||||
<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>
|
||||
@ -201,7 +201,7 @@
|
||||
<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>
|
||||
@ -211,7 +211,7 @@
|
||||
<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>
|
||||
@ -256,12 +256,20 @@
|
||||
<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>
|
||||
@ -291,7 +299,7 @@
|
||||
<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>
|
||||
@ -300,7 +308,7 @@
|
||||
<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>
|
||||
@ -448,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>
|
||||
|
@ -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) {
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
class CfgCloudlets {
|
||||
class GVAR(CookOff) {
|
||||
interval = 0.004;
|
||||
|
@ -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)});
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
class Extended_PreStart_EventHandlers {
|
||||
class ADDON {
|
||||
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
class CfgSFX {
|
||||
class GVAR(CookOff_low) {
|
||||
name = QGVAR(cookoff_low);
|
||||
|
@ -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};
|
||||
};
|
||||
};
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
@ -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;
|
52
addons/cookoff/functions/fnc_cookOffBoxLocal.sqf
Normal file
52
addons/cookoff/functions/fnc_cookOffBoxLocal.sqf
Normal 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
|
50
addons/cookoff/functions/fnc_cookOffBoxServer.sqf
Normal file
50
addons/cookoff/functions/fnc_cookOffBoxServer.sqf
Normal 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;
|
@ -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;
|
229
addons/cookoff/functions/fnc_cookOffLocal.sqf
Normal file
229
addons/cookoff/functions/fnc_cookOffLocal.sqf
Normal 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;
|
202
addons/cookoff/functions/fnc_cookOffServer.sqf
Normal file
202
addons/cookoff/functions/fnc_cookOffServer.sqf
Normal 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;
|
@ -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;
|
54
addons/cookoff/functions/fnc_detonateAmmunitionServer.sqf
Normal file
54
addons/cookoff/functions/fnc_detonateAmmunitionServer.sqf
Normal 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;
|
181
addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
Normal file
181
addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
Normal 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;
|
@ -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;
|
81
addons/cookoff/functions/fnc_engineFireLocal.sqf
Normal file
81
addons/cookoff/functions/fnc_engineFireLocal.sqf
Normal 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;
|
34
addons/cookoff/functions/fnc_engineFireServer.sqf
Normal file
34
addons/cookoff/functions/fnc_engineFireServer.sqf
Normal 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;
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: KoffeinFlummi, commy2
|
||||
* Handles all incoming damage for boxi
|
||||
* Author: KoffeinFlummi, commy2, johnb43
|
||||
* Handles all incoming damage for boxes.
|
||||
*
|
||||
* Arguments:
|
||||
* HandleDamage EH <ARRAY>
|
||||
*
|
||||
* Return Value:
|
||||
* Damage to be inflicted. <NUMBER>
|
||||
* Damage to be inflicted (can be nil) <NUMBER>
|
||||
*
|
||||
* Example:
|
||||
* _this call ace_cookoff_fnc_handleDamageBox
|
||||
@ -15,58 +15,48 @@
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
params ["_vehicle", "", "_damage", "_source", "_ammo", "_hitIndex", "_shooter"];
|
||||
// If cookoff for boxes is disabled, exit
|
||||
if (!GVAR(enableAmmobox) || {GVAR(ammoCookoffDuration) == 0}) exitWith {};
|
||||
|
||||
// it's already dead, who cares?
|
||||
if (damage _vehicle >= 1) exitWith {};
|
||||
params ["_box", "", "_damage", "_source", "_ammo", "", "_instigator", "_hitPoint"];
|
||||
|
||||
// If cookoff is disabled exit
|
||||
if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] in [0, false]) exitWith {};
|
||||
if (!local _box) exitWith {};
|
||||
|
||||
// get hitpoint name
|
||||
private _hitpoint = "#structural";
|
||||
// If it's already dead, ignore
|
||||
if (!alive _box) exitWith {};
|
||||
|
||||
if (_hitIndex != -1) then {
|
||||
_hitpoint = toLowerANSI ((getAllHitPointsDamage _vehicle param [0, []]) select _hitIndex);
|
||||
};
|
||||
if !(_box getVariable [QGVAR(enableAmmoCookoff), true]) exitWith {};
|
||||
|
||||
// get change in damage
|
||||
private _oldDamage = 0;
|
||||
if !(_hitPoint == "" && {_damage > 0.5}) exitWith {}; // "" means structural damage
|
||||
|
||||
if (_hitpoint isEqualTo "#structural") then {
|
||||
_oldDamage = damage _vehicle;
|
||||
private _ammoConfig = _ammo call CBA_fnc_getObjectConfig;
|
||||
|
||||
// Catch fire when hit by an explosive or incendiary round
|
||||
if ((getNumber (_ammoConfig >> "explosive") >= 0.5) || {getNumber (_ammoConfig >> QEGVAR(vehicle_damage,incendiary)) > random 1}) then {
|
||||
[QGVAR(cookOffBoxServer), [_box, _source, _instigator]] call CBA_fnc_serverEvent;
|
||||
} else {
|
||||
_oldDamage = _vehicle getHitIndex _hitIndex;
|
||||
};
|
||||
// There is a small chance of cooking a box off if it's shot by tracer ammo
|
||||
if (random 1 >= _damage * 0.05) exitWith {};
|
||||
|
||||
if (_hitpoint == "#structural" && _damage > 0.5) then {
|
||||
// Almost always catch fire when hit by an explosive
|
||||
if (IS_EXPLOSIVE_AMMO(_ammo)) then {
|
||||
_vehicle call FUNC(cookOffBox);
|
||||
// Need magazine to check for tracers
|
||||
private _magazine = if (_source == _instigator) then {
|
||||
currentMagazine _source
|
||||
} else {
|
||||
// Need magazine to check for tracers
|
||||
private _mag = "";
|
||||
if (_source == _shooter) then {
|
||||
_mag = currentMagazine _source;
|
||||
} else {
|
||||
_mag = _source currentMagazineTurret ([_shooter] call CBA_fnc_turretPath);
|
||||
};
|
||||
private _magCfg = configFile >> "CfgMagazines" >> _mag;
|
||||
|
||||
// Magazine could have changed during flight time (just ignore if so)
|
||||
if (getText (_magCfg >> "ammo") == _ammo) then {
|
||||
// If magazine's tracer density is high enough then low chance for cook off
|
||||
private _tracers = getNumber (_magCfg >> "tracersEvery");
|
||||
if (_tracers >= 1 && {_tracers <= 4}) then {
|
||||
if (random 1 < _oldDamage*0.05) then {
|
||||
_vehicle call FUNC(cookOffBox);
|
||||
};
|
||||
};
|
||||
};
|
||||
_source currentMagazineTurret (_source unitTurret _instigator)
|
||||
};
|
||||
|
||||
// prevent destruction, let cook-off handle it if necessary
|
||||
_damage min 0.89
|
||||
} else {
|
||||
_damage
|
||||
private _configMagazine = configFile >> "CfgMagazines" >> _magazine;
|
||||
|
||||
// Magazine could have changed during flight time (just ignore if so)
|
||||
if (getText (_configMagazine >> "ammo") == _ammo) then {
|
||||
// If magazine's tracer density is high enough then low chance for cook off
|
||||
private _tracers = getNumber (_configMagazine >> "tracersEvery");
|
||||
|
||||
if (_tracers >= 1 && {_tracers <= 4}) then {
|
||||
[QGVAR(cookOffBoxServer), [_box, _source, _instigator]] call CBA_fnc_serverEvent;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
// Prevent destruction, let cook-off handle it if necessary
|
||||
_damage min 0.89
|
||||
|
@ -1,24 +1,22 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: Cyruz
|
||||
* Checks if the magazine has ammo which is a flare
|
||||
* Checks if the magazine's ammo are flares.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Magazine <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* 0: If magazine is type of flare <BOOL>
|
||||
* If magazine is type of flare <BOOL>
|
||||
*
|
||||
* Example:
|
||||
* ["3Rnd_UGL_FlareWhite_F"] call ace_cookoff_fnc_isMagazineFlare
|
||||
* "3Rnd_UGL_FlareWhite_F" call ace_cookoff_fnc_isMagazineFlare
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
params ["_magazine"];
|
||||
|
||||
private _ammo = getText (configFile >> "CfgMagazines" >> _magazine >> "ammo");
|
||||
private _intensity = getNumber (configFile >> "CfgAmmo" >> _ammo >> "intensity");
|
||||
private _flare = getNumber (configFile >> "CfgAmmo" >> _ammo >> QEGVAR(grenades,flare));
|
||||
private _configAmmo = configFile >> "CfgAmmo" >> getText (configFile >> "CfgMagazines" >> _magazine >> "ammo");
|
||||
|
||||
_intensity != 0 || _flare == 1
|
||||
getNumber (_configAmmo >> "intensity") != 0 || {getNumber (_configAmmo >> QEGVAR(grenades,flare)) == 1}
|
||||
|
@ -5,7 +5,7 @@
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Vehicle <OBJECT>
|
||||
* 1. Selections for smoke to come out of <ARRAY> (default: [])
|
||||
* 1: Selections for smoke to come out of <ARRAY>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
@ -16,12 +16,11 @@
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
params ["_vehicle", ["_positions", []]];
|
||||
params ["_vehicle", "_selections"];
|
||||
|
||||
private _turretConfig = [_vehicle, [0]] call CBA_fnc_getTurret;
|
||||
private _positionBarrelEnd = getText (_turretConfig >> "gunBeg");
|
||||
private _positionBarrelEnd = getText ([_vehicle, [0]] call CBA_fnc_getTurret >> "gunBeg");
|
||||
|
||||
// smoke out of cannon and hatches
|
||||
// Smoke out of cannon and hatches
|
||||
private _smokeBarrel = "#particlesource" createVehicleLocal [0, 0, 0];
|
||||
_smokeBarrel setParticleClass "MediumDestructionSmoke";
|
||||
_smokeBarrel attachTo [_vehicle, [0, 0, 0], _positionBarrelEnd];
|
||||
@ -29,10 +28,10 @@ _smokeBarrel attachTo [_vehicle, [0, 0, 0], _positionBarrelEnd];
|
||||
private _effects = [_smokeBarrel];
|
||||
|
||||
{
|
||||
private _position = [0, -2, 0];
|
||||
|
||||
if (_x isNotEqualTo "#noselection") then {
|
||||
_position = _vehicle selectionPosition _x;
|
||||
private _position = if (_x != "#noselection") then {
|
||||
_vehicle selectionPosition _x
|
||||
} else {
|
||||
[0, -2, 0]
|
||||
};
|
||||
|
||||
private _smoke = "#particlesource" createVehicleLocal [0, 0, 0];
|
||||
@ -40,6 +39,6 @@ private _effects = [_smokeBarrel];
|
||||
_smoke attachTo [_vehicle, _position];
|
||||
|
||||
_effects pushBack _smoke;
|
||||
} forEach _positions;
|
||||
} forEach _selections;
|
||||
|
||||
_vehicle setVariable [QGVAR(effects), _effects];
|
||||
|
@ -1,69 +1,71 @@
|
||||
[
|
||||
QGVAR(enable), "LIST",
|
||||
[LSTRING(enable_hd_name), LSTRING(enable_hd_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
[[0, 1, 2], ["STR_A3_OPTIONS_DISABLED", ELSTRING(common,playerOnly), ELSTRING(common,playersAndAI)], 2],
|
||||
true, // isGlobal
|
||||
{[QGVAR(enable), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
true // Needs mission restart
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(enableFire), "CHECKBOX",
|
||||
QGVAR(enableFire),
|
||||
"CHECKBOX",
|
||||
[LSTRING(enableFire_name), LSTRING(enableFire_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
true, // default value
|
||||
true, // isGlobal
|
||||
{[QGVAR(enableFire), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
false // Needs mission restart
|
||||
true,
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(destroyVehicleAfterCookoff), "CHECKBOX",
|
||||
[LSTRING(destroyVehicleAfterCookoff_name), LSTRING(destroyVehicleAfterCookoff_tooltip)],
|
||||
QGVAR(cookoffDuration),
|
||||
"SLIDER",
|
||||
[LSTRING(cookoffDuration_name), LSTRING(cookoffDuration_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
false, // default value
|
||||
true, // isGlobal
|
||||
{[QGVAR(destroyVehicleAfterCookoff), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
false // Needs mission restart
|
||||
[0, 10, 1, 2],
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(enableAmmoCookoff), "CHECKBOX",
|
||||
[LSTRING(enableAmmoCookoff_name), LSTRING(enableAmmoCookoff_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
true, // default value
|
||||
true, // isGlobal
|
||||
{[QGVAR(enableAmmoCookoff), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
false // Needs mission restart
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(enableAmmobox), "CHECKBOX",
|
||||
[LSTRING(enableBoxCookoff_name), LSTRING(enableBoxCookoff_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
true, // default value
|
||||
true, // isGlobal
|
||||
{[QGVAR(enableAmmobox), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
true // Needs mission restart
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(ammoCookoffDuration), "SLIDER",
|
||||
[LSTRING(ammoCookoffDuration_name), LSTRING(ammoCookoffDuration_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
[0,5,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)]
|
||||
true, // isGlobal
|
||||
{[QGVAR(ammoCookoffDuration), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
true // Needs mission restart
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(probabilityCoef), "SLIDER",
|
||||
QGVAR(probabilityCoef),
|
||||
"SLIDER",
|
||||
[LSTRING(probabilityCoef_name), LSTRING(probabilityCoef_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
[0,5,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)]
|
||||
true, // isGlobal
|
||||
{[QGVAR(probabilityCoef), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
true // Needs mission restart
|
||||
[0, 10, 1, 2],
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(destroyVehicleAfterCookoff),
|
||||
"CHECKBOX",
|
||||
[LSTRING(destroyVehicleAfterCookoff_name), LSTRING(destroyVehicleAfterCookoff_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
false,
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(enableAmmoCookoff),
|
||||
"CHECKBOX",
|
||||
[LSTRING(enableAmmoCookoff_name), LSTRING(enableAmmoCookoff_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
true,
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(enableAmmobox),
|
||||
"CHECKBOX",
|
||||
[LSTRING(enableBoxCookoff_name), LSTRING(enableBoxCookoff_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
true,
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(ammoCookoffDuration),
|
||||
"SLIDER",
|
||||
[LSTRING(ammoCookoffDuration_name), LSTRING(ammoCookoffDuration_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
[0, 10, 1, 2],
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(removeAmmoDuringCookoff),
|
||||
"CHECKBOX",
|
||||
[LSTRING(removeAmmoDuringCookoff_name), LSTRING(removeAmmoDuringCookoff_tooltip)],
|
||||
LSTRING(category_displayName),
|
||||
true,
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
@ -16,14 +16,12 @@
|
||||
|
||||
#include "\z\ace\addons\main\script_macros.hpp"
|
||||
|
||||
#define IS_EXPLOSIVE_AMMO(ammo) (getNumber (ammo call CBA_fnc_getObjectConfig >> "explosive") > 0.5)
|
||||
|
||||
// Stages of cookoff in order (in seconds)
|
||||
// Should be no un-synced randomness in these as the effects must be ran on each client
|
||||
#define IGNITE_TIME 3
|
||||
#define SMOKE_TIME 10.5
|
||||
// Should be no un-synced randomness in these as the effects must be run on each client
|
||||
#define SMOKE_DELAY 10.5
|
||||
#define DETONATION_DELAY 3
|
||||
#define COOKOFF_TIME 14 // Cook off time should be 20s at most due to length of sound files
|
||||
#define COOKOFF_TIME_BOX 82.5 // Cook off time for boxes should be significant to allow time for ammo to burn
|
||||
#define ENGINE_FIRE_TIME 240
|
||||
#define MIN_TIME_BETWEEN_FLAMES 5
|
||||
#define MAX_TIME_BETWEEN_FLAMES 15
|
||||
#define MAX_TIME_BETWEEN_AMMO_DET 25
|
||||
@ -32,9 +30,6 @@
|
||||
#define MIN_AMMO_DETONATION_START_DELAY 1 // Min time to wait before a vehicle's ammo starts to cookoff
|
||||
#define MAX_AMMO_DETONATION_START_DELAY 6 // Max time to wait before a vehicle's ammo starts to cookoff
|
||||
|
||||
// Delay between flame effect for players in a cooking off vehicle
|
||||
#define FLAME_EFFECT_DELAY 0.4
|
||||
|
||||
// Common commander hatch defines for default vehicles
|
||||
#define DEFAULT_COMMANDER_HATCHES ["osa_poklop_commander", "hatch_commander_axis"]
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
<Project name="ACE">
|
||||
<Package name="CookOff">
|
||||
<Key ID="STR_ACE_CookOff_category_displayName">
|
||||
<English>ACE Cook off</English>
|
||||
<English>ACE Cook-off</English>
|
||||
<Spanish>ACE Detonación inducida por calor</Spanish>
|
||||
<Italian>ACE Detonazione Munizioni</Italian>
|
||||
<Chinese>ACE 殉爆效果</Chinese>
|
||||
@ -16,38 +16,65 @@
|
||||
<Portuguese>ACE Cook off</Portuguese>
|
||||
<Czech>ACE Vznícení munice</Czech>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enable_hd_name">
|
||||
<English>Damage handling and turret effects</English>
|
||||
<Spanish>Daño y efectos de torreta</Spanish>
|
||||
<German>Schadensberechnung und Geschützturmeffekte</German>
|
||||
<Japanese>損傷処理と砲塔の効果</Japanese>
|
||||
<Russian>Обработка урона и эффектов срыва башни</Russian>
|
||||
<Portuguese>Manipulação de dano e efeitos de torre</Portuguese>
|
||||
<French>Dégâts et effets de tourelle</French>
|
||||
<Chinese>傷害控制及炮塔效果</Chinese>
|
||||
<Chinesesimp>损坏处理和炮塔效果</Chinesesimp>
|
||||
<Italian>Gestione danni ed effetti torretta</Italian>
|
||||
<Czech>Poškodit ovládání a efekty věže</Czech>
|
||||
<Polish>Obsługa obrażeń i efekty wieży</Polish>
|
||||
<Korean>피해량 조절 및 포탑에 효과 부여</Korean>
|
||||
<Key ID="STR_ACE_CookOff_enableFire_name">
|
||||
<English>Enable vehicle cook-off fire</English>
|
||||
<Japanese>車両の誘爆火災を有効化</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enable_hd_tooltip">
|
||||
<English>Changes damage handling for cook off and turret explosion effects</English>
|
||||
<Spanish>Cambia el daño de la detonación inducida por calor y los efectos de la explosión de la torreta</Spanish>
|
||||
<German>Ändert die Schadensberechnung für die Durchzündung und die Explosionseffekte des Geschützturmes</German>
|
||||
<Japanese>誘爆の損傷処理と砲塔の爆発効果を変更します。</Japanese>
|
||||
<Russian>Изменяет обработку урона для возгорания и эффекта срыва башни</Russian>
|
||||
<Portuguese>Modifica a manipulação de dano para o cozinhamento de munição e efeitos de explosão da torre</Portuguese>
|
||||
<French>Modifie la gestion des dégâts pour l'auto-inflammation et les effets d'explosion de tourelle.</French>
|
||||
<Chinese>更改殉爆以及炮塔爆炸之傷害控制</Chinese>
|
||||
<Chinesesimp>改变殉爆和炮塔爆炸的损坏处理效果</Chinesesimp>
|
||||
<Italian>Modifica la gestione dei danni per l'esplosione di munizioni e gli effetti di esplosione della torretta</Italian>
|
||||
<Czech>Změní poškození ovládání a efekty výbuchu veže</Czech>
|
||||
<Polish>Zmienia obsługę obrażeń podczas samozapłonu i eksplozji wieży</Polish>
|
||||
<Korean>쿡오프로 인해 피해량의 변화와 포탑 터짐현상을 결정합니다.</Korean>
|
||||
<Key ID="STR_ACE_CookOff_enableFire_tooltip">
|
||||
<English>Enables vehicle cook-off fire effects.\nThis doesn't include ammunition detonations.</English>
|
||||
<Japanese>車両の誘爆火災エフェクトを有効化します。\nこれには弾薬の爆発は含まれません。</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_cookoffDuration_name">
|
||||
<English>Vehicle cook-off fire duration multiplier</English>
|
||||
<Japanese>車両の誘爆火災の持続時間倍率</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_cookoffDuration_tooltip">
|
||||
<English>Multiplier for how long vehicle cook-off fire lasts.\nSetting to 0 will disable vehicle cook-off fire.</English>
|
||||
<Japanese>車両の誘爆火災の持続時間をどのくらいの長さにするかの倍率。\n0に設定すると車両の誘爆火災が無効化されます。</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_probabilityCoef_name">
|
||||
<English>Vehicle cook-off fire probability multiplier</English>
|
||||
<Japanese>車両の誘爆火災の可能性倍率</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_probabilityCoef_tooltip">
|
||||
<English>Multiplier for vehicle cook-off fire probability. Higher value results in higher cook-off probability.\nSetting to 0 will disable vehicle cook-off fire.</English>
|
||||
<Japanese>車両の誘爆火災がどのくらいの可能性で発生するかの倍率。高い数値は高い誘爆の可能性につながります。\n0に設定すると車両の誘爆火災が無効化されます。</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_destroyVehicleAfterCookoff_name">
|
||||
<English>Destroy vehicles after cook-off</English>
|
||||
<Korean>쿡오프 후 차량 파괴</Korean>
|
||||
<Chinesesimp>殉爆发生后摧毁载具</Chinesesimp>
|
||||
<Russian>Уничтожать технику после детонации</Russian>
|
||||
<Spanish>Destruir vehículos tras la detonación inducida por calor</Spanish>
|
||||
<Japanese>誘爆後に車両を破壊する</Japanese>
|
||||
<Polish>Zniszcz Pojazdy po Zakończeniu Samozapłonu</Polish>
|
||||
<German>Zerstöre Fahrzeuge nach der Durchzündung</German>
|
||||
<Italian>Distruggi Veicoli dopo Esplosione Munizioni</Italian>
|
||||
<French>Destruction des véhicules après auto-inflammation</French>
|
||||
<Portuguese>Destruir veículos após cozinhamento</Portuguese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_destroyVehicleAfterCookoff_tooltip">
|
||||
<English>Controls whether vehicles will always be destroyed after cooking off.</English>
|
||||
<Japanese>誘爆の終了後に車両を必ず完全破壊するかどうかを設定します。</Japanese>
|
||||
<Polish>Kontroluje, czy pojazdy będą zawsze niszczone po samozapłonie.</Polish>
|
||||
<German>Steuert, ob Fahrzeuge nach dem Durchzünden immer zerstört werden.</German>
|
||||
<Italian>Determina se veicoli saranno sempre distrutti dall'esplosione delle munizioni.</Italian>
|
||||
<Korean>쿡오프 후 차량이 항상 파괴되는지 여부를 조정합니다.</Korean>
|
||||
<French>Contrôle si les véhicules seront toujours détruits après l'auto-inflammation.</French>
|
||||
<Portuguese>Define se os veículos serão sempre destruídos após cozinhamento.</Portuguese>
|
||||
<Russian>Определяет, всегда ли транспортные средства будут уничтожаться после детонации.</Russian>
|
||||
<Spanish>Controla si los vehículos siempre será destruidos despues de la detonación inducida por calor.</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enableAmmoCookoff_name">
|
||||
<English>Enable vehicle ammo cook-off</English>
|
||||
<Japanese>車両弾薬の誘爆を有効化</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enableAmmoCookoff_tooltip">
|
||||
<English>Enables cooking off of vehicle ammunition. Fires ammunition projectiles while vehicle has ammunition remaining.\nThis doesn't include fire effects.</English>
|
||||
<Japanese>車両弾薬の誘爆を有効化します。車両に積載されたままの弾薬と弾頭が発射されます。\nこれには火災エフェクトは含まれません。</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enableBoxCookoff_name">
|
||||
<English>Enable ammo box cook off</English>
|
||||
<English>Enable ammo box cook-off</English>
|
||||
<Spanish>Habilitar detonación inducida por calor en las cajas de munición</Spanish>
|
||||
<Japanese>弾薬箱の誘爆を有効化</Japanese>
|
||||
<German>Durchzündung für Munitionskisten ermöglichen</German>
|
||||
@ -62,160 +89,34 @@
|
||||
<Czech>Povolit vynícení munice v krabicích</Czech>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enableBoxCookoff_tooltip">
|
||||
<English>Enables cooking off of ammo boxes.</English>
|
||||
<Spanish>Habilita la detonación inducida por calor en las cajas de munición</Spanish>
|
||||
<Japanese>弾薬箱が誘爆するようになります。</Japanese>
|
||||
<German>Ermöglicht Durchzündung von Munitionskisten.</German>
|
||||
<Korean>탄약 상자에 쿡오프 현상을 적용합니다.</Korean>
|
||||
<Polish>Aktywuje samozapłon skrzyń z amunicją</Polish>
|
||||
<French>Permet l'auto-inflammation des caisses de munitions.</French>
|
||||
<Italian>Abilita l'esplosione di casse di munizioni distrutte.</Italian>
|
||||
<Chinese>開啟彈藥箱殉爆效果</Chinese>
|
||||
<Chinesesimp>开启弹药箱殉爆效果</Chinesesimp>
|
||||
<Russian>Активирует детонацию ящиков с боеприпасами</Russian>
|
||||
<Portuguese>Permitir que caixas de munição cozinhem.</Portuguese>
|
||||
<Czech>Zapíná vznícení munice v krabicích.</Czech>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enableAmmoCookoff_name">
|
||||
<English>Enable Ammunition cook off</English>
|
||||
<Spanish>Habilitar la detonación inducida por calor en la munición</Spanish>
|
||||
<Japanese>弾薬の誘爆を有効化</Japanese>
|
||||
<German>Durchzündung für Munition ermöglichen</German>
|
||||
<Korean>탄약 쿡오프 현상 활성화</Korean>
|
||||
<Polish>Aktywuj samozapłon amunicji</Polish>
|
||||
<French>Auto-inflammation des munitions</French>
|
||||
<Italian>Abilita Esplosione Munizioni</Italian>
|
||||
<Chinese>開啟彈藥殉爆效果</Chinese>
|
||||
<Chinesesimp>开启弹药殉爆效果</Chinesesimp>
|
||||
<Russian>Разрешить детонацию боекомплекта</Russian>
|
||||
<Portuguese>Permitir cozinhar munição</Portuguese>
|
||||
<Czech>Povolit vznícení munice</Czech>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enableAmmoCookoff_tooltip">
|
||||
<English>Enables Ammunition cook off. Fires ammunition projectiles while vehicle is on fire and has ammunition.</English>
|
||||
<Spanish>Habilita la detonación inducida por calor en la munición. Dispara proyectiles de munición mientras el vehículo está ardiendo y tiene munición</Spanish>
|
||||
<Japanese>弾薬が誘爆します。車両が燃えると、搭載している弾薬が激しく燃え上がります。</Japanese>
|
||||
<German>Ermöglicht Durchzündung von Munition. Feuert Projektile der Munition ab, solange das Fahrzeug brennt und Munition besitzt.</German>
|
||||
<Polish>Aktywuje samozapłon amunicji. Wystrzeliwuje pociski podczas gdy pojazd płonie i posiada amunicję.</Polish>
|
||||
<French>Permet l'auto-inflammation des munitions. Tire des projectiles tant que le véhicule est en feu et contient des munitions.</French>
|
||||
<Italian>Abilita l'esplosione di munizioni. Spara proiettili di munizioni quando il veicolo va a fuoco e contiene ancora munizioni.</Italian>
|
||||
<Chinese>開啟彈藥殉爆效果。當一台載有彈藥的載具起火時, 將會有殉爆的效果</Chinese>
|
||||
<Chinesesimp>开启弹药殉爆效果。当一台载有弹药的载具起火时,将会有殉爆的效果。</Chinesesimp>
|
||||
<Korean>쿡오프 현상을 활성화 합니다. 이것은 탄약에 불이 붙어 있는 동안 주변에 발사체를 발사합니다.</Korean>
|
||||
<Russian>Активирует детонацию боекомплекта в горящей технике.</Russian>
|
||||
<Portuguese>Permite que a munição cozinhe. Dispara projéteis de munição enquanto o veículo está em chamas e tem munição.</Portuguese>
|
||||
<Czech>Zapíná vznícení munice. Vystřeluje projektily po dobu kdy vozidlo hoří a má munici.</Czech>
|
||||
<English>Enables cooking off of ammo boxes.\nThis doesn't include fire effects.</English>
|
||||
<Japanese>弾薬箱の誘爆を有効化します。\nこれには火災エフェクトは含まれません。</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_ammoCookoffDuration_name">
|
||||
<English>Ammunition cook off duration</English>
|
||||
<Spanish>Duración de la detonación inducida por calor de la munición</Spanish>
|
||||
<German>Munitionsdurchzündungsdauer</German>
|
||||
<Polish>Czas trwania samozapłonu amunicji</Polish>
|
||||
<Japanese>弾薬の誘爆持続時間</Japanese>
|
||||
<French>Durée d'auto-inflammation des munitions</French>
|
||||
<Italian>Durata Esplosione Munizioni</Italian>
|
||||
<Chinese>彈藥殉爆效果持續時間</Chinese>
|
||||
<Chinesesimp>弹药殉爆效果持续时间</Chinesesimp>
|
||||
<Korean>쿡오프 지속 시간</Korean>
|
||||
<Russian>Длительность детонации боеприпасов</Russian>
|
||||
<Portuguese>Duração do cozinhamento de munição</Portuguese>
|
||||
<Czech>Doba trvání vznícení munice</Czech>
|
||||
<English>Ammo cook-off duration multiplier</English>
|
||||
<Japanese>弾薬の誘爆の持続時間倍率</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_ammoCookoffDuration_tooltip">
|
||||
<English>Multiplier for how long cook off lasts [Setting to 0 will disable ammo cookoff]</English>
|
||||
<Spanish>Multiplicador de cuanto dura la detonación inducida por calor [Ponerlo a cero la deshabilita]</Spanish>
|
||||
<German>Faktor für die Munitionsdurchzündungsdauer [0 zum Deaktivieren]</German>
|
||||
<French>Multiplicateur permettant de régler la durée durant laquelle les munitions continuent d'exploser [Une valeur de 0 désactive l'auto-inflammation].</French>
|
||||
<Polish>Mnożnik decydujący jak długo ma trwać samozapłon amunicji [Ustawienie na 0 spowoduje wyłącznie samozapłonu]</Polish>
|
||||
<Japanese>誘爆の持続時間を乗数で設定します。[0 に設定で誘爆を無効化]</Japanese>
|
||||
<Italian>Moltiplicatore della durata delle esplosioni di munizioni [Se impostato su 0 disabiliterà le esplosioni delle munizioni]</Italian>
|
||||
<Chinese>設定彈藥殉爆效果會持續多久時間 [輸入0來關閉殉爆效果]</Chinese>
|
||||
<Chinesesimp>设定弹药殉爆效果会持续多久时间 [输入0来关闭殉爆效果]</Chinesesimp>
|
||||
<Korean>쿡오프 지속 시간의 배수 [0 이면 비활성]</Korean>
|
||||
<Russian>Множитель длительности детонации [0 - отключает детонацию боеприпасов]</Russian>
|
||||
<Portuguese>Multiplicação da duração do cozinhamento [0 faz com que o cozinhamento seja desativado]</Portuguese>
|
||||
<Czech>Multiplikátor doby trvání vznícení munice [Nastavte 0 pro vypnutí vznícení munice]</Czech>
|
||||
<English>Multiplier for how long ammunition cook-off lasts, for both vehicles and ammo boxes.\nSetting to 0 will disable ammo cook-off for both vehicles and ammo boxes.</English>
|
||||
<Japanese>弾薬の誘爆の持続時間をどのくらいの長さにするかの倍率。車両弾薬と弾薬箱どちらにも影響します。\n0に設定すると弾薬の誘爆が無効化されます。</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_probabilityCoef_name">
|
||||
<English>Cook-off probability coefficient</English>
|
||||
<Spanish>Coeficiente de probabilidad de detonación inducida por calor</Spanish>
|
||||
<Japanese>誘爆の可能性係数</Japanese>
|
||||
<Italian>Coefficiente Probabilità Esplosione</Italian>
|
||||
<German>Faktor für Wahrscheinlichkeit der Durchzündung</German>
|
||||
<Chinese>殉爆發生機率係數</Chinese>
|
||||
<Chinesesimp>殉爆发生机率系数</Chinesesimp>
|
||||
<French>Coefficient de probabilité d'auto-inflammation</French>
|
||||
<Polish>Współczynnik prawdopodobieństwa samozapłonu</Polish>
|
||||
<Russian>Коэф. вероятности детонации</Russian>
|
||||
<Portuguese>Probabilidade de Cozinhar</Portuguese>
|
||||
<Czech>Koeficient pravděpodobnosti vznícení munice</Czech>
|
||||
<Korean>쿡오프 발생 확률 계수</Korean>
|
||||
<Key ID="STR_ACE_CookOff_removeAmmoDuringCookoff_name">
|
||||
<English>Enable ammo removal during cook-off</English>
|
||||
<Japanese>誘爆による弾薬の除去を有効化</Japanese>
|
||||
<French>Retirer les munitions durant l'auto-inflammation</French>
|
||||
<German>Aktiviert/Deaktiviert Entfernung der Munition beim Durchzünden</German>
|
||||
<Italian>Abilita rimozione munizioni dopo l'esplosione</Italian>
|
||||
<Polish>Włącz/Wyłącz usuwanie amunicji podczas samozapłonu</Polish>
|
||||
<Chinesesimp>启用/禁用殉爆过程中的弹药移除功能</Chinesesimp>
|
||||
<Korean>쿡오프시 탄약 제거 활성화/비활성화</Korean>
|
||||
<Russian>Удалять боеприпасы из-за детонации</Russian>
|
||||
<Spanish>Habilita/Deshabilita ka eliminación de munición durante la detonación inducida por calor</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_probabilityCoef_tooltip">
|
||||
<English>Multiplier for cook-off probability. Higher value results in higher cook-off probability</English>
|
||||
<Spanish>Multiplicador de probabilidad de detonación inducida por calor. Valores más altos producen mayor probabilidad</Spanish>
|
||||
<Japanese>誘爆する可能性の乗数。高い値では誘爆する可能性が高まります。</Japanese>
|
||||
<Italian>Moltiplicatore per la probabilità dell'esplosione di munizioni. Un valore più alto aumenta la probabilità.</Italian>
|
||||
<German>Faktor für Wahrscheinlichkeit der Durchzündung. Ein höherer Wert führt zu höherer Durchzündungswahrscheinlichkeit.</German>
|
||||
<Chinese>調整殉爆發生機率係數。值越高代表越容易發生殉爆</Chinese>
|
||||
<Chinesesimp>调整殉爆发生机率系数。值越高代表越容易发生殉爆。</Chinesesimp>
|
||||
<French>Multiplicateur de probabilité de l'auto-inflammation. Plus la valeur est élevée, plus la probabilité de combustion est grande.</French>
|
||||
<Polish>Mnożnik prawdopodobieństwa samozapłonu. Większa wartość oznacza większe prawdopodobieństwo samozapłonu</Polish>
|
||||
<Russian>Множитель коэффициента вероятности детонации. Чем выше значение, тем выше вероятность</Russian>
|
||||
<Portuguese>Multiplicador para a chance de cozinhamento. Valores mais altos aumentam as chances de ocorrer.</Portuguese>
|
||||
<Czech>Multiplikátor pro pravděpodobnost vznícení munice. Vyšší hodnota znamená vyšší šanci vznícení munice.</Czech>
|
||||
<Korean>쿡오프가 일어날 확률에 계수를 곱합니다. 더 큰 숫자는 더 높은 확률의 쿡오프를 일으킵니다.</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_destroyVehicleAfterCookoff_name">
|
||||
<English>Destroy Vehicles After Cook-off</English>
|
||||
<Korean>쿡오프 후 차량 파괴</Korean>
|
||||
<Chinesesimp>殉爆发生后摧毁载具</Chinesesimp>
|
||||
<Russian>Уничтожать технику после детонации</Russian>
|
||||
<Spanish>Destruir vehículos tras la detonación inducida por calor</Spanish>
|
||||
<Japanese>誘爆後に車両を破壊する</Japanese>
|
||||
<Polish>Zniszcz Pojazdy po Zakończeniu Samozapłonu</Polish>
|
||||
<German>Zerstöre Fahrzeuge nach der Durchzündung</German>
|
||||
<Italian>Distruggi Veicoli dopo Esplosione Munizioni</Italian>
|
||||
<French>Destruction des véhicules après auto-inflammation</French>
|
||||
<Portuguese>Destruir veículos após cozinhamento</Portuguese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_destroyVehicleAfterCookoff_tooltip">
|
||||
<English>Controls whether vehicles will always be destroyed after cooking off.</English>
|
||||
<Japanese>誘爆後に車両を破壊するかどうかを設定する。</Japanese>
|
||||
<Polish>Kontroluje, czy pojazdy będą zawsze niszczone po samozapłonie.</Polish>
|
||||
<German>Steuert, ob Fahrzeuge nach dem Durchzünden immer zerstört werden.</German>
|
||||
<Italian>Determina se veicoli saranno sempre distrutti dall'esplosione delle munizioni.</Italian>
|
||||
<Korean>쿡오프 후 차량이 항상 파괴되는지 여부를 조정합니다.</Korean>
|
||||
<French>Contrôle si les véhicules seront toujours détruits après l'auto-inflammation.</French>
|
||||
<Portuguese>Define se os veículos serão sempre destruídos após cozinhamento.</Portuguese>
|
||||
<Russian>Определяет, всегда ли транспортные средства будут уничтожаться после детонации.</Russian>
|
||||
<Spanish>Controla si los vehículos siempre será destruidos despues de la detonación inducida por calor.</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enableFire_name">
|
||||
<English>Enable Cook-Off Vehicle Fire</English>
|
||||
<Japanese>誘爆火災を有効化</Japanese>
|
||||
<French>Véhicules - Feu durant l'auto-inflammation</French>
|
||||
<Russian>Вкл. горение техники от детонации</Russian>
|
||||
<German>Aktiviert das in Brand setzen des Fahrzeugs während des Durchzündens der Munition</German>
|
||||
<Italian>Abilita incendiamento veicoli</Italian>
|
||||
<Polish>Włącz pożar pojazdu podczas samozapłonu</Polish>
|
||||
<Chinesesimp>启用殉爆载具火灾</Chinesesimp>
|
||||
<Korean>차량 쿡오프 화재 활성화</Korean>
|
||||
<Spanish>Habilitar incendio a causa de la detonación inducida por calor</Spanish>
|
||||
<Portuguese>Ativar incêndio de veículo durante cozinhamento</Portuguese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_CookOff_enableFire_tooltip">
|
||||
<English>Whether or not vehicles will catch on fire during cook-off</English>
|
||||
<Japanese>誘爆により車両が炎上するかどうかを設定します。</Japanese>
|
||||
<French>Définit si les véhicules prennent feu durant l'auto-inflammation de leurs munitions.</French>
|
||||
<Russian>Будет ли техника гореть при детонации боеприпасов</Russian>
|
||||
<German>Ob Fahrzeuge in Brand gesetzt werden, während deren Munition durchzündet.</German>
|
||||
<Italian>Determina se veicoli cominceranno a bruciare se le loro munizioni esplodono.</Italian>
|
||||
<Polish>Określa, czy pojazdy zapalą się podczas samozapłonu ich amunicji.</Polish>
|
||||
<Chinesesimp>车辆在殉爆过程中是否会起火</Chinesesimp>
|
||||
<Korean>쿡오프가 일어나면 차량에 불이 붙습니다.</Korean>
|
||||
<Spanish>Define si los vehículos salen ardiendo despues de una detonación inducida por calor.</Spanish>
|
||||
<Portuguese>Define se os veículos pegarão fogo durante o cozinhamento.</Portuguese>
|
||||
<Key ID="STR_ACE_CookOff_removeAmmoDuringCookoff_tooltip">
|
||||
<English>Removes all ammo during cook-off.</English>
|
||||
<French>Retire des munitions des véhicules durant une auto-inflammation.</French>
|
||||
<German>Entfernt Munition während dem Durchzünden der Munition eines Fahrzeuges.</German>
|
||||
<Japanese>誘爆によって全ての弾薬を除去します。</Japanese>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
||||
|
@ -45,17 +45,12 @@ private _categoryArray = [format ["ACE %1", localize LSTRING(DisplayName)]];
|
||||
[LSTRING(progressBarTimeCoefficent_displayName), LSTRING(progressBarTimeCoefficent_description)],
|
||||
_categoryArray,
|
||||
[0,2,1,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)]
|
||||
true, // isGlobal
|
||||
{[QGVAR(progressBarTimeCoefficent), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
false // Needs mission restart
|
||||
true // isGlobal
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(dragAfterDeploy), "CHECKBOX",
|
||||
[LSTRING(dragAfterDeploy_displayName), LSTRING(dragAfterDeploy_description)],
|
||||
_categoryArray,
|
||||
false, // default value
|
||||
false, // isGlobal
|
||||
{[QGVAR(dragAfterDeploy), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
false // Needs mission restart
|
||||
false // default value
|
||||
] call CBA_fnc_addSetting;
|
||||
|
@ -1120,5 +1120,22 @@
|
||||
<Russian>[CSW] Сумка с СПГ-9М орудием</Russian>
|
||||
<Korean>[CSW] SPG-9M 발사기 가방</Korean>
|
||||
</Key>
|
||||
<!-- Used in rearm to remove the [CSW] prefix from magazine names, so adjust when necessary -->
|
||||
<Key ID="STR_ACE_CSW_regex">
|
||||
<English>^\[CSW\]</English>
|
||||
<Spanish>^\[CSW\]</Spanish>
|
||||
<German>^\[CSW\]</German>
|
||||
<Portuguese>^\[CSW\]</Portuguese>
|
||||
<French>^\[CSW\]</French>
|
||||
<Japanese>^\[CSW\]</Japanese>
|
||||
<Chinese>^\[CSW\]</Chinese>
|
||||
<Chinesesimp>^\[班组\]</Chinesesimp>
|
||||
<Italian>^\[CSW\]</Italian>
|
||||
<Czech>^\[CSW\]</Czech>
|
||||
<Turkish>^\[CSW\]</Turkish>
|
||||
<Polish>^\[CSW\]</Polish>
|
||||
<Russian>^\[CSW\]</Russian>
|
||||
<Korean>^\[CSW\]</Korean>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
||||
|
@ -5,9 +5,7 @@ private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(setting_c
|
||||
[LSTRING(setting_requireRopeItems_displayName)],
|
||||
_category,
|
||||
false, // default value
|
||||
true, // isGlobal
|
||||
{[QGVAR(requireRopeItems), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
false // needRestart
|
||||
true // isGlobal
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
|
@ -21,11 +21,7 @@ params ["_player", "_thirst", "_hunger"];
|
||||
|
||||
// Kill unit with max thirst or hunger
|
||||
if ((_thirst > 99.9 || {_hunger > 99.9}) && {random 1 < 0.5}) exitWith {
|
||||
if (["ace_medical"] call EFUNC(common,isModLoaded)) then {
|
||||
[_player, "Hunger/Thirst empty"] call EFUNC(medical_status,setDead);
|
||||
} else {
|
||||
_player setDamage 1;
|
||||
};
|
||||
[_player, "Hunger/Thirst empty"] call EFUNC(common,setDead);
|
||||
};
|
||||
|
||||
// Exit if unit is not awake, below are animation based consequences
|
||||
|
@ -245,6 +245,7 @@
|
||||
<Japanese>傷口が開くのを防ぐ</Japanese>
|
||||
<Russian>Предотвратить повторное открытие ран</Russian>
|
||||
<French>Empêcher la réouverture des plaies</French>
|
||||
<German>Verhindert, dass sich Wunden wieder öffnen</German>
|
||||
<Spanish>Prevenir la reapertura de heridas</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_FieldManual_Medical_Treatment_SurgicalKit_Description">
|
||||
@ -254,6 +255,7 @@
|
||||
<Portuguese>O %3Kit Cirúrgico%4 é utilizado para prevenir a reabertura de feridas após a aplicação de bandagens. A depender das configurações, ele também pode remover traumas e pode requerir %3Suturas%4 adicionais para fechar feridas. Suturas são consumíveis, tal como as bandagens, e não são substituem o Kit Cirúrgico.<br/><br/>%3Uso:%4<br/>%2Utilize [%3%13%4] ou [%3%14%4] e selecione %3Tratamento Avançado%4.<br/>%2Selecione %3Usar Kit Cirúrgico%4.</Portuguese>
|
||||
<Italian>Un %3Kit Chirurgico%4 è usato per impedire che ferite bendate si riaprano. A seconda delle impostazioni, può anche azzerare danni o potrebbe richiedere %3Suture%4 aggiuntive per chiudere ferite. Suture sono consumabili proprio come bende, non sono un sostituto per un Kit Chirurgico.<br/><br/>%3Utilizzo:%4<br/>%2Usa [%3%13%4] o [%3%14%4] e seleziona %3Trattamenti Avanzati%4.<br/>%2Seleziona %3Usa Kit Chirurgico%4.</Italian>
|
||||
<Japanese>%3手術キット%4は包帯を巻いた傷口が再度開いて出血するのを防ぎます。設定によっては、負傷を取り除いたり、傷口を閉じるのに%3糸付縫合針%4を必要としたりします。糸付縫合針は消耗品で包帯のように使用され、手術キットを代替するものではありません。<br/><br/>%3使用方法:%4<br/>%2[%3%13%4] または [%3%14%4] を使って%3高度な治療%4を選択する。<br/>%2%3手術キット%4を選択して使用します。</Japanese>
|
||||
<German>Ein %3Chirurgisches Kit%4 wird verwendet, um zu verhindern, dass sich Wunden nach dem Verbinden wieder öffnen. Abhängig von den Einstellungen kann es auch Traumata beseitigen und erfordert möglicherweise zusätzliche %3Nähte%4, um Wunden zu schließen. Nahtmaterial ist, ähnlich wie Bandagen, Verbrauchsmaterial und kein Ersatz für das Chirurgie-Set.<br/><br/>%3Verwendung:%4<br/>%2Verwenden Sie [%3%13%4] oder [%3% 14%4] und wählen Sie %3Erweiterte Behandlung%4.<br/>%2Wählen Sie %3Chirurgisches Kit verwenden%4.</German>
|
||||
<Spanish>El %3Kit Quirúrgico%4 se usa para prevenir la reapertura de heridas despues de ser vendadas. Dependiendo de las opciones, tambien puede curar traumatismos y puede requerir %3Sutura%4 adicional para cerrar las heridas. Las Suturas son consumibles, al igual que las vendas, y no son un reemplazo para el Kit Quirúgico.<br/><br/>%3Uso:%4<br/>%2Usar [%3%13%4] o [%3%14%4] y seleccionar %3Tratamientos Avanzados%4.<br/>%2Seleccionar %3Usar Kit Quirúgico%4.</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_FieldManual_Medical_Treatment_CAT_ShortName">
|
||||
@ -265,6 +267,7 @@
|
||||
<Japanese>出血を止める</Japanese>
|
||||
<Russian>Остановить кровотечение</Russian>
|
||||
<French>Arrêter les saignements</French>
|
||||
<German>Stoppt Blutung</German>
|
||||
<Spanish>Parar Sangrado</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_FieldManual_Medical_Treatment_CAT_Description">
|
||||
@ -274,6 +277,7 @@
|
||||
<Portuguese>O %3Torniquete%4 interrompe o sangramento temporariamente, para que feridas possam ser enfaixadas. Seu uso é restrito aos membros.<br/><br/>%3Uso:%4<br/>%2Utilize [%3%13%4] ou [%3%14%4] e selecione um membro afetado.<br/>%2Selecione %3Aplicar Torniquete%4.</Portuguese>
|
||||
<Italian>Un %3Laccio Emostatico%4 ferma emorragie temporaneamente in modo da poter bendare ferite con calma. Utilizzabile su arti.<br/><br/>%3Utilizzo:%4<br/>%2Usa [%3%13%4] o [%3%14%4] e seleziona un arto afflitto.<br/>%2Seleziona %3Applica Laccio Emostatico%4.</Italian>
|
||||
<Japanese>%3止血帯%4は一時的に出血を止め、その間に傷に包帯を巻くことができます。四肢にのみ使用できます。<br/><br/>%3使用方法:%4<br/>%2[%3%13%4] または [%3%14%4] を使って使用したい四肢を選択します。<br/>%2%3止血帯を巻く%4を選択して使用します。</Japanese>
|
||||
<German>Ein %3Tourniquet%4 stoppt die Blutung vorübergehend, sodass eine oder mehrere Wunden verbunden werden können. Kann nur an Gliedmaßen verwendet werden.<br/><br/>%3Verwendung:%4<br/>%2Verwenden Sie [%3%13%4] oder [%3%14%4] und wählen Sie ein betroffenes Glied aus.< br/>%2Wählen Sie %3Tourniquet anwenden%4.</German>
|
||||
<Spanish>El %3Torniquete%4 para temporalmente el sangrado hasta que la herida sea vendada. Sólo puede ser usado en extremidades.<br/><br/>%3Uso:%4<br/>%2Usar [%3%13%4] o [%3%14%4] y seleccionar la extremidad afectada.<br/>%2Seleccionar %3Aplicar Torniquete%4.</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_FieldManual_Medical_Treatment_MedicalMenu_DisplayName">
|
||||
|
@ -17,7 +17,7 @@ GVAR(flashbangPPEffectCC) ppEffectForceInNVG true;
|
||||
// Add keybinds
|
||||
["ACE3 Weapons", QGVAR(switchGrenadeMode), localize LSTRING(SwitchGrenadeMode), {
|
||||
// Conditions: canInteract
|
||||
if !([ACE_player, objNull, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false};
|
||||
if !([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false};
|
||||
// Conditions: specific
|
||||
if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false};
|
||||
// Don't change mode or show hint if advanced throwing is active
|
||||
@ -32,3 +32,27 @@ GVAR(flashbangPPEffectCC) ppEffectForceInNVG true;
|
||||
[] call FUNC(addChangeFuseItemContextMenuOptions);
|
||||
};
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
|
||||
["vehicle", {
|
||||
private _currentThrowable = currentThrowable ACE_player;
|
||||
|
||||
// Make sure grenade can be rolled if in roll mode (detonation time has to be >= 1 second and player isn't in a vehicle)
|
||||
if !(
|
||||
GVAR(currentThrowMode) == 3 &&
|
||||
{_currentThrowable isNotEqualTo []} &&
|
||||
{
|
||||
!isNull objectParent ACE_player ||
|
||||
{getNumber (configFile >> "CfgAmmo" >> getText (configFile >> "CfgMagazines" >> _currentThrowable select 0 >> "ammo") >> "explosionTime") < MIN_EXPLOSION_TIME_FOR_ROLL}
|
||||
}
|
||||
) exitWith {};
|
||||
|
||||
// If the player can't use throwables, don't change it
|
||||
if !(ACE_player call CBA_fnc_canUseWeapon) exitWith {};
|
||||
|
||||
// Force the user into the normal throw mode
|
||||
// Next throw mode after roll would be drop, which isn't ideal if the user tries to throw unknowingly...
|
||||
[format [LLSTRING(RollGrenadeDisabled), LLSTRING(NormalThrow)], 2] call EFUNC(common,displayTextStructured);
|
||||
|
||||
GVAR(currentThrowMode) = 0;
|
||||
GVAR(throwModePFEH) call CBA_fnc_removePerFrameHandler;
|
||||
}, true] call CBA_fnc_addPlayerEventHandler;
|
||||
|
@ -6,6 +6,9 @@ PREP_RECOMPILE_START;
|
||||
#include "XEH_PREP.hpp"
|
||||
PREP_RECOMPILE_END;
|
||||
|
||||
GVAR(currentThrowMode) = 0;
|
||||
GVAR(throwModePFEH) = -1;
|
||||
|
||||
#include "initSettings.inc.sqf"
|
||||
|
||||
ADDON = true;
|
||||
|
@ -175,10 +175,12 @@ if (isServer) then {
|
||||
};
|
||||
if (_x isKindOf "ReammoBox_F") then {
|
||||
if (
|
||||
"ace_cookoff" call EFUNC(common,isModLoaded) &&
|
||||
{GETVAR(_x,EGVAR(cookoff,enableAmmoCookoff),EGVAR(cookoff,enableAmmobox))}
|
||||
(["ace_cookoff"] call EFUNC(common,isModLoaded)) &&
|
||||
{EGVAR(cookoff,enableAmmobox)} &&
|
||||
{EGVAR(cookoff,ammoCookoffDuration) != 0} &&
|
||||
{_x getVariable [QEGVAR(cookoff,enableAmmoCookoff), true]}
|
||||
) then {
|
||||
_x call EFUNC(cookoff,cookOffBox);
|
||||
[QEGVAR(cookOff,cookOffBoxServer), _box] call CBA_fnc_serverEvent;
|
||||
} else {
|
||||
_x setDamage 1;
|
||||
};
|
||||
@ -232,10 +234,7 @@ private _enginePosition = _vehicle modelToWorld (_vehicle selectionPosition _eng
|
||||
if (_position distance _enginePosition < EFFECT_SIZE * 2) then {
|
||||
_vehicle setHit [_engineSelection, 1];
|
||||
|
||||
if ("ace_cookoff" call EFUNC(common,isModLoaded)) then {
|
||||
private _enabled = _vehicle getVariable [QEGVAR(cookoff,enable), EGVAR(cookoff,enable)];
|
||||
if (_enabled in [2, true] || {_enabled isEqualTo 1 && {fullCrew [_vehicle, "", false] findIf {isPlayer (_x select 0)} != -1}}) then {
|
||||
_vehicle call EFUNC(cookoff,engineFire);
|
||||
};
|
||||
if (["ace_cookoff"] call EFUNC(common,isModLoaded)) then {
|
||||
[QEGVAR(cookoff,engineFireServer), _vehicle] call CBA_fnc_serverEvent;
|
||||
};
|
||||
};
|
||||
|
@ -15,7 +15,7 @@
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
private _mode = missionNamespace getVariable [QGVAR(currentThrowMode), 0];
|
||||
private _mode = GVAR(currentThrowMode);
|
||||
|
||||
if (_mode == 4) then {
|
||||
_mode = 0;
|
||||
@ -23,9 +23,18 @@ if (_mode == 4) then {
|
||||
_mode = _mode + 1;
|
||||
};
|
||||
|
||||
// ROLL GRENADE DOESN'T WORK RIGHT NOW
|
||||
if (_mode == 3) then {
|
||||
_mode = 4;
|
||||
private _currentThrowable = currentThrowable ACE_player;
|
||||
|
||||
// Make sure grenade can be rolled if in roll mode (detonation time has to be >= 1 second and player isn't in a vehicle)
|
||||
if (
|
||||
_mode == 3 &&
|
||||
{_currentThrowable isNotEqualTo []} &&
|
||||
{
|
||||
!isNull objectParent ACE_player ||
|
||||
{getNumber (configFile >> "CfgAmmo" >> getText (configFile >> "CfgMagazines" >> _currentThrowable select 0 >> "ammo") >> "explosionTime") < MIN_EXPLOSION_TIME_FOR_ROLL}
|
||||
}
|
||||
) then {
|
||||
_mode = _mode + 1;
|
||||
};
|
||||
|
||||
private _hint = localize ([
|
||||
@ -38,6 +47,37 @@ private _hint = localize ([
|
||||
|
||||
[_hint] call EFUNC(common,displayTextStructured);
|
||||
|
||||
GVAR(throwModePFEH) call CBA_fnc_removePerFrameHandler;
|
||||
GVAR(currentThrowMode) = _mode;
|
||||
|
||||
// If in rolling mode, check every frame if current throwable is rollable
|
||||
if (GVAR(currentThrowMode) == 3) then {
|
||||
GVAR(currentThrowable) = _currentThrowable;
|
||||
|
||||
GVAR(throwModePFEH) = {
|
||||
private _currentThrowable = currentThrowable ACE_player;
|
||||
|
||||
if (GVAR(currentThrowable) isEqualTo _currentThrowable) exitWith {};
|
||||
|
||||
GVAR(currentThrowable) = _currentThrowable;
|
||||
|
||||
// Make sure grenade can be rolled if in roll mode (detonation time has to be >= 1 second and player isn't in a vehicle)
|
||||
if !(
|
||||
GVAR(currentThrowMode) == 3 &&
|
||||
{_currentThrowable isNotEqualTo []} &&
|
||||
{
|
||||
!isNull objectParent ACE_player ||
|
||||
{getNumber (configFile >> "CfgAmmo" >> getText (configFile >> "CfgMagazines" >> _currentThrowable select 0 >> "ammo") >> "explosionTime") < MIN_EXPLOSION_TIME_FOR_ROLL}
|
||||
}
|
||||
) exitWith {};
|
||||
|
||||
// Force the user into the normal throw mode
|
||||
// Next throw mode after roll would be drop, which isn't ideal if the user tries to throw unknowingly...
|
||||
[format [LLSTRING(RollGrenadeDisabled), LLSTRING(NormalThrow)], 2] call EFUNC(common,displayTextStructured);
|
||||
|
||||
GVAR(throwModePFEH) call CBA_fnc_removePerFrameHandler;
|
||||
GVAR(currentThrowMode) = 0;
|
||||
} call CBA_fnc_addPerFrameHandler;
|
||||
};
|
||||
|
||||
true
|
||||
|
@ -85,7 +85,7 @@ if (getNumber (_config >> QGVAR(incendiary)) == 1) then {
|
||||
if (_unit != ACE_player) exitWith {};
|
||||
if (_unit getVariable [QEGVAR(advanced_throwing,primed), false]) exitWith {LOG("advanced_throwing throw");};
|
||||
|
||||
private _mode = missionNamespace getVariable [QGVAR(currentThrowMode), 0];
|
||||
private _mode = GVAR(currentThrowMode);
|
||||
|
||||
if (_mode != 0) then {
|
||||
private _velocity = velocity _projectile;
|
||||
@ -103,9 +103,22 @@ if (_mode != 0) then {
|
||||
case 2 : {
|
||||
_velocity = (_unit weaponDirection _weapon) vectorMultiply (vectorMagnitude _velocity);
|
||||
};
|
||||
//roll grande
|
||||
//roll grenade
|
||||
case 3 : {
|
||||
//@todo
|
||||
private _posASL = getPosASL _projectile;
|
||||
|
||||
// getPos is unreliable, as surfaces in some ruins are not recognised as surfaces
|
||||
private _lisPos = (lineIntersectsSurfaces [_posASL, _posASL vectorAdd [0, 0, -1e11], ACE_player, objNull, true, 1, "ROADWAY", "FIRE"]) select 0;
|
||||
_projectile setPosASL ((_lisPos select 0) vectorAdd [0, 0, 0.2]);
|
||||
|
||||
// Rotate throwables by 90° to the side by default, so cylindrical throwables can be rolled
|
||||
private _vectorDirAndUp = getArray (_config >> QGVAR(rollVectorDirAndUp));
|
||||
_vectorDirAndUp params [["_vectorDir", [0, 1, 0], [[]], 3], ["_vectorUp", [1, 0, 0], [[]], 3]];
|
||||
|
||||
// Do as if object were facing north
|
||||
_projectile setVectorDirAndUp ([[_vectorDir, _vectorUp], -(direction _projectile), 0, 0] call BIS_fnc_transformVectorDirAndUp);
|
||||
|
||||
_velocity = (vectorDir _unit) vectorMultiply 10;
|
||||
};
|
||||
//drop grenade
|
||||
case 4 : {
|
||||
|
@ -20,3 +20,5 @@
|
||||
#define EFFECT_STAGE_DELETELIGHT 1
|
||||
#define EFFECT_STAGE_PARTIALRECOVERY 2
|
||||
#define EFFECT_STAGE_FULLRECOVERY 3
|
||||
|
||||
#define MIN_EXPLOSION_TIME_FOR_ROLL 1
|
||||
|
@ -103,6 +103,10 @@
|
||||
<Chinese>下丟投擲</Chinese>
|
||||
<Turkish>Bombayı Yere Bırak</Turkish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Grenades_RollGrenadeDisabled">
|
||||
<English>Can't roll this grenade, switched to %1</English>
|
||||
<Japanese>この手榴弾は転がせません、 %1 に切り替えます</Japanese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Grenades_M84_Name">
|
||||
<English>M84 Stun Grenade</English>
|
||||
<German>M84 Blendgranate</German>
|
||||
|
@ -11,7 +11,7 @@
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [player, target] call ace_gunbag_fnc_offGunbagCallback
|
||||
* [player, cursorObject] call ace_gunbag_fnc_offGunbagCallback
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
@ -23,39 +23,28 @@ private _gunbag = backpackContainer _target;
|
||||
private _state = _gunbag getVariable [QGVAR(gunbagWeapon), []];
|
||||
|
||||
if (_state isEqualTo []) exitWith {
|
||||
[localize LSTRING(empty)] call EFUNC(common,displayTextStructured);
|
||||
[LLSTRING(empty)] call EFUNC(common,displayTextStructured);
|
||||
};
|
||||
|
||||
_state params ["_weapon", "_items", "_magazines"];
|
||||
|
||||
_unit addWeapon _weapon;
|
||||
[_unit, _weapon, true, _magazines] call EFUNC(common,addWeapon);
|
||||
|
||||
// Game will auto add magazines from player's inventory, put these back in player inventory as they will be overwritten
|
||||
([_unit, _weapon] call EFUNC(common,getWeaponState)) params ["", "", "_addedMags", "_addedAmmo"];
|
||||
// Add attachments
|
||||
{
|
||||
if (((_x select 0) != "") && {(_addedMags select _forEachIndex) != ""}) then {
|
||||
TRACE_2("Re-adding mag",_x,_addedMags select _forEachIndex);
|
||||
_unit addMagazine [_addedMags select _forEachIndex, _addedAmmo select _forEachIndex];
|
||||
};
|
||||
} forEach _magazines;
|
||||
|
||||
removeAllPrimaryWeaponItems _unit;
|
||||
|
||||
{
|
||||
_unit addWeaponItem [_weapon, _x];
|
||||
} forEach (_items + _magazines);
|
||||
_unit addWeaponItem [_weapon, _x, true];
|
||||
} forEach (_items select {_x != ""});
|
||||
|
||||
_unit selectWeapon _weapon;
|
||||
|
||||
_magazines = _magazines apply {_x select 0};
|
||||
private _mass = [_weapon, _items, _magazines apply {_x select 0}] call FUNC(calculateMass);
|
||||
|
||||
private _mass = [_weapon, _items, _magazines] call FUNC(calculateMass);
|
||||
|
||||
// remove virtual load
|
||||
// Remove virtual load
|
||||
[_target, _gunbag, -_mass] call EFUNC(movement,addLoadToUnitContainer);
|
||||
|
||||
_gunbag setVariable [QGVAR(gunbagWeapon), [], true];
|
||||
|
||||
// play sound
|
||||
// Play sound
|
||||
if (["ace_backpacks"] call EFUNC(common,isModLoaded)) then {
|
||||
[_target, _gunbag] call EFUNC(backpacks,backpackOpened);
|
||||
};
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: Ir0n1E and mjc4wilton
|
||||
* Author: Ir0n1E, mjc4wilton
|
||||
* Swap primary weapon and weapon in gunbag.
|
||||
*
|
||||
* Arguments:
|
||||
@ -11,66 +11,49 @@
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [player, target] call ace_gunbag_fnc_swapGunbagCallback
|
||||
* [player, cursorObject] call ace_gunbag_fnc_swapGunbagCallback
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
params ["_unit", "_target"];
|
||||
private _currentWeapon = primaryWeapon _unit; //Get Current Weapon
|
||||
|
||||
// Set up current weapon for storing
|
||||
private _gunbag = backpackContainer _target;
|
||||
private _currentItems = (getUnitLoadout _unit) select 0;
|
||||
|
||||
private _currentMagazines = _currentItems select [4, 2];
|
||||
_currentItems deleteRange [4, 2];
|
||||
|
||||
//---Set up current weapon for storing
|
||||
private _currentWeaponState = [_unit, _currentWeapon] call EFUNC(common,getWeaponState); //Gets weapon attachments
|
||||
private _currentWeapon = _currentItems deleteAt 0;
|
||||
|
||||
/*
|
||||
* example return value _state
|
||||
* [["","","optic_Aco",""],["arifle_MX_GL_ACO_F","GL_3GL_F"],["30Rnd_65x39_caseless_mag","1Rnd_HE_Grenade_shell"],[30,1]]
|
||||
*/
|
||||
private _currentMass = [_currentWeapon, _currentItems, _currentMagazines apply {_x select 0}] call FUNC(calculateMass);
|
||||
|
||||
_currentWeaponState params ["_currentWeaponItems", "", "_currentWeaponMagazines", "_currentWeaponAmmo"]; //Extract Weapon Attachments to separate arrays
|
||||
// Set up weapon in gunbag
|
||||
private _newState = _gunbag getVariable [QGVAR(gunbagWeapon), []];
|
||||
|
||||
private _currentWeaponMass = [_currentWeapon, _currentWeaponItems, _currentWeaponMagazines] call FUNC(calculateMass);
|
||||
|
||||
{
|
||||
_currentWeaponMagazines set [_forEachIndex, [_x, _currentWeaponAmmo select _forEachIndex]];
|
||||
} forEach _currentWeaponMagazines;
|
||||
|
||||
//---Set up weapon in gunbag
|
||||
private _newWeaponState = _gunbag getVariable [QGVAR(gunbagWeapon), []];
|
||||
|
||||
if (_newWeaponState isEqualTo []) exitWith {
|
||||
if (_newState isEqualTo []) exitWith {
|
||||
[LLSTRING(empty)] call EFUNC(common,displayTextStructured);
|
||||
};
|
||||
|
||||
_newWeaponState params ["_newWeapon", "_newWeaponItems", "_newWeaponMagazines"];
|
||||
_newState params ["_newWeapon", "_newItems", "_newMagazines"];
|
||||
|
||||
//---Swap Weapons
|
||||
// Swap Weapons
|
||||
_unit removeWeapon _currentWeapon;
|
||||
_unit addWeapon _newWeapon;
|
||||
|
||||
// Game will auto add magazines from player's inventory, put these back in player inventory as they will be overwritten
|
||||
([_unit, _newWeapon] call EFUNC(common,getWeaponState)) params ["", "", "_addedMags", "_addedAmmo"];
|
||||
[_unit, _newWeapon, true, _newMagazines] call EFUNC(common,addWeapon);
|
||||
|
||||
// Add attachments
|
||||
{
|
||||
if (((_x select 0) != "") && {(_addedMags select _forEachIndex) != ""}) then {
|
||||
TRACE_2("Re-adding mag",_x,_addedMags select _forEachIndex);
|
||||
_unit addMagazine [_addedMags select _forEachIndex, _addedAmmo select _forEachIndex];
|
||||
};
|
||||
} forEach _newWeaponMagazines;
|
||||
|
||||
removeAllPrimaryWeaponItems _unit;
|
||||
|
||||
{
|
||||
_unit addWeaponItem [_newWeapon, _x];
|
||||
} forEach (_newWeaponItems + _newWeaponMagazines);
|
||||
_unit addWeaponItem [_newWeapon, _x, true];
|
||||
} forEach (_newItems select {_x != ""});
|
||||
|
||||
_unit selectWeapon _newWeapon;
|
||||
|
||||
_newWeaponMagazines = _newWeaponMagazines apply {_x select 0};
|
||||
private _newMass = [_newWeapon, _newItems, _newMagazines apply {_x select 0}] call FUNC(calculateMass);
|
||||
|
||||
private _newWeaponMass = [_newWeapon, _newWeaponItems, _newWeaponMagazines] call FUNC(calculateMass);
|
||||
// Update virtual load
|
||||
[_target, _gunbag, _currentMass - _newMass] call EFUNC(movement,addLoadToUnitContainer);
|
||||
|
||||
// update virtual load
|
||||
[_target, _gunbag, _currentWeaponMass - _newWeaponMass] call EFUNC(movement,addLoadToUnitContainer);
|
||||
_gunbag setVariable [QGVAR(gunbagWeapon), [_currentWeapon, _currentWeaponItems, _currentWeaponMagazines], true]; //Replace weapon in gunbag
|
||||
// Replace weapon in gunbag
|
||||
_gunbag setVariable [QGVAR(gunbagWeapon), [_currentWeapon, _currentItems, _currentMagazines], true];
|
||||
|
@ -11,38 +11,32 @@
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [player, target] call ace_gunbag_fnc_toGunbagCallback
|
||||
* [player, cursorObject] call ace_gunbag_fnc_toGunbagCallback
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
params ["_unit", "_target"];
|
||||
|
||||
private _weapon = primaryWeapon _unit;
|
||||
// Set up current weapon for storing
|
||||
private _gunbag = backpackContainer _target;
|
||||
private _items = (getUnitLoadout _unit) select 0;
|
||||
|
||||
private _state = [_unit, _weapon] call EFUNC(common,getWeaponState);
|
||||
private _magazines = _items select [4, 2];
|
||||
_items deleteRange [4, 2];
|
||||
|
||||
/*
|
||||
* example return value _state
|
||||
* [["","","optic_Aco",""],["arifle_MX_GL_ACO_F","GL_3GL_F"],["30Rnd_65x39_caseless_mag","1Rnd_HE_Grenade_shell"],[30,1]]
|
||||
*/
|
||||
private _weapon = _items deleteAt 0;
|
||||
|
||||
_state params ["_items", "", "_magazines", "_ammo"];
|
||||
|
||||
private _mass = [_weapon, _items, _magazines] call FUNC(calculateMass);
|
||||
|
||||
{
|
||||
_magazines set [_forEachIndex, [_x, _ammo select _forEachIndex]];
|
||||
} forEach _magazines;
|
||||
private _mass = [_weapon, _items, _magazines apply {_x select 0}] call FUNC(calculateMass);
|
||||
|
||||
_unit removeWeapon _weapon;
|
||||
|
||||
// add virtual load
|
||||
// Add virtual load
|
||||
[_target, _gunbag, _mass] call EFUNC(movement,addLoadToUnitContainer);
|
||||
|
||||
_gunbag setVariable [QGVAR(gunbagWeapon), [_weapon, _items, _magazines], true];
|
||||
|
||||
// play sound
|
||||
// Play sound
|
||||
if (["ace_backpacks"] call EFUNC(common,isModLoaded)) then {
|
||||
[_target, _gunbag] call EFUNC(backpacks,backpackOpened);
|
||||
};
|
||||
|
@ -1,3 +1,4 @@
|
||||
ACEX_PREP(blacklist);
|
||||
ACEX_PREP(endMissionNoPlayers);
|
||||
ACEX_PREP(handleConnectHC);
|
||||
ACEX_PREP(handleDisconnect);
|
||||
|
@ -10,6 +10,21 @@
|
||||
};
|
||||
// Add disconnect EH
|
||||
addMissionEventHandler ["HandleDisconnect", {call FUNC(handleDisconnect)}];
|
||||
|
||||
[QGVAR(transferGroupsRebalance), {
|
||||
params ["_groups", "_owner", "_rebalance"];
|
||||
|
||||
if (_groups isNotEqualTo [] && {_owner > 1}) then {
|
||||
{
|
||||
_x setGroupOwner _owner;
|
||||
} forEach _groups;
|
||||
};
|
||||
|
||||
// Rebalance units
|
||||
if (_rebalance in [REBALANCE, FORCED_REBALANCE]) then {
|
||||
(_rebalance == FORCED_REBALANCE) call FUNC(rebalance);
|
||||
};
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
} else {
|
||||
// Register HC (this part happens on HC only)
|
||||
[QXGVAR(headlessClientJoined), [player]] call CBA_fnc_globalEvent; // Global event for API purposes
|
||||
|
51
addons/headless/functions/fnc_blacklist.sqf
Normal file
51
addons/headless/functions/fnc_blacklist.sqf
Normal file
@ -0,0 +1,51 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: johnb43
|
||||
* Modifies which units are blacklisted from being transferred to HCs.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Units <OBJECT, GROUP, ARRAY>
|
||||
* 1: Add (true) or remove (false) from blacklist <BOOL> (default: true)
|
||||
* 2: Owner to transfer units to <NUMBER> (default: -1)
|
||||
* 3: Rebalance <NUMBER> (default: 0)
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [cursorObject, true] call ace_headless_fnc_blacklist
|
||||
*
|
||||
* Public: Yes
|
||||
*/
|
||||
|
||||
params [["_units", objNull, [objNull, grpNull, []]], ["_blacklist", true, [false]], ["_owner", -1, [false]], ["_rebalance", NO_REBALANCE, [0]]];
|
||||
|
||||
if !(_units isEqualType []) then {
|
||||
_units = [_units];
|
||||
};
|
||||
|
||||
// Make sure passed arguments are objects or groups
|
||||
_units = _units select {_x isEqualType objNull || {_x isEqualType grpNull}};
|
||||
_units = _units select {!isNull _x};
|
||||
|
||||
if (_units isEqualTo []) exitWith {};
|
||||
|
||||
private _transfer = _blacklist && {_owner > 1};
|
||||
private _groups = [];
|
||||
|
||||
{
|
||||
_x setVariable [QXGVAR(blacklist), _blacklist, true];
|
||||
|
||||
if (_transfer) then {
|
||||
if (_x isEqualType objNull) then {
|
||||
_groups pushBack group _x;
|
||||
} else {
|
||||
_groups pushBack _x;
|
||||
};
|
||||
};
|
||||
} forEach _units;
|
||||
|
||||
// Try to move AI to new owner; Also takes care of rebalancing groups
|
||||
if (_transfer || {_rebalance in [REBALANCE, FORCED_REBALANCE]}) then {
|
||||
[QGVAR(transferGroupsRebalance), [_groups arrayIntersect _groups, _owner, _rebalance]] call CBA_fnc_serverEvent;
|
||||
};
|
@ -17,6 +17,9 @@
|
||||
|
||||
params ["_force"];
|
||||
|
||||
// Filter out any invalid entries
|
||||
GVAR(headlessClients) = GVAR(headlessClients) select {!isNull _x};
|
||||
|
||||
GVAR(headlessClients) params [
|
||||
["_HC1", objNull, [objNull]],
|
||||
["_HC2", objNull, [objNull]],
|
||||
@ -36,12 +39,13 @@ private _idHC2 = -1;
|
||||
private _idHC3 = -1;
|
||||
private _currentHC = 0;
|
||||
|
||||
if (!local _HC1) then {
|
||||
// objNull is never local
|
||||
if (!local _HC1 && !isNull _HC1) then {
|
||||
_idHC1 = owner _HC1;
|
||||
_currentHC = 1;
|
||||
};
|
||||
|
||||
if (!local _HC2) then {
|
||||
if (!local _HC2 && !isNull _HC2) then {
|
||||
_idHC2 = owner _HC2;
|
||||
|
||||
if (_currentHC == 0) then {
|
||||
@ -49,7 +53,7 @@ if (!local _HC2) then {
|
||||
};
|
||||
};
|
||||
|
||||
if (!local _HC3) then {
|
||||
if (!local _HC3 && !isNull _HC3) then {
|
||||
_idHC3 = owner _HC3;
|
||||
|
||||
if (_currentHC == 0) then {
|
||||
@ -57,84 +61,150 @@ if (!local _HC3) then {
|
||||
};
|
||||
};
|
||||
|
||||
if (_currentHC == 0) exitWith {
|
||||
TRACE_1("No Valid HC to transfer to",_currentHC);
|
||||
|
||||
if (XGVAR(log)) then {
|
||||
INFO("No Valid HC to transfer to");
|
||||
};
|
||||
};
|
||||
|
||||
// Prepare statistics
|
||||
private _numTransferredHC1 = 0;
|
||||
private _numTransferredHC2 = 0;
|
||||
private _numTransferredHC3 = 0;
|
||||
|
||||
private _units = [];
|
||||
private _transfer = false;
|
||||
private _previousOwner = -1;
|
||||
|
||||
// Transfer AI groups
|
||||
{
|
||||
// No transfer if empty group
|
||||
private _transfer = ((units _x) isNotEqualTo []) && {!(_x getVariable [QXGVAR(blacklist), false])};
|
||||
if (_transfer) then {
|
||||
// No transfer if waypoints with synchronized triggers exist for the group
|
||||
private _allWaypointsWithTriggers = (waypoints _x) select {(synchronizedTriggers _x) isNotEqualTo []};
|
||||
if (_allWaypointsWithTriggers isNotEqualTo []) exitWith {
|
||||
_units = units _x;
|
||||
|
||||
// No transfer if empty group or if group is blacklisted
|
||||
if (_units isEqualTo [] || {_x getVariable [QXGVAR(blacklist), false]}) then {
|
||||
continue;
|
||||
};
|
||||
|
||||
// No transfer if waypoints with synchronized triggers exist for the group
|
||||
if (((waypoints _x) select {(synchronizedTriggers _x) isNotEqualTo []}) isNotEqualTo []) then {
|
||||
continue;
|
||||
};
|
||||
|
||||
{
|
||||
// No transfer if already transferred
|
||||
if (!_force && {(owner _x) in [_idHC1, _idHC2, _idHC3]}) exitWith {
|
||||
_transfer = false;
|
||||
};
|
||||
|
||||
{
|
||||
// No transfer if already transferred
|
||||
if (!_force && {(owner _x) in [_idHC1, _idHC2, _idHC3]}) exitWith {
|
||||
_transfer = false;
|
||||
};
|
||||
// No transfer if any unit in group is blacklisted
|
||||
if (_x getVariable [QXGVAR(blacklist), false]) exitWith {
|
||||
_transfer = false;
|
||||
};
|
||||
|
||||
// No transfer if player or UAV in this group
|
||||
if (isPlayer _x || {unitIsUAV _x}) exitWith {
|
||||
_transfer = false;
|
||||
};
|
||||
// No transfer if player or UAV in this group
|
||||
if (isPlayer _x || {unitIsUAV _x}) exitWith {
|
||||
_transfer = false;
|
||||
};
|
||||
|
||||
// No transfer if any unit in group is blacklisted
|
||||
if (_x getVariable [QXGVAR(blacklist), false]) exitWith {
|
||||
_transfer = false;
|
||||
};
|
||||
private _vehicle = objectParent _x;
|
||||
|
||||
private _vehicle = objectParent _x;
|
||||
// No transfer if the vehicle the unit is in or if the crew in that vehicle is blacklisted
|
||||
if ((_vehicle getVariable [QXGVAR(blacklist), false]) || {unitIsUAV _vehicle}) exitWith {
|
||||
_transfer = false;
|
||||
};
|
||||
|
||||
// No transfer if the vehicle the unit is in or if the crew in that vehicle is blacklisted
|
||||
if ((_vehicle getVariable [QXGVAR(blacklist), false]) || {unitIsUAV _vehicle}) exitWith {
|
||||
_transfer = false;
|
||||
};
|
||||
// Save gear if unit about to be transferred with current loadout (naked unit work-around)
|
||||
if (XGVAR(transferLoadout) == 1) then {
|
||||
_x setVariable [QGVAR(loadout), _x call CBA_fnc_getLoadout, true];
|
||||
};
|
||||
} forEach _units;
|
||||
|
||||
// Save gear if unit about to be transferred with current loadout (naked unit work-around)
|
||||
if (XGVAR(transferLoadout) == 1) then {
|
||||
_x setVariable [QGVAR(loadout), _x call CBA_fnc_getLoadout, true];
|
||||
};
|
||||
} forEach (units _x);
|
||||
if (!_transfer) then {
|
||||
continue;
|
||||
};
|
||||
|
||||
// Round robin between HCs if load balance enabled, else pass all to one HC
|
||||
if (_transfer) then {
|
||||
switch (_currentHC) do {
|
||||
case 1: {
|
||||
private _transferred = _x setGroupOwner _idHC1;
|
||||
if (_loadBalance) then {
|
||||
_currentHC = [3, 2] select (!local _HC2);
|
||||
};
|
||||
if (_transferred) then {
|
||||
_numTransferredHC1 = _numTransferredHC1 + 1;
|
||||
_previousOwner = groupOwner _x;
|
||||
|
||||
switch (_currentHC) do {
|
||||
case 1: {
|
||||
if (_loadBalance) then {
|
||||
// Find the next valid HC
|
||||
// If none are valid, _currentHC will remain the same
|
||||
if (_idHC2 != -1) then {
|
||||
_currentHC = 2;
|
||||
} else {
|
||||
if (_idHC3 != -1) then {
|
||||
_currentHC = 3;
|
||||
};
|
||||
};
|
||||
};
|
||||
case 2: {
|
||||
private _transferred = _x setGroupOwner _idHC2;
|
||||
if (_loadBalance) then {
|
||||
_currentHC = [1, 3] select (!local _HC3);
|
||||
};
|
||||
if (_transferred) then {
|
||||
_numTransferredHC2 = _numTransferredHC2 + 1;
|
||||
|
||||
// Don't transfer if it's already local to HC1
|
||||
if (_previousOwner == _idHC1) exitWith {};
|
||||
|
||||
[QGVAR(groupTransferPre), [_x, _HC1, _previousOwner, _idHC1], [_previousOwner, _idHC1]] call CBA_fnc_targetEvent; // API
|
||||
|
||||
private _transferred = _x setGroupOwner _idHC1;
|
||||
|
||||
[QGVAR(groupTransferPost), [_x, _HC1, _previousOwner, _idHC1, _transferred], [_previousOwner, _idHC1]] call CBA_fnc_targetEvent; // API
|
||||
|
||||
if (_transferred) then {
|
||||
_numTransferredHC1 = _numTransferredHC1 + 1;
|
||||
};
|
||||
};
|
||||
case 2: {
|
||||
if (_loadBalance) then {
|
||||
// Find the next valid HC
|
||||
// If none are valid, _currentHC will remain the same
|
||||
if (_idHC3 != -1) then {
|
||||
_currentHC = 3;
|
||||
} else {
|
||||
if (_idHC1 != -1) then {
|
||||
_currentHC = 1;
|
||||
};
|
||||
};
|
||||
};
|
||||
case 3: {
|
||||
private _transferred = _x setGroupOwner _idHC3;
|
||||
if (_loadBalance) then {
|
||||
_currentHC = [2, 1] select (!local _HC1);
|
||||
};
|
||||
if (_transferred) then {
|
||||
_numTransferredHC3 = _numTransferredHC3 + 1;
|
||||
|
||||
// Don't transfer if it's already local to HC2
|
||||
if (_previousOwner == _idHC2) exitWith {};
|
||||
|
||||
[QGVAR(groupTransferPre), [_x, _HC2, _previousOwner, _idHC2], [_previousOwner, _idHC2]] call CBA_fnc_targetEvent; // API
|
||||
|
||||
private _transferred = _x setGroupOwner _idHC2;
|
||||
|
||||
[QGVAR(groupTransferPost), [_x, _HC2, _previousOwner, _idHC2, _transferred], [_previousOwner, _idHC2]] call CBA_fnc_targetEvent; // API
|
||||
|
||||
if (_transferred) then {
|
||||
_numTransferredHC2 = _numTransferredHC2 + 1;
|
||||
};
|
||||
};
|
||||
case 3: {
|
||||
if (_loadBalance) then {
|
||||
// Find the next valid HC
|
||||
// If none are valid, _currentHC will remain the same
|
||||
if (_idHC1 != -1) then {
|
||||
_currentHC = 1;
|
||||
} else {
|
||||
if (_idHC2 != -1) then {
|
||||
_currentHC = 2;
|
||||
};
|
||||
};
|
||||
};
|
||||
default {
|
||||
TRACE_1("No Valid HC to transfer to",_currentHC);
|
||||
|
||||
// Don't transfer if it's already local to HC3
|
||||
if (_previousOwner == _idHC3) exitWith {};
|
||||
|
||||
[QGVAR(groupTransferPre), [_x, _HC3, _previousOwner, _idHC3], [_previousOwner, _idHC3]] call CBA_fnc_targetEvent; // API
|
||||
|
||||
private _transferred = _x setGroupOwner _idHC2;
|
||||
|
||||
[QGVAR(groupTransferPost), [_x, _HC3, _previousOwner, _idHC3, _transferred], [_previousOwner, _idHC3]] call CBA_fnc_targetEvent; // API
|
||||
|
||||
if (_transferred) then {
|
||||
_numTransferredHC3 = _numTransferredHC3 + 1;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -5,8 +5,8 @@
|
||||
format ["ACE %1", LLSTRING(Module)],
|
||||
false,
|
||||
1,
|
||||
{[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
true
|
||||
{[QXGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
true // Needs mission restart
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
@ -15,8 +15,7 @@
|
||||
[LSTRING(Delay), LSTRING(DelayDesc)],
|
||||
format ["ACE %1", LLSTRING(Module)],
|
||||
[0, 60, 15, -1],
|
||||
1,
|
||||
{[QGVAR(delay), _this] call EFUNC(common,cbaSettings_settingChanged)}
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
@ -26,8 +25,8 @@
|
||||
format ["ACE %1", LLSTRING(Module)],
|
||||
[[0, 1, 2], [ELSTRING(Common,Disabled), LSTRING(Instant), LSTRING(Delayed)], 0],
|
||||
1,
|
||||
{[QGVAR(delay), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
true
|
||||
{[QXGVAR(endMission), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
true // Needs mission restart
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
@ -36,8 +35,7 @@
|
||||
[LSTRING(Log), LSTRING(LogDesc)],
|
||||
format ["ACE %1", LLSTRING(Module)],
|
||||
false,
|
||||
1,
|
||||
{[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}
|
||||
1
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
@ -47,6 +45,6 @@
|
||||
format ["ACE %1", LLSTRING(Module)],
|
||||
[[0, 1, 2], [ELSTRING(Common,Disabled), LSTRING(TransferLoadoutCurrent), LSTRING(TransferLoadoutConfig)], 0],
|
||||
1,
|
||||
{},
|
||||
true // needs mission restart
|
||||
{[QXGVAR(transferLoadout), _this] call EFUNC(common,cbaSettings_settingChanged)},
|
||||
true // Needs mission restart
|
||||
] call CBA_fnc_addSetting;
|
||||
|
@ -17,3 +17,7 @@
|
||||
#include "\z\ace\addons\main\script_macros.hpp"
|
||||
|
||||
#define DELAY_DEFAULT 15
|
||||
|
||||
#define NO_REBALANCE 0
|
||||
#define REBALANCE 1
|
||||
#define FORCED_REBALANCE 2
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
class Extended_PreStart_EventHandlers {
|
||||
class ADDON {
|
||||
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user